神经网络初识

0.导引

机器学习早在20世纪中页,就已经吸引了相当多的学者,并引起了极为热烈的学习和探讨,然而由于受各方面技术的限制,其发展陷入了相当长的停滞期。近两年来随着硬件计算能力的增长和在棋类项目上的突破,机器学习再一次成为了万众瞩莫的焦点,甚至连国务院印发的《新一代人工智能发展规划》都提出要在中小学阶段设置人工智能相关课程,推动人工智能领域一级学科建设,其火热和重要程度可见一斑。


识别mnist数据集

神经网络虽然仅仅是机器学习的一个分支,但是近年来从简单的AlexNet,LeNet到谷歌的inception v3和微软的ResNet,再到Hinton大神2017年提出的胶囊理论,发展不可谓不迅速。究其本质,还是在统计学范畴之内,利用大量数据内在的分布逻辑,来用各种模型进行拟合,从而对相同条件的未知结果的实验进行预测,并尽可能最大化预测成功的概率,因此和决策树,朴素贝叶斯等景点模型并没有质的区别。

1.线性回归 & 逻辑回归 & 感知机

这三者可以看做是最浅层的神经网络,因为不包含隐层
基本的形式可以用如下表达式描述(这里为了方便下面讨论,省略了偏置项b):


一般的线性表达

主要的差别在于激活函数h(x)不同
线性回归(Linear regression)的激活函数


线性回归激活函数
线性回归激活函数

感知机(Perceptron)的激活函数


感知机激活函数

感知机激活函数

逻辑回归(Logistic regressoin)的激活函数sigmoid


逻辑回归激活函数

逻辑回归激活函数

从适用方法上看,线性回归是一种回归算法,可用用于线性关系的值的预测,或者更抽象一点,可以用来拟合n元线性方程
想象一个场景,来估计弹簧长度与悬挂物体重量的关系,横轴x代表物体重量,纵轴y是弹簧的长度,虽然有各种各样的统计误差,但是当统计的数据足够多的时候,就会发现其实是一个线性关系,要求取这条直线,方法有很多,比如最小二乘法


一元线性回归

对于多元的场景也是一样的,还是刚才的例子,除了物体重量x1,这里增加一个x2代表弹簧的松弛程度,当两者叠加的时候弹簧的最终长度依然是一个线性值


二元线性回归

而后两者(逻辑回归和感知机),因为激活函数的特性,适用于做二分类,也就是分类算法

这两种类型的算法也涵盖了神经网络的两种主要用途,回归和分类

2.梯度下降法

上面介绍了几种线性模型,那么在实际操作中,如何确定系数矩阵W呢,这里主要介绍一下梯度下降法(Gradient Descent)
我们要实现的目标,是通过训练后,针对输入数据,产生和真实结果一致的输出,假使不能完全一致,这个概率也要越大越好,那么这里首先要定义一下损失函数cost function:
对于线性回归的损失函数,比较容易理解


线性回归损失函数

上式的意义在于,如果它的值越小,代表预测值与真实样本约接近
对于逻辑回归,应该如何计算损失函数呢,这里要使用条件概率,也就是在输入x的条件下,使得输出y是正确的概率最大

逻辑回归

这里y是真实值,y(x)是预测值,如何理解呢,假设y趋近于1,那么上式可以表达为y(x),这样只有预测值也趋近于1才能是概率最大,假设y趋近于0,上式表达为1-y(x),则只有y(x)趋近于0,才能使概率最大,将这个式子推广到全部的样本,就是全部样本的条件概率连乘积


逻辑回归损失函数

为了方便计算,再取一次对数,得到


逻辑回归对数损失函数

有了损失函数这样就可以通过数学的方式,求导获取极值点,梯度下降就是这样的一种算法,借助求导,将每一轮迭代的参数都向极值的位置靠拢,最终得到一个全局(或者局部)的最优解

梯度下降函数

下面对其原理略作解释,假设我们求极值的函数是二次型f(x) = (x-3)^2:


梯度下降示意

现在迭代到x = 4,这一点的导数df(x)/dx=2x-6等于2,假定学习率α=0.2,那么x经过梯度下降就等于4 - 0.2 * 2 = 3.6
那么再重复上述步骤,x = 3.6的导数为1.2,x = 3.6 - 0.2 * 1.2 = 3.36
可以看出来,x的值一步一步地接近了极值点3,
当然x值落在极值点左边也是一样的
比如x = 2,df(x)/dx=2x-6 = -2,x 经过梯度下降等于2 - 0.2 * -2 = 2.4
同样也是朝着目标3接近,那么假设要用梯度方法求极大值,那么只要把减号改成加号就行了

3.多层感知机

一个简单的定义就是包含了至少一个隐含层(输入层和输出层之外的层)的感知机


一个包含了两个隐含层的多层感知机

为何要有多层感知机呢,来看下什么是线性不可分的例子,譬如下图的数据,就没法在平面上用直线去划分成两类


xor问题

解决的办法大致有两种,一种是升维,把低维数据映射到高维空间,自然可以划分了,另外一种就是使用非线性的划分,而多层感知机就恰好是这种方式。

做一点引申,为何只有多层感知机,而没有多层线性回归呢,主要因为感知机的激活函数是非线性的,如果是多层线性回归叠加在一起,那么可以通过数学证明,最后的各层参数矩阵相乘的结果,可以等价于一次矩阵相乘,也就是多少层线性回归叠在一起也没用,最后只相当于一层。

那么多层的非线性激活函数的叠加,究竟能起到怎样的作用,我们来看一个例子,将上图的xor问题中的叉叉和圆圈分成AB两类,并且量化我们的预期:

待划分的数据

所以我们希望得到的划分结果如表格最右边一列,那么就构造一个只有一个隐含层的多层感知机来试试能否做到。

多层感知机解决xor

上图中,f11和f12是对h1节点和h2节点的激活函数,这里用了分段函数,也满足非线性的条件,计算过程如下表:


计算结果

可以看到经过这几步的计算,我们等价地完成了一个非线性的划分,成功完成了一条直线所不能的任务


非线性划分

正向传播(forward propergation)

上面给出的例子,直接就把合适的参数值填进去了,所以一次计算就能得到正确结果,这个计算过程,就是正向传播。下面列出上一个例子的正向计算步骤,一共四步


多层感知机的正向传播

这里虽然使用了矩阵的乘法表示,但是实际推导过程中,完全可以转化成代数表达式,当然注意一点,这里为了示意,隐含层的激活函数使用了两个分段函数f11(v) 和 f12(v) 来快速求得结果,实际的训练过程,多层感知机多使用上面提到的sigmoid函数,当然也可以选择双曲正切tanh或relu函数

反向传播(backward propergation)

上面给出的例子,直接就把一个非常理想的w参数矩阵给填上去了,而且又选择了非常讨巧的激活函数,但是实际的多层感知机训练过程常常是初始化随机参数,然后通过迭代来一步一步调整参数使其和期望值接近,这个迭代过程,就是反向传播,简称BP。
为了解释BP,这里先引入计算图的概念,假设我们有函数e = (a+b) ∗ (b+1),那么通过复合函数的分解法则,可以把e表示为e = c * d,
其中c = a + b
d = b + 1, 把这一分解过程用图表示出来,就是计算图了
计算图是一种有向图,它的节点可以表示常数,向量,边可以表示一种函数操作


计算图示意

把上图的有向图看做一棵树,如果从下往上一步步由叶子节点向上推导,就构成了正向传播的过程,相反地,从根节点向下求导,根据链式法则一步一步求导,最终有了各部分的导数,就可以计依据偏导数的乘法和加法法则算出e对b的偏导数,这就构成了反向传播。


根据计算图求导

如上图,在a=2, b=1这一点,我们先直接通过公式计算出最终e对b的偏导数为:(b + 1)+ (a +b)= 2b + a + 1,b的偏导数是5
然后逐步计算看看答案是否一样

  1. 在e点, e对c的偏导数和对d的偏导数可以用增量求得,先求c,比如c增加0.001,c=3.001,则e=2*3.001 = 6.002,增量是0.002,所以e对c的导数为0.002 / 0.001 = 2,同理求出e对d的导数为3
  2. 在c点,试求c对a的偏导数,a增加0.001,a=2.001,则c=3.001,增量为0.001,可知导数为0.001 / 0.001=1
    同理,c点c对b的导数也是1
  3. 容易在d点求得d对b的导数1
  4. 最下一层求e对b的偏导数,就是 e对c偏导数 x c对b的偏导数 + e对d的偏导数 x d对b的偏导数=3x1 + 2x1=5
根据计算图求导

我们可以看出,反向传播的本质其实就是一种计算工具,通过在遍历计算图的过程中,不断复用上层结果逐步算出每个节点的导数,大大增加了梯度下降算法的效率


偏导数的加法和乘法法则

4. CNN卷积神经网络

CNN,即 convolution neural network的缩写。我们以2维卷积神经网络来说明其含义,首先理解一下卷积的概念,其实就是用滑动窗口的思想进行矩阵相乘,假设我们有绿色的5x5数据矩阵,和黄色的3x3窗口(这里我们称其为卷积核),通过步长为1的卷积操作操作,就得到了右侧红色的3x3结果,通俗讲就是不断移动卷积核,让其与输入矩阵对应位置相乘并求和,得出一个子矩阵


卷积过程

神经网络中使用的卷积运算,在数学上其实是互相关函数(corss-relation function),表达式如下

离散卷积的表达式

上式和我们给出的动画一致,代表卷积操作的步长(stride)为1,如果垂直和水平方向的的步长s和t不为1,那么需要修改如下:

卷积表达式加入步长

2维卷积运算后的矩阵大小如何计算呢:


水平方向-valid

垂直方向-valid

其中k和l代表卷积核的宽和高,t和s代表水平和垂直方向的步长,x和y代表输入矩阵的宽度和高度。以本节开始给出的例子,输入矩阵是5x5,卷积核是3x3,步长是1那么输出矩阵的边长就是(5 - 3 + 1)/ 1 = 3

这种计算方式是在valid的模式下适用的,也就是卷积核移动时不会超出原矩阵的边界,如果允许超出,并对超出部分补0,这种模式叫做same模式,公式就改为:


水平方向-same
垂直方向-same

卷积层特别适合处理图像,因为这种操作和人眼的视觉细胞工作方式很像,每个视觉神经细胞都只能感受有限的图像区域,但是这些负责颜色和形状的神经细胞扫描过图像后,就能在我们大脑合成出有效的信息

CNN示意

多个卷积核,模拟了不同工种的视觉细胞,每个负责提炼原始2维信息中的部分结构特征,通过层层加深,把一个扁平模型逐渐深化,对深层次的特征进行学习,最后再通过感知机中的全连接网络和激活函数实现对特征的分类


image.png

那么使用CNN的优势在什么地方呢?

卷积运算在机器学习领域有三个重要的优势,分别是:

  1. 稀疏交互(sparse interactions)
  2. 参数共享(parameter sharing)
  3. 等变表示(equivariant representations)

池化

池化是一种降采样的过程。因为CNN层通常有不止一个卷积核来提取不同维度的特征,并且为了不限制网络的表示能力,大部分场景都会使用same模式填充0,这样输入尺寸不变,输出维度增多,如果一个网络包含多层CNN,数据会膨胀,池化就可以很好的解决这个问题。除了下面列举的最大池化和平均池化,池化函数还可以选择如L2范数或者举例中心像素的加权平均函数等。


最大池化
平均池化

池化还有一个非常重要的作用就是学习不变性,当使用分离的几个卷积核分别学得了不同的特征,比如下图中旋转了不同角度的数字5,当使用池化单元计算时,可以学得对输入的某些变换的不变性。


池化学习不变性

使用来自LeCun论文中的LeNet5作为案例, 来看一个基本的CNN模型是如何构成的
(这个模型的介绍非常多,这里不再详述,中文介绍可以参考这里)

LeNet5

可以看出来,基本上就是

输入 +(卷积+池化)x n +全连接 x m

CNN模型中,常见的激活函数是relu


Relu
image.png

Relu的特点
① 单侧抑制
② 相对宽阔的兴奋边界
③ 稀疏激活性


大脑神经元激活模型对比激活函数

带来的好处:

  • 稀疏激活,更有利于拟合数据特征
  • 收敛速度快可以解决梯度弥散问题(Vanishing Gradient Problem)
  • 计算复杂度低

CNN中全连接层的作用
充当分类器

你可能感兴趣的:(神经网络初识)