系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI,
点击star加星不要吝啬,星越多笔者越努力。git
在大多数文章中,都以“一我的被困在山上,须要迅速下到谷底”来举例,这我的会“寻找当前所处位置最陡峭的地方向下走”。这个例子中忽略了安全因素,这我的不可能沿着最陡峭的方向走,要考虑坡度。github
在天然界中,梯度降低的最好例子,就是泉水下山的过程:安全
梯度降低的数学公式:网络
\[\theta_{n+1} = \theta_{n} - \eta \cdot \nabla J(\theta) \tag{1}\]函数
其中:学习
“梯度降低”包含了两层含义:spa
亦即与上升相反的方向运动,就是降低。code
图2-9 梯度降低的步骤blog
图2-9解释了在函数极值点的两侧作梯度降低的计算过程,梯度降低的目的就是使得x值向极值点逼近。get
假设一个单变量函数:
\[J(x) = x ^2\]
咱们的目的是找到该函数的最小值,因而计算其微分:
\[J'(x) = 2x\]
假设初始位置为:
\[x_0=1.2\]
假设学习率:
\[\eta = 0.3\]
根据公式(1),迭代公式:
\[x_{n+1} = x_{n} - \eta \cdot \nabla J(x)= x_{n} - \eta \cdot 2x\tag{1}\]
假设终止条件为J(x)<1e-2,迭代过程是:
x=0.480000, y=0.230400 x=0.192000, y=0.036864 x=0.076800, y=0.005898 x=0.030720, y=0.000944
上面的过程如图2-10所示。
图2-10 使用梯度降低法迭代的过程
假设一个双变量函数:
\[J(x,y) = x^2 + \sin^2(y)\]
咱们的目的是找到该函数的最小值,因而计算其微分:
\[{\partial{J(x,y)} \over \partial{x}} = 2x\]
\[{\partial{J(x,y)} \over \partial{y}} = 2 \sin y \cos y\]
假设初始位置为:
\[(x_0,y_0)=(3,1)\]
假设学习率:
\[\eta = 0.1\]
根据公式(1),迭代过程是的计算公式:
\[(x_{n+1},y_{n+1}) = (x_n,y_n) - \eta \cdot \nabla J(x,y)\]
\[ = (x_n,y_n) - \eta \cdot (2x,2 \cdot \sin y \cdot \cos y) \tag{1}\]
根据公式(1),假设终止条件为\(J(x,y)<1e-2\),迭代过程如表2-3所示。
表2-3 双变量梯度降低的迭代过程
迭代次数 | x | y | J(x,y) |
---|---|---|---|
1 | 3 | 1 | 9.708073 |
2 | 2.4 | 0.909070 | 6.382415 |
... | ... | ... | ... |
15 | 0.105553 | 0.063481 | 0.015166 |
16 | 0.084442 | 0.050819 | 0.009711 |
迭代16次后,J(x,y)的值为0.009711,知足小于1e-2的条件,中止迭代。
上面的过程如表2-4所示,因为是双变量,因此须要用三维图来解释。请注意看两张图中间那条隐隐的黑色线,表示梯度降低的过程,从红色的高地一直沿着坡度向下走,直到蓝色的洼地。
表2-4 在三维空间内的梯度降低过程
观察角度1 | 观察角度2 |
---|---|
![]() |
![]() |
在公式表达时,学习率被表示为\(\eta\)。在代码里,咱们把学习率定义为learning_rate,或者eta。针对上面的例子,试验不一样的学习率对迭代状况的影响,如表2-5所示。
表2-5 不一样学习率对迭代状况的影响
学习率 | 迭代路线图 | 说明 |
---|---|---|
1.0 | ![]() |
学习率太大,迭代的状况很糟糕,在一条水平线上跳来跳去,永远也不能降低。 |
0.8 | ![]() |
学习率大,会有这种左右跳跃的状况发生,这不利于神经网络的训练。 |
0.4 | ![]() |
学习率合适,损失值会从单侧降低,4步之后基本接近了理想值。 |
0.1 | ![]() |
学习率较小,损失值会从单侧降低,但降低速度很是慢,10步了尚未到达理想状态。 |
ch02, Level3, Level4, Level5