深度学习基础3:Stochastic Gradient Descent(SGD)
·
import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w = 1.0
#forward(x):前向传播(模型预测)
def forward(x):
return x * w # 线性模型:y_pred = w * x
#loss(x, y):损失函数,计算单个样本上的平方误差(MSE的组成部分)
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) ** 2 # 单个样本损失: (预测值 - 真实值)^2
# gradient(x, y): 计算单个样本损失对参数 w 的梯度(导数)
def gradient(x, y):
return 2 * x * (x * w - y) # 公式推导:d(loss)/dw=2*x*(w*x-y)
# 记录绘图数据的列表
epoch_list = [] # 记录外层循环的epoch数
loss_list = [] # 记录每个epoch结束时的损失loss值
w_list = [] # 记录每个epoch结束时的w值
print('Predict (before training):', 4, forward(4))
for epoch in range(100): # 迭代100次
for x, y in zip(x_data, y_data):
l = loss(x, y) # 1. 计算当前损失
grad = gradient(x, y) # 2. 计算当前梯度
w -= 0.01 * grad # 3. 核心:沿负梯度方向更新参数(# 0.01是学习率learning_rate,控制每一步更新的大小)
print("/tgrad: ", x, y, grad)
# ===== 记录每个epoch结束后的状态 =====
epoch_list.append(epoch) # 记录当前epoch
loss_list.append(l) # 记录最后一个样本的损失(近似epoch损失)
w_list.append(w) # 记录更新后的w
print("progress: ", epoch, "w=", w, "loss=", l)
print('Predict (after training):', 4, forward(4))
# # ============= 绘图部分 =============
# 第一张图:损失下降
plt.figure(figsize=(12, 4))
# 左图:损失
plt.subplot(1, 2, 1)
plt.plot(epoch_list, loss_list, 'b-')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Loss')
# 右图:参数w变化
plt.subplot(1, 2, 2)
plt.plot(epoch_list, w_list, 'r-')
plt.xlabel('Epoch')
plt.ylabel('Weight w')
plt.title('Parameter w')
plt.show()
更多推荐
所有评论(0)