反向传播
想象一下,你正在玩一个猜数字的游戏,你需要猜一个数字,这个数字是正确答案。每次猜完后,都会有人告诉你猜的数字是偏大还是偏小了。根据这个反馈,你可以调整你的猜测,直到猜正确为止。这就是反向传播算法的基本思想。反向传播是一种用于训练神经网络的算法。它通过计算损失函数关于网络参数的梯度,从而对网络参数进行更新,以达到减小损失函数值的目的。这个过程中,算法会从输出层开始,逐层计算每一层的梯度,知道输入层。这个例子中,我们定义了一个简单线性模型,并使用随机梯度下降法进行训练。在每次迭代中,我们首先进行前向传播,计算输出和损失;然后进行反向传播,计算梯度;最后更新模型参数。通过这个例子,我们可以看到反向传播算法在神经网络训练中的重要作用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import torch import torch.nn as nn import torch.optim as optim
class Net(nn.Module): def __init__(self): super(Net, self).__init__()
self.fc1 = nn.Linear(1,1)
def forward(self, x): x = self.fc1(x)
return x
model = Net()
criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.5)
x_train = torch.tensor([[1.0], [2.0], [3.0]], requires_grad=True) y_train = torch.tensor([[2.0], [4.0], [6.0]])
for epoch in range(10): outputs = model(x_train) loss = criterion(outputs, y_train) optimizer.zero_grad() loss.backward() optimizer.step() print(f'Epoch: {epoch + 1}, Loss: {loss.item():.4f}')
|
输出结果为:
1 2 3 4 5 6 7 8 9 10 11 12
| $ poetry run python backpropagation_demo.py
Epoch: 1, Loss: 10.4069 Epoch: 2, Loss: 210.8012 Epoch: 3, Loss: 4354.0044 Epoch: 4, Loss: 89996.3984 Epoch: 5, Loss: 1860259.0000 Epoch: 6, Loss: 38452288.0000 Epoch: 7, Loss: 794823872.0000 Epoch: 8, Loss: 16429318144.0000 Epoch: 9, Loss: 339600474112.0000 Epoch: 10, Loss: 7019675254784.0000
|