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. Machine Learning In Action

    The mind-road of "Machine Learning In Action". Read though the book totally by English!!

  2. 『ACM C++』 PTA 天梯赛练习集L1 | 029-033

    哈哈,今天开始我也是学车人了~ 开始一千多道疯狂刷题~ ------------------------------------------------L1-029------------------ ...

  3. 利用Git Bash 远程访问服务器

    首先 先在自己的当前主机打开git bash ssh-keygen 生成密钥对 (默认就好,我自己是一直摁着回车的) cat ~/.ssh/id_rsa.pub 查看生成好的公钥,并复制好 打开你远端 ...

  4. -L -Wl,-rpath-link -Wl,-rpath区别精讲

    目录 前言 源码准备 源码内容 尝试编译,保证源码没有问题 编译 首先编译world.c 编译并链接hello.c 调试编译test.c 结论 转载请注明出处,谢谢 https://www.cnblo ...

  5. Mybatis 配置文件

    1.核心配置文件 sqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOC ...

  6. chrome浏览器页面获取绑定返回顶部动画事件插件

    在chrome浏览器下页面加载: var top = $("body").scrollTop()  ; console.log(top)                      ...

  7. Promise 的应用

    Promise 有三种状态,进行中(pending),已成功(fulfilled),已失败(rejected): 一旦状态改变,就不会再变,任何时候都可以得到这个结果.Promise对象的状态改变,只 ...

  8. cannot find module 'xxx' 解决办法

    先将node_module文件夹删掉 工程目录下输入命令:npm clean cache 查看package.json里有没有依赖项,有的话npm install 没有就npm install exp ...

  9. 20155211 2016-2017-2 《Java程序设计》第一周学习总结

    20155211 2006-2007-2 <Java程序设计>第1周学习总结 教材学习内容总结 首先根据博客上的指导安装了jdk,并且首次尝试了设置环境变量path和classpath. ...

  10. 20155217 实验四《Java面向对象程序设计》实验报告

    20155217 实验四<Java面向对象程序设计>实验报告 一.实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局 ...