1. 摘要

在 \(ReLU\) 的基础上作者提出了 \(PReLU\),在几乎没有增加额外参数的前提下既可以提升模型的拟合能力,又能减小过拟合风险。

针对 \(ReLU/PReLU\) 的矫正非线性,作者设计了一个鲁棒的的参数初始化方法。

2. 介绍

在过去几年,随着更强大网络模型的构建和有效防止过拟合策略的设计,我们在视觉识别任务上取得了长足的进步。一方面,由于网络复杂性的增加(比如增加深度、扩大宽度)、小步长的使用、新的激活函数和更成熟的网络层设计,神经网络变得更加能够拟合训练数据。另一方面,有效的正则化技术、数据增广和大规模的数据让网络获得了更好的泛化能力。

其中,激活函数 \(ReLU\) 是其中一个非常关键的因素,本文在此基础上做了两点主要改进。首先,我们提出了一个新的激活函数 \(PReLU\) (Parametric Rectified Linear Unit),该激活函数可以自适应地学习矫正线性单元的参数,并且能够在增加可忽略的额外计算成本下提高准确率。其次,我们研究了模型训练的难度,得出了一种理论上合理的初始化方法,有助于深层网络模型的收敛。

3. PReLU

我们设计的激活函数定义如下:

其中,\(y_i\) 是非线性激活函数 \(f\) 在第 \(i\) 个通道的输入,\(a_i\) 负责控制负半轴的斜率。在这里,我们允许不同通道的激活函数不一样。当 \(a_i=0\) 时,\(PReLU\) 就变成了 \(ReLU\),而且 \(a_i\) 是一个可以学习的参数。

如果 \(a_i\) 是一个小的固定值,那么 \(PReLU\) 就变成了 \(LReLU\)(Leaky ReLU)。\(LReLU\) 的动机是为了避免零梯度,实验表明 \(LReLU\) 相较 \(ReLU\) 对准确率几乎没有提高。但是,作者希望模型能够自适应地学习 \(PReLU\) 的参数,从而能够得到更专门的激活函数。

另外,作者也设计了一个通道共享的变体,也就是同一层网络所有通道共享同一个参数,这样,每一层仅仅引入了一个额外的参数。

在反向传播过程中,\({a_i}\) 的更新公式可以通过链式法则求出,\(\varepsilon\) 代表目标函数。

然后,采用动量的方法来更新 \({a_i}\) :

作者没有使用权重衰减(L2 正则化),因为这样会让 \({a_i}\) 趋向于 0。在实验中,即使没有正则化,学习到的系数幅度也很少会大于 1。而且,对 \({a_i}\) 的范围也未做限制,因此激活函数也可能是非单调的。

作者设计了一个简单的网络来验证 \(PReLU\) 的有效性,学习到的系数如下表所示。

这其中,有两个有意思的现象。一,第一个卷积层的系数远远比 0 要大(0.681, 0.596),因为这一层的卷积核大部分是类 Gabor 过滤器,比如说边缘、纹理检测器,学习到的结果表明卷积核的正负响应都被接受。这在卷积核数量有限的情况下,可以被认为是一个更加经济地利用低层次信息的方式。二,对于通道独立的激活函数,较深的卷积层通常具有较小的系数。 这意味着激活函数在深度增加时逐渐变得“更加非线性”。 换句话说,学习模型倾向于在较早阶段保留更多信息,并在更深层次阶段变得更具辨别力。

针对通道共享的版本,\(PReLU\) 仅仅引入了 13 个额外的参数,却取得了相对于基线情况 1.1% 的提升,这也表明了自适应学习激活函数形状的重要性。

4. 卷积核权重的初始化

近来,深层卷积神经网络的权重都是用正态分布来初始化的。若采用固定的标准差,非常深的模型很难收敛。对此,我们可以采取预训练的方式来初始化模型,但这样就需要更长的训练时间。先前的学者也提出了一个 \(Xavier\) 初始化方法,但它针对的是激活函数满足线性的情况, \(ReLU/PReLU\) 却不满足这个特性。

4.1. 前向传播情况

针对一个卷积层,其前向传播为:

\(x\) 是一个 \(k^2c*1\) 的向量,代表 \(c\) 个通道 \(k×k\) 区域的像素,\(k\) 是卷积核的大小,\(n=k^2c\) 代表一个激活值局部连接的像素个数。\(W\) 是一个 \(d×n\) 的矩阵,\(d\) 是卷积核的个数,\(W\) 的每一行代表一个卷积核的权重。我们用 \(l\) 来标识某一层,则有 \(x_l=f(y_{l-1})\),\(f\) 是激活函数,且有 \(c_l=d_{l-1}\)。

我们让 \(W_l\) 初始化的元素互相独立且同分布,然后假设 \(x_l\) 中的元素也是互相独立并且同分布的,而且 \(x_l\) 与 \(W_l\) 互相独立,那么有:

\(Var[X_1+X_2+\cdots+X_n] = Var[X_1] + Var[X_2] + \cdots +Var[X_n]\),如果 \(X_1,X_2,\cdots,X_n\) 互相独立,这里每个 \(w_l^i*x_l^i\) 是互相独立的,总共对 \(n_l\) 项求和。

让 \(w_l\) 具有零均值,然后有:

\[Var[X]=E[X^2]-(E[X])^2\]
\[Var[w_l] = E[w_l^2]-(E[w_l])^2=E[w_l^2]\]
\[E[w_l]E[x_l] = 0*E[x_l]=0\]
\[Var[w_lx_l]=E[(w_lx_l)^2]-(E[w_lx_l])^2=E[w_l^2]E[x_l^2]-(E[w_l]E[x_l])^2=Var[w_l]E[x_l^2]\]

这里,\(E[x_l^2] \not = Var[x_l]\),因为 \(ReLU\) 激活函数关于原点不对称,\(x_l\) 均值不为 0。

如果让 \(w_{l-1}\) 关于原点对称分布并且 \(b_{l-1}=0\),那么 \(y_{l-1}\) 也具有对称分布并且均值为 0。那么有:

\[Var[y_{l-1}] =E[y_{l-1}^2]-(E[y_{l-1}])^2=E[y_{l-1}^2]\]

经过 \(ReLU\) 激活函数后,一半的 \(y_{l-1}\) 变成了 0,所以有:

\[E[x_l^2]=\frac{1}{2}E[y_{l-1}^2]=\frac{1}{2}Var[y_{l-1}] \]

代入前面的式子,可得:

把 \(L\) 层网络放在一起,则有:

这个乘积是初始化参数的关键。一个合适的初始化方式应该避免指数级减少或者放大输入信号的幅度,因此我们期望上面的乘积有一个合理的尺度,比如 1。

这就是一个零均值标准差为 \(\sqrt{2/n_l}\) 的正态分布,也就是作者提出的参数初始化方式,同时,初始化偏置 \(b=0\)。

针对第一层网络,对输入我们没有应用激活函数,因此应该有 \(n_1Var[w_1]=1\),但这只有一层,为了简化,所有层的参数我们都按照上面的式子来初始化。

4.2. 反向传播情况

同理,一个卷积层的反向传播可以表示为:

这里,为了简化,\(\Delta x\) 和 \(\Delta y\) 就代表相应变量的梯度。

\(\Delta y\) 代表 \(d\) 个通道 \(k×k\) 区域的像素,被调整为了一个 \(k^2d*1\) 的向量。\(\hat n=k^2d\not =n\),\(\hat W\) 是一个 \(c×\hat n\) 的矩阵,\(\Delta x\) 是一个 \(c*1\) 的向量,代表这一层每个像素的梯度值。

假设 \(w_l\) 和 \(\Delta y_l\) 互相独立,\(w_l\) 关于原点对称且具有零均值,那么 \(\Delta x_l\) 也具有零均值。同时,我们有:

\[\Delta y_l=f'(y_l)\Delta x_{l+1}\]

如果激活函数是 \(ReLU\),那么 \(f'(y_l)\) 要么为 0 要么为 1,而且概率相等,因此有:

因子 \(\frac{1}{2}\) 的出现都是因为激活函数是 \(ReLU\),把 \(L\) 层网络放在一起,则有:

如果梯度不会指数级增大或者缩小的话,需要有:

这是一个零均值标准差为 \(\sqrt{2/\hat n_l}\) 的正态分布,和前面唯一不同的是 \(\hat n_l=k_l^2d_l\) 而 \(n_l=k_l^2c_l=k_l^2d_{l-1}\)。针对第一层网络,对输入我们不需要求梯度,但同理为了简化,所有层的参数我们都采用一样的方式来初始化。

通过前向传播得到的式子和通过反向传播得到的式子都是可行的,因为二者只是相差了一个因子。也就是说如果初始化能够适当地缩放后向信号,那么前向信号也是如此; 反之亦然。对于作者实验的所有模型,两种形式都可以使它们收敛。

针对 \(PReLU\),我们则很容易得到:

5. 实验

5.1 和 \(Xavier\) 初始化方法的对比

针对一个 22 层的模型,用本文提出的初始化方式比 \(Xavier\) 能更快收敛。

针对一个 30 层的模型,用本文提出的初始化方式可以使模型收敛,但用 \(Xavier\) 则无法收敛。

5.2 \(ReLU\) 和 \(PReLU\) 的对比

5.3 和其他模型的对比

获取更多精彩,请关注「seniusen」!

PReLU——Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification的更多相关文章

  1. [Kaiming]Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

    目录 概 主要内容 PReLU Kaiming 初始化 Forward case Backward case He K, Zhang X, Ren S, et al. Delving Deep int ...

  2. 微软亚洲实验室一篇超过人类识别率的论文:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification ImageNet Classification

    在该文章的两大创新点:一个是PReLU,一个是权值初始化的方法.下面我们分别一一来看. PReLU(paramter ReLU) 所谓的PRelu,即在 ReLU激活函数的基础上加入了一个参数,看一个 ...

  3. AlexNet论文翻译-ImageNet Classification with Deep Convolutional Neural Networks

    ImageNet Classification with Deep Convolutional Neural Networks 深度卷积神经网络的ImageNet分类 Alex Krizhevsky ...

  4. 1 - ImageNet Classification with Deep Convolutional Neural Network (阅读翻译)

    ImageNet Classification with Deep Convolutional Neural Network 利用深度卷积神经网络进行ImageNet分类 Abstract We tr ...

  5. 《ImageNet Classification with Deep Convolutional Neural Networks》 剖析

    <ImageNet Classification with Deep Convolutional Neural Networks> 剖析 CNN 领域的经典之作, 作者训练了一个面向数量为 ...

  6. C++ Low level performance optimize 2

    C++ Low level performance optimize 2 上一篇 文章讨论了一些底层代码的优化技巧,本文继续讨论一些相关的内容. 首先,上一篇文章讨论cache missing的重要性 ...

  7. C++ Low level performance optimize

    C++ Low level performance optimize 1.  May I have 1 bit ? 下面两段代码,哪一个占用空间更少,那个速度更快?思考10秒再继续往下看:) //v1 ...

  8. [notes] ImageNet Classification with Deep Convolutional Neual Network

    Paper: ImageNet Classification with Deep Convolutional Neual Network Achievements: The model address ...

  9. ImageNet Classification with Deep Convolutional Neural Networks(译文)转载

    ImageNet Classification with Deep Convolutional Neural Networks Alex Krizhevsky, Ilya Sutskever, Geo ...

随机推荐

  1. android实现静默安装demo

    1.须要RootTools.jar 2.运行脚本 public class InstallerActivity extends Activity {     /** Called when the a ...

  2. oracle中的某一个用户名修改

    1若修改某一个用户密码,修改用户口令格式为:alter user 用户名 identified by 新密码: 2以system 为例,想把密码修改为123456. 可输入alter user sys ...

  3. Web—08-移动端库和框架

    移动端js事件 移动端的操作方式和PC端是不同的,移动端主要用手指操作,所以有特殊的touch事件,touch事件包括如下几个事件: 1.touchstart: //手指放到屏幕上时触发 2.touc ...

  4. DBA手记(学习)-RAC环境下GES TX报警情况处理

    GES ... TX-... GES的全称是Global Enqueue Service,用于RAC环境的全局共享队列.从提示信息可以看出,目前的锁定是DML引发的行级锁(TX). 检查v$lock_ ...

  5. Struts2+AJAX+JQuery 实现用户登入与注册功能

    要求:必备知识:JAVA/Struts2,JS/JQuery,HTML/CSS基础语法:开发环境:MyEclipse 10 关于UI部分请查看下列链接,有详细制作步骤: 利用:before和:afte ...

  6. iOS:通信录(完成)(18-01-18更)

    1.读取通信录 1).9.0以前:AddressBook 2).9.0以后:Contacts 2.调用通信录UI(不弄) 1).9.0以前:AddressBookUI 2).9.0以后:Contact ...

  7. docker_Dockerfile_docker hub简单使用搭建nginx

    Docker for Windows是Docker for Microsoft Windows 的Community Edition(CE).要下载Docker for Windows,请前往Dock ...

  8. ubuntu SDL2 安装时依赖文件导致安装失败

    今天打算学习littlev GUI,使用Ubuntu来实现仿真,然后在安装SDL2的时候,始终因为依赖关系导致安装失败,我尝试手动去安装那些有依赖关系的包发现根本不可行,然后我百度上也没有找到合适的法 ...

  9. ping ipconfig telnet

    //查看本机IP ipconfig 内网拼其他机子, 其他机子一定要关闭防火墙 ping 192.168.198.46 telnet  192.168.198.46 3000     拼端口  会跳转 ...

  10. react中如何获取onclick事件调用元素的dom对象

    今天终于有时间写博客了, 前几天项目有个需求,我感觉用dom操作兄弟元素实现比较方便,但是前端用的react框架不能用jquery的$(this)获取当前元素,查了好多资料和尝试后写下总结: 在HTM ...