过拟合与欠拟合
过拟合与欠拟合
欠拟合:训练集和测试集的acc都很差 可以适当增加模型复杂度再测试
过拟合:使用模型复杂度高于实际数据模型复杂度 训练多次后training acc很好,test acc效果不好 泛化能力变差
交叉验证
每训练多少次做一次test,只保存test acc 最好的模型
overfitting之后的模型都不会保存
K-fold cross-validation
每次训练完以后重新划分Train Set 与Val Set
把最开始的Trainning set划分为K份,每次取K-1份做为Trainning Set 另外一份作为Val Set
减少过拟合
增大数据集
减少模型复杂度
Dropout
Data argume
Regularization
$$
J(\theta)=-\frac{1}{m}\sum_{i=1}^m[y_i\ln\hat y_i+(1-y_i)\ln(1-\bar y^i)]+\lambda \vert\theta_i\vert
$$
式子前半部分为交叉熵,后半部分为$\lambda$乘上网络参数的1或2范数,因为矩阵的1,2范数大于等于0,当我们对$J(\theta)$做最优化使其最小时,也相当于最优化$\vert\theta_i\vert$减小接近为0,达到简化网络的目的:高维参数接近为0,低维参数保持。
常用L2-Regularization:
$$
J(W;X,y)+\frac{1}{2}\Vert w\Vert^2
$$
optimizer=optim.SGD(net.parameters(),lr=learn_rate,weight_decay=0.01) |
使用时只需在.optim时给定参数weight_decay=$\lambda$
L1-Regularization:pytorch 没有api支持,需要人为编写
regularization_loss=0 |
动量与学习率衰减
Momentum:用于减少停止在局部最优点的情况
原梯度更新公式:
$$
w^{k+1}=w^k-\alpha\nabla f(w^k)
$$
Momentum梯度更新公式:
$$
z^{k+1}=\beta z^k+\nabla f(w^k)
$$
$$
w^{k+1}=w^k-\alpha z^{k+1}
$$
optimizer=optim.SGD(net.parameters(),lr=learn_rate,momentum=0.78,weight_decay=0.01) |
pytorch中调用只需在.optim中设置momentum=$\beta$即可
Learning rate tunning:减少收敛点附近震荡
lr随着迭代的进行不断减小
Scheme1:ReduceLROnPlateau(optimizer,'min')
optimizer=optim.SGD(net.parameters(),lr=learn_rate,momentum=0.78,weight_decay=0.01) |
scheduler.step(loss_val)
:loss函数连续一定不减小的话,就衰减lr
Scheme2:设置每30个epoch,lr=0.1*lr一次
scheduler=StepLR(optimizer,step_size=30,gamma=0.1) |
Early stopping:
train performance 还在上升,validation performance已经保持不变或者下降,则 early stoppping,保存Validation performance最大的模型
Dropout:
train前向传播时,每个connection有一定概率的输出为0,即令$w_ix_i=0$
可在任意连接层中添加torch.nn.Dropout(dropout_prob)
net_dropped=torch.nn.Sequential( |
validation 时不用Dropouot
梯度下降法的变式
SGD: Stochastic Gradient Descent
对于大数据集,由于显存有限,训练时不可能对所有数据求LOSS后进行梯度更新,所以每次随机选择一个batch的数据进行训练。
Adagrad
自衰减的学习率在某些情况下并不好,可能会造成学习过早停止,Adgrad是一种自学习方法,其参数更新公式为:
$$
w^{t+1}=w^t-\frac{\beta}{\sqrt{\sum_{i=0}^t(g^i)^2}+\xi}g^t
$$
其中$\xi$为平滑参数,大小通常为$10^{-4}-10^{-8}$主要用于防止分母为0,分母中的根号特别重要,没有该根号,算法表现非常差。
RMSprop
一种非常有效的自适应学习率改进方法:
$$
cache^t=\alpha * cache^{t-1}+(1-\alpha)(g^t)^2
$$
$$
w^{t+1}=w^t-\frac{\beta}{\sqrt{cache^t}+\xi}g^t
$$
RMSprop不在将前面所有梯度求平方和,二十引用了一个衰减率将其变小,采用一种滑动平均的方式,越靠近前面的梯度对自适应学习的影响率越小,能更快的收敛。