MelonTeam 移动终端前沿技术的探索者

深度学习基础概念笔记

2017-06-29
parrzhang
ai

导语 学习tensorflow,caffe等深度学习框架前,需要先了解一些基础概念。本文以笔记的形式记录了一个零基础的小白需要先了解的一些基础概念。

#

人工智能,机器学习和深度学习的关系

人工智能(Artificial Intelligence)——为机器赋予人的智能

“强人工智能”(General AI):无所不能的机器,它有着我们所有的感知(甚至比人更多),我们所有的理性,可以像我们一样思考

“弱人工智能”(Narrow AI):弱人工智能是能够与人一样,甚至比人更好地执行特定任务的技术。例如,Pinterest上的图像分类;或者Facebook的人脸识别。

强人工智能是愿景,弱人工智能是目前能实现的。

机器学习—— 一种实现人工智能的方法

机器学习最基本的做法,是使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测。

**深度学习——一种实现机器学习的技术**

机器学习可以通过神经网络来实现。可以将深度学习简单理解为,就是使用深度架构(比如深度神经网络)的机器学习方法。目前深度架构大部分时候就是指深度神经网络。

神经网络组成

一个神经网络由许多神经元组成,每个圆圈是一个神经元,每条线表示神经元之间的连接。x表示的输入数据,y表示的是输出数据,w表示每层连接的权重。w也就是我们构造完神经网络之后需要确定的。

最左边的叫做输入层,这层负责接受输入数据。

最右边的叫做输出层,我们可以从这层获取神经网络输出数据

输入层和输出层之间叫做隐藏层。隐藏层层数不定,简单的神经网络可能是2-3层,复杂的也可能成百上千层,隐藏层较多的就叫做深度神经网络。

深层网络比浅层网络的表达能力更强,能够处理更多的数据。但是深度网络的训练更加复杂。需要大量的数据,很多的技巧才能训练好一个深层网络。

问题:假设计算速度足够快,是不是深度网络越深越好?

不是。深度网络越深,对架构和算法的要求就越高。在超过架构和算法的瓶颈后,再增加深度也是徒劳。

神经元(感知器)

神经网络由一个个的神经元构成,而一个神经元也由三部分组成。

  • 输入权值  每个输入会对应一个权值w,同时还会有一个偏置值b。也就是图中的w0。训练神经网络的过程,其实就是确定权值w的过程。
  • 激活函数  经过权值运算之后还会经历激活函数再输出。比如我们可以用阶跃函数f来表示激活函数。

  • 输出  最终的输出,感知器的输出可以用这个公式来表示

神经元可以拟合任意的线性函数,如最简单拟合and函数。

and函数真值表如上图所示。取w1 = 0.5;w2 = 0.5 b = -0.8。激活函数取上面示例的阶跃函数f表示。可以验证此时神经元能表示and函数。

如输入第一行,x1 = 0,x2 = 0时,可以得到

y为0,这就是真值表的第一行。

在数学意义上,可以这样理解and函数的神经元。它表示了一个线性分类问题,它就像是一条直线把分类0(false,红叉)和分类1(true,绿点)分开

而实际上,神经元在数学上可以理解为一个数据分割问题。神经元是将神经网络转换成数学问题的关键。比如需要训练神经网络做一个分类器,那么在数学上可以将输入的参数(x1,x2…,xn)理解为m维坐标系(设x是m元向量)上的n个点,而每个神经元则可以理解为一个个拟合函数。取m为2,放在最简单的二维坐标系里面进行理解。

此时输入参数对应的是下图中的黑点,每个神经元就是黑线(由于激励函数的存在,不一定像下图一样是线性的,它可以是任意的形状)。神经网络由一个个神经元组成,这些神经元表示的拟合函数相互交错就形成了各种各样的区域。在下图中可以直观的看到,此时分类问题就是一个数学的问题,输入参数落在A区域,那么就认为他是分类1,落在B区域,则认为他是分类2。依次类推,我们便建立了神经网络分类器在数学上的表现含义。

激活函数

事实上,一个神经元不能拟合异或运算。在下图中可以直观的看到,你无法直接用一条直线将分类0和分类1分隔开。

此时可以借助激活函数来做分割。激活函数选择阀值函数,也就是当输入大于某个值时输出1(激活),小于等于那个值则输出0(没有激活)。

拟合异或函数的神经网络如图所示:

图中神经网络分成三层。在第二层中,如果输入大于1.5则输出1,否则0;第三层,如果输入大于0.5,则输出1,否则0.

第一层到第二层(阀值1.5):

第二层到第三层(阀值0.5):

可以看到最终结果与异或结果吻合。

其实,这里放在数学上理解体现的是一个升维思想。放在二维坐标中无法分割的点,可以放在三维坐标中分割。上面的神经网络可以理解为只有最后一层,三个参数的神经元。激活函数是用来构造第三个参数的方式。这样等同于将三个点放在三维坐标系中做数据分割。相当于在二维中无法解决中的问题升维到三维中解决

深度学习过程

  • 构造神经网络
  • 确定学习目标
  • 学习

如何进行深度学习,过程基本都可以分为这三步来做。用一个简单的例子来说明。如图,假设我们需要通过深度学习来识别手写图片对应的数字。

1.构造神经网络。这里可以采用最简单的全连接神经网络,也可以采用卷积神经网络。同时确定神经元的激励函数,神经网络的层数等。基础概念篇不做过多介绍

2.确定学习目标。这里简单假设我们所有输入的都是手写的数字图片。那么这里就有10个输出,分别对应0~9的数字的比例。我们用[y0,y1,…y9]表示,每个y值代表这张图可能对应该数字的概率(y0表示这张图是数字0的概率)。对于上图中第一个输入图片,在训练过程中,我们知道第一张图片输出应该是数字5。于是我们期望输出是[0,0,0,0,0,1,0,0,0,0]。但是实际上,我们的模型不是完美的,肯定会有误差,我们得到的结果可能是[0,0,0.1,0,0,0.88,0,0,0,0.02]。那么就会有个训练得到的结果和期望结果的误差。

这时候我们的学习目标也就是希望这个误差能够最小。误差用L来表示,学习目标就是找到权值w,使得L最小。当然,这里涉及到我们需要用一个公式来表达这个误差L,这个公式选取也很有学问,不同的公式最终在学习过程时收敛速度是不一样的,通过训练模型得到的权值w也是不一样的。这里先不多介绍。

3.学习。假设我们神经模型确定下来的权值w与L的关系如图所示(这里我们考虑最简单的二维坐标下的情况,原理是相通的,推广到多元坐标也是适用的)。由于数学模型的复杂,这里找最小值L的过程其实是找局部最小值的过程。

我们都知道,函数某个位置可导,那么就可以确定这个点的斜率。要找到局部最小值,可以根据这个点的斜率移动w。如根据此时斜率的值我们可以确定w应该向右移动一段距离。

此时移动w的距离称为步长。步长的选取很关键,如果步长过长,那么每次w偏移过大,永远都找不到真正的最小值。而如果步长选取过小,那么收敛会变得很慢,而且有可能在中间某段平滑处停下来,找到的也不是真正的最小值。而步长怎么选择呢?其实比较坑爹,某些时候有经验值,大部分时候则只能自己调整去试验。

在学习的过程中,遇到的最常见的一个问题是“走不动”了。比如在下图中。从A点走到B点,B点由于斜率平滑,慢慢走到了C点,这时候可能C点斜率是平滑了,那么w将无法继续往下走,永远停留在C点!这样得到的神经网络的误差L显然不是最小的,权值w也不是最佳的。

因此,在神经网络学习过程中,常用的做法是模拟物理世界引入一个“动量球”。假设每次的移动看成 是一个“动量球”的移动。在移动过程中,“动量球”先从最高点往下走,虽然下载下来后斜率减少,但是由于“动量球”将移动下来的重力势能转变的动能,它会继续往下走,从而移动过平缓区。当“动量球”到达某个局部最低点的时候,“动量球”会依靠自己的动能继续滚动,设法寻找到下一个局部最低点。当然,“动量球”不是万能的,它也可能会遇到“山坡”上不去最终滑下来停留在某个局部最小值(并不是真正的最小值)。但是“动量球”的引入,大大增加了学习过程的鲁棒性,扩宽了局部最小值的寻找范围。

实际上,借助理解神经网络学习的过程,我们会更加理解为什么深度越高的网络不一定就越好。对于深度越高的神经网络,“平滑区”会越来越多,局部最小点也会越来越多。没有合适的算法,很容易就陷入某个局部最小值里面去,而这个最小值可能还不如深度更浅的神经网络获得的局部最小值小。也就是说,神经网络复杂之后,对架构和算法的要求大大加高。

卷积

如果对卷积这个数学概念还没有了解,可以先看知乎这里通俗的解释。

https://www.zhihu.com/question/22298352

如果没有做过图像处理,还需要先看看卷积核,感受一下它的神奇。

http://blog.csdn.net/zouxy09/article/details/49080029

以图片的卷积为例,深度学习中的卷积计算就是使用卷积核遍历一张图片的过程。

根据对于边缘的处理不同,卷积分为相同填充和有效填充两种方法。相同填充中,超出边界的部分使用补充0的方法,使得输入和输出的图像尺寸相同。而在有效填充中,则不使用补充0的方法,因此输出的尺寸会比输入尺寸小一些。

例1:33的卷积核在55的图像上进行有效填充的卷积过程

例2. 两个333卷积核在5*5 图像上进行相同填充卷积过程。动图

图像有r,g,b三个通道。这里使用卷积核也分为3个通道分别进行卷积运算

池化

池化是卷积神经网络中用到的一种运算。在卷积神经网络中,卷积层后面一般是池化层。先进行卷积运算,再进行池化运算。

池化层在神经网络中起到的是降低参数和计算量,引入不变形的作用。

池化常用的是两种,一种是Avy Pooling,一种是Max Pooling。下图是Max Pooling的示意图,可以看到分别找的是2*2矩阵中的最大值,Avy Pooling则是将矩阵所有值加起来,求平均值。

参考资料

https://www.leiphone.com/news/201609/gox8CoyqMrXMi4L4.html

https://www.youtube.com/watch?v=ZrEsLwCjdxY&t=21s

https://www.zybuluo.com/hanbingtao/note/433855

https://www.zhihu.com/question/22334626

http://www.cnblogs.com/rgvb178/p/6017991.html


说一说

目录