将神经网络简单地描述为一个从输入映射到输出的数学函数理解起来更容易
神经网络由以下部分组成:
-
一个输入层, x x x
-
任意数量的隐藏层
-
一个输出层, y ^ ŷ y^
-
每两层之间都有一组权重和偏置,W 和 b
-
每个隐藏层都要选择一个激活函数 σ σ σ。在本文中,我们选用 Sigmoid 激活函数。
下图展示了 2 层神经网络的结构(请注意,在计算神经网络层数的时候,通常不计入输入层)。
训练神经网络
一个简单 2 层神经网络的输出 ŷ 可以表示为:
y
^
=
σ
(
W
2
σ
(
W
1
x
+
b
1
)
+
b
2
)
\hat{y}=\sigma(W_2\sigma(W_1x+b_1)+b_2)
y^=σ(W2σ(W1x+b1)+b2)
在上面的等式当中,权重 W 和偏置 b 是影响输出 y ^ ŷ y^的唯一变量。
自然,权重和偏差的正确值决定了预测的强度。根据输入数据微调权重和偏置的过程称为神经网络训练。
训练过程的每一次迭代包含以下步骤:
- 计算预测的输出 y ^ ŷ y^,称为前向传播
- 更新权重和偏置,称为反向传播
以下流程图说明了这个过程:
前向传播
正如我们在上图中所看到的,前向传播只是一个简单的计算。对于一个基本的 2 层神经网络,神经网络的输出计算如下:
y
^
=
σ
(
W
2
σ
(
W
1
x
+
b
1
)
+
b
2
)
\hat{y}=\sigma(W_2\sigma(W_1x+b_1)+b_2)
y^=σ(W2σ(W1x+b1)+b2)
然而,我们仍然需要一种方法来评估我们的预测的「优秀程度」(即,我们的预测与真实值相差多少?)这就需要用到损失函数了。
损失函数
损失函数有很多种,此处采用简单的误差平方和。
S u m − o f − S q u a r e s E r r o r = ∑ i = 1 n ( y − y ^ ) 2 Sum-of-Squares\ Error=\sum_{i=1}^{n}(y-\hat y)^2 Sum−of−Squares Error=i=1∑n(y−y^)2
误差平方和,即每个预测值和真实值之间差值的平均值。这个差值是取了平方项的,所以测量的是差值的绝对值。
在训练过程中,我们的目标是找到一组最佳的权重和偏置,使损失函数最小化。
反向传播
反向传播(backward propagation或backpropagation)指的是计算神经网络参数梯度的方法。 简言之,该方法根据微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络。 该算法存储了计算某些参数梯度时所需的任何中间变量(偏导数)。
现在,我们已经找到了预测误差的方法(损失函数),那么我们需要一种方法将错误「传播」回去,从而更新权重和偏置。
为了确定权重和偏置调整的适当值,我们需要知道损失函数对权重和偏置的偏导数。
从微积分的角度来看,函数的偏导数也就是函数的斜率。 梯度下降算法:
梯度下降
如果我们知道了偏导数(也就是梯度),我们可以通过简单增加或减少偏导数(如上图所示)的方式来更新权重和偏置。这就是所谓的梯度下降(梯度下降优化器)。在机器学习中梯度下降常常用来优化损失函数。
一般执行梯度下降是采用这个形式:
x=x−η∇g
其中η就是学习率,g是梯度。
然而,由于损失函数的方程不包含权重和偏置(指的是不直接包含),所以我们不能直接计算损失函数对权重和偏置的偏导数。因此,我们需要链式法则来帮助计算。
L
o
s
s
(
y
,
y
^
)
=
∑
i
=
1
n
(
y
−
y
^
)
2
∂
L
o
s
s
(
y
,
y
^
)
∂
W
=
∂
L
o
s
s
(
y
,
y
^
)
∂
y
^
∗
∂
y
^
∂
z
∗
∂
z
∂
W
w
h
e
r
e
z
=
W
x
+
b
=
2
(
y
−
y
^
)
∗
d
e
r
i
v
a
t
i
v
e
o
f
s
i
g
m
o
i
d
f
u
n
c
t
i
o
n
∗
x
=
2
(
y
−
y
^
)
∗
z
(
1
−
z
)
∗
x
Loss(y,\hat y)=\sum_{i=1}^{n}(y-\hat y)^2\\ \begin{align*} \frac{\partial Loss(y,\hat y)}{\partial W}&=\frac{\partial Loss(y,\hat y)}{\partial \hat y}*\frac{\partial \hat y}{\partial z}*\frac{\partial z}{\partial W}\qquad where\ z=Wx+b\\ &=2(y-\hat y)*derivative\ of\ sigmoid\ function*x\\ &=2(y-\hat y)*z(1-z)*x \end{align*}
Loss(y,y^)=i=1∑n(y−y^)2∂W∂Loss(y,y^)=∂y^∂Loss(y,y^)∗∂z∂y^∗∂W∂zwhere z=Wx+b=2(y−y^)∗derivative of sigmoid function∗x=2(y−y^)∗z(1−z)∗x
以上是用于计算损失函数对权重偏导数的链式法则。简单起见,只展示了一层神经网络的偏导数。
更深入地理解微积分和链式法则在反向传播中的应用可以参考3Blue1Brown的视频教程。
参考作者:Momooo吖 https://www.bilibili.com/read/cv25014708/?spm_id_from=333.999.collection.opus.click
https://zhuanlan.zhihu.com/p/635438713
一个对从基本原理到梯度下降,对神经网络讲得比较清楚的教程:https://zhuanlan.zhihu.com/p/59385110