手动实现梯度下降和随机梯度下降

梯度下降适合用于并行化,他是对于整个样本的数据进行求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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值