上一章传送门:深度学习参数初始化详细推导:Xavier方法和kaiming方法【一】
2. kaiming初始化上一章说到Xavier方法并不适用于ReLU函数,但ReLU函数早已经用得越来越广泛,这可怎么办?时代在召唤,kaiming大神出手了,2015年的论文[1]完美解决了这个问题,提出的kaiming初始化方法专门针对ReLU函数及其变种,达到了和Xavier一样的效果,可以说是Xavier的升级版。 这篇论文[1]针对的是CNN结构的网络,主要的贡献一是提出了ReLU的变种PReLU,另一个就是kaiming初始化方法。PReLU不是今天的重点,大概说一下,如下图,很像Leaky ReLU,差别只是参数 不是常数,而是可训练的。 kaiming方法虽然提出来是针对CNN的,但其实完全可以用到普通的DNN中,下面我们的推导先假定是普通的DNN网络,后面再专门讨论CNN的情况。 2.1 符号约定依旧入乡随俗,数学符号尽量和论文一致。 网络层数为 ,第 层的输入列向量为 ,状态向量为 ,参数矩阵为 ,偏置向量为 , 为激活函数,则有 2.2 公式推导所有偏置项 依然是初始化为0;假定 的每个元素在初始化阶段独立同分布,且采样分布为对称分布,均值为0,方差统一记为 ,这样就有 ;再假定 的所有元素也是独立同分布,且 和 相互独立。 前向传播情况根据 ,有 上式换成方差形式: 由于激活函数是ReLU, 不可能为0,因此 是对称分布且均值为0,根据 可以得出 也是对称分布的。证明如下:
有了 分布的对称性,设 的概率密度函数为 ,激活函数为 ,我们就可以直接算一下 : 代入(9)式,就有 然后递归一下,看最后一层 的方差: 为了让各层的 和 相等保持不变,只需要: 严格来讲,对于第一层,即 ,(12)式要把1/2去掉,因为原始的输入 并没有经过ReLU函数,我们假定它是符合对称分布的。不过论文也说了,为了简单,所有层都可以按(12)处理,影响并不大。 后向传播情况这一部分CNN和DNN有些差异,我这里公式符号不再严格和论文一致,思路是一致的。 损失函数用 表示,对向量 的偏导为 维的行向量: 其中任意一个元素 可以展开如下: 由 ,易知 ,进而 然后计算 , 这里先将 展开 这里 是激活函数ReLU的导函数,根据 的对称分布特性,可知 有50%的概率为1,50%的概率为0。 由 可知 ,因此 代入前面的公式(b)即有 递归下去,便有 因此保持梯度方差稳定,只需要: 同样严格来讲,对于第一层即 来说,约束(16')是不必要的,因为 是原始输入,不需要计算 ,但为了简单和统一,同样让满足(16'),对结果影响可忽略。 两个约束条件的关系通过前向和后向的分析,我们得到两个约束条件(12)和(16'),和Xavier方法对比一下可以发现只是差了一个常数项1/2。 同样的问题,当各层维度不等时,(12)和(16')无法同时满足,当然也可以像Xavier方法一样整个折衷方案,不过论文里又做了一番分析,认为只要任选一个约束就行。其实也很好理解,比如我们选(16')式成立,即让 ,那么后向传播方差稳定自不必说,看一下前向的情况,公式(11)中的系数变成了 因为连乘都约掉了,这个系数虽然不是1,但也不会随层数指数衰减或增大,只要各层维度相差不要太大,这个系数都可以接受。反过来选(12)成立也是一样的,所以没必要再整折衷方案。这个分析其实对Xavier方法一样是成立的。 还有跟我们在上一章提到的一样,有时我们特意需要缩放方差 倍,只需要将(12)和(16')等式右边的1改成 即可。 2.3 推广到PReLU2.2的分析都是假设激活函数为ReLU,下面将其推广到PReLU函数。PReLU的形式为: 不是固定常数而是可学习的参数,带下标表示不是全局唯一的,而是可以每层共享同一个(称为channel-shared),或者每个channel都对应一个单独的(称为channel-wise)。不过在初始化阶段我们都用同一个值 初始化所有的 ,所以这时候是等价于Leaky ReLU函数,参数为 。当 时就退化成了ReLU。 前向传播情况对应2.2,需要修改公式(a): 代入(9)式,就有 所以约束条件(12)变成了 后向传播情况对应2.2, 变为激活函数PReLU的导函数,根据 的对称分布特性,可知 有50%的概率为1,50%的概率为 。这样就有 有50%的概率为1,50%的概率为 ,即其期望为 。公式(c)修改为 代入公式(b)即有 所以约束条件(16')变成了 2.4 具体实现因为初始化阶段ReLU可以看作是PReLU在 下的特例,所以我们统一按PReLU处理。 的每个元素 初始化采用均值为0的分布,且要求方差相同,满足约束(12-PReLU)或约束(16’-PReLU)。通常采用均匀分布或正态分布,以(12-PReLU)式为例,具体为: PyTorch中提供了这两个初始化函数:
参数mode可选fan_in和fan_out,fan_in对应前向,fan_out对应后向。 2.5 CNN的情况一图胜千言,我这里画了个示意图,将CNN的卷积过程转换为类似于DNN的矩阵相乘运算。 原始论文中是针对CNN网络,跟我前面推导的主要差异在于 和 的意义不同,论文中对应的符号是 和 。 对于普通的DNN网络, 和 的意义很简单,就是第 层的输入和输出维度, 同时也是第 层的输入维度。 对于CNN网络,比较复杂,论文中给出的 ,其中 来自于第 层filter的尺寸 , 为输入channel数量。 就对应于上图 矩阵列数,具体为 ,filter尺寸为 ,输入channel数量为3。 前向过程看论文中公式(7) : 为列向量,维度就是 ,对应图中 矩阵的一行,。我画图为了方便,改成了行向量,包括 和 ,可以理解为都是转置的关系。 维度为 ,即 ,对应图中 ,转置关系。 为fitler数量,对应图中为2,也就是下一层网络的输入channel数量,因此有 为列向量,维度是 ,对应图中 矩阵的列数,为2。 后向过程看论文中公式(13) : 和 分别表示 和 的列向量形式,按我之前的约定,就是: 维度为 , 维度为 , 维度为 注意,这里的 和前向过程的完全不是一个概念。对照图,我们可以这么理解,对于这一层的输入图像 的一个非边缘像素点 (上图为了简单,输入尺寸很小只有 ,导致只有一个点非边缘,实际场景尺寸一般大得多,非边缘点占大多数),维度为输入channel数 ,这个像素点在前向传播中被每个filter做 次卷积, 个filter就一共做 次卷积,每次卷积都会参与到一个不同的 的更新运算,一共参与 个 的运算,在此图中恰好覆盖了 的所有元素,展开成向量就是 对应的矩阵为 ,即维度为 ,图中没有画出,其实还是图中 矩阵里的那些元素,只是需要重新排列一下。 因此有 上式正是论文中的公式(13)。 两个约束条件的关系弄清楚了 和 的含义,其他就和2.2的推导没啥太大差别了。 而且因为 和 ,当我们按论文中约束公式(16)初始化时,即 ,公式(11)的系数 同样不会随层数指数衰减或增大,是个可接受的值,跟2.2结论一致。 参考文献[1] He K, Zhang X, Ren S, et al. Delving deep into rectifiers: Surpassing human-level performance on imagenet classification[C]//Proceedings of the IEEE international conference on computer vision. 2015: 1026-1034. 都看到这儿了,何不关注一下 |
|