一.定义
梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以),本文介绍的是线性梯度下降法。
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。
注意:
1.梯度下降法不是一个机器学习算法,只是一种基于搜索的最优化的方法
2.作用:最小化一个损失函数
3.梯度上升法:也就是最大化一个效用函数
二.模拟梯度下降
举一个非常简单的例子,如求函数f(x)=(x - 2.5)^2-1 的最小值。
利用梯度下降的方法解题步骤如下:
1.求梯度(即求导)gradient:2(x - 2.5)
2.向梯度相反的方向移动 x(
theta ),如下
theta = theta - eta *gradient
,其中,eta 为步长。如果步长足够小,则可以保证每一次迭代都在减小,但可能导致收敛太慢,如果步长太大,则不能保证每一次迭代都减少,也不能保证收敛。
3.循环迭代步骤2,直到 x 的值变化到使得f(x)在两次迭代之间的差值足够小,比如0.00000001(
epsilon = 1e-8 ),也就是说,直到两次迭代计算出来的f(x)基本没有变化,则说明此时f(x)已经达到局部最小值了。
4.此时,输出 x(
theta),这个 x 就是使得函数 f(x) 最小时的 x 的取值(J(
theta)) 。
import numpy as np
import matplotlib.pyplot as plt
'''
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
在指定的间隔内返回均匀间隔的数字。
返回num均匀分布的样本,在[start, stop]。
这个区间的端点可以任意的被排除在外
'''
plot_x = np.linspace(-1,6,141)
# plot_y = (plot_x - 2.5)**2 - 1
# plt.plot(plot_x,plot_y)
# plt.show()
# theta 参数
def dJ(theta): # 求导之后的值
return 2*(theta - 2.5)
def J(theta):
return (theta - 2.5)**2 - 1
eta = 0.1
epsilon = 1e-8 #表示为10的-8次方
theta = 0.0
theta_history = [theta]
while True:
gradient = dJ(theta)
last_theta = theta
# 向倒数的负方向移动
theta = theta - eta *gradient
theta_history.append(theta)
#新的theta的值已经比上一theta的值要小于epsilon就停止
if(abs(J(theta) - J(last_theta)) < epsilon):
break
plt.plot(plot_x,J(plot_x))
plt.plot(np.array(theta_history),J(np.array(theta_history)),color='r')
plt.show()
# print(theta)
# print(J(theta))
待续未完……