本文内容参考了 Michael Nielsen 的神经网络与深度学习一书
神经网络简介
神经网络是一种模仿生物神经网络的结构和功能的数学模型或算法模型。神经网络模型使用人工定义的函数替代生物神经网络中的神经元,使用该函数的计算结果值当作生物神经的神经递质,因此,人工定义的这种函数也成为人工神经元,将该函数的计算结果值称为激活值。为了方便称呼,下文中的人工神经元就指代人工神经元函数或人工神经元激活函数。神经网络模型的运行原理和生物神经网络的运行原理类似,神经网络是由多层神经元构成,前面一层的人工神经元的计算值,传递给后一层的每个人工神经元,后一层人工神经元给前面一层神经元的输出值添加不同的权重,并作累加,再加上一个偏差值,这样后面一层人工神经元就得到了前面一层人工神经元输出的一个加权累加和(此称呼忽略了加上的偏差值),然后这一层每个人工神经元对它的加权累加和做激活,即加权累加和带入人工神经元函数求值,这一层的人工神经元激活输出值传递到下一层人工神经元函数,依次类推,直到最后一层神经元输出结果。
神经网络模型
上图中是一个神经网络模型的示意图,从左至右看,竖着排列的圆圈代表人工神经元,一列神经元代表一层,两层神经元之间的带方向的箭头表示每个人工神经元的激活值的输出,从一个神经元出发的箭头都是相同的激活值。
最左侧一列神经元是神经网络的输入层(input layer),其中每个神经元是输入神经元,事实上,输入神经元并不能算是真正的人工神经元,输入层的神经元的作用只是将数据输出到网络中,并没有真正的输入做加权累加和激活。通常每个输入神经元输入一个取值区间为[0,1]的数值,作为神经网络的输入。
中间两列神经元是神经网络的隐藏层(hidden layers),称为隐藏层的原因是这些人工神经元层既不做数据输入,也不做网络结果输出,没有别的意思了。通常称有多个隐藏层( ≥ 2 \ge 2 ≥2)的神经网络为深度神经网络。
最右边一列神经元是神经网络的输出层(output layer),这一层是神经网络计算结果的输出层。
除去输入层人工神经元外,其他人工神经元都是一个激活函数,以Sigmoid激活函数为例:
σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+e−z1
其中输入参数 z z z就是人工神经元对上一层输出的加权输入:
z j l = ∑ k a k l − 1 w j k l + b j l z^l_j=\sum_k a_k^{l-1}w_{jk}^l+b^l_j zjl=k∑akl−1wjkl+bjl
上式的含义是第 l l l层的第 j j j个神经元的加权累加和是上一层激活值 a l − 1 a^{l-1} al−1(上一层的激活输出值组成的向量)与该神经元对输入激活值的权重的加权和,再加上该神经元的偏差值 b j l b_j^l bjl。
神经网络原理
神经网络作为一种模拟生物学神经网络的算法模型,可以用于更多的人们纯靠传统算法无法解决的问题,比如:手写数字图片的识别、根据已有数据的分类预测未知数据的分类、判断时序数据的动态趋势、人脸识别、图片识别分类、自然语言处理、机器学习等等人工智能领域。
神经网络有如此强大的能力,依靠两个特性,第一,人工神经元源于感知机【参考连接: 神经网络与深度学习第一章】,拥有能够处理任何计算需求的能力,包括:基础的逻辑计算、基于输入因素的决策制定等。第二,神经网络可以根据输入数据的计算结果,通过计算机编程实现每个神经元的权重和偏差值的自我调整,以减小网络输出值与期望值之间的差距,从而使得神经网络对所有的输入值都能产生更加契合期望的输出值(数据标签)。
本文主要是神经网络的有监督学习,即:每个输入数据都有对应的期望输出值(也称为数据标签)。所有的数据被分为训练数据集和测试数据集,训练数据集主要用于调整网络的学习参数,也就是神经元的权重和偏差值。测试数据集用于测试训练好的神经网络的效果,即,查看神经网路是否已经满足我们的期望,是否能对测试集中的输入数据输出其对应的标签值。总而言之,神经网络的好坏主要看神经网络是否得到了充足的训练,训练是否使所有神经元得到了合适的权重和偏差值。
神经网络的第二个特性是通过学习算法来实现的。常用的学习算法称为随机梯度下降:
随机梯度下降算法的目的是为了降低神经网络对每对训练数据的输出结果的误差。误差的公式如下:
C ( w , b ) ≡ 1 2 n ∑ x ∥ y ( x ) − a ∥ 2 . C(w,b) \equiv \frac{1}{2n} \sum_x \| y(x) - a\|^2. C(w,b)≡2n1x∑∥y(x)−a∥2.
其中 C C C是成本函数,也称为二次损失函数。 y y y是数据的标签值, a a a神经网络的输出值, ∑ x \sum_x ∑x表示网络输出层神经元的激活值与期望输出值得距离得累加,是对所有输出神经元的累加结果。
为了降低上面的成本函数,我们要使用微积分中的梯度工具:
Δ C ≈ ∂ C ∂ w Δ w + ∂ C ∂ b Δ b . \Delta C \approx \frac{\partial C}{\partial w} \Delta w + \frac{\partial C}{\partial b} \Delta b. ΔC≈∂w∂CΔw+∂b∂CΔb.
上式来源于微分的定义,可以理解为通过小的改变量 Δ w 和 Δ b \Delta w和\Delta b Δw和Δb逐步降低成本函数 Δ C \Delta C ΔC。但是重要的一点是,要保证上式右边的取值为负数。因此我们引入了下面的假设:
w k → w k ′ = w k − η ∂ C ∂ w k b l → b l ′ = b l − η ∂ C ∂ b l . \begin{align*} w_k & \rightarrow & w_k' = w_k-\eta \frac{\partial C}{\partial w_k} \\ b_l & \rightarrow & b_l' = b_l-\eta \frac{\partial C}{\partial b_l}. \end{align*} wkbl→→wk′=wk−η∂wk∂Cbl′=bl