查看原文
其他

【周末AI课堂】从感知机到深度学习(理论篇)| 机器学习你会遇到的“坑”

唐僧不用海飞丝 读芯术 2019-12-26


AI课堂开讲,就差你了!


很多人说,看了再多的文章,可是没有人手把手地教授,还是很难真正地入门AI。为了将AI知识体系以最简单的方式呈现给你,从这个星期开始,芯君邀请AI专业人士开设“周末学习课堂”——每周就AI学习中的一个重点问题进行深度分析,课程会分为理论篇和代码篇,理论与实操,一个都不能少!


来,退出让你废寝忘食的游戏页面,取消只有胡吃海塞的周末聚会吧。未来你与同龄人的差异,也许就从每周末的这堂AI课开启了!


读芯术读者交流群,请加小编微信号:zhizhizhuji。等你。后台回复“周末AI课堂”,查阅相关源代码。

全文共2737字,预计学习时长6分钟




目前,对人工智能(AI)这一称呼,很多人都会下意识地理解为深度学习(deep learning),因为以卷积神经网络为代表的神经网络学习技术实在是太流行了,对人工智能下一个严格的定义是困难的(比如,有的人认为AlphaGo不算人工智能),但一个人工智能系统的目标却是确定的,就是胜任一些以前必须依靠人类智能参与的任务。目前深度学习模型在图片识别和语音识别领域已经达到了人类的平均水平。


一个人工智能系统必须可以自己获取知识,这样的过程之一就叫做机器学习(machine learning),从简单的线性模型到复杂的集成学习都是希望模型自动可以学习到数据的内在规律。其中感知机作为一种简单的用于线性分类的模型并没有特殊的地位,但随着神经网络学习的巨大成功,人们才开始注意到感知机作为神经网络的基本形式有着特别的意义,同时把多层感知机这一类的技术叫做深度学习,以区别于普通的统计学习办法。


如图,人工智能,机器学习,深度学习依次包含,另一种说法认为,人工智能与机器学习的关系是交集,而非包含。


感知机(Perceptron)


机器学习的感知机借鉴了生物学上的神经元模型,神经元彼此相连,当神经元接受其他神经元的化学递质直至电信号超出阈值被激活的时候,会向其他神经元发送信号,每个神经元只有激活和未激活两种状态,通过这样的方式,生物似乎可以自动或者非自动的学习到某种模式。比如简单的膝跳反射,这种单一突触的通路即可完成这个反射,膝盖骨的刺激到小腿向前踢的动作,就是一个将输入转化为输出的过程,甚至不需要大脑的参与。

 

如图,生物学上的神经元模型太过复杂,我们要做的第一步是将整个模型抽象出来,转化为实际可操作的模型。


感知机将神经元与神经元的可能连接(突触)处理为权重系数,没有连接则权重为零,把细胞体抽象为激活函数,当数值大于某个值时,函数才会输出。它不关心细胞体的结构,只把细胞体当作一个开关。


如图,输入特征有n+1维,经过每个权重系数的乘积,一起进入到细胞体,如果细胞体被激活,则经过激活函数的处理,输出最后的结果。


为什么要处理成n+1维呢,我们模仿了线性回归函数的形式,希望偏置项可以处理一部分的噪声,同时我们为了表示这些是同时进入细胞体,我们对每一项进行求和,再减去阈值,假设激活函数为f,阈值为t,偏置为b,最后的输出会被处理为:



初始的激活函数完全可以是阶跃函数,但为了连续可导,采用sigmoid函数作为激活函数,这一函数构成了logistic回归的基本形式,在感知机中,它作用也是相同的,它将很大的数值范围变成[0,1]内的数值,一方面,它作为细胞体,{0,1}表示该神经元是否被激活,另一方面,它作为输出单元,用于分类问题。


事实上,logistic回归和SVM都是从感知机算法发展而来。在分类问题中,使用sigmoid函数的感知机与logistic回归的效果一致,是线性的;在回归问题中,我们将激活函数扔掉:



这样是与简单线性回归又是一致的。但是感知机面临的最大问题有两个:


  • 如何解决非线性的问题


  • 如何训练感知器的参数


对于第一个问题,仿照logistic回归和SVM,我们也可以在感知器中使用kernel trick,使其可以处理非线性的问题,但研究发现,只需要添加一层隐藏神经元(Hidden layer),感知机就可以处理非线性问题,这样的形式又叫做多层感知机,也叫做前馈神经网络,这两者是一回事情,前馈神经网络就是存在隐层的感知机。当隐层的数目大于1时,就可以被称作深度前馈神经网络,虽然通常深度神经网络隐层数目庞大,但我们要注意深度神经网络最大的意义是,通过简单增加隐层的数目就可以处理复杂的非线性问题。


对于第二个问题,我们使用一种基于梯度下降的算法,叫做误差反传播(error BackPropagation),简称BP算法。


BP算法


首先我们要注意到,多层感知机(前馈神经网络)的参数主要分为两类,连接权重和阈值,一个典型的前馈神经网络如下:


如图,{1,2,3,i}表示输入层,{4,5,6,j},表示隐层,{7,8,9,k}表示输出层。


当我们用从神经网络做推断的时候,是从前往后传播。我们用表示输入层,表示输入层的第个神经元,表示隐层,表示隐层的第个神经元,连接权重就是输入层的第个神经元到隐层第个神经元的权重,先假设不使用激活函数,就有关系:



同理,输出层的第k个神经元表示为,它与隐层的关系也有:

 

 

当我们获得了输出之后,输出值与实际值的对比,获得Loss:

 


其中是一个向量,我们假设了向量的Loss可以由每个元素的Loss叠加而成,这在大多数的Loss function是成立的。显然,我们在回归问题中,不会出现多个输出的情形,我们尽可以将其理解为并不是真正的输出,而是其中的第二个隐层。Loss函数作为输出值和真实值的函数,其中输出值又是权重系数和阈值的函数,我们对权重系数应用梯度下降,本质是需要进行复合函数的求导:

 


其中,梯度项可以被写作:



这就是所谓的链式法则,可以看出梯度项主要由两项组成,其中第一项可以由loss function直接得到,第二项根据前向传播的公式,可以直接得到为,同时,我们也可以求得Loss对阈值的偏导:


 

如果我们要添加激活函数的神经网络,不过是多计算一个偏导,因为复合函数求导要一层一层的求导,假设激活函数为f,就有:



其中若是激活函数决定了这一层的输出,以及下一层的输入,它的形式为:



这样的更改对于我们的整个BP算法的更新并非本质意义上的,只是多计算了一个偏导数,但也要求我们的激活函数可导。


真正本质的问题在于,BP算法远远不是链式法则如此简单,因为几乎携带参数的学习器只要Loss function是预测值的函数,而预测值是参数的函数,我们都会用到链式法则。考虑一个简单的Loss function,a和b是两个参数,输出同时带有两层的复合函数:



对其中一个参数的偏导被计算为:



也就是说,我们要真正的利用链式法则需要计算复合函数嵌套的每一步的链,而不少的链是重复的,但在实际上BP的算法中我们并没有这样计算,这是因为我们是从整体的角度来看Loss function,每个路径虽然清晰,但会有重复,但是BP算法正是从后往前传播,所以它只看与Loss function直接相关的一层复合函数(加上激活函数,也就三层),它只需要逐层求解。这样的计算对于神经网络这样是非常高效的,这是神经网络中BP流行的本质原因。


读芯君开扒


课堂TIPS


• 神经网络一般要进行有监督学习,无监督的神经网络著名的主要有SOM网络和生成对抗网络。


• 除了前馈神经网络,递归神经网络也是一种重要的神经网络,区分这两者,主要看神经网络内部是否存在有向循环的结构。


• 需要特别强调的一点,深度学习之所以强大,人们将其归功于深度神经网络具有强大的自动表示能力,在统计学习中,学习器的表示需要手动设置,但在深度学习中,似乎并不需要这样做。这样看来,深度学习是比统计学习更容易操作的模型,但要注意,深度学习模型可解释性极差(几乎是black box),统计学习在很多任务上仍然具备着不可替代的性能和效果。


留言 点赞 发个朋友圈

我们一起探讨AI落地的最后一公里


作者:唐僧不用海飞丝


如需转载,请后台留言,遵守转载规范


推荐文章阅读


【周末AI课堂 | 第三十讲】理解梯度下降(二)(代码篇)

【周末AI课堂 | 第二十九讲】理解梯度下降(二)(理论篇)

【周末AI课堂 | 第二十八讲】理解梯度下降(一)(代码篇)

【周末AI课堂 | 第二十七讲】理解梯度下降(一)(理论篇)

【周末AI课堂 | 第二十六讲】理解损失函数(代码篇)

【周末AI课堂 | 第二十五讲】理解损失函数(理论篇)

【周末AI课堂 | 第二十四讲】聚类的几个重要问题(代码篇)

【周末AI课堂 | 第二十三讲】聚类的几个重要问题(理论篇)

【周末AI课堂 | 第二十二讲】Boosting集成(代码篇)

【周末AI课堂 | 第二十一讲】Boosting集成(理论篇)

【周末AI课堂 | 第二十讲】bagging集成和stacking集成(代码篇)

【周末AI课堂 | 第十九讲】bagging集成和stacking集成(理论篇)

【周末AI课堂 | 第十八讲】非参模型进阶(代码篇)

【周末AI课堂 | 第十七讲】非参模型进阶(理论篇)

【周末AI课堂 | 第十六讲】非参模型初步(代码篇)

【周末AI课堂 | 第十五讲】非参模型初步(理论篇)

【周末AI课堂 | 第十四讲】基于贝叶斯推断的回归模型(代码篇)

【周末AI课堂 | 第十三讲】基于贝叶斯推断的回归模型(理论篇)

【周末AI课堂 | 第十二讲】基于贝叶斯推断的分类模型(代码篇)

【周末AI课堂 | 第十一讲】基于贝叶斯推断的分类模型(理论篇)

【周末AI课堂 | 第十讲】核技巧(代码篇)

【周末AI课堂 | 第九讲】核技巧(理论篇)

【周末AI课堂 | 第八讲】非线性降维方法(代码篇)

【周末AI课堂 | 第七讲】非线性降维方法(理论篇)

【周末AI课堂 | 第六讲】线性降维方法(代码篇)

【周末AI课堂 | 第五讲】线性降维方法(理论篇)

【周末AI课堂 | 第四讲】如何进行特征选择(代码篇)

【周末AI课堂 | 第三讲】如何进行特征选择(理论篇)

【周末AI课堂 | 第二讲】过拟合问题(代码篇)

【周末AI课堂 | 第一讲】过拟合问题(理论篇)


长按识别二维码可添加关注

读芯君爱你


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存