理论知识 网络的主要结构

Posted by Sun on March 31, 2020

optimizer

作用

根据网络反向传播的梯度信息更新网络参数, 降低loss函数值

结构

  1. 优化器需要知道模型的参数空间, 因此需要训练前将网络参数放入优化器内

    1
    2
    
    optimizer_G = Adam(model_G.parameters(), lr=train_c.lr_G)  # lr 使用的是初始lr
    optimizer_D = Adam(model_D.parameters(), lr=train_c.lr_D)	
    
  2. 需要知道反向传播的梯度信息

    使用optimizer.step()函数, 对参数空间中的grad进行操作, 放在mini-batch内

    例如使用负梯度下降法

    1
    2
    3
    4
    5
    6
    
    for p in group['params']:
        if p.grad is None:  
            continue
        d_p = p.grad.data
       
        p.data.add_(-group['lr'], d_p)
    

    注意:

    1. 使用前先清零 optimizer.zero_grad(), 防止使用的这个grad就得同上一个mini-batch有关

    2. 跟在反向传播后面, 因为优化器更新参数需要基于反向梯度

      1
      2
      
      loss.backward()  # 反向传播
      optimizer.step()
      

    scheduler.step()按照Pytorch的定义是用来更新优化器的学习率的,一般是按照epoch为单位进行更换,即多少个epoch后更换一次学习率,因而scheduler.step()放在epoch这个大循环下

Loss

Cross Entropy Error Function(交叉熵损失函数)

t.nn.CrossEntropyLoss

1.表达式

(1) 二分类

在二分的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们的预测得到的概率为 [公式][公式] 。此时表达式为:

[公式]

其中: - [公式] —— 表示样本i的label,正类为1,负类为0 - [公式] —— 表示样本i预测为正的概率

(2) 多分类

多分类的情况实际上就是对二分类的扩展:

[公式]

其中: - [公式] ——类别的数量; - [公式] ——指示变量(0或1),如果该类别和样本i的类别相同就是1,否则是0; - [公式] ——对于观测样本i属于类别 [公式] 的预测概率。

例1:

v2-0c49d6159fc8a5676637668683d41762_720w

[公式]

[公式]

例2:

img

[公式]

[公式]

可以发现,交叉熵损失函数可以捕捉到模型1模型2预测效果的差异。

2. 函数性质

img

可以看出,该函数是凸函数,求导时能够得到全局最优值。

3. 学习过程

交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。

我们用神经网络最后一层输出的情况,来看一眼整个模型预测、获得损失和学习的流程:

  1. 神经网络最后一层得到每个类别的得分scores
  2. 该得分经过sigmoid(或softmax)函数获得概率输出;
  3. 模型预测的类别概率输出与真实类别的one hot形式进行交叉熵损失函数的计算。

学习任务分为二分类和多分类情况,我们分别讨论这两种情况的学习过程。

3.1 二分类情况

img

二分类交叉熵损失函数学习过程

如上图所示,求导过程可分成三个子过程,即拆成三项偏导的乘积:

[公式]

可以看到,我们得到了一个非常漂亮的结果,所以,使用交叉熵损失函数,不仅可以很好的衡量模型的效果,又可以很容易的的进行求导计算。

缺点

sigmoid(softmax)+cross-entropy loss 擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。基于这个问题的优化有很多,比如对softmax进行改进,如L-Softmax、SM-Softmax、AM-Softmax等。

CNN知识点

Val模式

model.eval() ,model.train()

eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大

model.train() 和 model.eval() 一般在模型训练和评价的时候会加上这两句,主要是针对由于model 在训练时和评价时 Batch Normalization 和 Dropout 方法模式不同;因此,在使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval;

通道(channel)和特征图(feature map)

从卷积网络的构成部分来看:

  • 池化过程中, 不会对通道间的交互有任何影响

  • 卷积则可以进行通道之间的交互, 之后在下一层生成新的通道, 比如Incept-Net中大量1*1的卷积便只进行通道间的交互而不关心通道内的交互.

通道和特征图都可看做是之前输入上某个特征分布的数据, 两者本质上是相同的

物理意义:通道中某一处数值的强弱就是对当前特征强弱的反应

Batch size, Epoch 和 iteration

1)iteration:表示1次迭代,每次迭代更新1次网络结构的参数,1个iteration等于使用batchsize个样本训练一次; (2)batch_size:批大小,即1次迭代所使用的样本量。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练; (3)epoch:1个epoch等于使用训练集中的全部样本训练一次。

Reference

损失函数 - 交叉熵损失函数 $$

$$