根据网络反向传播的梯度信息更新网络参数, 降低loss函数值
优化器需要知道模型的参数空间, 因此需要训练前将网络参数放入优化器内
需要知道反向传播的梯度信息
使用optimizer.step()
函数, 对参数空间中的grad进行操作, 放在mini-batch内
例如使用负梯度下降法
for p in group['params']:
if p.grad is None:
continue
d_p = p.grad.data
p.data.add_(-group['lr'], d_p)
注意:
使用前先清零 optimizer.zero_grad()
, 防止使用的这个grad就得同上一个mini-batch有关
跟在反向传播后面, 因为优化器更新参数需要基于反向梯度
scheduler.step()
按照Pytorch的定义是用来更新优化器的学习率的,一般是按照epoch为单位进行更换,即多少个epoch后更换一次学习率,因而scheduler.step()放在epoch这个大循环下。
t.nn.CrossEntropyLoss
在二分的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们的预测得到的概率为 和 。此时表达式为:
其中: - —— 表示样本i的label,正类为1,负类为0 - —— 表示样本i预测为正的概率
多分类的情况实际上就是对二分类的扩展:
其中: - ——类别的数量; - ——指示变量(0或1),如果该类别和样本i的类别相同就是1,否则是0; - ——对于观测样本i属于类别 的预测概率。
例1:
例2:
可以发现,交叉熵损失函数可以捕捉到模型1和模型2预测效果的差异。
可以看出,该函数是凸函数,求导时能够得到全局最优值。
交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。
我们用神经网络最后一层输出的情况,来看一眼整个模型预测、获得损失和学习的流程:
学习任务分为二分类和多分类情况,我们分别讨论这两种情况的学习过程。
二分类交叉熵损失函数学习过程
如上图所示,求导过程可分成三个子过程,即拆成三项偏导的乘积:
可以看到,我们得到了一个非常漂亮的结果,所以,使用交叉熵损失函数,不仅可以很好的衡量模型的效果,又可以很容易的的进行求导计算。
sigmoid(softmax)+cross-entropy loss 擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。基于这个问题的优化有很多,比如对softmax进行改进,如L-Softmax、SM-Softmax、AM-Softmax等。
model.eval()
,model.train()
eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大
model.train() 和 model.eval() 一般在模型训练和评价的时候会加上这两句,主要是针对由于model 在训练时和评价时 Batch Normalization 和 Dropout 方法模式不同;因此,在使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval;
从卷积网络的构成部分来看:
池化过程中, 不会对通道间的交互有任何影响
卷积则可以进行通道之间的交互, 之后在下一层生成新的通道, 比如Incept-Net中大量1*1的卷积便只进行通道间的交互而不关心通道内的交互.
通道和特征图都可看做是之前输入上某个特征分布的数据, 两者本质上是相同的
物理意义:通道中某一处数值的强弱就是对当前特征强弱的反应。
1)iteration:表示1次迭代,每次迭代更新1次网络结构的参数,1个iteration等于使用batchsize个样本训练一次; (2)batch_size:批大小,即1次迭代所使用的样本量。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练; (3)epoch:1个epoch等于使用训练集中的全部样本训练一次。
Reference
$$