文章目录
一、梯度下降法的原理介绍
(一)什么是梯度下降法
梯度下降法是迭代法的一种,可以用于求解最小二乘法(线性和非线性都可以),在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降是最常采用的方法之一,在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值,反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。
(二)相关概念的介绍
- 微分的概念
看待微分的意义,可以有不同的角度,最常用的两种是:
函数图像中,某的的切线的斜率;
函数的变化率。
当一个函数有多个变量时,就有了多变量的微分,即分别对每个变量进行求微分。 - 梯度的概念
梯度就是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,也就是该点变化率最大的方向。在现实中,就是山体的某点沿着山体最陡峭的向上方向就是梯度。
梯度其实就是多变量微分的一般化,在单变量的函数中梯度其实就是函数的微分,代表着函数在某个定点的切线的斜率;在多变量的函数中,梯度是一个向量,梯度的方向就指出了函数在给定点的上升最快的方向。 - 学习率α
学习率也被称为迭代的生长,优化函数的梯度一般是不断变化的(梯度的方向随梯度的变化而变化),因此需要一个适当的学习率约束着每次下降的距离不会太多也不会太少。
(三)梯度下降法的原理
-
根据采用数据量可以分为标准梯度下降法(GD)、批量梯度下降法(BatchGradient Descent)、小批量梯度下降法(Mini-batchGradient Descent)、随机梯度下降法(Stochastic Gradient Descent)
-
标准梯度下降法(GD)
每个样本都计算一次;
训练速度慢,容易陷入局部最优解。 -
批量梯度下降法(BatchGradient Descent)
批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。
如果数据集较大可能会面临内存不足的问题,并且其收敛速度一般较慢(相较于GD快一些),容易陷入局部最优解。选取平均梯度最小的方向。 -
小批量梯度下降法(Mini-batchGradient Descent)
小批量梯度下降算法是折中方案,选取训练集中一个小批量样本,这样可以保证训练过程更稳定,而且采用批量训练方法也可以利用矩阵计算的优势。通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。 -
随机梯度下降法(Stochastic Gradient Descent)
针对训练集中的一个训练样本计算的,又称为在线学习,即得到了一个样本,就可以执行一次参数更新。所以其收敛速度会快一些(不需要计算每个样本的梯度或平均梯度),但是有可能出现目标函数值震荡现象,因为频率的参数更新导致了高方差。
二、梯度下降法手工求解
(一)题目描述
(二)计算过程
- 设初始点:x0=(X₁(0),x₂(0))T=(3,2)T
学习率为λ - 计算初始点的梯度
▽f(x)=(2/3x₁,x₂)
▽f(x0)=(2,2) - 迭代公式
f(x1)=f(x0-λ▽f(x0))=10/3λ2-8λ+5
λ0=6/5为函数极小值点
更新后的迭代公式
x1=x0-λ0▽f(x0)=(3/5,-2/5)
重复上述过程得:x2=(3/52,2/52)
可以得到:xk=(3/5k,(-1)k2/5k)
三、在Excel中用梯度下降法求解近似根
求解z=2(x-1)2+y2的近似根
- 设置表格基本内容
- 设置(x,y)初始值为(2,1)
- 设置其他表格相应的计算公式
∂z/∂x=4*(x-1)
∂z/∂y=2y
∆x=-η∂z/∂x
∆y=-η∂z/∂y
通过右下角下拉就会得到前面计算的值 - 多次迭代结果
得到近似值为(1,0)
四、线性回归问题的求解
(一)最小二乘法
代码
from sklearn import linear_model
import seaborn as sns
import numpy as np
m=20 //数据集大小即20个数据点
X0=np.ones((m,1)) //生成m行1列的向量,其值全为1
X1=np.arange(1,m+1).reshape(m,1) //生成m行1列的向量,也就是x1,从1到m
X=np.hstack((X0,X1)) //按照列堆叠形成数组,其实就是样本数据
Y=np.array([3,4,5,5,2,4,7,8,11,8,12,11,13,13,16,17,18,17,19,21]).reshape(m,1)
model=linear_model.LinearRegression()
model.fit(X1,Y)
print("斜率",model.coef_[0])
print("截距",model.intercept_)
线性结果绘制
def plot(X,Y,theta):
import matplotlib.pyplot as plt
ax=plt.subplot(111)
ax.scatter(X,Y,s=30,c="blue",marker="s")
plt.xlabel("X")
plt.ylabel("Y")
x=np.arange(0,21,0.2)
y=model.intercept_+model.coef_[0]*x
ax.plot(x,y)
plt.show()
plot(X1,Y,model.coef_[0])
(二)梯度下降法
代码
from numpy import *
import numpy as np
m=20
x0=ones((m,1))
x1=arange(1,m+1).reshape(m,1)
x=hstack((x0,x1))
y=np.array([3,4,5,5,2,4,7,8,11,8,12,11,13,13,16,17,18,17,19,21]).reshape(m,1)
alpha=0.01
import matplotlib.pyplot as plt
plt.scatter(x1,y,color='red')
plt.show()
梯度下降迭代
def cost_function(theta,X,Y):
diff=dot(X,theta)-Y
return (1/(2*m))*dot(diff.transpose(),diff)
def gradient_function(theta,X,Y):
diff=dot(X,theta)-Y
return (1/m)*dot(X.transpose(),diff)
def gradient_descent(X,Y,alpha):
theta=array([1,1]).reshape(2,1)
gradient=gradient_function(theta,X,Y)
while not all(abs(gradient) <= 1e-5):
theta=theta-alpha*gradient
gradient=gradient_function(theta,X,Y)
return theta
optimal=gradient_descent(x,y,alpha)
print('optimal:',optimal)
print('cost function:',cost_function(optimal,x,y)[0][0])
线性结果绘制
def plot(X,Y,theta):
ax=plt.subplot(111)
ax.scatter(X,Y,s=30,c="red",marker="s")
plt.xlabel("X")
plt.ylabel("Y")
x=arange(0,21,0.2)
y=theta[0]+theta[1]*x
ax.plot(x,y)
plt.show()
plot(x1,y,optimal)
(三)二者对比
-
最小二乘法
-
梯度下降法
-
两者得到结果相差较小,基本可以忽略,而梯度下降算法会更加方便
五、参考
梯度下降算法原理讲解——机器学习
机器学习算法:梯度下降法——原理篇
什么是梯度和梯度下降法?
梯度下降法——极值,线性回归,近似根问题