lfkdsk / lfkdsk.github.io

2 stars 2 forks source link

Deep Learning 笔记 [5 - &] #8

Open lfkdsk opened 6 years ago

lfkdsk commented 6 years ago

Deep Learning 学习笔记 2

误差反向传播法

在第五章之中主要介绍了误差反向传播法。误差反向传播法是一种求导的方式,相较于之前的那个版本使用数值求导的方式使用计算图的计算方式能够提供更好的计算效率和记忆化(能够对各个节点进行求导、求梯度)。

使用计算图进行反向传播的流程如下:

  1. 首先构建一个计算图(对应神经网络的层)
  2. 计算图进行正向计算
  3. 通过链式法则,反向计算进行求导(梯度)

加法节点例子

反向传播的梯度计算就通过对节点的计算方式进行求偏导数: $$ z = x + y $$

求偏导数的结果:

$$ {\frac {\partial z}{\partial x}} = 1\ {\frac {\partial z}{\partial y}} = 1 $$

因此进行反向计算的时候遇到加法节点的时候都会直接放回上游的求值。

乘法节点例子

$$ z = xy $$

求偏导数的结果:

$$ {\frac {\partial z} {\partial x}} = y \ {\frac {\partial z} {\partial y}} = x $$

因此在进行反向传播计算的时候都会乘上相互的值(x 链路乘上 y、y 链路乘上 x)。

这里举了两个简单例子其余的节点都可以通过求偏导的方式来进行求值,因此在第五章之中换了反向传播的方式(而不是数值求导)进行计算,而其余的部分没有相应的改动。

SGD(stochastic gradient descent)

随机梯度下降法,之前我们所使用的方式,随机选取批次然后分析 loss 逐渐的趋向最低点。但是从这个方式来看就能知道 SGD 其实并不能一定能够带我们快速的到达其中的最低点,很可能会陷入某个 鞍点 (或者理解成局部的最低点、最高点)。书中举了这样一个例子: $$ f(x, y) = {\frac 1 {20}} x^2 + y^2 $$

从这个图里能够看出如果 SGD 选择的位置如果不太对劲的话,就会从到达他所能到达的最低点而不是整个函数的最低点。

Momentum

$$ v \leftarrow \alpha v - \eta {\frac {\partial L} {\partial W}} \ $$

$$ W \leftarrow W + v $$

Momentum 是一个新的梯度更新策略,其中的 $\eta{\frac {\partial L} {\partial W}}$ 是损失函数关于 W 的梯度,$\eta$ 是一个学习率(一个固定的值)。第一个式子之中表示了物体在梯度方向上受力,在这个力的作用之下物体的速度不断产生变化(结合这两个式子来看能够看出感觉 W 上每次是加一个在摩擦力一样)。

class Momentum:
    """Momentum SGD"""
    def __init__(self, lr=0.01, momentum=0.9):
        self.lr = lr
        self.momentum = momentum
        self.v = None

    def update(self, params, grads):
        if self.v is None:
            self.v = {}
            for key, val in params.items():                                
                self.v[key] = np.zeros_like(val)

        for key in params.keys():
            self.v[key] = self.momentum*self.v[key] - self.lr*grads[key] 
            params[key] += self.v[key]

书中描述把这个下降的过程描述为一个小球在碗里面震荡的过程,这个描述非常贴合这个算法过程。在小球不小心从左侧越过了最低点的时候,梯度就会调转方向,因此对方向施加的速度就能够让小球向相反的方向继续前进。

而且在选择方向上来讲,在 X 轴方向收到的力虽然小,但是一直有速度施加到这个上面。Y 轴上面的受力虽然比较大,但是因为会受到两端方向的力会相互抵消(速度不稳定)因此会更为快速的接近最低点。

AdaGrad

learning rate decay 学习率衰减:

随着学习的不断进行学习率会不断进行降低、衰减,这个很好理解可以简单理解成从最开始的粗粒度不断地进步到更细的粒度。

$$ h \leftarrow h + {\frac {\partial L} {\partial W}} \odot {\frac {\partial L} {\partial W}} $$

$$ W \leftarrow W - \eta {\frac 1 {\sqrt{h}}} {\frac {\partial L} {\partial W}} $$

W 的计算过程之中增加了一个 ${\frac 1 {\sqrt {h}}}$ ,从第一个式子之中可以看出 h 之中保存的是所有梯度的平方和( $\odot$ 代表矩阵乘法 )。乘以 ${\frac 1 {\sqrt {h}}}$ 就意味着波动幅度较大(较大幅度更新)的学习率会被变小。而波动幅度较小的,学习率则会变大。

AdaGrad会记录过去所有梯度的平方和。因此,学习越深入,更新 的幅度就越小。实际上,如果无止境地学习,更新量就会变为 0, 完全不再更新。为了改善这个问题,可以使用 RMSProp [7]方法。 RMSProp方法并不是将过去所有的梯度一视同仁地相加,而是逐渐 地遗忘过去的梯度,在做加法运算时将新梯度的信息更多地反映出来。 这种操作从专业上讲,称为“指数移动平均”,呈指数函数式地减小 过去的梯度的尺度。

Adam

Momentum参照小球在碗中滚动的物理规则进行移动,AdaGrad为参 数的每个元素适当地调整更新步伐。Adam 融合了这两者的思想。

待阅读论文:https://arxiv.org/pdf/1412.6980.pdf

Tips : Adam会设置 3个超参数。一个是学习率(论文中以α出现),另外两 个是一次momentum系数β1和二次momentum系数β2。根据论文, 标准的设定值是β1为 0.9,β2 为 0.999。设置了这些值后,大多数情 况下都能顺利运行。

Reading

Ensemble learning 集成学习