深度学习——感知机梯度求导

一、感知机介绍

1、神经网络基础

  1. 多输出神经网络示意图在这里插入图片描述

    1. 上图每个圆圈都是一个神经元,每条线表示神经元之间的链接。而神经元可以被分为多层,层与层之间同样可以有神经元链接,而层内之间的神经元没有链接。
    2. 最左边的层叫做输入层,负责接受输入数据;最右边的层叫做输出层,可以从这层获取神经网络输出数据。
    3. 输入层和输出层之间的层叫做隐藏层

2、感知器——神经网络的组成单元

在这里插入图片描述

  1. 感知器的组成部分:
    1. 输入权值:可以接受多个输入 ( x 1 , x 2 , . . . , x n ∣ x i ∈ R ) (x_1,x_2,...,x_n|x_i ∈ R) (x1,x2,...,xnxiR),每个输入上有一个权值 w i ∈ R w_i∈R wiR,此外还有一个偏向值 b ∈ R b∈R bR,即图中的 w 0 w_0 w0
    2. 激活函数:感知器的激活函数有很多种,详情请看此篇博客
    3. 输出:感知器的输出由如下公式计算 y = f ( w ∗ x + b ) y=f(w*x+b) y=f(wx+b)
  2. 感知器的功能
    1. 可以拟合任何的 线性函数,任何线性分类线性回归问题都可以用感知器解决。
    2. 实现二分类问题:0、1两大类,对应于单输出感知机
    3. 实现多分类问题:输出结果是概率,对于多输出感知机
      在这里插入图片描述

二、单一输出感知机

1、概括

  1. 感知机在这里插入图片描述
    在这里插入图片描述
    1. 输入: x x x
    2. 激活函数为: o = { 1        i f    ∑ i = 0 n w i x i > 0 0        o t h e r w i s e o=\begin{cases} 1\,\,\,\,\,\, if\,\,\sum_{i=0}^n{w_ix_i>0}\\ 0\,\,\,\,\,\, otherwise\\ \end{cases} o={1ifi=0nwixi>00otherwise
    3. 输出:感知器的输出由如下公式计算 y = ∑ x i ∗ w i + b y=\sum{x_i*w_i}+b y=xiwi+b

2、求导步骤

在这里插入图片描述

  1. 符号说明
    1. O 为 激 活 函 数 , 上 标 表 示 第 几 层 , 下 层 表 示 第 几 个 元 素 O为激活函数,上标表示第几层,下层表示第几个元素 O
    2. w i j : i w_{ij}:i wij:i表示连接的是上一层第 i i i号节点, j j j表示连接的是下一次的 j j j号节点
    3. E E E代表 e r r o r 或 l o s s error或loss errorloss
    4. σ \sigma σ代表sigmoid函数
  2. 推导
    1. E = 1 2 ( O 0 1 − t ) 2 E=\frac{1}{2}(O_0^1-t)^2 E=21(O01t)2
    2. ∂ E ∂ w j 0 = ( O 0 − t ) ∂ O 0 ∂ w j 0 \frac{\partial E}{\partial w_{j0}}=(O_0-t)\frac{\partial O_0}{\partial w_{j0}} wj0E=(O0t)wj0O0
    3. ∂ E ∂ w j 0 = ( O 0 − t ) ∂ σ ( x 0 ) ∂ w j 0 \frac{\partial E}{\partial w_{j0}}=(O_0-t)\frac{\partial \sigma \left( x_0 \right)}{\partial w_{j0}} wj0E=(O0t)wj0σ(x0)
    4. ∂ E ∂ w j 0 = ( O 0 − t ) ∂ σ ( x 0 ) ∂ x 0 1 ∂ x 0 1 ∂ w j 0 = ( O 0 − t ) σ ( x 0 ) ( 1 − σ ( x 0 ) ) ∂ x 0 1 ∂ w j 0 \frac{\partial E}{\partial w_{j0}}=(O_0-t)\frac{\partial \sigma \left( x_0 \right)}{\partial x_{0}^{1}}\frac{\partial x_{0}^{1}}{\partial w_{j0}}=(O_0-t)\sigma \left( x_0 \right) \left( 1-\sigma \left( x_0 \right) \right) \frac{\partial x_{0}^{1}}{\partial w_{j0}} wj0E=(O0t)x01σ(x0)wj0x01=(O0t)σ(x0)(1σ(x0))wj0x01
    5. ∂ E ∂ w j 0 = ( O 0 − t ) O 0 ( 1 − O 0 ) ∂ x 0 1 ∂ w j 0 \frac{\partial E}{\partial w_{j0}}=(O_0-t)O_0\left( 1-O_0 \right) \frac{\partial x_{0}^{1}}{\partial w_{j0}} wj0E=(O0t)O0(1O0)wj0x01
    6. ∂ 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\left( 1-O_0 \right) x_{j}^{0} wj0E=(O0t)O0(1O0)xj0

3、代码实现

# 单层感知机
# 输入数据
x = torch.randn(1,10)
w = torch.randn(1,10,requires_grad=True)
# [1,10]*[10,1]得到一维的数
o = torch.sigmoid(x@w.t())
# 得到loss,label和输出做均方差
loss = F.mse_loss(torch.ones(1,1),o)
# 得到梯度信息
loss.backward()

print("o.shape = ",o.shape)
print("loss.shape = ",loss.shape)
print(w.grad)

三、多输出感知机

1、概括

在这里插入图片描述

2、求导步骤

  1. 推导
    1. E = 1 2 ( O i 1 − t ) 2 E=\frac{1}{2}(O_i^1-t)^2 E=21(Oi1t)2
    2. ∂ E ∂ w j k = ( O k − t k ) ∂ O k ∂ w j k \frac{\partial E}{\partial w_{jk}}=(O_k-t_k)\frac{\partial O_k}{\partial w_{jk}} wjkE=(Oktk)wjkOk
    3. ∂ E ∂ w j k = ( O k − t k ) ∂ σ ( x k ) ∂ w j k \frac{\partial E}{\partial w_{jk}}=(O_k-t_k)\frac{\partial \sigma \left( x_k \right)}{\partial w_{jk}} wjkE=(Oktk)wjkσ(xk)
    4. ∂ E ∂ w j k = ( O k − t k ) ∂ σ ( x k ) ∂ x k 1 ∂ x k 1 ∂ w j k = ( O k − t k ) σ ( x k ) ( 1 − σ ( x k ) ) ∂ x k 1 ∂ w j k \frac{\partial E}{\partial w_{jk}}=(O_k-t_k)\frac{\partial \sigma \left( x_k \right)}{\partial x_{k}^{1}}\frac{\partial x_{k}^{1}}{\partial w_{jk}}=(O_k-t_k)\sigma \left( x_k \right) \left( 1-\sigma \left( x_k \right) \right) \frac{\partial x_{k}^{1}}{\partial w_{jk}} wjkE=(Oktk)xk1σ(xk)wjkxk1=(Oktk)σ(xk)(1σ(xk))wjkxk1
    5. ∂ E ∂ w j k = ( O k − t k ) O k ( 1 − O k ) ∂ x k 1 ∂ w j k \frac{\partial E}{\partial w_{jk}}=(O_k-t_k)O_k\left( 1-O_k \right) \frac{\partial x_{k}^{1}}{\partial w_{jk}} wjkE=(Oktk)Ok(1Ok)wjkxk1
    6. ∂ E ∂ w j k = ( O k − t k ) O k ( 1 − O k ) x j 0 \frac{\partial E}{\partial w_{jk}}=(O_k-t_k)O_k\left( 1-O_k \right) x_{j}^{0} wjkE=(Oktk)Ok(1Ok)xj0

3、代码实现

import torch
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()) #得到激活函数后的值
loss = F.mse_loss(torch.ones(1,2),o) # 得到均方误差
loss.backward() #得到梯度信息

print(w.grad)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值