PReLU——Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
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的更多相关文章
- [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 ...
- 微软亚洲实验室一篇超过人类识别率的论文:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification ImageNet Classification
在该文章的两大创新点:一个是PReLU,一个是权值初始化的方法.下面我们分别一一来看. PReLU(paramter ReLU) 所谓的PRelu,即在 ReLU激活函数的基础上加入了一个参数,看一个 ...
- AlexNet论文翻译-ImageNet Classification with Deep Convolutional Neural Networks
ImageNet Classification with Deep Convolutional Neural Networks 深度卷积神经网络的ImageNet分类 Alex Krizhevsky ...
- 1 - ImageNet Classification with Deep Convolutional Neural Network (阅读翻译)
ImageNet Classification with Deep Convolutional Neural Network 利用深度卷积神经网络进行ImageNet分类 Abstract We tr ...
- 《ImageNet Classification with Deep Convolutional Neural Networks》 剖析
<ImageNet Classification with Deep Convolutional Neural Networks> 剖析 CNN 领域的经典之作, 作者训练了一个面向数量为 ...
- C++ Low level performance optimize 2
C++ Low level performance optimize 2 上一篇 文章讨论了一些底层代码的优化技巧,本文继续讨论一些相关的内容. 首先,上一篇文章讨论cache missing的重要性 ...
- C++ Low level performance optimize
C++ Low level performance optimize 1. May I have 1 bit ? 下面两段代码,哪一个占用空间更少,那个速度更快?思考10秒再继续往下看:) //v1 ...
- [notes] ImageNet Classification with Deep Convolutional Neual Network
Paper: ImageNet Classification with Deep Convolutional Neual Network Achievements: The model address ...
- ImageNet Classification with Deep Convolutional Neural Networks(译文)转载
ImageNet Classification with Deep Convolutional Neural Networks Alex Krizhevsky, Ilya Sutskever, Geo ...
随机推荐
- [转载]Linux crontab命令解析
名称 : crontab crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表.-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权 ...
- C# 参数关键字params的作用
为了将方法声明为可以接受可变数量参数的方法,我们可以使用params关键字来声明数组,要求: (1)在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params ...
- Xcode 提交APP时遇到 “has one iOS Distribution certificate but its private key is not installed”
解决办法:登录Apple开发证书后台,把发布版证书.cer文件下载到本地,双击安装即可.若还没有设置发布证书文件,则创建一个后下载. Ref: https://blog.csdn.net/dingqk ...
- [iOS]被忽略的main函数
如同任何基于C的应用程序,程序启动的主入口点为iOS应用程序的main函数.在iOS应用程序,main函数的作用是很少的.它的主要工作是控制UIKit framework.因此,你在Xcode中创建任 ...
- VS2015菜单栏重复删除
举个例子,这个是工具栏的,出现了重复 只要选择工具栏自定义那个选项,在多余命令的下方,先删除几个外部命令,然后把空行删除,最后全部重置即可 结果如下图
- Red Hat 7.5 Yum Replacement
This system is not registered with an entitlement server. You can use subscription-manager to regist ...
- 【项目笔记】完成一个基于SSM框架的增删改查的模块后总结的问题
最近为了准备新工作重新摸出了SSM框架,同时从0学习了JQuery,终于用一周做完了一个包括增删改查的模块(主要是属性太多了,其中一个类50+,复制粘贴耗时). 从中特意记下了几个遇到的问题,总结一下 ...
- less使用
Less在浏览器上使用的方法 <link rel="stylesheet" type="text/less" href="styles.less ...
- background-image大小和位置的设置
1.background-position: 当背景图很大时,可以让其固定显示在不同的位置.剩下的会隐藏. 引入背景图片:background-image: url("img/banner. ...
- FreeRTOS内存管理
简介 Freertos的内存管理分别在heap_1.c,heap_2.c,heap_3.c,heap_4.c,heap_5.c个文件中,选择合适的一种应用于嵌入式项目中即可. 本文的图片中 红色部分B ...