感知机原理
感知机可以说是最古老的分类方法之一了,在1957年就已经提出。今天看来它的分类模型在大多数时候泛化能力不强,但是它的原理却值得好好研究。因为研究透了感知机模型,学习支持向量机的话会降低不少难度。同时如果研究透了感知机模型,再学习神经网络,深度学习,也是一个很好的起点。
- 感知机思想
比如我们在一个平台上有很多的男孩女孩,感知机的模型就是尝试找到一条直线,能够把所有的男孩和女孩隔离开。放到三维空间或者更高维的空间,感知机的模型就是尝试找到一个超平面,能够把所有的二元类别隔离开。当然你会问,如果我们找不到这么一条直线的话怎么办?找不到的话那就意味着类别线性不可分,也就意味着感知机模型不适合你的数据的分类。使用感知机一个最大的前提,就是数据是线性可分的。这严重限制了感知机的使用场景,而且这个模型只能用于二元分类,无法学习复杂的非线性模型,因此在工业界无法使用。它的分类竞争对手在面对不可分的情况时,比如支持向量机可以通过核技巧来让数据在高维可分,神经网络可以通过激活函数和增加隐藏层来让数据可分。 - 感知机模型
- 感知机数学原理
学习策略:
输入空间中任意一点到超平面的距离为:
对于误分类来说,- yi (w·xi+b) > 0 成立,因为在误分类情形下 yi 的值与 w·xi+b 的值符号相反,又因为 yi 取值为+1,-1,用 yi 的值可以去掉上面的距离公式中的绝对值符号,因此误分类点 xi 到超平面的距离为:
这样,假设超平面S的误分类点集合为M,那么所有误分类点到超平面S的总距离为:
我们研究可以发现,分子和分母都含有 w ,当分子的 w 扩大N倍时,分母的 L2 范数也会扩大N倍。也就是说,分子和分母有固定的倍数关系。那么我们可以固定分子或者分母为1,然后求另一个,即分子自己或者分母的倒数的最小化作为损失函数,这样可以简化我们的损失函数。在感知机模型中,我们采用的是保留分子,即最终感知机模型的损失函数简化为:
题外话,如果大家了解过支持向量机,就发现支持向量机采用的是固定分子为1,然后求1/||w||的最大化。采用不同的损失函数主要与它的后面的优化算法有关系。
神经网络
- 神经元
神经元和感知器(感知机)本质上是一样的,只不过我们说感知器的时候,它的激活函数是阶跃函数;而当我们说神经元时,激活函数往往选择为 sigmoid 函数或双曲正切函数 -tanh 函数。计算一个神经元的输出的方法和计算一个感知器的输出是一样的。如下图所示:
sigmoid函数定义:
sigmoid 函数是一个非线性函数,值域是(0,1)。函数图像如下图所示:
sigmoid函数的导数是:
可以看到,sigmoid 函数的导数非常有趣,它可以用 sigmoid 函数自身来表示。这样,一旦计算出 sigmoid 函数的值,计算它的导数的值就非常方便。用python绘制其图像为:
- 神经网络在感知机模型上主要做了三点扩展:
(1)加入了隐藏层
加入了隐藏层,隐藏层可以有多层,增强模型的表达能力
(2)输出层的神经元也可以有多个
这样模型可以灵活的应用于分类回归,以及其他的机器学习领域比如降维和聚类等
(3)对激活函数的扩展
感知机的激活函数是 sign(z),虽然简单但是处理能力有限,因此神经网络中一般使用的其他的激活函数,比如我们在逻辑回归里面使用过的Sigmoid 函数,还有后来出现的 tanx, softmax 和 ReLU 等。通过使用不同的激活函数,神经网络的表达能力进一步增强。 - 什么是神经网络
神经网络其实就是按照一定规则连接起来的多个神经元。上图展示了一个全连接(full connected, FC)神经网络,通过观察上面的图,我们可以发现它的规则包括:
(1)神经元按照层来布局。最左边的层叫做输入层,负责接收输入数据;最右边的层叫输出层,我们可以从这层获取神经网络输出数据。输入层和输出层之间的层叫做隐藏层,因为它们对于外部来说是不可见的;
(2)同一层的神经元之间没有连接;
(3)层与层之间是全连接的。第N层的每个神经元和第N-1层的所有神经元相连(这就是full connected的含义),第N-1层神经元的输出就是第N层神经元的输入;
(4)每个连接都有一个权值。
上面这些规则定义了全连接神经网络的结构。事实上还存在很多其它结构的神经网络,比如卷积神经网络(CNN)、循环神经网络(RNN),他们都具有不同的连接规则。
深度神经网络
- 深度神经网络 DNN:
对于隐藏层比较多(大于2)的神经网络叫做深度神经网络(Deep Neural Networks, 简称 DNN )。而深度学习,就是使用深层架构(比如,深度神经网络)的机器学习方法。那么深层网络和浅层网络相比有什么优势呢?简单来说深层网络能够表达力更强。事实上,一个仅有一个隐藏层的神经网络就能拟合任何一个函数,但是它需要很多很多的神经元。而深层网络用少得多的神经元就能拟合同样的函数。也就是为了拟合一个函数,要么使用一个浅而宽 的网络,要么使用一个深而窄 的网络。而后者往往更节约资源。深层网络也有劣势,就是它不太容易训练。简单的说,你需要大量的数据,很多的技巧才能训练好一个深层网络。这是个手艺活。 - DNN的基本结构
虽然DNN看起来很复杂,但是从小的局部模型来说,每一个神经元的输出还是和感知机一样,即一个线性关系:Z=∑i(wi∗xi+b) 然后加上激活函数 σ(z),由于DNN 层数比较多,则权重 w(weight) 和偏置 b(bias) 的数量也就是很多了。
权重W的定义:
偏置b的定义:
- DNN前向传播算法数学原理
在上一节,我们已经介绍了 DNN 各层线性关系系数 w,偏置 b 的定义。假设我们选择的激活函数是 σ(z),隐藏层和输出层的输出值为 a,则对于下图的三层 DNN,利用和感知机一样的思路,我们可以利用上一层的输出计算下一层的输出,也就是所谓的DNN前向传播算法。
- DNN前向传播算法
有了上一节的数学推导,DNN的前向传播算法也就不难了。所谓的DNN的前向传播算法也就是利用我们的若干个权重系数矩阵W,偏置向量b来和输入值向量x进行一系列线性运算和激活运算,从输入层开始,一层层的向后计算,一直到运算到输出层,得到输出结果为止。
- DNN前向传播算法小结
单独看DNN前向传播算法,似乎没有什么大用处,而且这一大堆的矩阵W,偏倚向量b对应的参数怎么获得呢?怎么得到最优的矩阵W,偏置向量b呢?这个我们在讲DNN的反向传播算法时再讲。而理解反向传播算法的前提就是理解DNN的模型与前向传播算法。