过拟合与欠拟合

欠拟合:训练集和测试集的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
for param in model.parameters():
regularization_loss+=torch.sum(torch.abs(param))

classify_loss=criteon(logits,target)
loss=classify_loss+0.01*regularzation_loss
optimizer.zero_grad()
loss.backward()
optimizer.step()

动量与学习率衰减

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=ReduceLROnPlateau(optimizer,'min')
for epoch in xrange(args.start_epoch,args.epochs):
train(train_loader,model,criterion,optimizer,epoch)
result_avg,loss_val=validate(val_loader,model,criterion,epoch)
scheduler.step(loss_val)

scheduler.step(loss_val):loss函数连续一定不减小的话,就衰减lr

Scheme2:设置每30个epoch,lr=0.1*lr一次

scheduler=StepLR(optimizer,step_size=30,gamma=0.1)
for epoch in range(100):
scheduler.step()
train()
validate()

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(
torch.nn.Linear(784,200),
torch.nn.Dropout(0.5),
torch.nn.ReLU(),
torch.nn.Linear(200,200),
torch.nn.Dropout(0.5),
torch.nn.ReLU(),
torch.nn.Linear(200,10),
)

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不在将前面所有梯度求平方和,二十引用了一个衰减率将其变小,采用一种滑动平均的方式,越靠近前面的梯度对自适应学习的影响率越小,能更快的收敛。