> 文章列表 > ccc-pytorch-感知机算法(3)

ccc-pytorch-感知机算法(3)

ccc-pytorch-感知机算法(3)

文章目录

      • 单一输出感知机
      • 多输出感知机
      • MLP反向传播

单一输出感知机

ccc-pytorch-感知机算法(3)
内容解释:

  • w001w^1_{00}w001:输入标号1连接标号0(第一层)
  • x00x_0^0x00:第0层的标号为0的值
  • O11O_1^1O11:第一层的标号为0的输出值
  • t:真实值
  • σ\\sigmaσ:激活函数

公式推导:
E=12(O01−t)\\begin{aligned} E=\\frac{1}{2}(O_0^1-t)^\\ \\end{aligned}E=21(O01t) 
添加常数便于求导,不影响单调性
∂E∂wj0=(O0−t)∂O0∂wj0=(O0−t)∂σ(x0)∂wj0=(O0−t)O0(1−O0)∂x01∂wj0注:[σ(x0)=O0]=(O0−t)O0(1−O0)xj0\\begin{aligned} \\frac{\\partial E}{\\partial w_{j0}} &=(O_0-t)\\frac{\\partial O_0}{\\partial w_{j0}}\\\\ &=(O_0-t)\\frac{\\partial \\sigma(x_0)}{\\partial w_{j0}}\\\\ &=(O_0-t) O_0(1- O_0)\\frac{\\partial x_0^1}{\\partial w_{j0}} 注:[\\sigma(x_0)=O_0]\\\\ &=(O_0-t) O_0(1- O_0)x_j^0 \\end{aligned}wj0E=(O0t)wj0O0=(O0t)wj0σ(x0)=(O0t)O0(1O0)wj0x01注:[σ(x0)=O0]=(O0t)O0(1O0)xj0
简单实践代码:

x = torch.randn(1,10)
w = torch.randn(1,10,requires_grad=True)
o = torch.sigmoid(x@w.t())
loss = F.mse_loss(torch.ones(1,1),o)
loss.shape
loss.backward()
w.grad

ccc-pytorch-感知机算法(3)

多输出感知机

ccc-pytorch-感知机算法(3)
内容解释:
和单层的一摸一样,只是多了几个输出,注意下标即可
公式推导:
E=12∑(Oik−tk)\\begin{aligned} E=\\frac{1}{2}\\sum(O_i^k-t_k)^\\ \\end{aligned}E=21(Oiktk) 
添加常数便于求导,不影响单调性
∂E∂wjk=(Ok−tk)∂Ok∂wjk注:[下标对上才有值]=(Ok−tk)∂σ(xk)∂wjk=(Ok−tk)Ok(1−Ok)∂xk1∂wjk=(Ok−tk)Ok(1−Ok)xj1\\begin{aligned} \\frac{\\partial E}{\\partial w_{jk}} &=(O_k-t_k)\\frac{\\partial O_k}{\\partial w_{jk}}注:[下标对上才有值]\\\\ &=(O_k-t_k)\\frac{\\partial \\sigma(x_k)}{\\partial w_{jk}}\\\\ &=(O_k-t_k) O_k(1- O_k)\\frac{\\partial x_k^1}{\\partial w_{jk}} \\\\ &=(O_k-t_k) O_k(1- O_k)x_j^1 \\end{aligned}wjkE=(Oktk)wjkOk注:[下标对上才有值]=(Oktk)wjkσ(xk)=(Oktk)Ok(1Ok)wjkxk1=(Oktk)Ok(1Ok)xj1
即只需要输出和对应输入即可计算

简单实践代码:

x = torch.randn(1,10)
w = torch.randn(2,10,requires_grad=True)
o = torch.sigmoid(x@w.t())
loss = F.mse_loss(torch.ones(1,2),o)
loss.shape
loss.backward()
w.grad

ccc-pytorch-感知机算法(3)

MLP反向传播

ccc-pytorch-感知机算法(3)
内容解释:
MLP即Multi-Layer Perceptron,多层感知机
公式推导:
∂E∂Wij=∂∂Wij12∑k∈K(Ok−tk)2=∑k∈K(Ok−tk)∂∂WijOk=∑k∈K(Ok−tk)∂∂Wijσ(xk)=∑k∈K(Ok−tk)Ok(1−Ok)∂xk∂wij=∑k∈K(Ok−tk)Ok(1−Ok)∂xk∂Oj⋅∂Oj∂wij=∑k∈K(Ok−tk)Ok(1−Ok)Wjk∂Oj∂wij=Oj(1−Oj)∂xj∂Wij∑k∈K(Ok−tk)Ok(1−Ok)Wjk=Oj(1−Oj)Oi∑k∈K(Ok−tk)Ok(1−Ok)Wjk注:[层数从左到右为i,j,k]\\begin{aligned} \\frac{\\partial E}{\\partial W_{ij}} &=\\frac{\\partial }{\\partial W_{ij}}\\frac{1}{2}\\sum_{k\\in K}(O_k-t_k)^2\\\\ &=\\sum_{k\\in K}(O_k-t_k)\\frac{\\partial }{\\partial W_{ij}}O_k\\\\ &=\\sum_{k\\in K}(O_k-t_k)\\frac{\\partial }{\\partial W_{ij}}\\sigma(x_k)\\\\ &=\\sum_{k\\in K}(O_k-t_k) O_k(1- O_k)\\frac{\\partial x_k}{\\partial w_{ij}} \\\\ &=\\sum_{k\\in K}(O_k-t_k) O_k(1- O_k)\\frac{\\partial x_k}{\\partial O_j}\\cdot\\frac{\\partial O_j}{\\partial w_{ij}}\\\\ &=\\sum_{k\\in K}(O_k-t_k) O_k(1- O_k)W_{jk}\\frac{\\partial O_j}{\\partial w_{ij}}\\\\ &=O_j(1-O_j)\\frac{\\partial x_j}{\\partial W_{ij}}\\sum_{k\\in K}(O_k-t_k) O_k(1- O_k)W_{jk}\\\\ &=O_j(1-O_j)O_i\\sum_{k\\in K}(O_k-t_k) O_k(1- O_k)W_{jk}\\\\ &注:[层数从左到右为 i ,j,k] \\end{aligned}WijE=Wij21kK(Oktk)2=kK(Oktk)WijOk=kK(Oktk)Wijσ(xk)=kK(Oktk)Ok(1Ok)wijxk=kK(Oktk)Ok(1Ok)OjxkwijOj=kK(Oktk)Ok(1Ok)WjkwijOj=Oj(1Oj)WijxjkK(Oktk)Ok(1Ok)Wjk=Oj(1Oj)OikK(Oktk)Ok(1Ok)Wjk注:[层数从左到右为ijk]
如果将仅与第k层相关的信息作为一个函数可以写作:
∂E∂Wij=OiOj(1−Oj)∑k∈KδkWjk\\begin{aligned} \\frac{\\partial E}{\\partial W_{ij}}=O_iO_j(1-O_j)\\sum_{k\\in K}\\delta _kW_{jk} \\end{aligned}WijE=OiOj(1Oj)kKδkWjk

所以一个前面层的值依赖后面层的信息,需要倒着计算才行哦