手推BP算法

本文介绍了激活函数在神经网络中的重要性,解释了为何需要非线性函数以解决复杂问题,并列举了常见的激活函数,如Sigmoid、ReLU和Tanh。同时,文章通过一个简单的神经网络示例,阐述了BP算法的正向传播和反向传播过程,展示了参数更新的方法。
摘要由CSDN通过智能技术生成

1.激活函数

激活函数(Activation Function)是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。激活函数对于人工神经网络模型去学习、理解复杂的非线性函数,具有十分重要的作用。

​ 如果不使用激活函数,每一层输出都是上一层输入的线性运算,无论神经网络有多少层(如图)

O u t p u t = w 5 ( i n p u t 1 ∗ w 1 + i n p u t 2 ∗ w 2 ) + w 6 ( i n p u t 1 ∗ w 3 + i n p u t 2 ∗ w 4 ) Output = w_5(input1*w_1 +input2*w_2)+w_6(input1*w_3+input2*w_4) Output=w5(input1w1+input2w2)+w6(input1w3+input2w4)

展开得: O u t p u t = i n p u t 1 ∗ ( w 1 ∗ w 5 + w 3 ∗ w 6 ) + i n p u t 2 ∗ ( w 2 ∗ w 5 + w 4 ∗ w 6 ) Output = input1*(w_1*w_5+w_3*w_6)+input2*(w_2*w_5+w_4*w_6) Output=input1(w1w5+w3w6)+input2(w2w5+w4w6),假设 O u t p u t = 0 Output=0 Output=0,那么 i n p u t 1 = − w 1 ∗ w 5 + w 3 ∗ w 6 w 2 ∗ w 5 + w 4 ∗ w 6 ∗ i n p u t 2 input1 = -\frac{w_1*w_5+w_3*w_6}{w_2*w_5+w_4*w_6}*input2 input1=w2w5+w4w6w1w5+w3w6input2,这样就又回到 y = X ∗ W y=X*W y=XW的线性模型了也就是说,现在的神经网络学习能力非常有限,无法去解决非线性问题,叠加简单神经网络解决不了非线性分类问题,最终的输出只是输入的线性组合,相当于感知机。如果使用了激活函数,将非线性因素引入到网络中,使得神经网络可以任意逼近任何非线性函数,能够应用到更多的非线性模型。

1.1 为什么要用激活函数?

四个问题:

  • 1.线性神经网络没法解决非线性问题:能不能把线性神经网络,转成非线性的,也就是把分隔直线转换成曲。这样是不是就能解决非线性分类,怎么转?我们从最简单的神经网络 Y = W ∗ X + b Y = W * X +b Y=WX+b入手,然后变成最简单的非线性神经网络 Y = W ∗ X ∗ X + b Y = W*X*X+b Y=WXX+b,这是一个普通 Y = X ∗ X Y = X*X Y=XX 的表达式,如图:,经过一系列运算,得到如下:变成曲线后,好像可以把这两类区分开。

  • 2.用最简单的神经网络 y = W ∗ X + b y=W*X+b y=WX+b,根据input X的值,我们会得到Y值,所以我们需要一个函数可以对得到的Y值进行分类的,比如Y大于0 ,分类为1,小于0 ,分类为0。

  • 3.对于神经网络 y = W ∗ X + b y=W*X+b y=WX+b,们需要算出输出误差error (output Y - target Y) 来更新权值,假设我们的输入X的绝对值特别大,或者无限大,那么Y值就会特别大,直接导致error太大,更新出来的权值没有意义,或者无法更新权值。

  • 4.如果我们的神经网络函数是线性的,那么它的导数就是个常数,意味着gradient和X 无关了,也就是和输入无关了,但是导数是常数,但是反向传播最终的落脚点其实是对各层的w求偏导数,再根据Lr来更新w的值,这个偏导数中包含该层的输入x,就算是没有激活线性的神经网络w更新也是和输入有关的。

  • 所以需要激活后函数

1.2 常用的激活函数

S t e p F u n c t i o n Step Function StepFunction函数
最简单的二分类非线性激活函数开始—阶跃函数(Step Function):
在这里插入图片描述
当输入(也就是神经网络Y的输出)大于0就被分类到1(100% 被激活 ),小于0就分到0,(没有被激活),但是这种激活方式要么100%要么0%,这样不好,所以使用0-100%比较好,值越大,激活程度越高 对于分类,也就意味着它属于这一类的概率越大。

s i g m o i d sigmoid sigmoid 函数
S i g m o i d Sigmoid Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。在信息科学中,由于其单增以及反函数单增等性质,Sigmoid函数常被用作神经网络的阈值函数,将变量映射到0,1之间,只会输出正数,以及靠近0的输出变化率最大,公式如下:
f ( x ) = 1 1 + e ( − x ) f(x)=\frac{1}{1+e^{(-x)}} f(x)=1+e(x)1
在这里插入图片描述

R e L U ReLU ReLU函数

R e l u Relu Relu激活函数(The Rectified Linear Unit),用于隐藏层的神经元输出。如果你的输入是图片格式,ReLu就挺常用的。公式如下:
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
在这里插入图片描述
T a n h Tanh Tanh 函数

T a n h Tanh Tanh 是双曲函数中的一个, T a n h ( ) Tanh() Tanh() 为双曲正切。在数学中,双曲正切“ T a n h Tanh Tanh”是由基本双曲函数双曲正弦和双曲余弦推导而来。公式如下:
f ( x ) = e x − e − x e x + e − x f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} f(x)=ex+exexex
在这里插入图片描述
s o f t m a x softmax softmax 函数
s o f t m a x softmax softmax 函数用于输出层。假设输出层共有 n n n 个神经元,计算第 k k k 个神经元的输出 y k y_k yk s o f t m a x softmax softmax 函数的分子是输入信号 a k a_k ak 的指数函数,分母是所有输入信号的指数函数的和。 s o f t m a x softmax softmax 函数公式如下:
y k = e a k ∑ i = 1 n e a i y_{k}=\frac{e^{a_{k}}}{\sum_{i=1}^{n} e^{a_{i}}} yk=i=1neaieak
激活函数确实是很好宽广的点,它对于提高模型鲁棒性,非线性表达能力,缓解梯度消失问题,将特征图映射到新的特征空间从何更有利于训练,加速模型收敛等问题都有很好的帮助

2.BP算法

2.1 构建神经网络

如下图:一个只有一层的神经网络
在这里插入图片描述

2.2 样本

假设样本是二维的,每个维度的值为 x 1 = 0 , . 5 , x 2 = 1.0 x_1=0,.5,x_2=1.0 x1=0,.5,x2=1.0,真实值为 y ^ \hat y y^

2.3 初始化参数

神经网络所有参数,随机初始化,
{ w 1 = 1.0 w 2 = 0.5 w 3 = 0.5 w 4 = 0.7 w 5 = 1.0 w 6 = 2.0 \begin{cases} w_1 = 1.0 \\ w_2 = 0.5 \\ w_3 = 0.5 \\ w_4 = 0.7 \\ w_5 = 1.0 \\ w_6 = 2.0 \end{cases} w1=1.0w2=0.5w3=0.5w4=0.7w5=1.0w6=2.0

2.4 正向传播

在这里插入图片描述
第一轮
计算第一个神经元 h 1 ( 1 ) h_1^{(1)} h1(1)输出:
h 1 ( 1 ) = w 1 ⋅ x 1 + w 2 ⋅ x 2 = 1.0 ⋅ 0.5 + 0.5 ⋅ 1.0 = 1.0 \begin{aligned} \begin{split} h^{(1)}_1 &=w_1 \cdot x_1 + w_2 \cdot x_2 \\ &=1.0 \cdot 0.5 + 0.5 \cdot 1.0 \\ &=1.0 \end{split} \end{aligned} h1(1)=w1x1+w2x2=1.00.5+0.51.0=1.0

计算第二个神经元 h 2 ( 1 ) h_2^{(1)} h2(1)输出:
h 2 ( 1 ) = w 3 ⋅ x 1 + w 4 ⋅ x 2 = 0.5 ⋅ 0.5 + 0.7 ⋅ 1.0 = 0.95 \begin{aligned} \begin{split} h^{(1)}_2 &=w_3 \cdot x_1 + w_4 \cdot x_2 \\ &=0.5 \cdot 0.5 + 0.7 \cdot 1.0 \\ &=0.95 \end{split} \end{aligned} h2(1)=w3x1+w4x2=0.50.5+0.71.0=0.95

计算最后一个神经元 y ′ y' y的输出:
y ′ = w 5 ⋅ h 1 ( 1 ) + w 6 ⋅ h 2 ( 1 ) = 1.0 ⋅ 1.0 + 2.0 ⋅ 0.95 = 2.9 \begin{aligned} \begin{split} y^{'} &=w_5 \cdot h^{(1)}_1 + w_6 \cdot h^{(1)}_2 \\ &=1.0 \cdot 1.0 + 2.0 \cdot 0.95 \\ &=2.9 \end{split} \end{aligned} y=w5h1(1)+w6h2(1)=1.01.0+2.00.95=2.9

完成一轮正向传播后,计算loss,这里采用MSE:
l o s s = 1 2 ( y − y ′ ) 2 = 0.5 ( 0.8 − 2.9 ) 2 = 2.205 \begin{aligned} \begin{split} loss &= \frac{1}{2}(y-y')^2 \\ &= 0.5(0.8-2.9)^2 \\ &= 2.205 \end{split} \end{aligned} loss=21(yy)2=0.5(0.82.9)2=2.205
接下来就是反向传播

2.5 反向传播

在这里插入图片描述
以计算 w 5 w_5 w5为例
∂ l o s s ∂ w 5 = ∂ l o s s ∂ y   ′ ⋅ ∂ y ′ ∂ w 5 \begin{aligned} \begin{split} \frac{\partial loss}{\partial w_5} = \frac{\partial loss}{\partial y^{\ '}} \cdot \frac{\partial y^{'}}{\partial w_5} \end{split} \end{aligned} w5loss=y lossw5y

∂ δ ∂ w 5 = 2.1 ⋅ 1.0 = 2.1 \begin{aligned} \begin{split} \frac{\partial \delta}{\partial w_5} = 2.1 \cdot 1.0 = 2.1 \end{split} \end{aligned} w5δ=2.11.0=2.1

更新 w 5 w_5 w5的值:
w 5 ( u p d a t e ) = w 5 − η ⋅ ∂ l o s s ∂ w 5 = 1.0 − 0.1 ⋅ 2.1 = 0.79 \begin{aligned} \begin{split} w^{(update)}_5 &= w_5 - \eta \cdot \frac{\partial loss}{\partial w_5} \\ &= 1.0 - 0.1 \cdot 2.1 \\ &=0.79 \end{split} \end{aligned} w5(update)=w5ηw5loss=1.00.12.1=0.79,其中 η \eta η为学习率。

以计算 w 1 w_1 w1为例:
∂ l o s s ∂ w 1 = ∂ l o s s ∂ y   ′ ⋅ ∂ y ′ ∂ h 1 ( 1 ) ⋅ ∂ h 1 ( 1 ) ∂ w 1 \begin{aligned} \begin{split} \frac{\partial loss}{\partial w_1} = \frac{\partial loss}{\partial y^{\ '}} \cdot \frac{\partial y^{'}}{\partial h^{(1)}_1} \cdot \frac{\partial h^{(1)}_1}{\partial w_1} \end{split} \end{aligned} w1loss=y lossh1(1)yw1h1(1)

∂ l o s s ∂ w 1 = 2.1 ⋅ 1.0 ⋅ 0.5 = 1.05 \begin{aligned} \begin{split} \frac{\partial loss}{\partial w_1} = 2.1 \cdot 1.0 \cdot 0.5 = 1.05 \end{split} \end{aligned} w1loss=2.11.00.5=1.05

那么便可更新 w 1 w_1 w1的值:
w 1 ( u p d a t e ) = w 1 − η ⋅ ∂ l o s s ∂ w 1 = 1.0 − 0.1 ⋅ 1.05 = 0.895 \begin{aligned} \begin{split} w^{(update)}_1 &= w_1 - \eta \cdot \frac{\partial loss}{\partial w_1} \\ &= 1.0 - 0.1 \cdot 1.05 \\ &=0.895 \end{split} \end{aligned} w1(update)=w1ηw1loss=1.00.11.05=0.895

经过一轮正向反向传播后更新得到的参数:

{ w 1 = 0.895 w 2 = 0.29 w 3 = 0.29 w 4 = 0.28 w 5 = 0.79 w 6 = 1.8005 \begin{cases} \begin{split} w_1 &= 0.895 \\ w_2 &= 0.29 \\ w_3 &= 0.29 \\ w_4 &= 0.28 \\ w_5 &= 0.79 \\ w_6 &= 1.8005 \end{split} \end{cases} w1w2w3w4w5w6=0.895=0.29=0.29=0.28=0.79=1.8005

第二轮正向传播
在这里插入图片描述
h 1 ( 1 ) = w 1 ⋅ x 1 + w 2 ⋅ x 2 = 0.895 ⋅ 0.5 + 0.29 ⋅ 1.0 = 0.7375 \begin{aligned} \begin{split} h^{(1)}_1 &=w_1 \cdot x_1 + w_2 \cdot x_2 \\ &=0.895 \cdot 0.5 + 0.29 \cdot 1.0 \\ &=0.7375 \end{split} \end{aligned} h1(1)=w1x1+w2x2=0.8950.5+0.291.0=0.7375

h 2 ( 1 ) = w 3 ⋅ x 1 + w 4 ⋅ x 2 = 0.29 ⋅ 0.5 + 0.28 ⋅ 1.0 = 0.425 \begin{aligned} \begin{split} h^{(1)}_2 &=w_3 \cdot x_1 + w_4 \cdot x_2 \\ &=0.29 \cdot 0.5 + 0.28 \cdot 1.0 \\ &=0.425 \end{split} \end{aligned} h2(1)=w3x1+w4x2=0.290.5+0.281.0=0.425

y ′ = w 5 ⋅ h 1 ( 1 ) + w 6 ⋅ h 2 ( 1 ) = 0.79 ⋅ 0.7375 + 1.8005 ⋅ 0.425 = 1.3478 \begin{aligned} \begin{split} y^{'} &=w_5 \cdot h^{(1)}_1 + w_6 \cdot h^{(1)}_2 \\ &=0.79 \cdot 0.7375 + 1.8005 \cdot 0.425 \\ &=1.3478 \end{split} \end{aligned} y=w5h1(1)+w6h2(1)=0.790.7375+1.80050.425=1.3478

误差比第一轮减小了:
l o s s = 1 2 ( y − y ′ ) 2 = 0.5 ( 0.8 − 1.3478 ) 2 = 0.15 \begin{aligned} \begin{split} loss &= \frac{1}{2}(y-y^{'})^2 \\ &= 0.5(0.8-1.3478)^2 \\ &= 0.15 \end{split} \end{aligned} loss=21(yy)2=0.5(0.81.3478)2=0.15

3.总结

在这里插入图片描述
在实际使用的神经网络中,每个神经元在上文计算的基础上,会再通过一个激活函数,才能得到最后的值;

4.手写推导

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值