本文主要是介绍《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》论文阅读笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
论文原文:http://arxiv.org/abs/1502.01852
论文主要讨论了以ReLU为激活函数的网络的缺陷并提出了改进的激活函数PReLU与新的Kaiming初始化方法
1. PReLU
-
前向传播
- 通道独立: f ( y i ) = max ( 0 , y i ) + a i min ( 0 , y i ) f\left(y_{i}\right)=\max \left(0, y_{i}\right)+a_{i} \min \left(0, y_{i}\right) f(yi)=max(0,yi)+aimin(0,yi)
- 通道共享: f ( y i ) = max ( 0 , y i ) + a min ( 0 , y i ) f\left(y_{i}\right)=\max \left(0, y_{i}\right)+a \min \left(0, y_{i}\right) f(yi)=max(0,yi)+amin(0,yi)
区别在于通道共享的PReLU对于每个通道都使用相同的 a a a,而通道独立的PReLU对于每个通道 i i i都使用不同的 a i a_{i} ai,这些参数都是与网络同时训练得到的
-
反向传播
∂ E ∂ a i = ∑ y i ∂ E ∂ f ( y i ) ∂ f ( y i ) ∂ a i \frac{\partial \mathcal{E}}{\partial a_{i}}=\sum_{y_{i}} \frac{\partial \mathcal{E}}{\partial f\left(y_{i}\right)} \frac{\partial f\left(y_{i}\right)}{\partial a_{i}} ∂ai∂E=yi∑∂f(yi)∂E∂ai∂f(yi)
∂ f ( y i ) ∂ a i = { 0 , if y i > 0 y i , if y i ≤ 0 \frac{\partial f\left(y_{i}\right)}{\partial a_{i}}=\left\{\begin{array}{ll}{0,} & {\text { if } y_{i}>0} \\ {y_{i},} & {\text { if } y_{i} \leq 0}\end{array}\right. ∂ai∂f(yi)={0,yi, if yi>0 if yi≤0
-
实验结果
-
在ImageNet上仅改变激活函数能得到1.2的提升
-
越低层的a越远离0而越高层的a越接近0,说明模型在低层时保留了更多的信息,而在高层时提取更多非线性特征
-
2. Kaiming初始化
-
使用ReLU的网络相比使用sigmoid的网络能更快的收敛,但不良的初始化会导致模型难以训练。
-
传统的网络使用高斯分布进行初始化,在训练深层网络时难以收敛(需要使用预训练模型或辅助分类器),Xavier初始化基于激活函数是线性的这一假设,不适用于ReLU及其变体
-
kaiming初始化过程
-
对于前向传播: y l = W l x l + b l \mathbf{y}_{l}=\mathbf{W}_{l} \mathbf{x}_{l}+\mathbf{b}_{l} yl=Wlxl+bl
- x l {x}_{l} xl: k 2 c × 1 k^{2} c\times1 k2c×1
- W l {W}_{l} Wl: d × k 2 c d\times k^{2} c d×k2c
- b l {b}_{l} bl: d × 1 d\times 1 d×1
其中 k k k为输入图像大小, c c c为通道数, d d d为核个数
-
初始化 w l w_{l} wl与 x l x_{l} xl都是独立同分布的,则有
Var [ y l ] = n l Var [ w l x l ] = n l Var [ w l ] E [ x l 2 ] \operatorname{Var}\left[y_{l}\right]=n_{l} \operatorname{Var}\left[w_{l} x_{l}\right]=n_{l} \operatorname{Var}\left[w_{l}\right] E\left[x_{l}^{2}\right] Var[yl]=nlVar[wlxl]=nlVar[wl]E[xl2]
只有在 x l {x}_{l} xl是0均值的情况下才有 E [ x l 2 ] = Var [ x l ] E\left[x_{l}^{2}\right] = \operatorname{Var}\left[x_{l}\right] E[xl2]=Var[xl],而ReLU激活后 x l = max ( 0 , y l − 1 ) x_{l}=\max \left(0, y_{l-1}\right) xl=max(0,yl−1)不满足0均值,因此将与Xavier中的情况不符 -
如果 w l − 1 {w}_{l-1} wl−1是关于0的对称分布, b l − 1 = 0 {b}_{l-1}=0 bl−1=0,那么** y l − 1 {y}_{l-1} yl−1是在0附近的均值为0的对称分布**,当激活函数为ReLU时,有 E [ x l 2 ] = 1 2 Var [ y l − 1 ] E\left[x_{l}^{2}\right]=\frac{1}{2} \operatorname{Var}\left[y_{l-1}\right] E[xl2]=21Var[yl−1],带入上式得到
Var [ y l ] = 1 2 n l Var [ w l ] Var [ y l − 1 ] \operatorname{Var}\left[y_{l}\right]=\frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right] \operatorname{Var}\left[y_{l-1}\right] Var[yl]=21nlVar[wl]Var[yl−1] -
若有多层网络,则公式变为
Var [ y L ] = Var [ y 1 ] ( ∏ l = 2 L 1 2 n l Var [ w l ] ) \operatorname{Var}\left[y_{L}\right]=\operatorname{Var}\left[y_{1}\right]\left(\prod_{l=2}^{L} \frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right]\right) Var[yL]=Var[y1](l=2∏L21nlVar[wl]) -
要使输入输出的方差不变,就需要对于每一层都有
1 2 n l Var [ w l ] = 1 , ∀ l \frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right]=1, \quad \forall l 21nlVar[wl]=1,∀l -
这就能得出对于每一层只要设置 w l w_{l} wl方差为 2 / n l \sqrt{2 / n_{l}} 2/nl的高斯分布即可
-
-
讨论
-
使用高斯分布时训练深层网络会出现梯度消失现象
-
变量的方差会从头到尾保持,如果输入没有标准化,方差的量级将会变得很大导致softmax overflow
-
使用PReLU后,初始化公式变为 1 2 ( 1 + a 2 ) n l Var [ w l ] = 1 \frac{1}{2}\left(1+a^{2}\right) n_{l} \operatorname{Var}\left[w_{l}\right]=1 21(1+a2)nlVar[wl]=1
-
与Xavier初始化的比较
-
Xavier只考虑 n l Var [ w l ] = 1 n_{l} \operatorname{Var}\left[w_{l}\right]=1 nlVar[wl]=1,设置方差为 1 / n l \sqrt{1 / n_{l}} 1/nl
-
Kaiming考虑 1 2 n l Var [ w l ] = 1 \frac{1}{2} n_{l} \operatorname{Var}\left[w_{l}\right]=1 21nlVar[wl]=1,设置方差为 2 / n l \sqrt{2 / n_{l}} 2/nl
-
两种初始化都能使浅层网络收敛,但Kaiming能使深层网络收敛并且速度更快
-
-
这篇关于《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》论文阅读笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!