这周的视频主要讲了在使用梯度下降求解$w$和$b$时用到的优化方法,主要包括Mini-batch、指数加权平均、动量梯度下降法、RMSprop、Adam优化算法、学习率衰减。这些都是比较实用的方法,在《机器学习实战》中也都有介绍。
Mini-batch
说到Mini-batch有必要提一下梯度下降和随机梯度下降。以线性回归为例进行说明,假设$(x_{j},y_{j})$是输入输出向量,参数个数为$n$,样本个数为$m$,$h(x)$是预测函数,$J(\theta)$为损失函数,这里取平方误差函数,则有
$$h(\theta)=\sum_{j=0}^{n}\theta_{j}x_{j}$$
$$J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(y^{i}-h_{\theta}(x^{i}))^2$$
批量梯度下降(Batch Gradient Descent)
批量梯度下降首先对损失函数$J(\theta)$求导
$$\frac{\partial{J(\theta)}}{\partial{\theta_{j}}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{i}-h_{\theta}(x^{i}))x^{i}_{j}$$
要最小化损失函数,所以每个参数都要沿着负梯度的方向进行更新,有
$$\theta_{j}=\theta_{j}+\eta*\frac{1}{m}\sum_{i=1}^{m}(y^{i}-h_{\theta}(x^{i}))x^{i}_{j}$$
从上面的公式中可以看出,每进行一次更新都需要用到$m$个样本,即最小化所有训练样本的损失函数,最后求得的解是全局最优解。但是当$m$很大时$\theta$更新速度会很慢。
随机梯度下降(Stochastic Gradient Descent)
为了避免$m$很大时$\theta$更新速度慢的情况,每次更新只使用一个样本,最小化每条样本的损失函数,当样本量很大时也能利用少量数据求得$\theta$最优解。但是不是每次迭代都能向着全局最优解的方向,若遇上噪声容易陷入局部最优。
而Mini-batch是在BGD和SGD中取折中,一次取一部分数据进行梯度更新,既保证了速度,又能让迭代方向与全局最优解的方向保持一致。
指数加权平均
在实际应用中有时候会对原始数据进行处理,降低一些奇异值的影响,达到平滑的目的。Ng用温度的例子比较名确的说明了指数加权平均的处理过程,假设$\theta_{t}$代表第$t$天的温度,$v_{t}$代表第$t$天经过指数加权平均处理的温度,则有
$$v_{t} = \betav_{t-1}+(1-\beta)\theta_{t}$$
其中$\beta$是可调节的超参数。乍看上去这个公式和指数没什么关系,展开来看,让$、beta=0.9$
$$v_{100}=0.9v_{99}+0.1\theta_{100}$$
$$v_{99}=0.9v_{98}+0.1\theta_{99}$$
$$v_{98}=0.9v_{97}+0.1\theta_{98}$$
$$……$$
所以有$$v_{100}=0.1\theta_{100}+0.10.9\theta_{99}+0.10.9^2\theta_{98}+……+0.10.9^{99}*\theta_{1}$$
不难看出本质上就是以指数形式的递减加权的移动平均,各数值的加权随着时间指数级递减。
Momentum
在上面提到的梯度下降算法中,$w$和$b$的更新公式是这样的
$$w = w-\eta dw$$
$$b = b-\eta db$$
而动量梯度下降是按照下面的方式进行更新的
$$v_{dw}=\beta v_{dw}+(1-\beta) dw$$
$$w=w-\eta v_{dw}$$
$$v_{db}=\beta v_{db}+(1-\beta) db$$
$$b=w-\eta v_{db}$$
动量梯度下降是将梯度下降的过程加了一个指数加权平均,这样能更好的控制梯度更新的方向。
RMSprop
RMSprop与动量梯度下降算法很想,其$w$和$b$的更新公式如下
$$v_{dw}=\beta v_{dw}+(1-\beta)(dw)^2$$
$$w=w-\eta \frac{dw}{\sqrt{v_{dw}}}$$
$$v_{db}=\beta v_{db}+(1-\beta)(db)^2$$
$$b=w-\eta \frac{db}{\sqrt{v_{db}}}$$
这样做是防止在对$w$进行迭代时,$w$的变化幅度很小,而$b$的变化很大。当$w$很小时,$\frac{dw}{\sqrt{v_{dw}}}$这项会将$w$变化幅度增大。对于$b$的迭代道理一样。
Adam优化算法
Adam算法是把Momentum和RMSprop结合,其$w$和$b$的更新公式如下
$$v_{dw}=\beta_{1} v_{dw}+(1-\beta_{1})dw$$
$$s_{dw}=\beta_{2} s_{dw}+(1-\beta_{2})(dw)^2$$
$$v_{dw}^{correct}=\frac{v_{dw}}{(1-\beta_{1}^{t})}$$
$$s_{dw}^{correct}=\frac{s_{dw}}{(1-\beta_{2}^{t})}$$
$$w=w-\eta \frac{v_{dw}^{correct}}{\sqrt{s_{dw}^{correct}}+\varepsilon}$$
$$v_{db}=\beta_{1} v_{db}+(1-\beta_{1})db$$
$$s_{db}=\beta_{2} s_{db}+(1-\beta_{2})(db)^2$$
$$v_{db}^{correct}=\frac{v_{db}}{(1-\beta_{1}^{t})}$$
$$s_{db}^{correct}=\frac{s_{db}}{(1-\beta_{2}^{t})}$$
$$b=b-\eta \frac{v_{db}^{correct}}{\sqrt{s_{db}^{correct}}+\varepsilon}$$
学习率衰减
在算法迭代过程中,学习率较大会造成震荡,这时候需要降低学习率。一般会这样设置学习率
$$\eta = \eta \frac{1}{1+decayepoch_num}$$
其中,decay的范围是[0,1],epoch_num是迭代的次数,所以$\eta$会随着迭代次数的增加而减小。