1.背景及思路
【思想】
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