系列文章目录
深度学习原理-----线性回归+梯度下降法
深度学习原理-----逻辑回归算法
深度学习原理-----全连接神经网络
深度学习原理-----卷积神经网络
深度学习原理-----循环神经网络(RNN、LSTM)
时间序列预测-----基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测
时间序列预测(多特征)-----基于BP、LSTM、CNN-LSTM神经网络算法的多特征用电负荷预测
系列教学视频
快速入门深度学习与实战
[手把手教学]基于BP神经网络单特征用电负荷预测
[手把手教学]基于RNN、LSTM神经网络单特征用电负荷预测
[手把手教学]基于CNN-LSTM神经网络单特征用电负荷预测
[多特征预测]基于BP神经网络多特征电力负荷预测
[多特征预测]基于RNN、LSTM多特征用电负荷预测
[多特征预测]基于CNN-LSTM网络多特征用电负荷预测
文章目录
前言
全连接神经网络是大多数人学习深度学习所接触的第一个神经网络模型,虽然这个神经网络是很久之前提出的,但是在深度学习中是很重要的。其中最重要的原因是利用了反向传播算法进行参数更新,使得神经网络可以通过不断喂给数据进行参数更新达到不断学习的目的。反向传播算法是梯度下降法在深度神经网络上的具体实现方式。其原理就是利用梯度下降法来不断更新神经网络的参数,目前几乎所有的神经网络的参数的更新的方式都是利用的梯度下降法或者经过优化的梯度下降法。
正如上文所说的,目前几乎所有的神经网络中都利用反向传播算法来进行神经网络的参数更新,例如可以很好解决图像特征提取的CNN卷积神经网络和可以很好学习到时间序列信息的RNN循环神经网络,其网络参数的更新去拟合现有的数据都是利用的反向传播算法,因此反向传播算法并不是全连接神经网络专有的,而是主流神经网络普遍利用的一种参数更新的方法,正是应为有了反向传播算法,神经网络才可以不断从数据中学习到有用信息,因此全连接神经网络是学习深度学习的基础。
那么神经网络可以帮助我们做什么呢?从目前的可以解决的问题上我们可以将任务分为两类,一类是分类任务,一类是回归任务。分类任务就是对输入的数据特征进行学习,输出是对应输入数据预测类别,比如输入一些猫和狗的数据并对其进行学习,现在输入一张新的图片,判断图中的图片是否是猫还是狗。回归任务就是对输入的数据特征进行学习,输出是对应输入数据的预测值,比如输入历史的天气数据相关特征进行学习,现在输入一段历史的天气数据相关特征数据,输出第二日的温度预测值。
1、全连接神经网络基本结构
虽然全连接神经网络听起来像是一个生物学的概念,但是其本质就是一堆数学模型,而全连接神经网络模型是由输入层、隐藏层、输出层所组成,全连接神经网络结构如下图所示:

神经网络的每一层都是一个个神经元所组成的,因此只要搞清楚神经元的本质就可以搞清楚全连接神经网络了。如图所示,这是一个全连接神经网络神经元的模型图。

该神经元的数学表达式如式所示:
a
=
h
(
w
∗
x
+
b
)
a=h(w * x+b)
a=h(w∗x+b) b称之为偏置,用于控制神经元被激活的容易程度,而w是表示各个信号的权重的参数,用于控制各个信号的重要性,而h()为激活函数,是一种非线性函数。
貌似这个数学表达式没有那么复杂,在仔细观察,其实这个神经元的数据表达式和线性模型的数学表达式是很相似的,只不过是将线性模型的输出结果进行一个激活函数的计算在输出。加入激活函数一定是有其中的意义的,激活函数的种类有很多,但是他们都有一个共同的特征就是激活函数都是非线性的。
那么为什么神经网络都要加上激活函数,同时该激活函数为什么要一定是非线性的呢?从神经网络的结构来说,神经网络分为输入层、隐藏层、输出层;这里的隐藏层是一层或者多层的神经网络层连接而成。
隐藏层的输入是输入层或者前一层隐藏层的输出,如果不利用非线性的函数作为激活函数的话,那么不管如何加深神经网络的层数,隐藏层再怎么多,总是存在与之等效的“无隐藏层的神经网络”。
为了具体地理解这一点,我们来思考下面这个简单的例子。
这里我们考虑把线性函数h(x)=cx作为激活函数,把y(x)=h(h(h(x)))的运算对应3层神经网络,这个运算会进行
y
(
x
)
=
c
∗
c
∗
c
∗
x
y(x)=c * c * c * x
y(x)=c∗c∗c∗x的乘法运算,但是同样的处理可以由y(x)=ax(注意,这里
a
=
c
∗
∗
3
a=c * * 3
a=c∗∗3)一次乘法运算(既没有隐藏层的神经网络)来表示。如本例所示,使用线性函数时,无法发挥多层网络带来的优势。因此,为了发挥多层隐藏层所带来的优势,激活函数必须使用非线性函数。
2、激活函数
前面介绍了激活函数在神经网络中的作用和其中的必要性,下面来介绍一下神经网络中一些常用的激活函数;在神经网络中比较常用的激活函数有sigmoid函数、Tanh函数、ReLU函数、Leaky ReLU函数、softmax函数。
2.1、Sigmoid函数
Sigmoid函数最早是在逻辑回归中提到的,它作为解决二分类的问题出场的。其值域是在[0,1]之间,输出的值可以作为分类的概率。Sigmoid函数的公式和导数如下式所示:
y
=
1
1
+
e
−
z
⇒
y
′
=
y
(
1
−
y
)
′
\mathrm{y}=\frac{1}{1+\mathrm{e}^{-\mathrm{z}}} \Rightarrow \mathrm{y}^{\prime}=\mathrm{y}(1-\mathrm{y})^{\prime}
y=1+e−z1⇒y′=y(1−y)′ 其中对应的函数图像和对应的导数图像如下图所示:
Sigmoid函数优点:
1、简单、非常适用分类任务;
Sigmoid函数缺点:
1、反向传播训练时有梯度消失的问题;
2、输出值区间为(0,1),关于0不对称;
3、梯度更新在不同方向走得太远,使得优化难度增大,训练耗时
2.2、Tanh函数
Tanh函数,其输出值在区间[-1,1]。函数表达式和其对应的导数表达式如下式所示:
y
=
e
z
−
e
−
z
e
z
+
e
−
z
⇒
y
′
=
1
−
y
2
\mathrm{y}=\frac{\mathrm{e}^{\mathrm{z}}-\mathrm{e}^{-\mathrm{z}}}{\mathrm{e}^{\mathrm{z}}+\mathrm{e}^{-\mathrm{z}}} \Rightarrow \mathrm{y}^{\prime}=1-\mathrm{y}^2
y=ez+e−zez−e−z⇒y′=1−y2
Tanh函数优点:
1、解决了Sigmoid函数输出值非0对称的问题
2、训练比Sigmoid函数快,更容易收敛;
Tanh函数缺点:
1、反向传播训练时有梯度消失的问题;
2、Tanh函数和Sigmoid函数非常相似。
2.3、ReLU函数
ReLU函数是目前在神经网络使用最流行的激活函数。其函数表达式和其对应的导数非常简单:
y
=
{
z
if
z
>
0
0
if
z
<
=
0
⟹
y
′
=
{
1
if
z
>
0
0
if
z
<
=
0
y=\left\{\begin{array}{ll} z & \text { if } z>0 \\ 0 & \text { if } z<=0 \end{array} \Longrightarrow y^{\prime}= \begin{cases}1 & \text { if } z>0 \\ 0 & \text { if } z<=0\end{cases}\right.
y={z0 if z>0 if z<=0⟹y′={10 if z>0 if z<=0
ReLU函数优点:
1、解决了梯度消失的问题;
2、计算更为简单,没有Sigmoid函数和Tanh函数的指数运算;
ReLU函数缺点:
1、训练时可能出现神经元死亡;
2.4、Leaky ReLU函数
Leaky ReLU函数是ReLU函数的变体。其函数和对应导数的表达式为: y = { z if z > 0 a z if z < = 0 ⟹ y ′ = { 1 if z > 0 a if z < = 0 \mathrm{y}=\left\{\begin{array}{ll} \mathrm{z} & \text { if } \mathrm{z}>0 \\ \mathrm{az} & \text { if } \mathrm{z}<=0 \end{array} \Longrightarrow \mathrm{y}^{\prime}= \begin{cases}1 & \text { if } \mathrm{z}>0 \\ \mathrm{a} & \text { if } \mathrm{z}<=0\end{cases}\right. y={zaz if z>0 if z<=0⟹y′={1a if z>0 if z<=0

Leaky ReLU函数优点:
1、解决了ReLU的神经元死亡问题;
Leaky ReLU函数缺点:
1、无法为正负输入值提供一致的关系预测(不同区间函数不同)
2.5、SoftMax激活函数
SoftMax函数通常被用在多分类网络模型中。其表达式: y i = e z i ∑ j e z j ⟹ y i ′ = y i ( 1 − y i ) \mathrm{y}_{\mathrm{i}}=\frac{\mathrm{e}^{\mathrm{z}_{\mathrm{i}}}}{\sum_{\mathrm{j}} \mathrm{e}^{\mathrm{z}_{\mathrm{j}}}} \Longrightarrow \mathrm{y}_{\mathrm{i}}^{\prime}=\mathrm{y}_{\mathrm{i}}\left(1-\mathrm{y}_{\mathrm{i}}\right) yi=∑jezjezi⟹yi′=yi(1−yi) SoftMax函数的值域是在[0,1]之间的,并且存在多个输出,例如是一个5分类的任务,那么SoftMax函数最终的输出是对应每个类别的的概率,同时这5个类别对应的概率相加最终的结果为1。因此在多分类任务的场景下,神经网络的最后一层一般都是使用SoftMax函数来作为激活函数。
3、前向传播
神经网络的输出是通过前向传播最后输出的,前向传播的是将数据特征作为输入,输入到隐藏层,将数据特征和对应的权重相乘同时再和偏置进行求和,将计算的结果通过激活函数进行激活,将经过激活函数激活的函数输出值作为下一层神经网络层的输入再和对应的权重相乘同时和对应的偏置求和,再将计算的结果通过激活函数进行激活,不断重复上述的过程直到神经网络的输出层,最终得到神经网络的输出值。
我们可以将神经网络模型理解为一个黑匣子,将数据输入到黑匣子中,然后得到一个通过黑匣子计算的输出结果(当然这个结果是一个合理且让我们满意的结果);例如利用神经网络制作一个数字分类器,我们输入一个数字8的图片,我们希望通过神经网络模型的计算,最后的输出结果是告诉我这个图片中的数字为8。例如我们输入一个人的身高、体重、性别、学历、工龄、专业方向等个人信息到神经网络中,通过神经网络的计算,神经网络可以输出该人的一年的年收入。这里的将数据输入到神经网络中,神经网络经过计算输出计算结果的过程就叫做神经网络的前向传播。
下面我们来看看神经网络前项传播具体的计算过程,以下图所示,该神经网络模型由输入层、两层隐藏层、输出层所组成。

隐藏层的神经元 a 11 , a 12 a_{11}, a_{12} a11,a12计算公式如下: a 11 = sigmoid ( x 1 w 11 + x 2 w 13 + b 1 ) a 12 = sigmoid ( x 1 w 12 + x 2 w 14 + b 2 ) \begin{aligned} &a_{11}=\operatorname{sigmoid}\left(x_1 w_{11}+x_2 w_{13}+b_1\right) \\ &a_{12}=\operatorname{sigmoid}\left(x_1 w_{12}+x_2 w_{14}+b_2\right) \end{aligned} a11=sigmoid(x1w11+x2w13+b1)a12=sigmoid(x1w12+x2w14+b2) 输出层的神经元计算公式如下: a 21 = relu ( a 11 w 21 + a 12 w 22 + b 3 ) y = a 21 \begin{gathered} a_{21}=\operatorname{relu}\left(a_{11} w_{21}+a_{12} w_{22}+b_3\right) \\ y=a_{21} \end{gathered} a21=relu(a11w21+a12w22+b3)y=a21 其中是 w 11 , w 12 , w 13 , w 14 , w 21 , w 22 , b 1 , b 2 , b 3 w_{11}, w_{12}, w_{13}, w_{14}, w_{21}, w_{22}, b_1, b_2, b_3 w11,w12,w13,w14,w21,w22,b1,b2,b3隐藏层对应输入的权重和偏置。
3.1、案例1
下面我们用一个具体的实例来进行神经网络的前向传播,如下图是一个神经网络模型中的一个神经网络链,其中包含从输入到输出的一条神经网络前向传播输入的路径,一个完整的神经网络模型的前向传播就是由许多这样的传播链组成的。

这里假设第一个神经元节点用的激活函数是sigmoid,第二个神经元利用的激活函数是relu,此时前向传播的具体计算过程如下所示:
a
11
=
sigmoid
(
x
1
w
11
+
b
1
)
a
21
=
relu
(
a
11
w
21
+
b
1
)
y
=
a
21
\begin{gathered} a_{11}=\operatorname{sigmoid}\left(x_1 w_{11}+b_1\right) \\ a_{21}=\text { relu }\left(a_{11} w_{21}+b_1\right) \\ y=a_{21} \end{gathered}
a11=sigmoid(x1w11+b1)a21= relu (a11w21+b1)y=a21
此时假设神经网络的输出
x
1
=
1
x_1=1
x1=1,神经网络该特征输入对应的标签label为2。同时神经网络参数进行了初始化,初始化的值为
w
11
=
0.5
,
w
21
=
1
,
b
1
=
0.5
,
b
2
=
1
w_{11}=0.5, \quad w_{21}=1, \quad b_1=0.5, \quad b_2=1
w11=0.5,w21=1,b1=0.5,b2=1。因此具体的计算过程如下所示:
a
11
=
sigmoid
(
1
×
0.5
+
0.5
)
=
0.731
a
21
=
relu
(
0.731
×
1
+
1
)
=
1.731
y
=
1.731
\begin{gathered} a_{11}=\operatorname{sigmoid}(1 \times 0.5+0.5) \\ =0.731 \\ a_{21}=\operatorname{relu}(0.731 \times 1+1) \\ =1.731 \\ y=1.731 \end{gathered}
a11=sigmoid(1×0.5+0.5)=0.731a21=relu(0.731×1+1)=1.731y=1.731 例子中给的w和b的值是初始化的值,也就是随机值,很显然这个输出的y值和真实的label值是有一点的差距的,因此只要找到一种方法可以求出准确的w和b,那么通过前向传播来计算出来的y就会无限接近于label值(或者等于label值)。那么有没有什么方法可以帮助我们找到神经网络中的权重w和偏置b呢?答案是肯定的,这样的方法就是梯度下降法,而反向传播法是梯度下降法在深度神经网络上的具体实现方式。
4、反向传播
前面我们在讲线性回归的时候已经很细致的讲解了梯度下降法了,可以去参看一下手把手教你深度学习和实战-----线性回归+梯度下降法这篇文章来对梯度下降法有一个更加细致的了解。
首先梯度下降法有需要有损失函数。利用这个损失函数来计算前向传播的输出值和真实的label值之间的损失误差。损失函数目前用的比较多的有均方误差和交叉熵误差等。
在回归问题中用的比较多的是均方误差函数,均方误差的损失函数如下所示:
J
(
x
)
=
1
2
m
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
J(x)=\frac{1}{2 m} \sum_{i=1}^m\left(f\left(x_i\right)-y_i\right)^2
J(x)=2m1i=1∑m(f(xi)−yi)2 其中
f
(
x
i
)
f\left(x_i\right)
f(xi)是神经网络通过前向传播计算出来的输出值,
x
i
x_i
xi是输入的特征数据,
y
i
y_i
yi是对应输入数据特征的标签。因此可以利用计算神经网络的输出值和真实标签之间的误差。
在分类问题中用的比较多的是交叉熵损失函数,交叉熵损失函数公式如下所示:
J
(
x
)
=
−
1
m
∑
i
=
1
m
(
y
i
log
σ
(
w
⊤
x
i
+
b
)
+
(
1
−
y
i
)
log
(
1
−
σ
(
w
⊤
x
i
+
b
)
)
)
J_{(x)}=-\frac{1}{m} \sum_{i=1}^m\left(y_i \log \sigma\left(w^{\top} x_i+b\right)+\left(1-y_i\right) \log \left(1-\sigma\left(w^{\top} x_i+b\right)\right)\right)
J(x)=−m1i=1∑m(yilogσ(w⊤xi+b)+(1−yi)log(1−σ(w⊤xi+b))) 其中
σ
(
w
⊤
x
i
+
b
)
\sigma\left(w^{\top} x_i+b\right)
σ(w⊤xi+b)为sigmoid函数,
x
i
x_i
xi是输入的特征数据,
y
i
y_i
yi是对应输入数据特征的标签。
正是因为神经网络的输出值和真实值存在损失误差,才会有梯度下降法利用损失进行参数的更新,最终才会有神经网络的反向传播不断更新神经网络的w和b,从而使得神经网络的输出和真实label不断的逼近,损失函数也不断的逼近0。但是实际项目中,由于数据中存在噪声,因此损失值在参数不断的更新下会不断接近0,但是不可能等于0,所以我们往常将模型的训练轮次和损失值变化画图显示出来,如果损失值在一定的轮次后趋于平缓不再下降,那么就认为模型的训练已经收敛了。如下图所示:
从图中可以看出该神经网络模型的loss值大概在100左右的时候就已经收敛。后续的训练模型的loss值趋于平稳不再下降,同时模型的loss值也趋于0。
现在损失函数有了,那么就可以利用损失函数来进行神经网络模型的参数的更新了,梯度下降法进行参数更新的公式如下式所示:
w
=
w
−
a
∂
J
(
w
)
∂
w
b
=
b
−
α
∂
J
(
b
)
∂
b
\begin{aligned} &w=w-a \frac{\partial J(w)}{\partial w} \\ &b=b-\alpha \frac{\partial J(b)}{\partial b} \end{aligned}
w=w−a∂w∂J(w)b=b−α∂b∂J(b) 其中α为学习率,学习率的既不能太大,也不能太小,太大的话可能会导致参数跳过使损失函数最小的值,太小的话可能导致参数更新过慢,在训练结束后模型还没有收敛。通常学习率是取0.01或0.001。
4.1、链式法则
在线性回归和逻辑回归梯度下降法求解梯度中就利用到链式法则去求解梯度。链式法则在高等数学当中是一个比较重要的知识点,同时也是反向传播进行参数更新的核心知识。链式法则分为单变量链式法则和多变量链式法则。其本质就是求解复合函数求导问题。
单变量链式法则:
假设,当
y
y
y为
u
u
u的函数,
u
u
u为
v
v
v的函数,
v
v
v为
x
x
x的函数时,求
y
y
y关于
x
x
x的导数。具体的公式应当如下所示:
d
y
d
x
=
d
y
d
u
d
u
d
v
d
v
d
x
\frac{\mathrm{d} y}{\mathrm{~d} x}=\frac{\mathrm{d} y}{\mathrm{~d} u} \frac{\mathrm{d} u}{\mathrm{~d} v} \frac{\mathrm{d} v}{\mathrm{~d} x}
dxdy= dudy dvdu dxdv 我们用一个具体的例子来利用链式求导法则进行求导。
存在函数
z
=
u
2
z=u^2
z=u2,同时
u
=
2
−
y
,
y
=
4
x
u=2-y, \quad y=4 x
u=2−y,y=4x,求
z
z
z关于
x
x
x的导数。
d
z
d
x
=
d
z
d
u
⋅
d
u
d
y
⋅
d
y
d
x
=
2
u
×
(
−
1
)
×
4
=
−
8
u
\begin{aligned} \frac{d z}{d x} &=\frac{d z}{d u} \cdot \frac{d u}{d y} \cdot \frac{d y}{d x} \\ &=2 u \times(-1) \times 4 \\ &=-8 u \end{aligned}
dxdz=dudz⋅dydu⋅dxdy=2u×(−1)×4=−8u 同时:
u
=
2
−
y
,
y
=
4
x
u
=
2
−
4
x
\begin{gathered} u=2-y, \quad y=4 x \\ u=2-4 x \end{gathered}
u=2−y,y=4xu=2−4x 因此:
d
z
d
x
=
−
8
u
=
−
8
×
(
2
−
4
x
)
=
32
x
−
16
\begin{aligned} \frac{d z}{d x} &=-8 u \\ &=-8 \times(2-4 x) \\ &=32 x-16 \end{aligned}
dxdz=−8u=−8×(2−4x)=32x−16 利用上述的公式就对单变量的复合函数进行了链式求导,下面来看看多变量的链式求导法则。
假设变量z为u,v的函数,u和v分别为y的函数,y为x的函数,求z关于x的导数。
∂
z
∂
x
=
∂
z
∂
u
⋅
∂
u
∂
y
⋅
∂
y
∂
x
+
∂
z
∂
v
⋅
∂
v
∂
y
⋅
∂
y
∂
x
\frac{\partial z}{\partial x}=\frac{\partial z}{\partial u} \cdot \frac{\partial u}{\partial y} \cdot \frac{\partial y}{\partial x}+\frac{\partial z}{\partial v} \cdot \frac{\partial v}{\partial y} \cdot \frac{\partial y}{\partial x}
∂x∂z=∂u∂z⋅∂y∂u⋅∂x∂y+∂v∂z⋅∂y∂v⋅∂x∂y 存在函数
z
=
u
2
+
v
3
z=u^2+v^3
z=u2+v3,同时
u
=
2
−
y
,
v
=
4
+
y
,
y
=
4
x
u=2-y, \quad v=4+y, \quad y=4 x
u=2−y,v=4+y,y=4x,求z关于x的导数
按链式法则求导有:
∂
z
∂
x
=
∂
z
∂
u
⋅
∂
μ
∂
y
⋅
∂
y
∂
x
+
∂
z
∂
v
⋅
∂
v
∂
y
⋅
∂
y
∂
x
=
2
u
×
(
−
1
)
×
4
+
3
v
2
×
1
×
4
=
−
8
u
+
12
v
2
\begin{aligned} \frac{\partial z}{\partial x} &=\frac{\partial z}{\partial u} \cdot \frac{\partial \mu}{\partial y} \cdot \frac{\partial y}{\partial x}+\frac{\partial z}{\partial v} \cdot \frac{\partial v}{\partial y} \cdot \frac{\partial y}{\partial x} \\ &=2 u \times(-1) \times 4+3 v^2 \times 1 \times 4 \\ &=-8 u+12 v^2 \end{aligned}
∂x∂z=∂u∂z⋅∂y∂μ⋅∂x∂y+∂v∂z⋅∂y∂v⋅∂x∂y=2u×(−1)×4+3v2×1×4=−8u+12v2 同时因为:
u
=
2
−
4
x
,
V
=
4
+
4
x
u=2-4 x, V=4+4 x
u=2−4x,V=4+4x 解得:
∂
z
∂
x
=
192
x
2
+
542
x
+
176
\frac{\partial z}{\partial x}=192 x^2+542 x+176
∂x∂z=192x2+542x+176 以上就是链式法则的计算过程和规则。
4.2、案例2
前面了解了复合函数的链式法则求导法则,现在可以利用链式求导法则求解对应神经网络参数的梯度,以此来利用梯度下降法进行反向传播,从而对参数进行更新。前面前向传播案例讲解中利用一个神经网络链进行前向传播的计算,现在利用同样的神经网络链进行反向传播参数的讲解。从图中可以看到该神经网络链一共有4个参数,分别为
w
11
,
w
21
,
b
1
,
b
2
w_{11}, w_{21}, b_1, b_2
w11,w21,b1,b2,同时4个参数和输入值x_1分别有对应的初始值,分别为
w
11
=
0.5
,
w
21
=
1
,
b
1
=
0.5
,
b
2
=
1
,
x
1
=
1
w_{11}=0.5, w_{21}=1, b_1=0.5, b_2=1, x_1=1
w11=0.5,w21=1,b1=0.5,b2=1,x1=1。同时通过前向传播计算出来的y=1.731,label值为2。现在利用神经网络的前向传播计算出来的输出值和真实值label之间的误差进行反传播进行梯度更新。
这里的损失函数利用的是均方误差损失函数,首先计算误差对最近的参数
w
21
,
b
2
w_{21}, b_2
w21,b2的梯度:
∂
J
(
w
21
)
∂
w
21
=
∂
J
(
w
21
)
∂
y
⋅
∂
y
∂
a
21
⋅
∂
a
21
∂
w
21
=
∂
1
2
(
y
−
2
)
2
∂
y
×
∂
a
21
∂
a
21
×
∂
r
e
l
u
(
a
11
w
21
+
b
1
)
∂
w
21
=
(
y
−
2
)
×
1
×
∂
relu
(
a
11
w
21
+
b
1
)
∂
(
a
11
w
21
+
b
1
)
×
∂
(
a
11
w
21
+
b
1
)
∂
w
21
=
(
y
−
2
)
×
a
11
×
∂
r
e
l
u
(
a
11
w
21
+
b
1
)
∂
(
a
11
w
21
+
b
1
)
\begin{aligned} \frac{\partial J\left(w_{21}\right)}{\partial w_{21}} &=\frac{\partial J\left(w_{21}\right)}{\partial y} \cdot \frac{\partial y}{\partial a_{21}} \cdot \frac{\partial a_{21}}{\partial w_{21}} \\ &=\frac{\partial \frac{1}{2}(y-2)^2}{\partial y} \times \frac{\partial a_{21}}{\partial a_{21}} \times \frac{\partial r e l u\left(a_{11} w_{21}+b_1\right)}{\partial w_{21}} \\ &=(y-2) \times 1 \times \frac{\partial \operatorname{relu}\left(a_{11} w_{21}+b_1\right)}{\partial\left(a_{11} w_{21}+b_1\right)} \times \frac{\partial\left(a_{11} w_{21}+b_1\right)}{\partial w_{21}} \\ &=(y-2) \times a_{11} \times \frac{\partial r e l u\left(a_{11} w_{21}+b_1\right)}{\partial\left(a_{11} w_{21}+b_1\right)} \end{aligned}
∂w21∂J(w21)=∂y∂J(w21)⋅∂a21∂y⋅∂w21∂a21=∂y∂21(y−2)2×∂a21∂a21×∂w21∂relu(a11w21+b1)=(y−2)×1×∂(a11w21+b1)∂relu(a11w21+b1)×∂w21∂(a11w21+b1)=(y−2)×a11×∂(a11w21+b1)∂relu(a11w21+b1) 因为:
a
11
w
21
+
b
1
=
1.731
>
0
a_{11} w_{21}+b_1=1.731>0
a11w21+b1=1.731>0 所以:
∂
relu
(
a
11
w
21
+
b
1
)
∂
(
a
11
w
21
+
b
1
)
=
1
\frac{\partial \operatorname{relu}\left(a_{11} w_{21}+b_1\right)}{\partial\left(a_{11} w_{21}+b_1\right)}=1
∂(a11w21+b1)∂relu(a11w21+b1)=1 最终:
∂
J
(
w
21
)
∂
w
21
=
(
y
−
2
)
×
a
11
=
(
1.731
−
2
)
×
0.731
=
−
0.196639
\begin{aligned} \frac{\partial J\left(w_{21}\right)}{\partial w_{21}} &=(y-2) \times a_{11} \\ &=(1.731-2) \times 0.731=-0.196639 \end{aligned}
∂w21∂J(w21)=(y−2)×a11=(1.731−2)×0.731=−0.196639 同理可以得出:
∂
J
(
b
2
)
∂
b
2
=
−
0.269
\frac{\partial J\left(b_2\right)}{\partial b_2}=-0.269
∂b2∂J(b2)=−0.269 然后计算离误差最远的两个参数
w
21
,
b
2
w_{21}, b_2
w21,b2的梯度:
∂
J
(
w
11
)
∂
w
11
=
∂
J
(
w
11
)
∂
y
⋅
∂
y
∂
a
21
⋅
∂
a
21
∂
u
11
⋅
∂
a
11
∂
w
11
=
∂
1
2
(
y
−
2
)
2
∂
y
⋅
∂
a
21
∂
a
21
⋅
∂
r
e
l
u
(
a
11
w
21
+
b
1
)
∂
a
11
⋅
∂
sigmoid
(
x
1
w
11
+
b
1
)
∂
w
11
=
(
y
−
2
)
×
1
×
∂
relu
(
a
11
w
21
+
b
1
)
∂
(
a
11
w
21
+
b
1
)
⋅
∂
(
a
11
w
21
+
b
1
)
∂
a
11
⋅
∂
sigmoid
(
x
1
w
11
+
b
1
)
∂
w
11
=
(
y
−
2
)
×
w
21
⋅
∂
sigmoid
(
x
1
w
11
+
b
1
)
∂
w
11
=
(
y
−
2
)
×
w
21
×
sigmoid
(
x
1
w
11
+
b
1
)
(
1
−
sigmoid
(
x
1
w
11
+
b
1
)
x
1
=
(
1.731
−
2
)
×
1
×
0.731
×
(
1
−
0.731
)
×
1
=
−
0.269
×
0.731
×
0.269
×
1
=
−
0.052895
\begin{aligned} &\frac{\partial J\left(w_{11}\right)}{\partial w_{11}}=\frac{\partial J\left(w_{11}\right)}{\partial y} \cdot \frac{\partial y}{\partial a_{21}} \cdot \frac{\partial a_{21}}{\partial u_{11}} \cdot \frac{\partial a_{11}}{\partial w_{11}} \\ &=\frac{\partial \frac{1}{2}(y-2)^2}{\partial y} \cdot \frac{\partial a_{21}}{\partial a_{21}} \cdot \frac{\partial r e l u\left(a_{11} w_{21}+b_1\right)}{\partial a_{11}} \cdot \frac{\partial \operatorname{sigmoid}\left(x_1 w_{11}+b_1\right)}{\partial w_{11}} \\ &=(y-2) \times 1 \times \frac{\partial \operatorname{relu}\left(a_{11} w_{21}+b_1\right)}{\partial\left(a_{11} w_{21}+b_1\right)} \cdot \frac{\partial\left(a_{11} w_{21}+b_1\right)}{\partial a_{11}} \cdot \frac{\partial \operatorname{sigmoid}\left(x_1 w_{11}+b_1\right)}{\partial w_{11}} \\ &=(y-2) \times w_{21} \cdot \frac{\partial \operatorname{sigmoid}\left(x_1 w_{11}+b_1\right)}{\partial w_{11}} \\ &=(y-2) \times w_{21} \times \operatorname{sigmoid}\left(x_1 w_{11}+b_1\right)\left(1-\operatorname{sigmoid}\left(x_1 w_{11}+b_1\right) x_1\right. \\ &=(1.731-2) \times 1 \times 0.731 \times(1-0.731) \times 1 \\ &=-0.269 \times 0.731 \times 0.269 \times 1 \\ &=-0.052895 \end{aligned}
∂w11∂J(w11)=∂y∂J(w11)⋅∂a21∂y⋅∂u11∂a21⋅∂w11∂a11=∂y∂21(y−2)2⋅∂a21∂a21⋅∂a11∂relu(a11w21+b1)⋅∂w11∂sigmoid(x1w11+b1)=(y−2)×1×∂(a11w21+b1)∂relu(a11w21+b1)⋅∂a11∂(a11w21+b1)⋅∂w11∂sigmoid(x1w11+b1)=(y−2)×w21⋅∂w11∂sigmoid(x1w11+b1)=(y−2)×w21×sigmoid(x1w11+b1)(1−sigmoid(x1w11+b1)x1=(1.731−2)×1×0.731×(1−0.731)×1=−0.269×0.731×0.269×1=−0.052895 同理可以计算出:
∂
J
(
b
1
)
∂
b
1
=
−
0.052895
\frac{\partial J\left(b_1\right)}{\partial b_1}=-0.052895
∂b1∂J(b1)=−0.052895 通过上述的计算可以得到对应参数的梯度数值如下所示:
∂
J
(
w
21
)
∂
w
21
=
−
0.196639
,
∂
J
(
b
2
)
∂
b
2
=
−
0.269
,
∂
J
(
w
11
)
∂
w
11
=
−
0.052895
,
∂
J
(
b
1
)
∂
b
1
=
−
0.052895
\frac{\partial J\left(w_{21}\right)}{\partial w_{21}}=-0.196639, \frac{\partial J\left(b_2\right)}{\partial b_2}=-0.269, \frac{\partial J\left(w_{11}\right)}{\partial w_{11}}=-0.052895, \frac{\partial J\left(b_1\right)}{\partial b_1}=-0.052895
∂w21∂J(w21)=−0.196639,∂b2∂J(b2)=−0.269,∂w11∂J(w11)=−0.052895,∂b1∂J(b1)=−0.052895 为了方便计算对其进行四舍五入保留小数点后3位:
∂
J
(
w
21
)
∂
w
21
=
−
0.197
,
∂
J
(
b
2
)
∂
b
2
=
−
0.269
,
∂
J
(
w
11
)
∂
w
11
=
−
0.053
,
∂
J
(
b
1
)
∂
b
1
=
−
0.053
\frac{\partial J\left(w_{21}\right)}{\partial w_{21}}=-0.197, \quad \frac{\partial J\left(b_2\right)}{\partial b_2}=-0.269, \quad \frac{\partial J\left(w_{11}\right)}{\partial w_{11}}=-0.053, \quad \frac{\partial J\left(b_1\right)}{\partial b_1}=-0.053
∂w21∂J(w21)=−0.197,∂b2∂J(b2)=−0.269,∂w11∂J(w11)=−0.053,∂b1∂J(b1)=−0.053 此时梯度有了,就可以利用梯度对参数进行更新了,假设此时的学习率的大小为0.1。参数更新过程如下:
w
11
=
0.5
−
0.1
×
(
−
0.053
)
=
0.505
w
21
=
−
1
−
0.1
×
(
−
0.197
)
=
1.020
b
1
=
0.5
−
0.1
×
(
−
0.053
)
=
0.505
b
2
=
1
−
0.1
×
(
−
0.269
)
=
1.027
\begin{aligned} &w_{11}=0.5-0.1 \times(-0.053)=0.505 \\ &w_{21}=-1-0.1 \times(-0.197)=1.020 \\ &b_1=0.5-0.1 \times(-0.053)=0.505 \\ &b_2=1-0.1 \times(-0.269)=1.027 \end{aligned}
w11=0.5−0.1×(−0.053)=0.505w21=−1−0.1×(−0.197)=1.020b1=0.5−0.1×(−0.053)=0.505b2=1−0.1×(−0.269)=1.027 更新后的参数为:
w
11
=
0.505
w
21
=
1.020
b
1
=
0.505
b
2
=
1.027
\begin{aligned} &w_{11}=0.505 \\ &w_{21}=1.020 \\ &b_1=0.505 \\ &b_2=1.027 \end{aligned}
w11=0.505w21=1.020b1=0.505b2=1.027 利用更新后的参数进行前向传播的计算:
a
11
=
sigmoid
(
1
×
0.505
+
0.505
)
=
0.733
a
21
=
relu
(
0.733
×
1.02
+
1.027
)
=
1.775
y
=
1.775
\begin{gathered} a_{11}=\operatorname{sigmoid}(1 \times 0.505+0.505) \\ =0.733 \\ \begin{array}{c} a_{21}=\operatorname{relu}(0.733 \times 1.02+1.027) \\ =1.775 \\ \quad y=1.775 \end{array} \end{gathered}
a11=sigmoid(1×0.505+0.505)=0.733a21=relu(0.733×1.02+1.027)=1.775y=1.775 此时最终的输出结果是y=1.775,可以看出这个数值比之前的参数没有更新的前向传播输出值1.731要更加接近真实值2了,这还是更新一轮后的结果,我们不断的给模型喂入数据,模型不断的利用梯度下降法进行反向传播进行参数更新,直到最后模型趋于收敛不再下降为止。因此反向传播可以有效的帮忙神经网络学习到数据中的信息,反向传播算法也是神经网络的核心所在。
总结
本文运用了大量的案例和计算来讲解全连接神经网络,力求在详细的案例的基础上搞懂全连接神经网络,全连接神经网络的是深度学习的基础入门神经网络,他也是后续神经网络的一个缩影,因为神经网络的基本流程就是神经网络参数的初始化、喂入数据进行前向传播、计算神经网络输出值和真实值的误差、利用误差进行反向传播更新参数、然后不断进行前向传播和反向传播进行参数更新直到模型收敛为止。后续的卷积神经网络和循环神经网络的模型学习的过程也是按这个流程走的,只不过在学习这两个模型的时候更侧重他的模型本身的特点。
3万+

被折叠的 条评论
为什么被折叠?



