一. 什么是神经网络
神经网络的说法起源于人类大脑的结构,大概的意思是说在人类大脑里,神经元细胞互相连接传递信息素,构成了一张网络。
机器学习里的神经网络是是一种比喻的表达,形象的描述了在计算机程序中构造许多个计算节点,这些节点如同神经网络一般互相连接,用以解决复杂的问题。
神经网络解决问题的方式从数学角度可以这样来看。我们可以把要预测的问题看成一个非常复杂的函数,我们无法知道精确的知道这个函数究竟是什么样的,但是我们至少可以用一种近似的算法来拟合这个函数。
我们需要一个圆来区分两种类别,假设我们没有画圆的能力,于是我们可以用画切线的方法来拟合这个圆,随着切线的增加,我们对圆的拟合就越准确,但是我们永远无法用有限的切线来精确描述圆。将感知器想象成图中的切线,可以帮助我们大致的理解神经网的功能。
二. 神经网络模型
我们使用之前章节讲过的逻辑回归模块来构造神经网络模型, 在逻辑回归模块的基础上,我们增加更多的逻辑回归感知器,构造一个中间层(如下图)。这个构造的层被称为隐藏层,输入数据被称为输入层,提供最后输出的层被称为输出层。
每一个输入值的权重为W,对于不同的感知器,每个参数可以有不同的权重。这有点像是每个感知器分布好像可以负责不同的属性。
比如在信用评估系统中,某个感知器负责审查收入,那么收入相关的参数对它来说就比较重要,权重也就比较大,其他信息如信用记录就比较次要,则权重值比较小。另外一个感知器专门负责审查信用度的,那么信用相关的输入获得的权重就会比较大,收入信息的权重比较小。最终这些不同感知器获得的评分汇总到输出层,获得一个最终的评估结果。
然而在实际的神经网络系统中,每个感知器并无法像我们之前描述的那样清晰的分工,每个感知器可能在不同维度上都有一定的作用, 实际上感知器之间所感知的维度很大程度上是非正交的 (如下图)。
为了处理更加复杂的问题,我们加入了更加多的感知器,创建更多的隐藏层,这就如同在画圆时使用了更多的切线。在目前比较新的神经网络结构里,隐藏层的数量可以达到数百层,这就需要大量的算力来实现了。
三. 正向传播算法
神经网络再给出预测的时候是正向传播的, 每一个节点的输入是上一层的输出,每个节点的输出则是下一层的输入。
1. 输入层
即一组输入参数 X 1 = ( x 1 1 , x 1 2 , . . . , x i n ) X_1= (x_1^1, x_1^2, ..., x_i^n) X1=(x11,x12,...,xin) , 此处 x x x的下标是表示这是第一层输入参数,上标表示第几个输入参数。我们将输入参数组成一个向量 X 1 X_1 X1。
2. 隐藏层
在i层上的输入是
X
i
−
1
=
(
x
i
−
1
1
,
x
i
−
1
2
,
.
.
.
,
x
i
−
1
k
)
X_{i-1} = (x_{i-1}^1,x_{i-1}^2, ..., x_{i-1}^k)
Xi−1=(xi−11,xi−12,...,xi−1k),输出是
X
i
=
(
x
i
−
1
1
,
x
i
−
1
2
,
.
.
.
,
x
i
−
1
m
)
X_i = (x_{i-1}^1,x_{i-1}^2, ..., x_{i-1}^m)
Xi=(xi−11,xi−12,...,xi−1m)。
X
i
=
t
a
n
h
(
W
i
∗
X
i
−
1
+
b
i
)
X_i = tanh(W_i * X_{i-1} +b_i)
Xi=tanh(Wi∗Xi−1+bi)
- 每个隐藏层有一组自己的权重值
W
i
W_i
Wi和偏移值
b
i
b_i
bi。
W
i
W_i
Wi是一个
(
k
,
m
)
(k,m)
(k,m)的矩阵,
b
i
b_i
bi则是
m
m
m维的向量。
k k k必须等于上一层的节点数(输入的个数), m m m则等于这一层的节点数,也是这一层的输出的个数。 - 此处的
t
a
n
h
(
s
)
=
e
s
−
e
−
s
e
s
+
e
−
s
tanh(s) = \frac{e^s-e^{-s}}{e^s+e^{-s}}
tanh(s)=es+e−ses−e−s , 即逻辑回归中
θ
(
s
)
\theta(s)
θ(s)的变形,亦被称为激活函数。
使用这个激活函数的意义在于,如果我们只用 W i ∗ X i − 1 + b i W_i * X_{i-1} +b_i Wi∗Xi−1+bi作为每一个节点的话,线性变化的输出到另外一个线性变化,那么整个系统依旧是线性的,其拟合功能是有限的, 激活函数意义就在于打破这种线性的关系,增加变化。
3. 输出层
输出层一般是使用一个逻辑回归函数的节点,用来获得输出一个概率值。对于多分类的神经网络,最常用的是softmax节点作为输出节点,以求获得每个分类的概率值,取概率最高的分类为结果。
所以从理论上来说,我们只要能有一组足够好的权重值和偏移值,我们既可以获得一个比较精确的输出结果。
四. 反向传播算法
反向传播算法是帮助我们来获得这组权重值和偏移值的方法。
具体步骤是:
- 首先随机产生一组权重值和偏移值
- 先做正向传播, 对于输入参数, 逐个算出每一层的输出值,直到最终输出结果。
- 比较正确的结果和输出结果, 计算其差异度,这个计算差异度的函数被称为损失函数,差异度称为损失(loss)。
- 根据损失函数,使用随机梯度下降算法最小化损失函数。此处的随机是指在求 e ( L o s s ( x n ) , y n ) e(Loss(x_n), y_n) e(Loss(xn),yn)时随机的选取一组 ( x n , y n ) (x_n, y_n) (xn,yn)。这样做的好处是计算量小,速度快,另外因为增加了随机性,也比较不容易让计算陷入到局部最小值。
- 从输出层开始逐层倒退的使用随机梯度下降算法,计算最大化的梯度,直到第一层节点 (输入层的下一层)。
- 更新整个网络的所有的权重值和偏移值。
- 重复以上步骤 1 - 6 直到输出结果的损失值足够小,即输出结果足够准确为止。