梯度下降详解:从标准梯度下降到相关变种

梯度下降及相关变种详解


​ 本篇笔记说明梯度下降法、随机梯度下降和小批量梯度下降三种梯度下降的不同形式做详细说明。

1.几个重要数学概念:偏导数、方向导数和梯度

为了理解梯度下降法,首先需要对标题中的三个数学概念有个简单的概念。

方向导数与偏导数有什么联系? - 知乎 (zhihu.com)

如何直观形象地理解方向导数与梯度以及它们之间的关系? - 知乎 (zhihu.com)

该部分参考高等数学下册第七版(同济大学数学系)

偏导数

​ 对于一元函数来说,为了研究其变化率,引入了导数的概念。对于一个多变量的函数来说,也需要研究它的变化率。但是由于多元函数的变量不止一个,关系更加复杂,所以这里先引入的概念为偏导数。

偏导数的概念和表示

偏导数:多元函数关于一个变量的导数,而其他的变量保持恒定。

用数学公式表示:若下面极限存在,那么该极限的值就是函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)处对 x x x的偏导数
lim ⁡ Δ x → 0 f ( x 0 + Δ x , y 0 ) − f ( x 0 , y 0 ) Δ x \lim\limits_{\Delta x\rightarrow 0}\frac{f(x_0+\Delta x, y_0)-f(x_0,y_0)}{\Delta x} Δx0limΔxf(x0+Δx,y0)f(x0,y0)
对于 x x x的偏导数可以记做:
∂ z ∂ x ∣ x = x 0 y = y 0 , ∂ f ∂ x ∣ x = x 0 y = y 0 , z x ∣ x = x 0 y = y 0  或  f x ( x 0 , y 0 ) .  \left.\frac{\partial z}{\partial x}\right|_{\substack{x=x_0 \\ y=y_0}},\left.\frac{\partial f}{\partial x}\right|_{\substack{x=x_0 \\ y=y_0}},\left.z_x\right|_{\substack{x=x_0 \\ y=y_0}} \text { 或 } f_x\left(x_0, y_0\right) \text {. } xz x=x0y=y0,xf x=x0y=y0,zxx=x0y=y0  fx(x0,y0)

偏导数的求法

​ 对于 z = f ( x , y ) z=f(x,y) z=f(x,y):求 ∂ f ∂ x \frac{\partial f}{\partial x} xf时,只需要暂时把 y y y看做常量,而对 x x x求导数;求 ∂ f ∂ y \frac{\partial f}{\partial y} yf时,只需要暂时把 x x x看做常量,而对 y y y求导数。当扩展到n元函数的偏导数时,求法以此类推即可。

偏导数的几何意义

​ 二元函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)处的偏导数几何意义如下:

​ 设 M ( x 0 , y 0 , f ( x 0 , y 0 ) ) M(x_0,y_0,f(x_0,y_0)) M(x0,y0,f(x0,y0))为曲面 z = f ( x , y ) z=f(x,y) z=f(x,y)上的一点,过M作平面 y = y 0 y=y_0 y=y0,截此曲面得一曲线,此曲线在平面 y = y 0 y=y_0 y=y0上的方程为 z = f ( x , y 0 ) z=f(x,y_0) z=f(x,y0),则导数 d d x f ( x , y 0 ) ∣ x = x 0 \frac{d}{dx}f(x,y_0)|_{x=x_0} dxdf(x,y0)x=x0,即偏导数 f x ( x 0 , y 0 ) f_x(x_0,y_0) fx(x0,y0),就是这曲线在点 M 0 M_0 M0处的切线 M 0 T x M_0T_x M0Tx对x轴的斜率(见图9-5)。同样,偏导数 f ( x 0 , y 0 ) f(x_0,y_0) f(x0,y0)的几何意义是曲面被平面 x = x 0 x=x_0 x=x0所截得的曲线在点 M 0 M_0 M0处的切线 M 0 T y M_0T_y M0Ty对y轴的斜率。

image-20221021173133754

​ 总之:偏导数反映了函数沿着坐标轴方向的变化率

方向导数

​ 偏导数反映了函数沿着坐标轴方向的变化率,但是仅仅研究函数沿着坐标轴方向的变化率是不够的。故又引入了方向导数的概念,以研究函数沿着任意一个方向的变化率问题。

方向导数的定义和表示

​ 设 l l l x O y xOy xOy平面上以 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0)为始点的射线, e l = ( c o s α , c o s β ) e_l=(cos\alpha,cos\beta) el=(cosα,cosβ)是与 l l l同方向的单位向量。射线 l l l的参数方程为:
{ x = x 0 + t cos ⁡ α , y = y 0 + t cos ⁡ β ( t ⩾ 0 ) . \left\{\begin{array}{l} x=x_0+t \cos \alpha, \\ y=y_0+t \cos \beta \end{array}(t \geqslant 0) .\right. {x=x0+tcosα,y=y0+tcosβ(t0).
image-20221021180748107

​ 设函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0)的某个邻域 U ( P 0 ) U(P_0) U(P0)内有定义, P ( x 0 + t c o s α , y 0 + t c o s β ) P(x0 + tcos \alpha,y_0 + tcos β) P(x0+tcosα,y0+tcosβ) l l l上另一点,且 P ∈ U ( P 0 ) P∈U(P_0) PU(P0). 如果函数增量 f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) f(x_0+tcos \alpha,y_0 +tcosβ)-f(x_0,y_0) f(x0+tcosα,y0+tcosβ)f(x0,y0) P P P P 0 P_0 P0的距离 ∣ P P 0 ∣ = t |PP_0| =t PP0=t的比值
f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) t \frac{f(x_0+tcos\alpha, y_0+tcos\beta)-f(x_0,y_0)}{t} tf(x0+tcosα,y0+tcosβ)f(x0,y0)
P P P 沿着 l l l 趋于 P 0 P_0 P0 (即 t → 0 + t \rightarrow 0^{+} t0+) 时的极限存在, 那么称此极限为函数 f ( x , y ) f(x, y) f(x,y) 在点 P 0 P_0 P0 沿方向 l l l 的方向导数, 记作 ∂ f ∂ l ∣ ( x 0 , y 0 ) \left.\frac{\partial f}{\partial l}\right|_{\left(x_0, y_0\right)} lf (x0,y0), 即
∂ f ∂ l ∣ ( x 0 , y 0 ) = lim ⁡ t → 0 + f ( x 0 + t cos ⁡ α , y 0 + t cos ⁡ β ) − f ( x 0 , y 0 ) t . \left.\frac{\partial f}{\partial l}\right|_{\left(x_0, y_0\right)}=\lim _{t \rightarrow 0^{+}} \frac{f\left(x_0+t \cos \alpha, y_0+t \cos \beta\right)-f\left(x_0, y_0\right)}{t} . lf (x0,y0)=t0+limtf(x0+tcosα,y0+tcosβ)f(x0,y0).

方向导数的几何意义

​ 由上述的定义可知,方向导数的几何意义就是函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0)处沿方向 l l l的变化率。

​ 同时,方向导数和偏导数有一定的关系:

  • 若函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0)的偏导数存在

    • e l = i = ( 1 , 0 ) e_l=i=(1,0) el=i=(1,0),则:
      ∂ f ∂ l ∣ ( x 0 , y 0 ) = lim ⁡ t → 0 + f ( x 0 + t , y 0 ) − f ( x 0 , y 0 ) t = f x ( x 0 , y 0 ) \left.\frac{\partial f}{\partial l}\right|_{\left(x_0, y_0\right)}=\lim _{t \rightarrow 0^{+}} \frac{f\left(x_0+t , y_0\right)-f\left(x_0, y_0\right)}{t}=f_x(x_0,y_0) lf (x0,y0)=t0+limtf(x0+t,y0)f(x0,y0)=fx(x0,y0)

    • e j = j = ( 0 , 1 ) e_j=j=(0,1) ej=j=(0,1),则:
      ∂ f ∂ l ∣ ( x 0 , y 0 ) = lim ⁡ t → 0 + f ( x 0 , y 0 + t ) − f ( x 0 , y 0 ) t = f y ( x 0 , y 0 ) \left.\frac{\partial f}{\partial l}\right|_{\left(x_0, y_0\right)}=\lim _{t \rightarrow 0^{+}} \frac{f\left(x_0 , y_0+t\right)-f\left(x_0, y_0\right)}{t}=f_y(x_0,y_0) lf (x0,y0)=t0+limtf(x0,y0+t)f(x0,y0)=fy(x0,y0)

  • e l = i = ( 1 , 0 ) e_l=i=(1,0) el=i=(1,0) ∂ f ∂ l ∣ ( x 0 , y 0 ) \frac{\partial f}{\partial l}|_{(x_0,y_0)} lf(x0,y0)存在,则 ∂ z ∂ l ∣ ( x 0 , y 0 ) \frac{\partial z}{\partial l}|_{(x_0,y_0)} lz(x0,y0)不一定存在

方向导数的计算

方向导数的计算和定义如下:
∂ f ∂ l ∣ ( x 0 , y 0 ) = f x ( x 0 , y 0 ) cos ⁡ α + f y ( x 0 , y 0 ) cos ⁡ β \left.\frac{\partial f}{\partial l}\right|_{\left(x_0, y_0\right)}=f_x(x_0,y_0)\cos\alpha+f_y(x_0,y_0)\cos\beta lf (x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ
其中 α 和 β \alpha和\beta αβ是方向 l l l的余弦。

梯度

梯度的定义

​ 在二元函数的情形下,设函数 f ( x , y ) f(x,y) f(x,y)在平面 D D D内具有一阶连续偏导数,则对于每一点 P 0 ( x 0 , y 0 ) ∈ D P_0(x_0,y_0)\in D P0(x0,y0)D,都可以定义出一个向量:
f x ( x 0 , y 0 ) i + f y ( x 0 , y 0 ) j f_x(x_0,y_0)\boldsymbol{i}+f_y(x_0,y_0)\boldsymbol{j} fx(x0,y0)i+fy(x0,y0)j
则称为函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0)的梯度,记做 g r a d f ( x 0 , y 0 ) \bold{grad}f(x_0,y_0) gradf(x0,y0)或者 ∇ f ( x 0 , y 0 ) \nabla f(x_0,y_0) f(x0,y0),即:
g r a d f ( x 0 , y 0 ) = ∇ f ( x 0 , y 0 ) = f x ( x 0 , y 0 ) i + f y ( x 0 , y 0 ) j .  \boldsymbol{g r a d} f\left(x_0, y_0\right)=\nabla f\left(x_0, y_0\right)=f_x\left(x_0, y_0\right) \boldsymbol{i}+f_y\left(x_0, y_0\right) \boldsymbol{j} \text {. } gradf(x0,y0)=f(x0,y0)=fx(x0,y0)i+fy(x0,y0)j
如果函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0)处可微分, e l = ( cos ⁡ α , cos ⁡ β ) \boldsymbol{e_l}=(\cos\alpha,\cos\beta) el=(cosα,cosβ)是与 l l l同方向的方向向量,那么
∂ f ∂ l ∣ ( x 0 , y 0 ) = f x ( x 0 , y 0 ) cos ⁡ α + f y ( x 0 , y 0 ) cos ⁡ β = g r a d f ( x 0 , y 0 ) ⋅ e l = ∣ g r a d f ( x 0 , y 0 ) ∣ cos ⁡ θ \left.\frac{\partial f}{\partial l}\right|_{\left(x_0, y_0\right)}=f_x(x_0,y_0)\cos\alpha+f_y(x_0,y_0)\cos\beta\\ =\boldsymbol{grad}f(x_0,y_0)·\boldsymbol{e_l}=|\boldsymbol{grad}f(x_0,y_0)|\cos\theta lf (x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ=gradf(x0,y0)el=gradf(x0,y0)cosθ
其中 θ = ( g r a d f ( x 0 , y 0 ) , e l ^ ) \theta=({\boldsymbol{grad}\widehat{f(x_0,y_0),\boldsymbol{e_l}}}) θ=(gradf(x0,y0),el )

方向导数与梯度之间的关系【重要结论推导】

​ 上述推导可以进一步得到这个点的梯度与方向导数之间的关系:

  • θ = 0 \theta=0 θ=0时,即 e l \boldsymbol{e_l} el与梯度 g r a d f ( x 0 , y 0 ) \boldsymbol{g r a d} f\left(x_0, y_0\right) gradf(x0,y0)的方向相同时,函数 f ( x , y ) f(x,y) f(x,y)增加最快

    此时,函数在这个方向的方向导数达到最大值,这个最大值就是梯度 g r a d f ( x 0 , y 0 ) \boldsymbol{g r a d} f\left(x_0, y_0\right) gradf(x0,y0)的模,即:
    ∂ f ∂ l ∣ ( x 0 , y 0 ) = ∣ g r a d f ( x 0 , y 0 ) ∣ \left.\frac{\partial f}{\partial l}\right|_{\left(x_0, y_0\right)} = |\boldsymbol{g r a d} f\left(x_0, y_0\right)| lf (x0,y0)=gradf(x0,y0)

  • θ = π \theta=\pi θ=π时,即 e l \boldsymbol{e_l} el与梯度 g r a d f ( x 0 , y 0 ) \boldsymbol{g r a d} f\left(x_0, y_0\right) gradf(x0,y0)的方向相反时,函数 f ( x , y ) f(x,y) f(x,y)减少最快

    此时,函数在这个方向的方向导数达到最小,这个最大值就是梯度 g r a d f ( x 0 , y 0 ) \boldsymbol{g r a d} f\left(x_0, y_0\right) gradf(x0,y0)的模的相反数,即:
    ∂ f ∂ l ∣ ( x 0 , y 0 ) = − ∣ g r a d f ( x 0 , y 0 ) ∣ \left.\frac{\partial f}{\partial l}\right|_{\left(x_0, y_0\right)} = -|\boldsymbol{g r a d} f\left(x_0, y_0\right)| lf (x0,y0)=gradf(x0,y0)

  • θ = π 2 \theta=\frac{\pi}{2} θ=2π时,即 e l \boldsymbol{e_l} el与梯度 g r a d f ( x 0 , y 0 ) \boldsymbol{g r a d} f\left(x_0, y_0\right) gradf(x0,y0)的方向正交时,函数 f ( x , y ) f(x,y) f(x,y)的变化率为0,即函数值不变。
    ∂ f ∂ l ∣ ( x 0 , y 0 ) = ∣ g r a d f ( x 0 , y 0 ) ∣ cos ⁡ π 2 = 0 \left.\frac{\partial f}{\partial l}\right|_{\left(x_0, y_0\right)} = |\boldsymbol{g r a d} f\left(x_0, y_0\right)|\cos\frac{\pi}{2}=0 lf (x0,y0)=gradf(x0,y0)cos2π=0

经过上面的证明,我们得到了梯度下降的重要结论:

  • 梯度的方向是函数值增加最快的方向
  • 梯度的反方向是函数值减少最快的方向

梯度下降法是基于上面的结论确定函数局部极小值的一个优化算法。

下面详细说明梯度下降,随机梯度下降,小批量梯度下降算法。

2. 梯度下降

[5分钟深度学习] #01 梯度下降算法_哔哩哔哩_bilibili

详解梯度下降法(干货篇) - 知乎 (zhihu.com)

【官方双语】深度学习之神经网络的结构 Part 1 ver 2.0_哔哩哔哩_bilibili

【官方双语】深度学习之梯度下降法 Part 2 ver 0.9 beta_哔哩哔哩_bilibili

【官方双语】深度学习之反向传播算法 上/下 Part 3 ver 0.9 beta_哔哩哔哩_bilibili

引入

​ 先考虑一个拟合的例子,使用直线 y = k x + b y=kx+b y=kx+b对下图所示的散点进行拟合。

​ 对于任意一个散点 ( x i , y i ) (x_i,y_i) (xi,yi),它的拟合值为 y i ′ y_i' yi,那么我们将二者之间误差记做 e i = y i ′ − y i e_i=y_i'-y_i ei=yiyi。另外,为了考量拟合结果的好坏,我们定义一个损失函数 L L L,如下:
L = 1 2 ∑ i = 1 n ∣ e i ∣ 2 L=\frac{1}{2}\sum_{i=1}^n|e_i|^2 L=21i=1nei2
显然,损失函数函数值越小,拟合的效果越好;损失函数的函数值越大,拟合的效果越差。然后我们将直线的方程 y = k x + b y=kx+b y=kx+b右侧代入损失函数,得到:
L = 1 2 ∑ i = 1 n [ y i − ( k x i + b ) ] 2 L=\frac{1}{2}\sum_{i=1}^n[y_i-(kx_i+b)]^2 L=21i=1n[yi(kxi+b)]2
考虑下面的两种情况:

  • 直线斜率 k k k已知,截距 b b b未知
    L = 1 2 ∑ i = 1 n b 2 + 2 ( k x i − y i ) b + ( y i − k x i ) 2 L=\frac{1}{2}\sum_{i=1}^nb^2+2(kx_i-y_i)b+(y_i-kx_i)^2 L=21i=1nb2+2(kxiyi)b+(yikxi)2
    整理得损失函数 L L L为关于b的一个二次函数。函数图像开口向上,有最小值。为了求得 L L L的最小值,那么只要对其求导,得到b等于何值时,损失函数值最小。这个 b b b的值就是我们最佳的拟合直线的截距取值。

    image-20221022150549698

    如果我们不知道直接求导,令导数等于0,或者说这个函数的导数求等于0的值较为困难,那么怎么找到这个b值呢?

    采用迭代优化的方式

    随机确定一个初始的b值,假设如下图所示的 b 1 b_1 b1

    image-20221022153822784

    梯度方向是增加最快的方向(对于一元函数来说为导数),按照该结论,我们应该沿着梯度的反方向更新b值,即:
    b ← b − a ⋅ d L d b b\leftarrow b-a·\frac{dL}{db} bbadbdL
    这里的a我们称之为学习率,简单一点理解就是梯度下降的步长,反映了更新b的程度。重复这个步骤直到梯度为零,b不再会被更新,至此我们也找到了最优b的值。

    image-20221022161154489
  • 直线斜率 k k k和截距 b b b均未知
    L = 1 2 ∑ i = 1 n b 2 + 2 ( k x i − y i ) b + ( y i − k x i ) 2 = 1 2 ∑ i = 1 n b 2 + x i 2 k 2 + 2 x i b k − 2 y i b + y i 2 − 2 x i y i L=\frac{1}{2}\sum_{i=1}^nb^2+2(kx_i-y_i)b+(y_i-kx_i)^2\\ =\frac{1}{2}\sum_{i=1}^nb^2+x_i^2k^2+2x_ibk-2y_ib+y_i^2-2x_iy_i L=21i=1nb2+2(kxiyi)b+(yikxi)2=21i=1nb2+xi2k2+2xibk2yib+yi22xiyi

    为关于 k k k b b b的二元二次函数。此时要求解损失函数的最小值,可以使用多元函数的极值进行求解。同样,我们也可以采用梯度下降的方式,逐步确定参数的最佳取值。

梯度下降概念

一般的情况:

对于最简单的线性函数 y = f ( x i , θ ) y=f(x_i,\theta) y=f(xi,θ):
h ( θ ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h(\theta)=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n h(θ)=θ0+θ1x1+θ2x2+...+θnxn
定义其损失函数为:
L = 1 2 ∑ i = 1 m ∣ e i ∣ 2 = 1 2 ∑ i = 1 m ( y i − h ( θ ) ) 2 L=\frac{1}{2}\sum_{i=1}^m|e_i|^2=\frac{1}{2}\sum_{i=1}^m(y_i-h(\theta))^2 L=21i=1mei2=21i=1m(yih(θ))2
那么梯度下降的参数更新式为:
θ n + 1 = θ n − α ∇ L \theta_{n+1}=\theta_n-\alpha\nabla L θn+1=θnαL
其中
∇ L = ∂ L ( θ ) ∂ θ \nabla L=\frac{\partial L(\theta)}{\partial\theta } L=θL(θ)

标准梯度下降

​ 标准梯度下降是对所有的样本的损失函数求梯度,再对参数进行更新:
θ n + 1 = θ n − α ∇ L \theta_{n+1}=\theta_n-\alpha\nabla L θn+1=θnαL
​ 标准梯度下降需要遍历样本集合,梯度下降的方向是最优的方向。但遍历整个样本集合也造成了极大的内存消耗和较长的时间开销。这就引入了随机梯度下降的概念:

3. 随机梯度下降

随机梯度下降的概念

​ 随机梯度下降不再对整个样本空间的损失和函数求梯度,而是每次从样本空间中选择一个子集,使用抽取的子集的损失函数对参数进行更新。

​ 比如每次从大小为n的样本空间中随机抽取m个样本,并且每次都不重复,这样能解决内存开销和时间开销的问题。当样本的方差较小时,使用小部分的样本仍可以按照正确的趋势收敛函数。这样抽取的方式被称为批梯度下降

存在问题

​ 随机梯度下降存在震荡的问题:

​ 随机梯度下降时学习率 α \alpha α不能设置得过大,否则可能在山谷附近(最优解附近)“震荡”,始终无法得到最优解。

image-20221022210141860

这种算法如果要遍历整个样本集的话需要迭代很多次,且每次更新并不是向着最优的方向进行,所以每走一步都要“很小心”,也就是说随机梯度下降法的学习率α不能设置太大,不然容易出现在最优解附近“震荡”,但始终无法更接近最优解的现象
但从另一个角度来看,这种“来回震荡”的优化路线在损失函数局部极小值较多时,能够有效避免模型陷入局部最优解。

详解梯度下降法(干货篇) - 知乎 (zhihu.com)

4. Momentum梯度下降法

Momentum梯度下降概念

​ Momentum梯度下降法,动量梯度下降法。在进行下一次的梯度下降更新参数前,保留上一次的梯度,这里称为“动量”。然后使用本次的梯度与动量合成,合成的方向为本次真正的下降方向。

​ 动量梯度下降的物理含义可以由下图直观理解,按照动量梯度下降,下降将更加平滑。更容易达到最优解。

image-20221022210455729

更新的方程如下:
θ n + 1 = μ θ n − α ∇ L \theta_{n+1}=\mu\theta_n-\alpha\nabla L θn+1=μθnαL
此处 μ θ n \mu\theta_n μθn μ \mu μ为动量系数或者控制动量。

5. AdaGrad梯度下降法

α \alpha α为学习率,对于神经网络而言,一开始我们希望快速找到一个正确的收敛方向,会设置一个较大的学习率,但是随着训练过程,我们需要找到最优解防止震荡就需要找到一个更加细致的学习率。

​ 这里引入了一个新的参数 r r r,表示梯度随时间的积累量:
r ← r + L 2 r\leftarrow r+L^2 rr+L2
r r r作为更新方程的一部分:
θ n + 1 = θ n − α δ + r ∇ L \theta_{n+1}=\theta_n-\frac{\alpha}{\sqrt{\delta+r}}\nabla L θn+1=θnδ+r αL
引入后:当梯度变化较大时,学习率会较快的下降;梯度波动很小时,学习率会较快下降。 δ \delta δ是一个很小的数,用来防止分母为0.

后来又有了RMSProp(2012)

6. Adam梯度下降法

​ Adam梯度下降既考虑了动量,又考虑了学习率的自动调节。方法又引入了一个参数 s s s,此外 r r r使用的是RMSProp中 r r r的表示:
s ^ ← ρ 1 s + ( 1 − ρ 1 ) g →自适应动量 r ^ ← ρ 2 r + ( 1 − ρ 2 ) g 2 \begin{aligned} &\hat{s} \leftarrow \rho_1 s+\left(1-\rho_1\right) g \quad\text{→自适应动量}\\ &\hat{r} \leftarrow \rho_2 r+\left(1-\rho_2\right) g^2 \end{aligned} s^ρ1s+(1ρ1)g自适应动量r^ρ2r+(1ρ2)g2
更新方程为:
θ n + 1 = θ n − ε s ^ r ^ + δ \theta_{n+1} = \theta_n-\frac{\varepsilon \hat{s}}{\sqrt{\hat{r}}+\delta} θn+1=θnr^ +δεs^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 梯度下降是一种常见的数学优化方法,用于最小化一些目标函数。Matlab是一种常用的编程语言,用于数值计算及可视化。在Matlab中,可以通过编写代码实现梯度下降算法来求解目标函数的最小值。 梯度下降算法的基本思路是,找到目标函数的梯度(即方向导数)并将自变量沿着梯度方向移动一小步,直到达到目标函数的最小值。这个小步称为学习率。如果学习率太大,可能会导致算法无法收敛,如果学习率太小,可能会导致算法收敛速度太慢。因此,合适的学习率是非常重要的。 以下是一个简单的梯度下降Matlab代码的实现: ```matlab %初始化自变量和学习率 x = 5; lr = 0.01; %目标函数 function y = f(x) y = x^2 - 6*x + 8; end %计算梯度 function g = grad(x) g = 2*x - 6; end %梯度下降算法 while abs(grad(x)) > 1e-6 x = x - lr * grad(x); end %输出结果 fprintf('The optimal value of x is %.4f\n', x); fprintf('The optimal value of the objective function is %.4f\n', f(x)); ``` 这个代码首先定义了自变量x和学习率lr的初始值。然后定义了目标函数f和计算梯度的函数grad。在while循环中,采用梯度下降算法不断更新自变量x的值,直到梯度的绝对值小于某个阈值(本例中为1e-6)。最后输出了最优解和最小的目标函数值。 总而言之,梯度下降算法是一种数学优化方法,常用于最小化目标函数。在Matlab中,可以编写代码实现梯度下降算法来求解目标函数的最小值,需要注意学习率设置和算法的收敛性。 ### 回答2: 梯度下降算法机器学习中常用的优化算法,可以根据损失函数的梯度来寻找最优解。在MATLAB中实现梯度下降算法可以分为以下几个步骤: 1.定义损失函数 在MATLAB中,可以通过定义一个函数来表示损失函数,例如: ``` function J = costFunction(X, y, theta) % Compute cost for linear regression m = length(y); % number of training examples J = 0; predictions = X*theta; sqrErrors = (predictions - y).^2; J = 1/(2*m) * sum(sqrErrors); end ``` 其中,X为特征矩阵,y为样本输出,theta为待求解的参数,通过计算预测值与实际值的误差平方和来得到损失函数。 2.定义梯度函数 梯度函数表示损失函数对于每个参数的导数,即损失函数在当前参数值处的方向导数。在MATLAB中,可以定义一个函数来计算梯度值,例如: ``` function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) %GRADIENTDESCENT Performs gradient descent to learn theta % theta = GRADIENTDESCENT(X, y, theta, alpha, num_iters) updates theta by % taking num_iters gradient steps with learning rate alpha m = length(y); % number of training examples J_history = zeros(num_iters, 1); for iter = 1:num_iters predictions = X*theta; errors = predictions - y; delta = (1/m)*X'*errors; theta = theta - alpha * delta; J_history(iter) = costFunction(X, y, theta); end end ``` 其中,alpha表示学习率,num_iters表示迭代次数,通过迭代更新参数theta的值。 3.运行并可视化结果 在定义好损失函数和梯度函数之后,可以通过调用gradientDescent函数来得到参数估计值,例如: ``` initial_theta = zeros(size(X, 2), 1); num_iters = 1500; alpha = 0.01; [theta, J_history] = gradientDescent(X, y, initial_theta, alpha, num_iters); ``` 得到的theta就是我们需要的模型参数估计值,J_history则可以用来观察损失函数的变化情况,进而判断优化效果。我们可以通过可视化的方式来呈现损失函数随迭代次数的变化趋势,例如: ``` plot(1:num_iters, J_history, '-b', 'LineWidth', 2); xlabel('Number of iterations'); ylabel('Cost J'); ``` 以上就是使用MATLAB实现梯度下降算法的基本步骤,需要注意的是,选择合适的学习率alpha和迭代次数num_iters对于算法的收敛效果十分重要。 ### 回答3: 梯度下降算法是一种基于优化的方法,用于寻找函数最小值或最大值的过程。在机器学习中,它被广泛应用于训练模型,例如神经网络。 梯度下降的主要思想是通过迭代逐步调整参数,使得损失函数的值逐渐趋近于最小值。具体来说,对于每一次迭代,使用当前参数计算出损失函数的梯度,然后按照一定的步长调整参数的值,使得损失函数的值下降。这个过程一直持续到损失函数的值达到一个稳定的最小值。 以下是一个简单的梯度下降的MATLAB代码: function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) %初始化J_history: J_history = zeros(num_iters, 1); %执行num_iters次迭代: for iter = 1:num_iters %计算当前theta下的代价函数: J_history(iter) = computeCost(X, y, theta); %计算当前theta下的梯度: grad = (1/m) * X' * (X*theta - y); %更新参数: theta = theta - alpha * grad; end end 其中,X是样本矩阵,y是标签矩阵,theta是需要求解的权重向量,alpha是学习率,num_iters是迭代次数。computeCost函数用于计算当前参数下的代价函数。 这个代码是一个简单的批量梯度下降算法。在每次迭代中,它计算出当前参数下的代价函数和梯度,然后沿着负梯度方向更新参数。如果学习率设置得当,这个算法可以很快地收敛到最优解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blanche117

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值