上一节中介绍了单层感知机,感知机的输出节点只有一个,只有
O
0
O_0
O0没有
O
1
O_1
O1。对于单层感知机的梯度下降公式如下:
∂
E
∂
w
j
0
=
(
O
0
−
t
)
∗
O
0
(
1
−
O
0
)
x
j
0
\frac {\partial E}{\partial w_{j0}} = (O_0 -t)*O_0(1-O_0)x_j^0
∂wj0∂E=(O0−t)∗O0(1−O0)xj0
即对参数
w
j
0
w_{j0}
wj0的梯度。可以看出
w
j
0
w_{j0}
wj0的梯度跟这一层的输出权值以及
x
j
0
x_{j0}
xj0有关。
多层感知机模型
其中
x
k
1
x_k^1
xk1表示第一层感知机的第k号节点,
O
k
1
O_k^1
Ok1表示经过激活函数后的数值,
w
j
k
1
w_{jk}^1
wjk1表示上一层的第j个节点和对应这一层的第k个节点。
多层感知机梯度
E = 1 2 ∑ ( O i 1 − t i ) 2 当 k = i 时 , 才 有 意 义 , 因 此 ∂ E ∂ w j k = ( O k − t k ) ∂ O k ∂ w j k ∂ E ∂ w j k = ( O k − t k ) ∂ σ ( x k ) ∂ w j k ∂ E ∂ w j k = ( O k − t k ) σ ( x k ) ( 1 − σ x ( k ) ) ∂ x k 1 ∂ w j k ∂ E ∂ w j k = ( O k − t k ) O k ( 1 − O k ) x j 0 E = \frac {1}{2}\sum(O_i^1 - t_i)^2 \\ 当k=i时,才有意义,因此 \frac {\partial E}{\partial w_{jk}} = (O_k - t_k)\frac {\partial O_k}{\partial w_{jk}} \\ \frac {\partial E}{\partial w_{jk}} = (O_k - t_k)\frac {\partial \sigma(x_k)}{\partial w_{jk}} \\ \frac {\partial E}{\partial w_{jk}} =(O_k - t_k) \sigma (x_k)(1-\sigma x(k)) \frac {\partial x_k^1}{\partial w_{jk}} \\ \frac {\partial E}{\partial w_{jk}} =(O_k - t_k) O_k(1-O_k) x_j^0\\ E=21∑(Oi1−ti)2当k=i时,才有意义,因此∂wjk∂E=(Ok−tk)∂wjk∂Ok∂wjk∂E=(Ok−tk)∂wjk∂σ(xk)∂wjk∂E=(Ok−tk)σ(xk)(1−σx(k))∂wjk∂xk1∂wjk∂E=(Ok−tk)Ok(1−Ok)xj0
PyTorch实现
from torch.nn import functional as F
x = torch.randn(1,10)
w = torch.randn(2,10,requires_grad = True)
o = torch.sigmoid(x@w.t())
o.shape # torch.Size([1, 2])
loss = F.mse_loss(torch.ones(1,2),o) # tensor(0.1849, grad_fn=<MseLossBackward>)
loss.backward()
w.grad
# tensor([[ 0.1048, 0.0295, 0.0433, 0.0624, 0.0105, -0.0463, 0.0789, -0.0975,
# -0.0250, -0.0553],
# [ 0.1950, 0.0549, 0.0805, 0.1162, 0.0196, -0.0862, 0.1467, -0.1815,
# -0.0464, -0.1029]])
其实多输出的感知机已经不能叫做感知机了,因为感知机的定义就是一个单一输出的。而多输出的感知机相当于标准全连接层的输出层。