自动微分与反向传播
自动微分是深度学习集成库中一种自动求解微分的方法,而反向传播(backpropagation, BP)则是深度学习中利用自动微分计算梯度的算法。
例
假设我们有一个简单的单层 MLP:
\hat{y} = W x + b.
设训练数据是 (x, y),使用均方误差(MSE)作为损失函数,则 loss 可以展开表示为:
L(W, b) = (W x + b - y)^2.
计算图
对于复合函数 z = f(u, v), u = g(x), v = h(x),我们知道,在 f 可微、u, v 可导时,由链式法则,有
\frac{\mathrm{d} z}{\mathrm{d} x} = \frac{\partial z}{\partial u} \frac{\mathrm{d} u}{\mathrm{d} x} + \frac{\partial z}{\partial v} \frac{\mathrm{d} v}{\mathrm{d} x}.
在反向传播中,已知 u(x), v(x) 的解析式和 x 的值,\frac{\mathrm{d} u}{\mathrm{d} x} 和 \frac{\mathrm{d} v}{\mathrm{d} x} 都可以计算得到;而反向传播假设 \frac{\partial z}{\partial u} 和 \frac{\partial z}{\partial v} 已知,因此可以计算出 \frac{\mathrm{d} z}{\mathrm{d} x}。
现在假设 x 是一个需要求梯度的变量,z 是目标函数,而 u、v、f 则是已知的函数。
在计算图中,我们将损失函数分解为大量基本计算的组合,每个基本计算都定义清楚它们的导数。例如,PyTorch 的 torch.exp 函数,便在代码中定义了输入为 x 时的导数值是 e^x;torch.log 函数则定义了输入为 x 时导数值是 \frac{1}{x}。
PyTorch
见 (链接未公开)
BEYOND THE ARTICLE
读完了,有什么想法?
阅读已保存的问答示例,并循着引用回到原文。
— 本文完 — 返回文章列表