本文只对吴恩达最优化方法中原理部分进行整理,没有代码部分,需要原始代码可以到GitHub上down下来。文尾附链接。
除了使用Gradient Descent更新参数降低成本,还有更多高级优化方法,这些方法可以加快学习速度,甚至可以获得更好的COST函数最终值。 拥有一个好的优化算法可能是等待天数与短短几个小时之间的差异,以获得同样的效果。最优化方法做的就是加速训练。
梯度下降在成本函数上“下坡” J J J. 把它想象成它试图这样做:
注意: 本文中, 目标函数J对特参数a的导数用da表示:$\frac{\partial J}{\partial a } = $ da
。
机器学习中的一种简单优化方法是梯度下降(Gradient Descent , GD)。 当您对每个步骤的所有$ m $示例执行梯度下降操作时,它也称为Batch Gradient Descent
。
Gradient Descent:实施梯度下降更新规则。 梯度下降规则是,对于 l = 1 , . . . , L l = 1,...,L l=1,...,L:
(1) W [ l ] = W [ l ] − α d W [ l ] W^{[l]} = W^{[l]} - \alpha \text{ } dW^{[l]} \tag{1} W[l]=W[l]−α dW[l](1)
(2) b [ l ] = b [ l ] − α d b [ l ] b^{[l]} = b^{[l]} - \alpha \text{ } db^{[l]} \tag{2} b[l]=b[l]−α db[l](2)
其中L是层数, a l p h a alpha alpha是学习率。
其中一个变体是随机梯度下降(SGD),相当于小批量梯度下降,其中每个小批量只有一个例子。 您刚刚实施的更新规则不会更改。 您将在一次只计算一个训练示例而不是整个训练集上计算渐变的变化是什么。 下面的代码示例说明了随机梯度下降和(批量)梯度下降之间的差异。
X = data_input
Y = labels
parameters = initialize_parameters(layers_dims)
for i in range(0, num_iterations):
# Forward propagation
a, caches = forward_propagation(X, parameters)
# Compute cost.
cost = compute_cost(a, Y)
# Backward propagation.
grads = backward_propagation(a, caches, parameters)
# Update parameters.
parameters = update_parameters(parameters, grads)
X = data_input
Y = labels
parameters = initialize_parameters(layers_dims)
for i in range(0, num_iterations):
for j in range(0, m):
# Forward propagation
a, caches = forward_propagation(X[:,j], parameters)
# Compute cost
cost = compute_cost(a, Y[:,j])
# Backward propagation
grads = backward_propagation(a, caches, parameters)
# Update parameters.
parameters = update_parameters(parameters, grads)
下面对Mini-Batch Gradient descent进行介绍,测试集为(X, Y)。
总共有两步:
mini_batch_size
(此处为64)的mini-batches。 请注意,训练示例的数量并不总是被mini_batch_size
整除。 最后一个迷你批次可能更小,但您不必担心这一点。 当最终的小批量小于完整的mini_batch_size
时,它将如下所示:请注意,最后一个小批量可能最终小于mini_batch_size = 64
。让 ⌊ s ⌋ \lfloor s\rfloor ⌊s⌋ 代表 s s s向下舍入到最接近的整数(这是Python中的math.floor(s)
。 如果示例的总数不是mini_batch_size=64
的倍数,那么将会有 ⌊ m m i n i _ b a t c h _ s i z e ⌋ \lfloor \frac{m}{mini\_batch\_size}\rfloor ⌊mini_batch_sizem⌋ 最终小批量中的示例将是( m − m i n i _ b a t c h _ s i z e × ⌊ m m i n i _ b a t c h _ s i z e ⌋ m-mini_\_batch_\_size \times \lfloor \frac{m}{mini\_batch\_size}\rfloor m−mini_batch_size×⌊mini_batch_sizem⌋)。
注意:
因为mini-batch梯度下降在仅仅看到一个例子的子集之后进行参数更新,所以更新的方向具有一些变化,因此小批量梯度下降所采用的路径将沿着局部最优收敛方向摆动。 使用Momentum可以减少这些振荡。
Momentum考虑了过去的梯度方向以平滑更新。我们将先前收敛的方向存储在变量 v v v中。 形式上,这将是先前步骤的梯度的指数加权平均值。 您还可以将 v v v视为滚球下坡的“速度”,根据坡度/坡度的方向建立速度(和动量)。
Figure 3: 红色箭头显示了使用动量梯度下降的mini-batch的下降方向。 蓝点表示未使用动量优化的梯度方向(相对于当前的mini-batch)。 我们让梯度影响速度方向 v v v,然后每一步调整 v v v的方向,而不是仅仅使 v v v等于梯度方向。
动量momentum公式:
使用momentum优化梯度下降的公式如下。对于网络的每一层 l = 1 , . . . , L l = 1, ..., L l=1,...,L:
(3) { v d W [ l ] = β v d W [ l ] + ( 1 − β ) d W [ l ] W [ l ] = W [ l ] − α v d W [ l ] \begin{cases} v_{dW^{[l]}} = \beta v_{dW^{[l]}} + (1 - \beta) dW^{[l]} \\ W^{[l]} = W^{[l]} - \alpha v_{dW^{[l]}} \end{cases}\tag{3} {vdW[l]=βvdW[l]+(1−β)dW[l]W[l]=W[l]−αvdW[l](3)
(4) { v d b [ l ] = β v d b [ l ] + ( 1 − β ) d b [ l ] b [ l ] = b [ l ] − α v d b [ l ] \begin{cases} v_{db^{[l]}} = \beta v_{db^{[l]}} + (1 - \beta) db^{[l]} \\ b^{[l]} = b^{[l]} - \alpha v_{db^{[l]}} \end{cases}\tag{4} {vdb[l]=βvdb[l]+(1−β)db[l]b[l]=b[l]−αvdb[l](4)
L代表神经网络的某一层, β \beta β 是动量momentum , α \alpha α是学习率。
注意:
你如何选择 β \beta β?
注意:
Adam是用于训练神经网络的最有效的优化算法之一。 它结合了RMSProp和Momentum的想法。
Adam 是如何工作的?
参数跟新准则如下,对于网络每一层参数 l = 1 , . . . , L l = 1, ..., L l=1,...,L:
{ v d W [ l ] = β 1 v d W [ l ] + ( 1 − β 1 ) ∂ J ∂ W [ l ] v d W [ l ] c o r r e c t e d = v d W [ l ] 1 − ( β 1 ) t s d W [ l ] = β 2 s d W [ l ] + ( 1 − β 2 ) ( ∂ J ∂ W [ l ] ) 2 s d W [ l ] c o r r e c t e d = s d W [ l ] 1 − ( β 1 ) t W [ l ] = W [ l ] − α v d W [ l ] c o r r e c t e d s d W [ l ] c o r r e c t e d + ε \begin{cases} v_{dW^{[l]}} = \beta_1 v_{dW^{[l]}} + (1 - \beta_1) \frac{\partial \mathcal{J} }{ \partial W^{[l]} } \\ v^{corrected}_{dW^{[l]}} = \frac{v_{dW^{[l]}}}{1 - (\beta_1)^t} \\ s_{dW^{[l]}} = \beta_2 s_{dW^{[l]}} + (1 - \beta_2) (\frac{\partial \mathcal{J} }{\partial W^{[l]} })^2 \\ s^{corrected}_{dW^{[l]}} = \frac{s_{dW^{[l]}}}{1 - (\beta_1)^t} \\ W^{[l]} = W^{[l]} - \alpha \frac{v^{corrected}_{dW^{[l]}}}{\sqrt{s^{corrected}_{dW^{[l]}}} + \varepsilon} \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧vdW[l]=β1vdW[l]+(1−β1)∂W[l]∂JvdW[l]corrected=1−(β1)tvdW[l]sdW[l]=β2sdW[l]+(1−β2)(∂W[l]∂J)2sdW[l]corrected=1−(β1)tsdW[l]W[l]=W[l]−αsdW[l]corrected+εvdW[l]corrected
这里:
Adam明显优于小批量梯度下降和动量。 如果您在此简单数据集上运行模型以获得更多时期,则所有这三种方法都将产生非常好的结果。 但是,你已经看到Adam收敛得更快。
Adam的一些优点包括:
资料地址GitHub,顺手点赞
资料原地址GitHub
转载请注明出处audior