神经网络是一种受生物学启发的编程范式,让计算机在众多观测数据中进行自我学习的算法技术。而深度学习可以看作是强有力的用于神经网络学习的众多技术的集合。目前,神经网络与深度学习在图像识别、语音识别和自然语言处理领域中都给出了最好的解决方案。本文以两种常用神经元的工作原理入门,讲解梯度下降学习算法,并进一步引出深度学习的概念。
感知器是人工神经元的一种,即便如今更多的使用sigmoid神经元,但首先理解感知器的工作原理,对于后面sigmoid神经元的理解会更加简单。感知器的工作原理如图所示:
其中x1, x2, x3代表输入元素,每条指向感知器的路径箭头带有一定的权值wi(i=1, 2, 3),感知器带有一个参数称为阈值,通过判断所有输入与权值的乘积和与给定阈值的大小,决定最后的输出值,即 显然,通过调整权值与阈值,将会产生不同的决策结果。这样一来,通过构建一个如下图所示的复杂的感知器网络,为考虑更多的输入因素做出决策,是非常可靠的,其中介于输入层与输出层之间的神经网络层称为隐藏层。 为简化数学描述,可以将阈值移向不等式的另一边,以参数b代替-threshold,参数b称为感知器的贝叶斯(bias)参数;而w和x分别代表权值向量和输入向量。如下所示: 若给定输入向量为二进制数,则通过判断输出值是否大于零输出0或1。可以看出,感知器可以用来被设计成复杂的逻辑电路,若将输入向量视作无输入值的感知器,则可以设计如下图的逻辑电路: 通过对感知器的了解,我们发现如果能让权值和bias参数自动调整,使之成为一种自主学习算法,那么将无需程序员的干预,极大地增强神经网络对于不同场景的适应性。如果要设计一种自主学习算法,那么就需要神经网络能够循序渐进地增大或减小权值向量和bias的值,从而使得输出值能够做出相应的细微改变,并根据输出结果再次改变权值向量或bias值,如此循环,直到得出正确的决策结果。这样一来,就需要一种不局限于只能输入和输出二进制向量值的神经元,这样的神经元称为sigmoid神经元,如下图所示:
一个sigmoid神经元接受介于0到1之间的输入向量值,与感知器神经元一样,计算w*x+b的值,但不再通过判断这个结果值是否大于0输出结果值,而是将其作为sigmoid函数的自变量,计算输出结果值。这里sigmoid函数称为神经元的激励函数,激励函数可以拥有其他多种函数形式,这里以sigmoid函数为例,定义如下: 可以发现,sigmoid神经元是对应于感知器非0即1的输出做出的平滑改进,考虑极限状态下,函数值小于0.5时输出0,大于0.5时输出1,此时的函数即为感知器神经元的激励函数形式,我们称为阶跃函数,如图所示: 总的来说,当权值或bias值发生改变时,输出值的改变可以通过以下式子计算得出: 所以sigmoid神经元方便了通过改变权值向量或bias值,来观察输出值的变化,更加简单迅速地基于输出结果值的反馈,调整权值向量或bias值,使得决策结果更接近于预期结果。基于神经网络做出的决策结果,我们定义损失函数用来评估神经网络决策的精确性:
其中,w代表权值集合,b代表bias值集合,n代表所有输入集合的数目,a代表神经网络的输出值,y(x)代表给定输入集合x下期望的决策结果。观察可知,损失函数C(w,b)基于范数计算,结果总是非负的,有时也称C(w,b)为均方误差MSE(mean squared error)。当C(w,b)结果值接近于0时,说明神经网络的决策结果接近于预期结果,表现良好;否则,当C(w,b)结果值非常大时,说明神经网络表现不好,需要训练算法调整权值集合或bias值集合,使得损失函数值C(w,b)取最小值,这样的算法称为梯度下降算法。 现在,重点在于找到适当的权值集合和bias值集合使得梯度下降算法取最小值。由于损失函数是非负的二次方函数,因此可以将损失函数图像想象成向下凹的山谷,让一颗球从任意点滚下,那么最终这颗球将静止在最低点,也就是损失函数的最小值。 为方便分析,假设损失函数只有参数v即C(v),现模拟球滚下的过程,将这颗球向v1方向移动Δv1,向v2方向移动Δv2,那么C(v)的变化量ΔC可以表示成: 再次简化公式,取Δv代表移动变化量,∇C代表导数向量,称为梯度向量,如下所示: 那么C(v)的变化量ΔC简化为 为取得损失函数最小值,只需使得ΔC小于0即可,特别地,取 ,其中η是一个正数,称为学习速率。这样一来 保证了ΔC≤0。v调整为 ,再次利用损失函数评估训练算法的精确度,循环进行减小C(v)值直到取得最小值。 回到神经网络的损失函数C(w,v),则对于调整权值wk和bias值bl,有 但是,这里存在一个问题,将损失函数变形: 可以理解为,损失函数是针对所有输入集合下的Cx取平均的计算,那么当n足够大即训练样本足够多的情况下,梯度下降算法的计算效率将非常慢。因此,我们可以在所有训练样本集中随机采样X1,X2,…Xm,采样的集合称为minibatch,通过计算采样下的梯度向量∇Cx,近似作为整体样本的梯度向量∇C,那么就有 在下一次计算∇Cx时再随机采样m个输入集合,直到损失函数取得最小值。这将大大提高神经网络的学习效率,这样的算法称为随机梯度下降算法。这时调整权值和bias值则有 当然,这种近似计算不会是完美的,但它不需要是完美的,我们要做的只是让这颗球沿着损失函数值下降的方向移动就可以了。实践当中,随机梯度下降算法是神经网络学习中比较常用且有效的技术。神经网络和深度学习技术给出了在图像识别等领域的最好解决方案,为引出深度学习的概念,这里以人脸识别为例,判断一张图片中是否含有人脸。假设现在不再使用上述的神经网络,而是直接选定权值和bias值,设计一个神经网络能够识别人脸。自然而然,分析一张图片中是否含有人脸,可以将这个问题分解为若干的子问题,比如:图片的左上方是否有一只眼睛?图片的右上方是否有一只眼睛?中间是否有一个鼻子?底部中间是否有一张嘴巴?等等。如果多数子问题的答案是“是”或“大概是”,那么我们倾向于判断图片中含有人脸。相反,如果多数问题答案是“否”,那么倾向于判断图片中不含有人脸。 这样设计的神经网络结构如图所示:
子问题可以进而分解为更简单的子问题,如判断图片左上方是否有一只眼睛可以分解为:是否有眉毛?是否有睫毛?是否有虹膜?等等。子问题再继续分解下去,最终可以分解得到关于像素的最简单易回答的问题,例如判断图片某个位置是否包含非常简单的形状。也就是说,我们将一个复杂的问题不断分解,最终得到一些关于像素级别的简单子问题,进而设计一个包含若干层的神经网络,这种神经网络就是深度神经网络。 深度学习就是让深度神经网络能够使用学习算法,自动调整权值和bias值的启发式训练算法。深度学习技术基于随机梯度下降技术和反向传播技术不断发展,让训练更深层次的神经网络成为可能。目前日常使用的深度神经网络一般含有5到10层隐藏层。