pytorch使用随机梯度下降的方法更新线性模型y=wx的权重w
程序员文章站
2022-05-21 22:57:26
...
pytorch使用随机梯度下降更新权重w
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