使用导数更新模型参数

使用 PyTorch 的深度学习入门

Jasmin Ludolf

Senior Data Science Content Developer, DataCamp

导数的类比

$$

导数表示曲线的斜率

$$

  • 陡峭斜率(红色箭头):
    • 步子大,导数大
  • 平缓斜率(绿色箭头):
    • 步子小,导数小
  • 谷底(蓝色箭头):
    • 平坦,导数为零

$$

山谷示意图

使用 PyTorch 的深度学习入门

凸函数与非凸函数

这是一个凸函数

凸函数示例

这是一个非凸函数

非凸函数示例(标出全局最小值)

使用 PyTorch 的深度学习入门

将导数与模型训练关联起来

  • 在训练的前向传播中计算损失

$$ 计算损失

使用 PyTorch 的深度学习入门

将导数与模型训练关联起来

  • 梯度用于最小化损失,调节层的权重偏置
  • 重复直到各层被调好

$$ 计算梯度

使用 PyTorch 的深度学习入门

反向传播概念

$$

  • 考虑由三层组成的网络:

    • 从 $L2$ 的损失梯度开始
    • 用 $L2$ 计算 $L1$ 的梯度
    • 对所有层重复($L1$、$L0$)

反向传播示意图

使用 PyTorch 的深度学习入门

PyTorch 中的反向传播

# Run a forward pass 
model = nn.Sequential(nn.Linear(16, 8),
                      nn.Linear(8, 4),
                      nn.Linear(4, 2))
prediction = model(sample)


# Calculate the loss and gradients criterion = CrossEntropyLoss() loss = criterion(prediction, target) loss.backward()
# Access each layer's gradients
model[0].weight.grad
model[0].bias.grad
model[1].weight.grad
model[1].bias.grad
model[2].weight.grad
model[2].bias.grad
使用 PyTorch 的深度学习入门

手动更新模型参数

# Learning rate is typically small
lr = 0.001

# Update the weights
weight = model[0].weight
weight_grad = model[0].weight.grad


weight = weight - lr * weight_grad
# Update the biases bias = model[0].bias bias_grad = model[0].bias.grad
bias = bias - lr * bias_grad

$$

  • 访问各层梯度
  • 乘以学习率
  • 用该结果更新权重(相减)
使用 PyTorch 的深度学习入门

梯度下降

  • 对非凸函数使用梯度下降

  • PyTorch 通过优化器简化此过程

    • 随机梯度下降(SGD)
import torch.optim as optim

# Create the optimizer
optimizer = optim.SGD(model.parameters(), lr=0.001)

# Perform parameter updates optimizer.step()
使用 PyTorch 的深度学习入门

Passons à la pratique !

使用 PyTorch 的深度学习入门

Preparing Video For Download...