前言
本文对深度学习的步骤做了一个简单的介绍,以及一个很重要的机制—反向传播。
一、深度学习的三个步骤
前面我们已经知道了机器学习的三个步骤,深度学习同样具有相似的三个步骤。
Step1:神经网络
Step2:模型评估
Step3:选择最优函数
Step1:神经网络
神经网络中的节点类似我们人类的神经元,不同的连接方式会产生不同的网络结构,连接方式是可以自己手动设置的。
以全连接前馈神经网络为例:前馈也称前向,即信号是单向流动的,输入信号后,信号从前一层流向后一层,直到输出层,任意两层间的连接是没有反馈的。
当已知权重和偏差时,输入
(
1
,
−
1
)
(1,−1)
(1,−1)的结果:
当已知权重和偏差时,输入
(
−
1
,
0
)
(−1,0)
(−1,0)的结果:
我们可以看出,当权重和偏差确定的时候,就可以看做一个函数,它的输入为一个向量,输出也是一个向量。当我们设置不同的权重和偏差时,就会有一个很大的函数集合,是之前学过的模型不能表达的情况,这就是深度学习。
神经网络的组成:输入层(1层)、隐含层(N层)、输出层(1层)
那么为什么叫深度学习呢?因为deep = many hidden layers,随着层数的增加,错误率在降低,但计算的复杂度也随之上升。为了解决这个问题,我们引入矩阵运算来提升计算效率。
拿这个简单的例子来说,把输入的
1
1
1,
−
1
-1
−1 当做一个向量,把权重值也看成一个向量,通过矩阵乘法再加上偏差(也是向量),经过激活函数,得到最终结果。神经网络的做法也是如此:
那么我们需要多少层,每一层又有多少个神经元呢?这个问题需要反复试错,得出一些经验,再加上自己的直觉来解决。对于网络结构,可以自行设计。
Step2: 模型评估
对于模型的评估,我们一般采用损失函数来评价模型的好坏,对于神经网络来说,我们采用交叉熵函数来对
y
y
y和
y
^
\hat y
y^的损失进行计算,最后就是调整参数,让交叉熵越小越好。
对于损失,我们不单单要计算一笔数据的,而是要计算所有训练数据的损失,然后把所有训练数据的损失相加,得到一个总体损失
L
L
L。接下来就是在function set里面找到一组函数能使
L
L
L最小,或者是找一组神经网络的参数\thetaθ,来最小化总体损失
L
L
L。
Step3:选择最优函数
我们依然选用梯度下降的方法进行求解。
具体流程:
θ
\theta
θ是一组包含权重和偏差的参数集合,随机初始化一个初值,接下来计算每个参数对应的偏微分,得到的一个偏微分集合
∇
L
\nabla{L}
∇L即梯度,有了这些偏微分,就可以不断更新梯度,得到新的参数,不断重复这个过程,就能得到一组最好的参数使得损失函数的值最小。
二、反向传播机制
损失函数是定义在单个训练样本上的,即一个样本的误差,例如分类时预测的类别和实际类别的区别,是一个样本的,用
L
L
L表示。
代价函数是定义在整个训练集上的,也就是所有样本的误差总和的平均,即损失函数总和的平均。
总体损失函数是定义在整个训练集上的,也就是所有样本的误差的总和,即平时我们反向传播需要最小化的值。
链式法则
前向传播
在介绍反向传播之前,我们先来看一下前向传播。
取出神经网络的一个神经元来看(红色三角区域):
z
=
x
1
w
1
+
x
2
w
2
+
b
z=x_1w_1+x_2w_2+b
z=x1w1+x2w2+b
根据求微分的原理,前向传播的运算规律为:
∂
z
∂
w
1
=
x
1
\frac{\partial z}{\partial w_1} = x_1
∂w1∂z=x1
∂
z
∂
w
2
=
x
2
\frac{\partial z}{\partial w_2} = x_2
∂w2∂z=x2
这里得到的
x
1
x_1
x1、
x
2
x_2
x2就是我们刚刚的输入值。
反向传播
由于
l
l
l是最后一层,所以
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l计算起来就相对困难。
利用链式法则我们依然可以来做这件事,但是
∂
l
∂
z
′
\frac{\partial l}{\partial z \prime}
∂z′∂l、
∂
l
∂
z
′
′
\frac{\partial l}{\partial z \prime \prime}
∂z′′∂l是我们无法得知的。但我们可以换个角度来看这个问题,现在有另外一个神经元,把前向的过程逆过来,其中
σ
′
(
z
)
{\sigma}'(z)
σ′(z)是常数,它在向前传播的时候就已经确定了。
Case 1:输出层
假设
∂
l
∂
z
′
\frac{\partial l}{\partial z'}
∂z′∂l 和
∂
l
∂
z
′
′
\frac{\partial l}{\partial z''}
∂z′′∂l是最后一层的隐藏层, 也就是
y
1
y_1
y1与
y
2
y_2
y2是输出值,那么可以直接计算结果,如下图所示。
Case 2:不是输出层
但是如果不是最后一层,计算
∂
l
∂
z
′
\frac{\partial l}{\partial z'}
∂z′∂l和
∂
l
∂
z
′
′
\frac{\partial l}{\partial z''}
∂z′′∂l 的话就需要通过链式法则继续计算了。
对于这个问题,我们要继续计算后面的
∂
l
∂
z
a
\frac{\partial l}{\partial z_a}
∂za∂l和
∂
l
∂
z
b
\frac{\partial l}{\partial z_b}
∂zb∂l,然后通过乘
w
5
w_5
w5和
w
6
w_6
w6得到
∂
l
∂
z
′
\frac{\partial l}{\partial z'}
∂z′∂l,但是要是
∂
l
∂
z
a
\frac{\partial l}{\partial z_a}
∂za∂l和
∂
l
∂
z
b
\frac{\partial l}{\partial z_b}
∂zb∂l也不知道,那么我们就继续往后面层计算,一直到碰到输出值,得到输出值之后再反向往输入方向计算下去。
我们可以从最后一个
∂
l
∂
z
5
\frac{\partial l}{\partial z_5}
∂z5∂l和
∂
l
∂
z
6
\frac{\partial l}{\partial z_6}
∂z6∂l 看,因为
∂
l
∂
z
5
\frac{\partial l}{\partial z_5}
∂z5∂l 和
∂
l
∂
z
6
\frac{\partial l}{\partial z_6}
∂z6∂l 比较容易通过output求出来,然后继续往前求
∂
l
∂
z
3
\frac{\partial l}{\partial z_3}
∂z3∂l 和
∂
l
∂
z
4
\frac{\partial l}{\partial z_4}
∂z4∂l ,再继续求
∂
l
∂
z
1
\frac{\partial l}{\partial z_1}
∂z1∂l和
∂
l
∂
z
2
\frac{\partial l}{\partial z_2}
∂z2∂l, 最后我们就得到下图的结果:
我们的目标是:求
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z(前向部分)和
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l ( 反向部分 ),然后把
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z和
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l相乘,我们就可以得到
∂
l
∂
w
\frac{\partial l}{\partial w}
∂w∂l ,进而所有神经网络的参数我们就都可以得到了,然后再用梯度下降就可以不断更新,得到损失最小的函数了。
总结
本文主要讲解了深度学习的三个步骤,以及链式法则、前向传播,反向传播机制,需要有一些微积分的简单基础就可以明白整个过程。