Gradient descent——梯度下降
词汇:
Gradient:梯度
Descent:下降
梯度下降(gradient descent)是几乎每种机器学习模型中使用的优化算法。
该算法是几乎所有ML模型的学习方式!
梯度下降的直观描述如下:
如图1所示,登山运动员从山顶下山,他希望走到山底部的最低点
下面进行建模
基本假设:
1. 登山运动员下山的步长固定,为一定值(常数)
2. 山底存在最低点
在坐标轴上做出“山”的三维图像如图1所示
分析:
登山运动员下山时,步长为一定值,为了保证其走到山底的最低点,我们采用“贪心”策略:
(1)对于当前位置,我们基于当前状态走到当前可达的最低点
(2)重复(1),直到周围的海拔均比当前海拔高,结束
图1 梯度下降方法示例图
梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。
(引用自博客https://blog.csdn.net/pangjiuzala/article/details/72630166)
梯度下降(gradient descent)是几乎每种机器学习模型中使用的优化算法。
该算法是几乎所有ML模型的学习方式!
图2 梯度下降方法示例图
梯度下降(gradient descent)中的几个重要名词:
1. 梯度
2. learning rate即学习率
3. bias偏差
下面一一解释
1. 梯度 gradient
图3 梯度
梯度是微积分中一个很重要的概念
- 在单变量的函数中f(x),梯度其实就是函数的微分df/dx,代表着函数在某个给定点P(x, f(x))的切线的斜率
- 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向
这也就说明了为什么我们需要千方百计的求取梯度!我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的方向一直走,就能走到局部的最低点!
(引用自博客https://blog.csdn.net/pangjiuzala/article/details/72630166)
单变量的梯度下降参见上方的图2,多变量的梯度下降参见上方的图1
2. 学习率 learning rate
学习率被定义为每次迭代中成本函数中最小化的量。简单来说,我们下降到成本函数的最小值的速率是学习率。我们应该非常仔细地选择学习率,因为它不应该是非常大的,以至于最佳解决方案被错过,也不应该非常低,以至于网络需要融合。
直观描述如下:
学习率是网络放弃旧信念的速度有多快。
如果一个孩子看到10只猫的例子,并且所有猫都有橙色皮毛,它会认为猫有橙色皮毛,并且在尝试识别猫时会寻找橙色皮毛。现在它看到一只黑猫和她的父母告诉她这是一只猫(监督学习)。凭借较大的“学习率”,它将很快意识到“橙皮”并不是猫最重要的特征。学习率很低,它会认为这只黑猫是一个异常值,猫仍然是橙色的。
好的,这个例子有点紧张。关键是更高的学习率意味着网络更快地改变主意。在上面的情况下这可能是好的,但也可能是坏的。如果学习率太高,可能会开始认为所有的猫都是黑色的,即使它看到的是更多的橙色猫而不是黑色的猫。
一般来说,您希望找到一个足够低的学习率,使网络收敛到有用的东西,但又足够高,以至于您不必花费数年时间来训练它。
(引用自https://www.quora.com/What-is-the-learning-rate-in-neural-networks)
3. 偏差 bias
偏差(Bias)——除了权重之外,另一个被应用于输入的线性分量被称为偏差。它被加到权重与输入相乘的结果中。基本上添加偏差的目的是来改变权重与输入相乘所得结果的范围的。添加偏差后,结果将看起来像a* W1 +偏差。这是输入变换的最终线性分量。(引用自博客https://blog.csdn.net/pangjiuzala/article/details/72630166)
梯度下降python代码示例
def train(X, y, W, B, alpha, max_iters):
'''
Performs GD on all training examples,
X: Training data set,
y: Labels for training data,
W: Weights vector,
B: Bias variable,
alpha: The learning rate,
max_iters: Maximum GD iterations.
'''
dW = 0 # Weights gradient accumulator
dB = 0 # Bias gradient accumulator
m = X.shape[0] # No. of training examples
for i in range(max_iters):
dW = 0 # Reseting the accumulators
dB = 0
for j in range(m):
# 1. Iterate over all examples,
# 2. Compute gradients of the weights and biases in w_grad and b_grad,
# 3. Update dW by adding w_grad and dB by adding b_grad,
W = W - alpha * (dW / m) # Update the weights
B = B - alpha * (dB / m) # Update the bias
return W, B # Return the updated weights and bias.
其中,关键参数包括X, y, W, B, alpha, max_iters
X:训练数据集
y:数据集标记
W:权重向量
B:偏置变量
alpha:learning rate
max_iters:最大GD迭代次数
dW = 0 # 权重梯度叠加器
dB = 0 # 偏置梯度叠加器