一、概念
本文讨论的神经网络是从生物学领域引入计算机科学和工程领域的一个仿生学概念,又称人工神经网络(英语:artificial neural network,缩写ANN)。是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。参考wiki定义。
二、神经网络如何工作
2.1 神经元
如图,一个神经元通常具有多个树突,主要用来接受传入信息;而轴突只有一条,轴突尾端有许多轴突末梢可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接,从而传递信号。这个连接的位置在生物学上叫做“突触”。
基于此,1943年,心理学家McCulloch和数学家Pitts参考了生物神经元的结构,发表了抽象的神经元模型MP,神经元模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。如下图:
图中X代表输入信号,W代表权重,∑代表将X和W的矩阵运算,ψ对运算结果应用sgn函数,最终得到输出y。
然而,改模型对权限W是通过指定好的,因此不存在在计算工程中动态调配权限W的能力,也就是不存在学习的能力。
2.2 感知器
1958年,计算科学家Rosenblatt提出了由两层神经元组成的神经网络:“感知器”(Perceptron)。
可以看到,一个感知器有如下组成部分:
输入权值: 一个感知器可以接收多个输入,每个输入上有一个权值,此外还有一个偏置项,就是上图中的。
激活函数: 感知器的激活函数可以有很多选择,比如我们可以选择Sigmoid函数来作为激活函数。
其中,因为生物学上,外接信号传导到神经元上,神经元不会立刻做出反应,而是会抑制输入,直到输入增强,强大到可以触发输出。也就是说,在产生输出之前,输入必须达到一个阈值。在数学上,这种随着变量值增大,函数值发生跳跃的函数成为激活函数。下图是一个常用的激活函数,Sigmoid函数曲线图:
感知器通过将权重矩阵和输入矩阵相乘,得到输出,再在输出结果上应用激活函数得到最终的输出结果。
2.3 神经网络架构
上节我们看到,感知器其实是单层的神经网络,神经网络可以理解成多个感知器组合而成的一个结构,如下图:
前面提过,这个网络中最左边的称为输入层,其中的神经元称为输入神经元。最右边的,即输出层包含有输出神经元,在本例中,输出层只有一个神经元。中间层,既然这层中的神经元既不是输入也不是输出,则被称为隐藏层。“隐藏”这一术语也许听上去有些神秘 —— 我第一次听到这个词,以为它必然有一些深层的哲学或数学涵意 —— 但它实际上仅仅意味着“既非输入也非输出”。上面的网络仅有一个隐藏层,但有些网络有多个隐藏层。
设计网络的输入输出层通常是比较直接的。例如,假设我们尝试确定一张手写数字的图像上是否写的是“”。很自然地,我们可以将图片像素的强度进行编码作为输入神经元来设计网络。如果图像是一个 的灰度图像,那么我们会需要 个输入神经元,每个强度取 和 之间合适的值。输出层只需要包含一个神经元,当输出值小于 时表示 “输入图像不是一个 ”,大于 的值表示 “输入图像是一个 ”。
相比于神经网络中输入输出层的直观设计,隐藏层的设计则堪称一门艺术。特别是,通过一些简单的经验法则来总结隐藏层的设计流程是不可行的。相反,神经网络的研究人员已经为隐藏层开发了许多设计最优法则,这有助于网络的行为能符合人们期望的那样。例如,这些法则可以用于帮助权衡隐藏层数量和训练网络所需的时间开销。
目前为止,我们讨论的神经网络,都是以上一层的输出作为下一层的输入。这种网络被称为前馈神经网络。这意味着网络中是没有回路的 —— 信息总是向前传播,从不反向回馈。如果确实有回路,我们最终会有这样的情况: 函数的输入依赖于输出。这将难于理解,所以我们不允许这样的环路。
然而,也有一些人工神经网络的模型,其中反馈环路是可行的。这些模型被称为递归神经网络。这种模型的设计思想,是具有休眠前会在一段有限的时间内保持激活状态的神经元。这种激活状态可以刺激其它神经元,使其随后被激活并同样保持一段有限的时间。这样会导致更多的神经元被激活,随着时间的推移,我们得到一个级联的神经元激活系统。因为一个神经元的输出只在一段时间后而不是即刻影响它的输入,在这个模型中回路并不会引起问题。
递归神经网络比前馈网络影响力小得多,部分原因是递归网络的学习算法(至少目前为止)不够强大。但是递归网络仍然很有吸引力。它们原理上比前馈网络更接近我们大脑的实际工作。并且递归网络能解决一些重要的问题,这些问题如果仅仅用前馈网络来解决,则更加困难。
2.4 神经网络的训练
2.4.1 损失函数(loss function)
神经网络的学习过程就是对权重矩阵的更新过程。所谓的训练过程就是比较当前网络的预测值和我们真正想要的目标值,再根据两者差异来更新每一层的权重矩阵。因此,必须先定义好如何比较预测值和目标值的差异,这便是损失函数(loss function)。损失函数输出值loss越高表示差异性越大,神经网络的训练就变成了尽可能的缩小loss的过程。
2.4.2 梯度下降法(Gradient descent)
所谓梯度下降法,就是通过使loss值向当前点对应梯度点反方向不断移动,来降低loss。一次移动多少通过学习率(learning rate)控制。
通俗来讲,所谓梯度下降法,其实就如同漆黑的夜晚拿着手电筒站在山顶,每次只能看到眼前的一米远距离,想要下到山脚,我们采用每次都选择最陡峭的地方向下挪动,反复这一过程,最终到达山脚。