具有多层输出的感知机如下图所示:图中节点上的符号表示的含义是:
- $x^1_k$ 代表第 1 层上的第 k 个节点
- $O^1_k$ 同样代表第 1 层上的第 k 个节点
若能求出 $\frac {\nabla E}{\nabla w_{jk}}$ 的结果,便可知道所有的梯度信息
Derivative
首先我们定义 $E=\frac {1}{2}\sum_i (O^1_i - t_i)^2$
$$ \begin{align*} \frac{\nabla E}{\nabla{w_{jk}}} &= (O^1_k - t_k)\frac{\nabla O^1_k}{\nabla w_{jk}} \\ &= (O^1_k - t_k)\frac{\nabla \sigma(x^1_k)}{\nabla w_{jk}} \\ &= (O_k^1-t_k)\sigma(x_k^1)(1-\sigma(x_k^1))\frac{\nabla x_k^1}{\nabla w_{jk}} \\ &= (O_k^1-t_k)O^1_k(1-O^1_k)x^0_j \\ \end{align*} $$
由推导结果可看出,一条边上的输出结果只与该线上的输入值 $x^0_j$ 和 $O^1_k$,因此对于一个多输出的感知机,对比单输出的感知机,改变了输出节点上的取值。单层为 $O_0$,多层为 $(O_k^1-t_k)$
- import torch
- import torch.nn.functional as F
-
- x = torch.randn(1,10) # dim=1,len=10, x为[1,10]的矩阵
- w = torch.randn(2, 10, requires_grad=True) # w为[2,10]的矩阵
-
- o = torch.sigmoid(x@w.t()) # o为[1,2]的矩阵
- print("o.shape: ", o.shape)
-
- loss = F.mse_loss(input=o, target=torch.ones(1, 2))
- print("loss: ", loss)
- loss.backward()
- print("w.grad: ", w.grad)