• 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] ot = 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 ot =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」!

  • 相关阅读:
    布隆过滤器(Bloom Filter) 未完待续
    [面试]future模式
    R语言入门(2)-数据对象
    R语言入门(1)-初识R语言
    [面试] Java GC (未整理完)
    [面试]StringBuilder StringBuffer源码粘贴(并非源码分析, 请绕道)
    [面试]synchronized
    [面试]volatile类型修饰符/内存屏障/处理器缓存
    [面试]死锁-最简单的死锁demo
    [面试]Actor模型
  • 原文地址:https://www.cnblogs.com/seniusen/p/10717703.html
Copyright © 2020-2023  润新知