写在前面
本文翻译 Implement Gradient Descent in Python
什么是梯度下降算法
梯度下降算法是一种寻找函数最小值得优化算法。算法从函数的一个随机点开始,每次移动都是函数梯度的负方向,从而到达函数的全局/局部最小点。
例子
问题:给定函数$y=(x+5)^2$,从x=3点出发,找到函数的局部最小点。
解决方案:从函数图形上看,我们可以知道答案。当x = -5 时,函数$y=(x+5)^2$到达最小值(x=-5, y=0)。所以x=-5是函数的局部和全局最小值。
现在,我们来看如何使用梯度下降算法来获得同样的答案。
第一步:初始化x=3。找到函数的梯度,$\frac{dy}{dx} = 2*(x+5)$.
第二步:向梯度的负方向移动。但是每次移动多少呢。这里,我们需要一个学习率。这里我们假设学习率->0.01
第三步:我们来演示梯度下降的两次迭代
第四步:我们可以看到x的值在下降,应该会收敛到局部最小-5。然而,我们需要多少次迭代呢。
我们在算法里设置一个精度变量用来计算两个连续的”x”值。如果两个连续x的值得差值小于我们设置的精度,就停止算法。
Python实现梯度下降
步骤1:初始化参数1
2
3
4
5
6
7cur_x = 3 # 算法开始在 x=3
rate = 0.01 #学习率
precision = 0.000001 # 什么时候停止算法
previous_step_size = 1
max_iters = 10000 # 最大迭代次数
iters = 0 # 迭代计数器
df = lambda x : 2*(x+5) # 函数梯度
步骤2:在循环中进行梯度下降
停止循环当两个连续迭代的x值的差小于0.000001或者迭代次数超过10,0001
2
3
4
5
6
7
8while previous_step_size > precision and iters < max_iters:
prev_x = cur_x
cur_x = cur_x - rate * df(prev_x) # 梯度
previous_step_size = abs(cur_x - prev_x)
iters = iters + 1
print("Iteration",iters,"\nX value is",cur_x)
print("The local minimum occurs at", cur_x)
输出:从下面的输出,我们可以看到最开始10次迭代的x的值,我们可以通过这个交叉检查我们上面的计算。算法运行了595次迭代直到停止。
完整的运行过程:
1 | cur_x = 3 # 算法开始在 x=3 |
1 | while previous_step_size > precision and iters < max_iters: |
1 | Iteration 1 |