1.激活函数
激活函数(Activation Function)是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。激活函数对于人工神经网络模型去学习、理解复杂的非线性函数,具有十分重要的作用。
如果不使用激活函数,每一层输出都是上一层输入的线性运算,无论神经网络有多少层(如图)
![](https://i-blog.csdnimg.cn/blog_migrate/8f74ba4a3137752a0e622780e8b299b9.png)
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(input1∗w1+input2∗w2)+w6(input1∗w3+input2∗w4)
展开得: 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∗(w1∗w5+w3∗w6)+input2∗(w2∗w5+w4∗w6),假设 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=−w2∗w5+w4∗w6w1∗w5+w3∗w6∗input2,这样就又回到 y = X ∗ W y=X*W y=X∗W的线性模型了也就是说,现在的神经网络学习能力非常有限,无法去解决非线性问题,叠加简单神经网络解决不了非线性分类问题,最终的输出只是输入的线性组合,相当于感知机。如果使用了激活函数,将非线性因素引入到网络中,使得神经网络可以任意逼近任何非线性函数,能够应用到更多的非线性模型。
1.1 为什么要用激活函数?
四个问题:
-
1.线性神经网络没法解决非线性问题:能不能把线性神经网络,转成非线性的,也就是把分隔直线转换成曲。这样是不是就能解决非线性分类,怎么转?我们从最简单的神经网络 Y = W ∗ X + b Y = W * X +b Y=W∗X+b入手,然后变成最简单的非线性神经网络 Y = W ∗ X ∗ X + b Y = W*X*X+b Y=W∗X∗X+b,这是一个普通 Y = X ∗ X Y = X*X Y=X∗X 的表达式,如图:
,经过一系列运算,得到如下:
变成曲线后,好像可以把这两类区分开。
-
2.用最简单的神经网络 y = W ∗ X + b y=W*X+b y=W∗X+b,根据input X的值,我们会得到Y值,所以我们需要一个函数可以对得到的Y值进行分类的,比如Y大于0 ,分类为1,小于0 ,分类为0。
-
3.对于神经网络 y = W ∗ X + b y=W*X+b y=W∗X+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+e−xex−e−x
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)=w1⋅x1+w2⋅x2=1.0⋅0.5+0.5⋅1.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)=w3⋅x1+w4⋅x2=0.5⋅0.5+0.7⋅1.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′=w5⋅h1(1)+w6⋅h2(1)=1.0⋅1.0+2.0⋅0.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(y−y′)2=0.5(0.8−2.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}
∂w5∂loss=∂y ′∂loss⋅∂w5∂y′
∂ δ ∂ 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.1⋅1.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−η⋅∂w5∂loss=1.0−0.1⋅2.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}
∂w1∂loss=∂y ′∂loss⋅∂h1(1)∂y′⋅∂w1∂h1(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} ∂w1∂loss=2.1⋅1.0⋅0.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−η⋅∂w1∂loss=1.0−0.1⋅1.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)=w1⋅x1+w2⋅x2=0.895⋅0.5+0.29⋅1.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)=w3⋅x1+w4⋅x2=0.29⋅0.5+0.28⋅1.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′=w5⋅h1(1)+w6⋅h2(1)=0.79⋅0.7375+1.8005⋅0.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(y−y′)2=0.5(0.8−1.3478)2=0.15
3.总结
在实际使用的神经网络中,每个神经元在上文计算的基础上,会再通过一个激活函数,才能得到最后的值;
4.手写推导