欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pytorch使用随机梯度下降的方法更新线性模型y=wx的权重w

程序员文章站 2022-05-21 22:57:26
...

1.背景及思路

【背景1】pytorch实现最简单的线性模型y=wx
【背景2】pytorch使用梯度下降的方法更新线性模型y=wx的权重w
【思想】
1.使用梯度下降是可以解决大多数问题的,但是遇到“鞍点”问题无法解决。
2.使用梯度下降更新权重w的时候,对于每一个w,计算cost损失、计算梯度的时候,都要对所有样本[x1,y1]、[x2, y2]……[xn,yn]求cost损失和梯度的均值。实际上我们最主要的目标是找到最接近的w的值,只要多训练几次,对于cost和梯度取不取均值,没有太大区别。所以没有必要把计算时间都浪费在cost和梯度的均值上。所以引入随机梯度。
3.即:第一次用[x1,y1]这组数据计算梯度、更新w;第二次用[x2,y2]这组数据计算梯度、更新w……以此类推,每次随机抽取的用来计算梯度的样本[xn,yn]不是固定的,所以叫做随机梯度下降。

2.pytorch全套代码

import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

# 初始化权重
w = 1.0


# 定义模型
def forward(x):
    return x * w


def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2


# 定义梯度计算方法(使用随机梯度下降)
def gradient(xs, ys):
    return 2 * x * (x * w - y)


# 最终绘制图像的x
epoch_list = []
cost_list = []

print ('Predict (before training)', 4 , forward(4))
for epoch in range(100):
    for x, y in zip(x_data, y_data):

        grad = gradient(x, y)
        w = w - 0.01 * grad
        print("\t x=", x, "y=", y, "grade:", grad)
        l = loss(x, y)
    print(' Epoch:', epoch, ' w=', w, ' loss=', l)
    epoch_list.append(epoch)
    cost_list.append(l)

print('Predict (after training)', 4, forward(4))

# 绘图
plt.plot(epoch_list, cost_list)
plt.ylabel('cost')
plt.xlabel('epoch')
plt.show()

3.展示pytorch绘制的图像(epoch-loss)

从图中可以发现,当训练epoch次数增加的时候,损失值会越来越小。
此时打印4 和forward(4),就会得到forward(4)的值接近于8。所以权重w=y/x=2
pytorch使用随机梯度下降的方法更新线性模型y=wx的权重w