一、深度学习基础
从本次开始,我们将开启新的篇章:深度学习系列。主要涉及三个部分,一是,深度学习基础:包括深度学习历史及基本概念,感知机,BP神经网络,神经网络等初步介绍;过程中会引入一些基础概念:反向传播,随机梯度下降,学习率衰减,损失函数等;二是,深度学习典型算法第一部分:包括深度神经网络DNN、卷积神经网络CNN、深度置信网络DBN等;三是,深度学习典型算法第二部分:包括递归神经网络RNN,循环神经网络RNN,生成对抗式网络GAN等。本次只介绍第一部分,深度学习基础。
1.1 深度学习及其发展历史
1.1.1 什么是学习?
赫伯特·西蒙教授(Herbert Simon,1975年图灵奖获得者、1978年诺贝尔经济学奖获得者)曾对“学习”给了一个定义:“如果一个系统,能够通过执行某个过程,就此改进了它的性能,那么这个过程就是学习”。学习的核心目的,就是改善性能。
1.1.2 什么是机器学习?
那机器学习又是什么呢?不知道大家还记不记得,在该系列教程开篇我们提到过这个问题: 机器学习本质是什么? 我们当时是这么说的:
机器学习 \(≈\) 寻找一个函数/数学
如下图所示,常用的语音识别、图像识别、对话系统等,训练模型的过程都是在寻找一个任务相关的最优化函数。
也就是说,需要找到一个关于输入输出的映射关系,也就是一个最优化函数,那如何确定这样一个最优化的函数呢?
形象的说,为了确定最优化映射关系(函数),会生成一系列的函数,这就是模型的训练过程,再从中选取最优的函数,如上图所示,\(f_1\)就优于\(f_2\),因为\(f_1\)能准确识别图片,而\(f_2\)不能。
1.1.3 什么是深度学习?
今天的主角登场!深度学习又是什么?它和机器学习又是啥关系?这在第一堂课中其实也提及了。
简要回顾一下:
一位微软工程师对它们的解释
What?借用网上一句话,不要慌,看不懂的一律当作约饭机器学习处理。言归正传,本着不以说清楚为目的的教程都是耍流氓的精神:
人工智能:计算机领域类的一套概念。
机器学习:一种实现人工智能的方法。
深度学习:一种实现机器学习的技术。
今天我们从另一个角度来进行解释,因为之前我们已经讲过了统计的相关课程,今天从统计的角度进行解释:学习的四个象限
怎么理解呢?
由「可推理可统计」向「可推理不可统计」发展部分的手段为机器学习,由「可推理可统计」向「不可推理可统计」法阵的手段为深度学习,而深度学习用到了神经网络的理论。两个学习都是人工智能的范围。那第IV象限是什么鬼? 那属于强学习范畴了,目前我们狭义上的弱机器学习是搞不定的。
1.1.4 深度学习发展历史
当遇到一个陌生对手的时候,如何以最佳方式干翻\(ta\)?最好入手的地方当然是深扒\(ta\)的过去,只有了解\(ta\)的过去,把握历史,才能抓住现在与未来!
-
1943年
由神经科学家麦卡洛克(\(W.S.McCilloch\)) 和数学家皮兹(\(W.Pitts\))在《数学生物物理学公告》上发表论文《神经活动中内在思想的逻辑演算》(\(A Logical Calculus of the Ideas Immanent in Nervous Activity\))。建立了神经网络和数学模型,称为\(MCP\)模型。所谓\(MCP\)模型,其实是按照生物神经元的结构和工作原理构造出来的一个抽象和简化了的模型,也就诞生了所谓的“模拟大脑”,人工神经网络的大门由此开启。\(MCP\)当时是希望能够用计算机来模拟人的神经元反应的过程,该模型将神经元简化为了三个过程:输入信号线性加权,求和,非线性激活(阈值法)。如下图所示 -
1958年
计算机科学家罗森布拉特(\(Rosenblatt\))提出了两层神经元组成的神经网络,称之为“感知器”(\(Perceptrons\))。第一次将\(MCP\)用于机器学习分类。“感知器”算法算法使用\(MCP\)模型对输入的多维数据进行二分类,且能够使用梯度下降法从训练样本中自动学习更新权值。1962年,该方法被证明为能够收敛,理论与实践效果引起第一次神经网络的浪潮。 -
1969年
纵观科学发展史,无疑都是充满曲折的,深度学习也毫不例外。 1969年,美国数学家及人工智能先驱\(Marvin Minsky\)在其著作中证明了感知器本质上是一种线性模型(\(linear model\)),只能处理线性分类问题,就连最简单的\(XOR\)(亦或)问题都无法正确分类。这等于直接宣判了感知器的死刑,神经网络的研究也陷入了将近20年的停滞。 -
1986年
由神经网络之父\(Geoffrey Hinton\)在1986年发明了适用于多层感知器(\(MLP\))的\(BP(Backpropagation)\)算法,并采用\(Sigmoid\)进行非线性映射,有效解决了非线性分类和学习的问题。该方法引起了神经网络的第二次热潮。注:\(Sigmoid\)函数是一个在生物学中常见的\(S\)型的函数,也称为\(S\)型生长曲线。在信息科学中,由于其单增以及反函数单增等性质,\(Sigmoid\)函数常被用作神经网络的阈值函数,将变量映射到0,1之间。
-
90年代时期
1991年\(BP\)算法被指出存在梯度消失问题,也就是说在误差梯度后项传递的过程中,后层梯度以乘性方式叠加到前层,由于\(Sigmoid\)函数的饱和特性,后层梯度本来就小,误差梯度传到前层时几乎为0,因此无法对前层进行有效的学习,该问题直接阻碍了深度学习的进一步发展。此外90年代中期,支持向量机算法诞生(\(SVM\)算法)等各种浅层机器学习模型被提出,\(SVM\)也是一种有监督的学习模型,应用于模式识别,分类以及回归分析等。支持向量机以统计学为基础,和神经网络有明显的差异,支持向量机等算法的提出再次阻碍了深度学习的发展。
-
发展期 2006年 - 2012年
2006年,加拿大多伦多大学教授、机器学习领域泰斗、神经网络之父——\(Geoffrey Hinton\)和他的学生\(Ruslan Salakhutdinov\)在顶尖学术刊物《科学》上发表了一篇文章,该文章提出了深层网络训练中梯度消失问题的解决方案:无监督预训练对权值进行初始化\(+\)有监督训练微调。斯坦福大学、纽约大学、加拿大蒙特利尔大学等成为研究深度学习的重镇,至此开启了深度学习在学术界和工业界的浪潮。2011年,\(ReLU\)激活函数被提出,该激活函数能够有效的抑制梯度消失问题。2011年以来,微软首次将\(DL\)应用在语音识别上,取得了重大突破。微软研究院和\(Google\)的语音识别研究人员先后采用深度神经网络\((DNN)\)技术降低语音识别错误率20%~30%,是语音识别领域十多年来最大的突破性进展。2012年,\(DNN\)技术在图像识别领域取得惊人的效果,在\(ImageNet\)评测上将错误率从26%降低到15%。在这一年,\(DNN\)还被应用于制药公司的\(DrugeActivity\)预测问题,并获得世界最好成绩。
-
爆发期 2012 - 至今
2012年,\(Hinton\)课题组为了证明深度学习的潜力,首次参加\(ImageNet\)图像识别比赛,其通过构建的卷积神经网络(\(CNN\))网络\(AlexNet\)一举夺得冠军,且碾压第二名(\(SVM\)方法)的分类性能。也正是由于该比赛,CNN吸引到了众多研究者的注意。\(AlexNet\)的创新点在于:
(1)首次采用\(ReLU\)激活函数,极大增大收敛速度且从根本上解决了梯度消失问题。
(2)由于\(ReLU\)方法可以很好抑制梯度消失问题,\(AlexNet\)抛弃了“预训练\(+\)微调”的方法,完全采用有监督训练。也正因为如此,\(DL\)的主流学习方法也因此变为了纯粹的有监督学习。
(3)扩展了\(LeNet5\)结构,添加\(Dropout\)层减小过拟合,\(LRN\)层增强泛化能力/减小过拟合。
(4)第一次使用\(GPU\)加速模型计算。
2013、2014、2015、2016年,通过\(ImageNet\)图像识别比赛,\(DL\)的网络结构,训练方法,\(GPU\)硬件的不断进步,促使其在其他领域也在不断的征服战场。
1.1.5 小结
深度学习经过半个多世纪的发展,现在已经广泛应用到我们日常生活中,今天我们将从基础的开始,沿着感知机->神经网络->深度神经网络逐次介绍, 并在介绍的过程中引入一些深度学习里的基础概念:反向传播,随机梯度下降,学习率衰减,损失函数等。
1.2 从感知机到深度神经网络
1.2.1 感知机
如果大家有印象的话,我们在概率统计机器学习时,简单介绍过感知机。它是一个二分类的线性模型,结构如下图所示,
可以看到,一个感知器有如下组成部分:
-
输入权值 一个感知器可以接收多个输入\((x_1,x_2,\dots,x_n|x_i\in R)\),每个输入上有一个权值\(w_i\in R\),此外还有一个偏置项\(b\in R\),就是上图中的\(w_0\)。
-
激活函数 感知器的激活函数可以有很多选择,比如我们可以选择下面这个 阶跃函数\(f\) 来作为激活函数:
\[f(z)= \begin{cases} \begin{aligned} 1 && z > 0\\ 0 && otherwise\\ \end{aligned} \end{cases} \]先不用管激活函数这个概念,现只需知道是将线性转为非线性表达即可。
-
输出 感知器的输出由下面这个公式来计算
\(y=f(w*x+b)\)
如果看完上面的公式一下子就晕了,不要紧,我们用一个简单的例子来帮助理解。
例子:用感知器实现\(and\)函数
我们设计一个感知器,让它来实现\(and\)运算。\(and\)是一个二元函数(带有两个参数\(x_1\)和\(x_2\)),下面是它的真值表:
| \(x_1\) | \(x_2\) | \(y\) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
为了计算方便,我们用\(0\)表示\(false\),用\(1\)表示\(true\)。
我们令\(w_1=0.5,w_2=0.5,b=-0.8\),(真实场景是训练得到),而激活函数就是前面写出来的阶跃函数,这时,感知器就相当于and函数。不明白?我们验算一下:
输入上面真值表的第一行,即\(x_1=0,x_2=0\),那么根据公式(1),计算输出:
$$\begin{aligned}y &=f(xx+b) \ &=f(w_1x_1+w_2x_2+b)\ &=f(0.50+0.5*0-0.8)\&=f(-0.8)\ &=0 \end{aligned}$$
也就是当\(x_1,x_2\)都为\(0\)的时候,\(y\)为\(0\),这就是真值表的第一行。大家可以自行验证上述真值表的第二、三、四行。同理,感知机还能实现\(or\)函数。
感知机还能做点什么?
事实上,感知器不仅仅能实现简单的布尔运算。它可以拟合任何的线性函数,任何线性分类或线性回归问题都可以用感知器来解决。前面的布尔运算可以看作是二分类问题,即给定一个输入,输出0(属于分类0)或1(属于分类1)。如下面所示,and运算是一个线性分类问题,即可以用一条直线把分类0(\(false\),红叉表示)和分类1(\(true\),绿点表示)分开。
然而,感知器却不能实现异或运算,如下图所示,异或运算不是线性的,你无法用一条直线把分类0和分类1分开。
感知机训练过程统计课程中已经介绍过,这里不再赘述。
那如何解决这类问题呢?一种是像之前课堂里介绍的,SVM等解决,另一类呢,你说一个感知机不能解决,那我多加几层行不行呢?当然是可以的,神经网络从此诞生。
1.2.2 线性单元是啥
在正式介绍神经网络之前,不得不提它的基本单元——线性单元(神经元)。
本节通过介绍另外一种『感知器』,也就是『线性单元』,来说明关于深度学习的一些基本的概念,比如模型、目标函数、优化算法等等。这些概念对于所有的深度学习算法来说都是通用的,掌握了这些概念,就掌握了深度学习的基本套路。
感知器有一个问题,当面对的数据集不是线性可分的时候,『感知器规则』可能无法收敛,这意味着我们永远也无法完成一个感知器的训练。为了解决这个问题,我们使用一个可导的线性函数来替代感知器的阶跃函数,这种感知器就叫做线性单元。线性单元在面对线性不可分的数据集时,会收敛到一个最佳的近似上。
为了简单起见,我们可以设置线性单元的激活函数\(f\)为 \(f(x)=x\),这样的线性单元如下图所示:
对比我们前面介绍过的感知机:
这样替换了激活函数之后,线性单元将返回一个实数值而不是0,1分类。因此线性单元用来解决回归问题而不是分类问题(以概率形式也可以做分类问题) 。
线性单元的模型
当我们说模型时,我们实际上在谈论根据输入\(x\)预测输出\(y\)的算法。比如,\(x\)可以是一个人的工作年限,\(y\)可以是他的月薪,我们可以用某种算法来根据一个人的工作年限来预测他的收入。比如:
\(y=h(x)=w*x+b\)
函数\(h(x)\)叫做假设,而\(w\)、\(b\)是它的参数。我们假设参数\(w=1000\),参数\(b=500\),如果一个人的工作年限是5年的话,我们的模型会预测他的月薪为
\(y=h(x)=1000*5+500=5500\)(元)
你也许会说,这个模型太不靠谱了。你说得对~