本文参考人工神经网络ANN
神经网络是一门重要的机器学习技术。它是深度学习的基础。
神经网络是一种模拟人脑的神经网络以期望能够实现人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有1000亿个神经元之多。
前言
让我们来看一个经典的神经网络。这是一个包含三个层次的神经网络。红色的是输入层,绿色的是输出层,紫色的是中间层(也叫隐藏层)。输入层有3个输入单元,隐藏层有4个单元,输出层有2个单元。后文中,我们统一使用这种颜色来表达神经网络的结构。
在开始介绍前,有一些知识可以先记在心里:
– 设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定;
– 神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;
– 结构图里的关键不是圆圈(“神经元”),而是连接线(“神经元”之间的连接)。每个连接线对应一个不同的权重(权值),这是需要训练得到的。
神经元
神经元模型是一个包含输入,输出 与 计算功能 的模型。
输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。
下图是一个典型的神经元模型:包含有3个输入,1个输出,以及2个计算功能。注意中间的箭头线。这些线称为“连接”。每个上有一个“权值”。
连接
连接是神经元中最重要的东西,每一个连接上都有一个权重。
一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好。
我们使用a来表示输入,用w来表示权值。一个表示连接的有向箭头可以这样理解:在初端,传递的信号大小仍然是a,端中间有加权参数w,经过这个加权后的信号会变成aw,因此在连接的末端,信号的大小就变成了aw。
在其他绘图模型里,有向箭头可能表示的是值的不变传递。而在神经元模型里,每个有向箭头表示的是值的加权传递!
神经元计算
如果我们将神经元图中的所有变量用符号表示,并且写出输出的计算公式的话,就是下图。
可见z是在输入和权值的线性加权和叠加了一个函数g的值。在MP模型里,函数g是sgn函数(取符号函数)。这个函数当输入大于0时,输出1,否则输出0。
下面对神经元模型的图进行一些扩展。首先将sum函数与sgn函数合并到一个圆圈里,代表神经元的内部计算。最后说明,一个神经元可以引出多个代表输出的有向箭头,但值都是一样的。
神经元可以看作一个计算与存储单元。
计算是神经元对其输入进行计算功能。存储是神经元会暂存计算结果,并传递到下一层。
机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的:首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。
样本的预测目标为
y
p
y_p
yp,真实目标为
y
y
y。那么,定义一个值
l
o
s
s
loss
loss,计算公式如下
l
o
s
s
=
(
y
p
−
y
)
2
loss = (y_p - y)^2
loss=(yp−y)2
这个值称之为损失(loss),我们的目标就是使对所有训练数据的损失和尽可能的小。
如果将先前的神经网络预测的矩阵公式带入到yp中(因为有z=yp),那么我们可以把损失写为关于参数(parameter)的函数,这个函数称之为损失函数(loss function)。下面的问题就是求:如何优化参数,能够让损失函数的值最小。
此时这个问题就被转化为一个优化问题。一个常用方法就是高等数学中的求导,但是这里的问题由于参数不止一个,求导后计算导数等于0的运算量很大,所以一般来说解决这个优化问题使用的是梯度下降算法。梯度下降算法每次计算参数在当前的梯度,然后让参数向着梯度的反方向前进一段距离,不断重复,直到梯度接近零时截止。一般这个时候,所有的参数恰好达到使损失函数达到一个最低值的状态。
在神经网络模型中,由于结构复杂,每次计算梯度的代价很大。因此还需要使用反向传播算法。反向传播算法是利用了神经网络的结构进行的计算。不一次计算所有参数的梯度,而是从后往前。首先计算输出层的梯度,然后是第二个参数矩阵的梯度,接着是中间层的梯度,再然后是第一个参数矩阵的梯度,最后是输入层的梯度。计算结束以后,所要的两个参数矩阵的梯度就都有了。
反向传播算法可以直观的理解为下图。梯度的计算从后往前,一层层反向传播。前缀E代表着相对导数的意思。
优化问题只是训练中的一个部分。机器学习问题之所以称为学习问题,而不是优化问题,就是因为它不仅要求数据在训练集上求得一个较小的误差,在测试集上也要表现好。因为模型最终是要部署到没有见过训练数据的真实场景。提升模型在测试集上的预测效果的主题叫做泛化(generalization),相关方法被称作正则化(regularization)。神经网络中常用的泛化技术有权重衰减等。