[笔记]effective backprop

翻译自effective backprop, Yann LeCun

stochastic vs batch learning

stochastic learning的优势

  • 通常比batch更快。因为在训练数据中,可能有很多重复或者类似的数据。stochastic通过抽样,可以降低重复数据的比例,使得模型更快的学到信息。而batch则要一块儿计算所有数据,显然是浪费的。

  • 通常容易达到更优。batch得到的最优点受初始值影响很大。而stochastic则因为在训练过程中有噪音的加入,更有机会跳过局部最优,达到全局最优。

  • 方便追踪变化。当数据分布随着时间发生变化时,显然stochastic方法更容易随之改变。

Batch learning的优势

  • 收敛条件更容易理解。

  • 可以使用很多加速算法。比如共轭梯度

  • 理论分析更方便。跟1有点类似。

这些优势都是因为没有stochastic中的训练噪音所致。其实就是一个硬币的正反两面。
正是因为有了噪音,stochastic会容易跳进全局最优的洞里,但也正是因为这个,所以stochastic很难收敛到最优点上,而是在那个点附近左右晃动(噪音区),晃动幅度和学习因子成正比。因此我们才需要逐渐缩小学习因子。
不过训练噪音往往没有我们想的那么严重,通常,在达到“噪音区”之前,overfitting就已经开始作用了。

Shuffle Examples

当模型遇到之前没见过的样本时,可以学到更多信息。有2个比较简单的做法:

  • 连续的iter之间提供不同label的样本。

  • 观察预测误差,提高误差较大的样本作为训练输入的概率

Normalize Input

均值要接近0

通常,每维输入的均值如果能接近0,那么收敛速度将很大加快。
举一个极端例子,如果输入x每一维都是正的,根据bp算法,$\Delta w = \delta x$, $\delta$是bp回溯来的误差,它的计算有点复杂,这里可以当成一个整体。现在$x$的每一维都是正的,那么$\Delta w$的符号就完全受$\delta$的影响,而且都是同号的。这就意味着,$\Delta w$每一维的改变都是同向的,要么同时增加,要么同时减少,这点就很难受,如果需要有些维度增加,有些减少,就需要通过zig-zag的形式前进。训练速度自然就慢了。

各维度的方差也必须一致

确切的说是要和我们使用的激活函数匹配。如果有些维度方差大,有些方差小,不同维度的前进速度就不一样,而我们的激活函数很多都是有饱和区的,一旦进入饱和区就很难前进。
一个例外就是,我们知道某些维度不重要,此时可以降低它的方差,让训练过程一定程度忽略它。

去相关性

前2个很容易实现,但是去相关性就会略难。一般采用PCA,它可以去除输入各维度之间的线性依赖。

Sigmoid函数

根据以上归一化要求,对称sigmoid函数,比如tanh函数$f(x) = \frac{e^x – e^{-x}}{e^x + e^{-x}}$,比非对称函数,比如logistic函数$f(x) = \frac{1}{1+e^{-x}}$更好,所以我们一般选择tanh函数。不过对称sigmoid函数的一个问题是:

  • 在输入很小的时候,函数输出接近0,$\Delta w$接近0. 此时可能无法前进。

  • 同时在输入很大的时候,函数导数接近0,$\Delta w$依然接近0.

而logistic函数只会在输入很大的时候,$\Delta w$接近0。

选择target value

很多时候,我们觉得选择激活函数的渐近值作为目标值就行了,事实上那样会迫使模型学到很大的参数,不仅使得模型过拟合,还会减慢模型的学习速度,因为在这个区域$\Delta w$接近0。

所以,可以选择这个函数:
$$ f(x) = 1.7159 \cdot tanh(\frac{2}{3}x)$$
它在$f$取$\pm1$的点上,正好是二阶导数的极值点。
这是有讲究的,如果$\pm1$的位置太接近线性区,就变成线性拟合了,太远就进入了饱和区。这样选既保证了非线性性,又防止模型太快进入饱和区。

weight初始化

weight初始化的意义是,首先使sigmoid作用在线性区,提高开始阶段的学习速度,同时线性关系也比较容易学习。
假设输入层的变量是按照上面要求归一化的,同时选择的激活函数是$f(x) = 1.7159 \cdot tanh(\frac{2}{3}x)$,那么每一层的weight可以从这个均值为0,方差为$\sigma_i = m^{-1/2}$的正态分布中获得,其中$m$是输入维度。

deeplearning.net上提供的方法跟这个不同,因为它选择的是tanh(x)函数,所以方差需要改变,而且它是从以下的平均分布中随机取$w$的。
$$\big[-\sqrt{\frac{6}{fan_{in}+fan_{out}}},\sqrt{\frac{6}{fan_{in}+fan_{out}}} \big]$$

选择学习因子learning rate(lr)

一般人们都认同,当训练过程中,cost function曲线开始震荡时,减小lr,当曲线没有太大改变时,增加lr。但是对于stochastic训练,cost function一直都是震荡的,所以并不适用。

另外,针对不同的参数选择不同的学习因子也是有好处的,比如较低层上的$w$需要一个比较大的学习因子,而高层上的$w$则需要一个比较小的学习因子,因为在多数情况下,低层上的二阶导数比较小,即曲面比较平缓,所以需要步子迈大些,lr要大些;而高层上的二阶导数比较大,所以lr要小些。一个类似的情况是,学习因子要和输入维度的平方根成正比,即输入维度多的时候,lr可以大些,维度少的时候,lr要小些。,lr其实反应的是cost function的高阶导数,但是很多时候,二阶、或者高阶导数非常难以计算,所以只能取个近似值

Momentum势能算法

势能算法可以看做是对二阶导数的近似,公式如下:

$$\Delta w(t+1) = \eta \frac{\partial E_{t+1}}{\partial w} + \mu \Delta w(t)$$

它由2个梯度组成,在比较曲折的平面上,前后两个梯度可能会异号,从而互相抵消,而在比较平坦的平面上,又会相互增强。所以说它是对二阶导数的近似。

    原文作者:flybywind
    原文地址: https://segmentfault.com/a/1190000007625167
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞