前言
在学习了深度学习的梯度下降算法之后,做一些总结来记录一下。
在深度学习中,当我们构建好学习系统之后,需要建立数据模型,初期选择较为简单的线性模型作为我们理解深度学习相关知识概念的基础模型。
在权重数量不多,目标函数是凸函数的情况下可以通过分治法来找寻全局最优点。
一、概念
梯度下降算法:在我们确定好最初权重猜测之后,想要找到目标点,此时需要确定往数轴的哪个方向,此时梯度的定义就是通过目标函数对权重求导来确定移动方向。
及通过每次的迭代来向着目标点下降一点从而达到目的的一种’贪心’算法。
def forward(x):
return x*w #求预估值
def cost(xt,yt): #求MSE
cost = 0
for x,y in zip(xt,yt):
y_val = forward(x)#forward()函数中不能放如xt,因为此时xt已经通过for循环赋值给了x
cost += (y_val - y)*(y_val - y)
return cost/len(xt) #通过len()函数来计算列表xt的长度,从而求MSE--平均平方误差
def gradient(xt,yt): #创建grad函数,通过求导来确定是向左还是向右改变权重
grad = 0
for x,y in zip(xt,yt):
grad += 2*x*(x*w - y)
return grad/len(xt)
print('Predict(before) w=',4,forward(4))
mse_list = []
epoch_list = []
for epoch in range(100): #循环训练100次
cost_val = cost(x_data,y_data)
grad_val = gradient(x_data,y_data) #求梯度
w -= 0.01*grad_val #0.01 学习率----更新
mse_list.append(cost_val)
epoch_list.append(epoch)
print('Epoch:', epoch, 'w=', w, 'cost=', cost_val)
print('Predict(before) w=',4,forward(4))
随机梯度下降算法:在使用梯度下降算法难免会担心担心找不到全局最优点(实际情况很少)或者是鞍点(即碰到非凸函数时),所以此时能通过随机梯度算法解决问题。通过每次随机的选取样本,从而引入随机噪声,来推动着向前移动从而跨过鞍点到达最优点。
def forward(x):
return x*w
def loss(xt,yt):
y = forward(xt)
y_val= (yt - y)**2
return y_val #从计算平均平方误差到求单独的一组数据的误差
def gradient(xt,yt):
return 2*xt*(xt*w - yt)
loss_list = []
epoch_list = []
for epoch in range(100):
for x,y in zip(x_data,y_data):
loss_val = loss(x,y) #计算损失值
grad_val = gradient(x,y) #求梯度
w -= 0.01*grad_val
print('epoch=',epoch, 'w=',w, 'loss=',loss_val)
epoch_list.append(epoch)
loss_list.append(loss_val)
二、差异
随机梯度算法能解决掉鞍点等问题,且当数据样本数量较多时,相对于梯度下降算法,随机梯度下降算法每次迭代所导致的计算开销会小,所以在学习训练中使用较多
由于随机梯度算法在每次更新的时候是随机选取样本计算,所以会有计算速度快,内存开销小等优势,但由于每次只接受一个信息,则会导致数据偏差大,误差较大,所以出现了后面的批量梯度下降算法。
无论是哪一种算法,对于学习率的选取都至关重要,需要大量实验找到
总结
引用其他博主的一句来总结:
*什么是梯度下降:及使用适当的学习率,沿着梯度反方向更新自变量可能降低目标函数值。梯度下降重复这一更新过程直到得到满足要求的解。
https://blog.csdn.net/qq_43328040/article/details/107892818?