深度学习模型训练时需要调哪些参数?基于PyTorch框架进行总结。
1、参数初始化策略
代码示例:
# Common practise for initialization.
for layer in model.modules():
if isinstance(layer, torch.nn.Conv2d):
torch.nn.init.kaiming_normal_(layer.weight, mode='fan_out',
nonlinearity='relu')
if layer.bias is not None:
torch.nn.init.constant_(layer.bias, val=0.0)
elif isinstance(layer, torch.nn.BatchNorm2d):
torch.nn.init.constant_(layer.weight, val=1.0)
torch.nn.init.constant_(layer.bias, val=0.0)
elif isinstance(layer, torch.nn.Linear):
torch.nn.init.xavier_normal_(layer.weight)
if layer.bias is not None:
torch.nn.init.constant_(layer.bias, val=0.0)
# Initialization with given tensor.
layer.weight = torch.nn.Parameter(tensor)
常见的初始化策略有:
- 常量初始化:torch.nn.init.constant_(tensor, val)
- 均匀分布初始化:torch.nn.init.uniform_(tensor, a=0.0, b=1.0)
- 正态分布初始化:torch.nn.init.normal_(tensor, mean=0.0, std=1.0)
- xavier初始化:torch.nn.init.xavier_uniform_(tensor, gain=1.0)、torch.nn.init.xavier_normal_(tensor, gain=1.0)
- kaiming初始化:torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')、torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
2、学习率
初始学习率一般设为:0.001~0.01之间。
2.1、固定学习率
2.2、衰减学习率
2.2.1、按迭代次数调整学习率
torch.optim.lr_scheduler provides several methods to adjust the learning rate based on the number of epochs.
-
torch.optim.lr_scheduler.StepLR
-
torch.optim.lr_scheduler.LambdaLR
-
torch.optim.lr_scheduler.MultiplicativeLR
-
torch.optim.lr_scheduler.MultiStepLR
-
torch.optim.lr_scheduler.ExponentialLR
-
torch.optim.lr_scheduler.CosineAnnealingLR
2.2.2、按评估指标调整学习率
torch.optim.lr_scheduler.ReduceLROnPlateau allows dynamic learning rate reducing based on some validation measurements.
-
torch.optim.lr_scheduler.ReduceLROnPlateau
3、批次大小
mini-batch、批次大小一般设为:16、32、64、128、256
大 batch size 占用空间,小 batch size 消耗时间。
4、迭代次数
一般根据训练时验证集的准确率选择epoch
5、优化器、激活函数
5.1、优化器
-
Adam:收敛速度快、torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
-
Momentum:准确率更高、torch.optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False)
-
AdaGrad:torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10)
-
AdaDelta:torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)
-
RMSProp:torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
-
SGD:torch.optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False)
5.2、激活函数
-
ReLU:torch.nn.ReLU(inplace: bool = False)
-
Tanh:torch.nn.Tanh
-
LeakyRelu:torch.nn.LeakyReLU(negative_slope: float = 0.01, inplace: bool = False)
-
Sigmoid:torch.nn.Sigmoid
-
LogSigmoid:torch.nn.LogSigmoid
6、隐层维度、隐层数
6.1、隐层维度
一般设为8的倍数,如16、32、64、128、256。
词嵌入向量维度一般设为128、256。
一般原则:
- 隐藏神经元的数量应在输入层的大小和输出层的大小之间
- 隐藏神经元的数量应为输入层大小的2/3加上输出层大小的2/3
- 隐藏神经元的数量应小于输入层大小的两倍
6.2、隐层数
- 没有隐藏层:仅能够表示线性可分函数或决策
- 隐藏层数=1:可以拟合任何“包含从一个有限空间到另一个有限空间的连续映射”的函数
- 隐藏层数=2:搭配适当的激活函数可以表示任意精度的任意决策边界,并且可以拟合任何精度的任何平滑映射
- 隐藏层数>2:多出来的隐藏层可以学习复杂的描述(某种自动特征工程)
7、防止过拟合策略
三种常用的防止过拟合的策略
7.1、Dropout
- torch.nn.Dropout(p: float = 0.5, inplace: bool = False)
- dropout rate一般设为0.0-0.5之间的值
7.2、Batch Normalization
- torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
-
机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。那BatchNorm的作用是什么呢?BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
7.3、Regularization
7.3.1、L1 Regularization
代码示例:
l1_regularization = torch.nn.L1Loss(reduction='sum')
loss = ... # Standard cross-entropy loss
for param in model.parameters():
loss += torch.sum(torch.abs(param))
loss.backward()
7.3.2、L2 Regularization
通过在优化器定义中设置weight decay参数实现。