在Python中实现机器学习中的梯度下降
什么是梯度下降?
这是一个寻找函数最小值的优化算法。我们从函数上的一个随机点开始,沿着函数梯度的负方向移动,到达局部最小值。
手工举例:
问题 :从点x = 3开始,查找函数y =(x + 5)²的局部最小值
解答:我们通过查看图表知道答案。当x = -5时(即,当x = -5,y = 0时),y=(x+5)²达到它的最小值。因此x = -5是函数的局部和全局最小值。
现在,让我们看看如何使用梯度下降获得相同的数字。
第1步 :找到函数的梯度,dy / dx = 2 *(x + 5)。
第2步 :朝梯度负向移动。但是等等,移动多少?为此,我们需要一个学习率。让我们假设学习率→0.01
第3步 :我们执行2次梯度下降迭代
步骤4 :我们已经可以观察到X值缓慢下降并且应该收敛到-5(局部最小值)。但是,我们应该执行多少次迭代?
让我们在算法中设置一个精度变量,它计算两个连续的“x”值之间的差值。如果连续2次迭代的x值之间的差异小于我们设置的精度,请停止算法!
Python中的梯度下降:
步骤1 :初始化参数
cur_x = 3 # The algorithm starts at x=3
rate = 0.01 # Learning rate
precision = 0.000001 #这告诉我们何时停止算法
previous_step_size = 1 #
max_iters = 10000 # 最大迭代次数
iters = 0 #iteration counter
df = lambda x: 2*(x+5) #Gradient of our function
步骤 2:运行一个while循环执行梯度下降:
当连续两次迭代的x值之间的差值小于0.000001或迭代次数超过10,000时停止循环
while previous_step_size > precision and iters < max_iters:
prev_x = cur_x #Store current x value in prev_x
cur_x = cur_x - rate * df(prev_x) #Grad descent
previous_step_size = abs(cur_x - prev_x) #Change in x
iters = iters+1 #iteration count
print("Iteration",iters,"X value is",cur_x) #Print iterations
print("The local minimum occurs at", cur_x)
输出 :从下面的输出中,我们可以观察前10次迭代的x值 - 可以通过上面的计算进行交叉检查。该算法在终止之前运行595次迭代。