笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~
【吴恩达课程笔记专栏】
【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础
【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络
【深度学习】吴恩达课程笔记(三)——参数VS超参数、深度学习的实践层面
当涉及深度学习优化算法时,我们通常会面临一个目标:最小化一个损失函数。这个损失函数衡量了模型预测与实际值之间的差距。为了找到最佳的模型参数,我们需要使用优化算法来调整这些参数,以便最小化损失函数。
以下是一些常用的深度学习优化算法:
这些算法都有各自的优劣势,适用于不同类型的深度学习任务。在实际应用中,通常需要根据具体问题和数据集的特点来选择合适的优化算法。
批量梯度下降是为了优化模型参数,使得损失函数达到最小值,从而实现训练数据的拟合和模型的泛化能力。
初始化参数:随机初始化模型参数或采用预训练的参数作为初始值。
对于整个训练样本集合进行如下操作:
计算梯度:计算损失函数关于所有训练样本的参数的梯度,即
∇ J ( θ ) = 1 m ∑ i = 1 m ∇ J ( θ ; x ( i ) , y ( i ) ) \nabla J(\theta) = \frac{1}{m} \sum_{i=1}^{m} \nabla J(\theta; x^{(i)}, y^{(i)}) ∇J(θ)=m1i=1∑m∇J(θ;x(i),y(i))
更新参数:利用所有训练样本的梯度信息,按照梯度下降的更新规则来更新模型参数:
θ = θ − η ⋅ ∇ J ( θ ) \theta = \theta - \eta \cdot \nabla J(\theta) θ=θ−η⋅∇J(θ)
其中, ( η ) 是学习率, ( m ) 是训练样本的数量。
随机梯度下降(Stochastic Gradient Descent, SGD)是梯度下降法的一种变种
通过每次迭代仅利用单个训练样本的梯度信息,来更新模型参数,从而减少计算开销,并加快收敛速度。
初始化参数:随机初始化模型参数或采用预训练的参数作为初始值。
对于每个训练样本 (x(i), y(i)) 进行如下操作:
计算梯度:计算损失函数关于当前样本的参数的梯度,即
∇ J ( θ ; x ( i ) , y ( i ) ) \nabla J(\theta; x^{(i)}, y^{(i)}) ∇J(θ;x(i),y(i))
更新参数:利用当前样本的梯度信息,按照梯度下降的更新规则来更新模型参数:
θ = θ − η ⋅ ∇ J ( θ ; x ( i ) , y ( i ) ) \theta = \theta - \eta \cdot \nabla J(\theta; x^{(i)}, y^{(i)}) θ=θ−η⋅∇J(θ;x(i),y(i))
其中,( η )是学习率。
小批量梯度下降是为了优化模型参数,使得损失函数达到最小值,从而实现训练数据的拟合和模型的泛化能力。
初始化参数:随机初始化模型参数或采用预训练的参数作为初始值。
对于每个小批量样本(x(i), y(i)) 进行如下操作:
计算梯度:计算损失函数关于当前小批量样本的参数的梯度,即
1 m ∑ i = 1 m ∇ J ( θ ; x ( i ) , y ( i ) ) \frac{1}{m} \sum_{i=1}^{m} \nabla J(\theta; x^{(i)}, y^{(i)}) m1i=1∑m∇J(θ;x(i),y(i))
更新参数:利用当前小批量样本的梯度信息,按照梯度下降的更新规则来更新模型参数:
θ = θ − η ⋅ 1 m ∑ i = 1 m ∇ J ( θ ; x ( i ) , y ( i ) ) \theta = \theta - \eta \cdot \frac{1}{m} \sum_{i=1}^{m} \nabla J(\theta; x^{(i)}, y^{(i)}) θ=θ−η⋅m1i=1∑m∇J(θ;x(i),y(i))
其中, ( η ) 是学习率, ( m ) 是小批量样本的大小。
定义梯度下降时使用一次全部样本集合为一代。
两者都需要多次遍历全部数据集才会有效果。在mini-batch中,如果只经历一代,那么梯度下降的效果虽然比batch一代好,但总体效果仍是微小的。
使用mini-batch时,每重新开始遍历一次数据集,应当把数据集中的数据重新打乱分配到mini-batch中,体现出随机性
指数加权平均数用于对时间序列数据进行平滑处理,以便观察数据的长期趋势。
假设给定一个序列 ( x1, x2, …, xt ),其指数加权平均数 ( vt ) 的计算方式为:
v t = β v t − 1 + ( 1 − β ) x t v_t = \beta v_{t-1} + (1-\beta) x_t vt=βvt−1+(1−β)xt
( 0 < < 1 ) 被称为平滑因子,较大的平滑因子意味着新观测值对平均数的影响更大,从而使得平均数更快地适应最新的观测值;而较小的平滑因子则意味着平均数更加稳定、更不容易受到新观测值的影响。
( v0 ) 可以被初始化为 0 或者 x1 ,为了在开始时确定初始的指数加权平均数值
假设英国去年第t天的气温是θt
要用一条曲线拟合温度变化,可以进行如下操作
v 0 = 0 v t = β v t − 1 + ( 1 − β ) θ t v_0=0 \\ v_t=\beta v_{t-1}+(1-\beta)\theta_t v0=0vt=βvt−1+(1−β)θt
其中 vt 是第t天附近的 1/(1-) 天的平均天气。
为什么这么规定?
( 1 − ε ) 1 / ε 约等于 1 e (数学中一个挺重要的数) 这说明 1 1 − β 天之外的数所占的权重总共不到 1 e ,不那么值得关注了 (1-ε)^{1/ε}约等于\frac{1}{e}(数学中一个挺重要的数)\\ 这说明\frac{1}{1-\beta}天之外的数所占的权重总共不到\frac{1}{e},不那么值得关注了 (1−ε)1/ε约等于e1(数学中一个挺重要的数)这说明1−β1天之外的数所占的权重总共不到e1,不那么值得关注了
β = 0.9 ( 1 − 0.1 ) 1 0.1 = 0. 9 10 β = 0.98 ( 1 − 0.02 ) 1 0.02 = 0.9 8 50 \beta = 0.9\\ (1-0.1)^{\frac{1}{0.1}} = 0.9^{10} \\ \beta = 0.98 \\ (1-0.02)^{\frac{1}{0.02}} = 0.98^{50} β=0.9(1−0.1)0.11=0.910β=0.98(1−0.02)0.021=0.9850
可以看出 越大,平均的天数越大,拟合得越粗略。
红色:=0.9;绿色:=0.98
由于v0=0,v1= v0 + (1-) θ1 = (1-)θ1,前几个vi的值会非常的小,如图中紫线。当迭代到一定数量之后,拟合才变得正常(紫线逼近绿线)。
偏差修正的目的是为了消除初始时刻的平均值对整体平均值的影响。偏差修正可以通过以下公式实现:
v t ^ = v t 1 − α t v t ^ 表示经过偏差修正后的平均值 v t 表示未经修正的平均值 β 为平滑因子 t 表示时间步 \hat{v_t} = \frac{v_t}{1 - \alpha^t} \\ \hat{v_t} 表示经过偏差修正后的平均值\\ v_t 表示未经修正的平均值\\ \beta 为平滑因子\\ t 表示时间步\\ vt^=1−αtvtvt^表示经过偏差修正后的平均值vt表示未经修正的平均值β为平滑因子t表示时间步
通过偏差修正,可以有效地减小最初几个数据点对平均值的影响,得到更加准确和稳定的指数加权平均值。
加速梯度下降过程
传统的梯度下降法在更新参数时只考虑当前的梯度值,而动量梯度下降法引入了一个额外的动量项,用于模拟物理中的动量效应。
在每次参数更新时,动量梯度下降法会根据当前梯度和上一次的动量来计算一个更新量,并将该更新量应用于参数。更新量由两部分组成:一部分是当前梯度的方向,另一部分是上一次动量的方向。
蓝线是一般梯度下降的成本函数值迭代情况,红线是动量梯度下降法中成本函数迭代境况。
我们使用指数加权平均来计算新的dW和db。在竖直方向上,由于平均值接近0,所以动量梯度下降的竖直方向迭代值接近0 。在水平方向上,动量梯度下降的迭代值则为正常水平。
d w = β ⋅ d w t − 1 + ( 1 − β ) ⋅ ∂ J ∂ w d b = β ⋅ d b t − 1 + ( 1 − β ) ⋅ ∂ J ∂ b w = w − α ⋅ d w b = b − α ⋅ d b dw = \beta \cdot dw_{t-1} + (1 - \beta) \cdot \frac{\partial J}{\partial w}\\ db = \beta \cdot db_{t-1} + (1 - \beta) \cdot \frac{\partial J}{\partial b}\\ w = w - \alpha \cdot dw\\ b = b - \alpha \cdot db\\ dw=β⋅dwt−1+(1−β)⋅∂w∂Jdb=β⋅dbt−1+(1−β)⋅∂b∂Jw=w−α⋅dwb=b−α⋅db
β 是动量系数 , 通常取 0.9 α 是学习率 J 是损失函数 d w t − 1 和 d b t − 1 表示上一次的权重和偏置更新量 ∂ J ∂ w 和 ∂ J ∂ b 分别是损失函数对权重和偏置的偏导数 w 和 b 分别表示更新后的权重和偏置 \beta 是动量系数,通常取0.9\\ \alpha 是学习率\\ J 是损失函数\\ dw_{t-1} 和 db_{t-1} 表示上一次的权重和偏置更新量\\ \frac{\partial J}{\partial w} 和 \frac{\partial J}{\partial b} 分别是损失函数对权重和偏置的偏导数\\ w 和 b 分别表示更新后的权重和偏置 β是动量系数,通常取0.9α是学习率J是损失函数dwt−1和dbt−1表示上一次的权重和偏置更新量∂w∂J和∂b∂J分别是损失函数对权重和偏置的偏导数w和b分别表示更新后的权重和偏置
解决传统梯度下降法中学习率衰减过快的问题。RMSprop通过对梯度的平方进行指数加权移动平均来调整学习率,从而加速模型的训练。
使用它的时候可以适当加大学习率
我们需要计算一个额外变量S,S等于目前数据附近水平方向或竖直方向的dX的方差。
我们在更新数据(W、b)的时候,把原来要减掉的dX除以这个方差,那么方差大的方向变化量就减少,方差小的方向变化量就仍处于正常水平甚至增大。
adam是训练神经网络中最有效的优化算法之一。它结合了momentum和RMSprop。
{ 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 + ε l = 1 , . . . , L \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} \\ l = 1, ..., L ⎩ ⎨ ⎧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]correctedl=1,...,L
其中:
在不同的代(epoch)上使用递减的学习率
α = 1 1 + d e c a y r a t e ∗ e p o c h n u m ∗ α 0 α = a e p o c h n u m ∗ α 0 α = k e p o c h n u m ∗ α 0 手动调整 α 的值 \alpha=\frac{1}{1+decayrate*epochnum}*\alpha_0 \\ \alpha=a^{epochnum}*\alpha_0 \\ \alpha=\frac{k}{\sqrt{epochnum}}*\alpha_0 \\ 手动调整\alpha的值 α=1+decayrate∗epochnum1∗α0α=aepochnum∗α0α=epochnumk∗α0手动调整α的值