梯度下降适合用于并行化,他是对于整个样本的数据进行求Loss和Gradient的,相比于梯度下降而言,随机梯度下降针对的是某个样本,他不需要所有求和,只需对其中某个样本求梯度即可;但是这两个也有优缺点,比如随机梯度下降虽然性能好,但是对每个样本求梯度再更新权重,这样会使得时间复杂度较大;对于梯度下降其时间复杂度低,但是性能不行,为此在这两者之间取折中在深度学习当中,往往使用Batch,将样本若干分为一组,对每一组求梯度,用小批量的数据进行批量的随机梯度下降。
梯度下降代码实现:
# -*- coding: utf-8 -*-
# @Time : 2022/1/21 14:33
# @Author : CH339
# @FileName: Test1_21_2.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_56068397/article/
"""
实现梯度下降
"""
# 定义数据集
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
# 初始化定义权重
w = 0.5
ln = 0.01
# 定义前馈函数
def forward(x,w):
return x*w
# 定义损失函数
def cost(x1,y1,w):
cost = 0
for x,y in zip(x1,y1):
y_pre = forward(x, w)
cost += (y_pre-y)**2
return cost/len(x1)
# 定义梯度函数
def gradient(x1,y1,w):
grad = 0
for x,y in zip(x1,y1):
grad += 2*x*(w*x-y)
return grad/len(x1)
# 迭代100次
for epoch in range(100):
cos = cost(x_data,y_data,w)
grad = gradient(x_data,y_data,w)
w = w-ln*grad
print('Epoch=',epoch+1,'w=',w,'Loss=',cos)
部分截图:
随机梯度下降的实现:
# -*- coding: utf-8 -*-
# @Time : 2022/1/21 14:51
# @Author : CH339
# @FileName: Test1_21_3.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_56068397/article/
"""
实现随机梯度下降
"""
# 定义数据集
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
# 初始化定义权重
w = 0.5
ln = 0.01
# 定义前馈函数
def forward(x,w):
return x*w
# 定义损失函数
def cost(x1,y1,w):
y_pre = forward(x, w)
return (y_pre-y)**2
# 定义梯度函数
def gradient(x,y,w):
# 这个结果只需对w求偏导即可
return 2*x*(x*w-y)
# 迭代100次,在每一次迭代当中对每个样本都进行梯度计算并更新w
for epoch in range(100):
# 对每一个样本进行梯度计算
for x,y in zip(x_data,y_data):
cos = cost(x,y,w)
w = w-ln*gradient(x,y,w)
# 一轮结束后的结果
print('Epoch=',epoch+1,'w=',w,'Loss=',cos)