PReLUNet

本文探讨了PReLU激活函数如何改进ReLU的不足,通过引入可学习参数解决了反向传播问题,并降低了ILSVRC2012数据集的top5错误率至4.94%。同时,文章介绍了针对ReLU网络的权重初始化方法,有效避免了梯度爆炸和消失,对深度神经网络的训练进行了优化。
部署运行你感兴趣的模型镜像

Paper : Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
Code : unofficial

概要

PReLU Net 其实并不是一种网络结构,而是一种新的激活函数,这种激活函数尝试解决ReLU函数在输入为负数时带来的反向传播停止的问题,而我认为这篇文章的更重要的一点是它提出了一种参数初始化的方法,优化了深度神经网络的训练过程,解决了梯度爆炸和梯度消失的问题。

激活函数

PReLU的全称是Parametric ReLU,相比ReLU和Leaky ReLU引入了可学习得参数。

image.png

左侧即为朴素的ReLU激活函数,而右侧即为PReLU激活函数,形式化的定义方式如下

PReLU ( y ) = { y y ≥ 0 a y y < 0 \text{PReLU}(y) = \left\{\begin{matrix} y& y\geq 0\\ ay& y<0 \end{matrix}\right. PReLU(y)={yayy0y<0

在a的值固定为小常数 ϵ \epsilon ϵ时,PReLU变换为Leaky ReLU。由于PReLU引入了参数,我们可以令该参数为全局共享或是通道共享,获得不同的效果。根据论文中的实验结果,PReLU可以将ILSVRC 2012 数据集的top5的错误率降至4.94%,首次超越了人类的5.1%,的确可以带来模型表现效果的提升,但是近些年来没有太多模型使用PReLU,说明PReLU的作用以trick居多。

权重初始化

个人认为指导整流线性网络(以ReLU为主而不是Sigmoid作为激活函数的网络)卷积层权重初始化的方式才是这篇文章的精髓。

对于第 l l l层的卷积层,如果只考虑卷积区域的结果,因为卷积是线性操作,则输出的结果可以表示为如下形式

y l = W l x l + b l \textrm{y}_l = \textrm{W}_l \textrm{x}_l+\textrm{b}_l yl=Wlxl+bl

设输入 x l \textrm x_l xl k × k × c k\times k\times c k×k×c的规模, k k k为卷积核的长度和宽度, c c c为输入的通道大小,输出通道的大小(卷积核的个数)为 d d d,令 n = k 2 c n = k^2 c n=k2c,则 W l \textrm W_l Wl的大小为 d × n d\times n d×n,也就是卷积核对应的矩阵。可以理解成将输入 x l \textrm x_l xl拍扁成 n × 1 n\times 1 n×1的向量,然后使用矩阵乘法的方式求卷积。

如果 y l , W l , x l \textrm{y}_l, \textrm{W}_l, \textrm{x}_l yl,Wl,xl中每个矩阵(向量)中的值都是独立同分布的,那么有如下式子

Var [ y l ] = n Var [ w l x l ] \text{Var}[y_l] = n \text{Var} [w_lx_l] Var[yl]=nVar[wlxl]

其中 y l , w l , x l y_l,w_l,x_l yl,wl,xl分别为 y l , W l , x l \textrm{y}_l, \textrm{W}_l, \textrm{x}_l yl,Wl,xl某位置上的值,如果假设 x l x_l xl的均值为0,则有

Var [ y l ] = n Var [ w l ] E [ x l 2 ] \text{Var}[y_l] = n \text{Var} [w_l]\text E[x_l^2] Var[yl]=nVar[wl]E[xl2]

如果我们使用激活函数为ReLU,则有 x l = ReLU ( y l − 1 ) x_l = \text{ReLU}(y_{l-1}) xl=ReLU(yl1)。如果我们令 w l w_l wl的分布是关于0对称的, b l − 1 = 0 b_{l-1}=0 bl1=0,那么 y l − 1 y_{l-1} yl1的分布就是关于0对称的,因此有

E [ x l 2 ] = 1 2 Var [ y l − 1 ] \text E[x_l^2] = \frac{1}{2}\text{Var}[y_{l-1}] E[xl2]=21Var[yl1]

根据递推式可以得到如下表达式

Var [ y L ] = Var [ y 1 ] ∏ l = 2 L 1 2 n l V a r [ w l ] \text{Var}[y_L] = \text{Var} [y_1] \prod_{l=2}^L \frac{1}{2}n_l\text Var[w_l] Var[yL]=Var[y1]l=2L21nlVar[wl]

如果想要避免梯度爆炸和梯度消失,最好的初始化卷积层参数的方法是令参数满足如下式子

1 2 n l Var [ w l ] = 1          ∀ l ∈ { 1 , 2 , . . . L } \frac{1}{2}n_l \text{Var} [w_l] = 1\;\;\;\; \forall l \in \{1,2,...L\} 21nlVar[wl]=1l{1,2,...L}

也就是说,令第 l l l层的卷积核分布为 N ( 0 , 2 n l ) N(0,\frac{2}{n_l}) N(0,nl2) b l b_l bl初始化为0。

核心观点

  1. 非线性激活函数ReLU构成的网络,不能采用Xavier的初始化方法,而应当用$w_l \sim N(0,\frac{2}{n_l});;b_l = 0 $的方式。
  2. PReLU替换ReLU可以改善模型的表现,但是trick居多。

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值