一、感知机介绍
1、神经网络基础
-
多输出神经网络示意图
- 上图每个圆圈都是一个神经元,每条线表示神经元之间的链接。而神经元可以被分为多层,层与层之间同样可以有神经元链接,而层内之间的神经元没有链接。
- 最左边的层叫做输入层,负责接受输入数据;最右边的层叫做输出层,可以从这层获取神经网络输出数据。
- 输入层和输出层之间的层叫做隐藏层
2、感知器——神经网络的组成单元
- 感知器的组成部分:
- 输入权值:可以接受多个输入 ( x 1 , x 2 , . . . , x n ∣ x i ∈ R ) (x_1,x_2,...,x_n|x_i ∈ R) (x1,x2,...,xn∣xi∈R),每个输入上有一个权值 w i ∈ R w_i∈R wi∈R,此外还有一个偏向值 b ∈ R b∈R b∈R,即图中的 w 0 w_0 w0。
- 激活函数:感知器的激活函数有很多种,详情请看此篇博客
- 输出:感知器的输出由如下公式计算 y = f ( w ∗ x + b ) y=f(w*x+b) y=f(w∗x+b)
- 感知器的功能
- 可以拟合任何的 线性函数,任何线性分类或线性回归问题都可以用感知器解决。
- 实现二分类问题:0、1两大类,对应于单输出感知机
- 实现多分类问题:输出结果是概率,对于多输出感知机
二、单一输出感知机
1、概括
- 感知机
- 输入: x x x
- 激活函数为: 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={1if∑i=0nwixi>00otherwise
- 输出:感知器的输出由如下公式计算 y = ∑ x i ∗ w i + b y=\sum{x_i*w_i}+b y=∑xi∗wi+b
2、求导步骤
- 符号说明
- O 为 激 活 函 数 , 上 标 表 示 第 几 层 , 下 层 表 示 第 几 个 元 素 O为激活函数,上标表示第几层,下层表示第几个元素 O为激活函数,上标表示第几层,下层表示第几个元素
- w i j : i w_{ij}:i wij:i表示连接的是上一层第 i i i号节点, j j j表示连接的是下一次的 j j j号节点
- E E E代表 e r r o r 或 l o s s error或loss error或loss
- σ \sigma σ代表sigmoid函数
- 推导
- E = 1 2 ( O 0 1 − t ) 2 E=\frac{1}{2}(O_0^1-t)^2 E=21(O01−t)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}} ∂wj0∂E=(O0−t)∂wj0∂O0
- ∂ 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}} ∂wj0∂E=(O0−t)∂wj0∂σ(x0)
- ∂ 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}} ∂wj0∂E=(O0−t)∂x01∂σ(x0)∂wj0∂x01=(O0−t)σ(x0)(1−σ(x0))∂wj0∂x01
- ∂ 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}} ∂wj0∂E=(O0−t)O0(1−O0)∂wj0∂x01
- ∂ 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} ∂wj0∂E=(O0−t)O0(1−O0)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、求导步骤
- 推导
- E = 1 2 ( O i 1 − t ) 2 E=\frac{1}{2}(O_i^1-t)^2 E=21(Oi1−t)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}} ∂wjk∂E=(Ok−tk)∂wjk∂Ok
- ∂ 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}} ∂wjk∂E=(Ok−tk)∂wjk∂σ(xk)
- ∂ 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}} ∂wjk∂E=(Ok−tk)∂xk1∂σ(xk)∂wjk∂xk1=(Ok−tk)σ(xk)(1−σ(xk))∂wjk∂xk1
- ∂ 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}} ∂wjk∂E=(Ok−tk)Ok(1−Ok)∂wjk∂xk1
- ∂ 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} ∂wjk∂E=(Ok−tk)Ok(1−Ok)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)