梯度下降法
对于线性回归分析,我们将假设函数定义为 h(x)=θ0+θ1x1+⋯+θnxn
令 x0=1,记x=(x0x1⋯xn),θ=⎛⎝⎜⎜⎜⎜θ0θ1⋮θn⎞⎠⎟⎟⎟⎟
因为假设函数与参数 θ 有关,记 hθ(x)=h(x)=xθ
对于每一个训练样本 X(i)=(xi0,xi1,⋯,xin) ,假设函数与样本输出值存在误差 hθ(Xi)−yi,那么损失函数定义为:J(θ)=12∑ni=1(hθ(Xi)−yi)2
目标函数定义为 minθJ(θ)=12∑ni=1(hθ(Xi)−yi)2梯度下降的迭代算法
梯度下降法的原理是每次沿着梯度的方向去更新参数,更新公式为 θi=θi−α∂J(θ)∂θi
其中 ∂J(θ)∂θi=∑mi=1(hθ(Xi)−yi)∂(hθ(Xi)−yi)∂θi
对于样本数量m=1情况, ∂(hθ(Xi)−yi)∂θi=∂(θ0+θ1x1+⋯+θnxn−yi)∂θi=xi
所以参数 θi=θi−α(hθ(Xi)−yi)xi
所以当样本数量大于1的情况,梯度下降过程为:
θi=θi−α∑mj=1hθ(Xj)−yj)xji
由于每个参数的求解都需要整个样本数据集的迭代,称为批量随机梯度下降法,收敛速度慢
为了加快训练速度,采用随机梯度下降法,这种方法是通过随机选取一组样本进行参数迭代,训练速度较快,但是会存在噪声,使得参数迭代不是向着整体最优方向,此时可以采用小批量随机梯度下降,这种方法的是选取小批量样本进行参数的迭代,三种方法的python代码如下:
x = [[1,4],[2,5],[5,1],[4,2]]
y= [19,26,19,20]
theta = [1,1] #参数初始值
alpha = 0.1#学习率
max_iter = 10000 #最大迭代次数
iter_count = 0 #当前迭代次数
loss = 10 #当前误差
eps = 0.0001 #精度
err1 = [0,0,0,0]
err2 = [0,0,0,0]
while loss>eps and iter_count<max_iter:
loss = 0
err1sum = 0
err2sum = 0
for j in range(4):
predict_y = x[j][0]*theta[0]+x[j][1]*theta[1]
err1[j] = (predict_y-y[j])*x[j][0]
err1sum += err1[j]
err2[j] = (predict_y-y[j])*x[j][1]
err2sum += err2[j]
theta[0] = theta[0]-alpha*err1sum/4 #损失函数一般要做平均
theta[1] = theta[1]-alpha*err2sum/4
for j in range(4):
predict_y = x[j][0]*theta[0]+x[j][1]*theta[1]
loss += (1/(2*4))*(predict_y-y[j])**2
iter_count += 1
print(theta)
###随机梯度下降SGD
import random
x = [[1,4],[2,5],[5,1],[4,2]]
y= [19,26,19,20]
theta = [1,1] #参数初始值
alpha = 0.01#学习率
max_iter = 10000 #最大迭代次数
iter_count = 0 #当前迭代次数
loss = 10 #当前误差
eps = 0.0001 #精度
error = 0
while loss>eps and iter_count<max_iter:
loss = 0
i = random.randint(0,3)#随机抽取一组样本
predict_y = x[i][0]*theta[0]+x[i][1]*theta[1]
theta[0] = theta[0]-alpha*(predict_y-y[i])*x[i][0]#损失函数一般要做平均
theta[1] = theta[1]-alpha*(predict_y-y[i])*x[i][1]
for i in range(4):
predict_y = x[i][0]*theta[0]+x[i][1]*theta[1]
error = 0.5*(predict_y-y[i])**2
loss += error
iter_count += 1
print(theta)
###小批量随机梯度下降MBGD
import random
x = [[1,4],[2,5],[5,1],[4,2]]
y= [19,26,19,20]
theta = [1,1] #参数初始值
alpha = 0.01#学习率
max_iter = 10000 #最大迭代次数
iter_count = 0 #当前迭代次数
loss = 10 #当前误差
eps = 0.0001 #精度
error = 0
while loss>eps and iter_count<max_iter:
loss = 0
#这里随机选取2组样本更新theta
i = random.randint(0,3)#随机抽取一组样本
j = (i+1)%4
predict_y0 = x[i][0]*theta[0]+x[i][1]*theta[1]
predict_y1 = x[j][0]*theta[0]+x[j][1]*theta[1]
theta[0] = theta[0]-alpha*1/2*((predict_y0-y[i])*x[i][0]+(predict_y1-y[i])*x[j][0])#损失函数一般要做平均
theta[1] = theta[1]-alpha*1/2*((predict_y0-y[i])*x[i][1]+(predict_y1-y[i])*x[j][1])
for i in range(4):
predict_y = x[i][0]*theta[0]+x[i][1]*theta[1]
error = 0.5/2*(predict_y-y[i])**2
loss += error
iter_count += 1
print(theta)
梯度下降的矩阵算法
定义梯度 ▽θJ=⎛⎝⎜⎜⎜⎜⎜⎜⎜∂J∂θ0∂J∂θ1⋮∂J∂θn⎞⎠⎟⎟⎟⎟⎟⎟⎟
以下说明几个公式,不懂的可以去看线性代数的知识
定义矩阵的迹trA=∑ni=1Aii,那么根据矩阵性质有trA=trAT,trAB=trBA,trABC=trCAB=trBCA,trABATC=CAB+CTABT,tra=a(a∈R)
对于整个数据集 X=⎛⎝⎜⎜⎜⎜X1X2⋮Xm⎞⎠⎟⎟⎟⎟,其中Xi=(xi0xi1⋯xin)
j假设函数 h=Xθ=⎛⎝⎜⎜⎜⎜X1θX2θ⋮Xmθ⎞⎠⎟⎟⎟⎟=⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜hθ(X1)hθ(X2)⋮hθ(Xm)⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟
Xθ−y=⎛⎝⎜⎜⎜⎜⎜hθ(X1)−y1hθ(X2)−y2⋮hθ(Xm)−ym⎞⎠⎟⎟⎟⎟⎟ ,所以损失函数计算公式为
J(θ)=12(Xθ−y)T(Xθ−y)=12∑mi=1(hθ(Xi)−yi)2
▽θJ(θ)=12▽θtr(Xθ−y)T(Xθ−y)=12▽θtr(θTXTXθ−θTXTy−yTXθ+yTy)
▽θtr(θTXTXθ)=▽θtr(θIθTXTX)=XTXθI+XTXθIT=2XTXθ
▽θtr(yTXθ)=XTy,▽θtr(θTXTy)=▽θtr(yTXθ)=XTy,▽θtr(yTy)=0
所以 ▽θJ(θ)=12(2XTXθ−2XTy)=XTXθ−XTy
当梯度等于0时,有 θ=(XTX)−1XTy ,这就是梯度下降的矩阵算法