梯度下降法(Gradient Descent)
原理
1.1、定义
梯度下降是迭代法的一种,是一种基于搜索的最优化方法。
梯度下降法不是一个机器学习的方法
它可以用于求解最小二乘问题(线性和非线性都可以)。
1.2、作用
可以最小化损失函数(梯度上升法可以最大化效用函数)
二、公式
2.1 批量梯度下降
构造线性方程的损失函数:
J(θ)=1m∑mi=1(y(i)−θ⋅x(i))2
J
(
θ
)
=
1
m
∑
i
=
1
m
(
y
(
i
)
−
θ
⋅
x
(
i
)
)
2
,对损失函数求导,计算损失梯度更新公式为:
想要计算梯度,需要先将 ∇J(θ) ∇ J ( θ ) 求出:
通过对θ的不断地更新迭代,判断如果损失函数 J(θ) J ( θ ) 的变化率小于一个极小值 ϵ ϵ
那么该θ值即为最优参数。
2.2 随机梯度下降
使学习率η与迭代遍历次数i_iters进行关联:
此时的学习率η会随着i_iters的增大而减小,变化率不稳定,为了控制变化率的范围,修正学习率公式:
体现随机随机性,i_iters的取值采取随机取值的策略。这样就构造了一个简单的随机梯度下降法。
三、流程图
四、代码实现
'''构造损失函数'''
def J(theta,x,y):
m=len(x)
try:
print()
return (x.dot(theta)-y).dot(x.dot(theta)-y)/m
except:
return float('inf')
'''构造θ更新函数'''
def theta_update(theta,eta,x,y):
m=len(x)
eta=2*eta/m
return theta-x.T.dot(x.dot(theta)-y)*eta
'''循环判定θ变化是否小于ε'''
def gradient_descent(x,y,initial_theta,eta,n_iters=1e4,epsilon=1e-6):
i_iter=0
theta=initial_theta
while i_iter<n_iters:
last_theta=theta
theta=theta_update(theta,eta,x,y)
if (abs(J(theta,x,y)-J(last_theta,x,y))<epsilon):
break
i_iter+=1
return theta
if _name_=='_main_':
'''说明:
高维度梯度下降时,需对数据集做均值归一化处理。
不同维度量纲不同,同一个学习率无法适配每一个维度。
所以需对各维度量纲进行归一化。
'''
initial_theta=np.zeros(X_b.shape[1])#初始化θ
eta=0.01#定义学习率
theta=gradient_descent(X_b,y_train,initial_theta,eta,n_iters=1e4)#求解θ
五、注意事项
高维度并不只有一个极值点,想要达到最佳极值点需做一下操作:
多次运行,随机化初始点θ
随机梯度下降法更容易跳出局部最优解
随机梯度下降运行速度更快