更多数据分析内容参看这里
今天我们来学习人工智能的底层模型——神经网络(NEURAL NETWORKS),现在比较热门的一个模型是深度学习,深度学习的基础也是神经网络,要学好深度学习,神经网络不了解基本是不可能的。
首先我们来看一下生物的神经构造,因为神经网络就是从生物的神经构造得到的灵感。在生物的神经构造中,下图中圆形的是细胞本体(细胞核),神经网络中称之为神经元,人具有
数学家在看过生物的神经构造后,就想通过数学模型来模仿。下图是一个非常有名的神经网络,一般人们谈到神经网络指的就是它,全称是Backpropagation(BP) Neural Networks,翻译过来就是倒传递神经网络,也有的人称之为多层感知机(Multi-Layer Perceptrons)。在BP神经网络中,神经元被分为三个层次,有输入层,隐藏层以及输出层。输入层的神经元负责接收外来的输入和刺激,它是用于数据收集用。输出层又称决策层,它的每个神经元在做一个决策,如果有五个决策就需要五个输出层神经元。中间的隐藏层神经元负责增加计算能力,当问题比较复杂时,需要隐藏层的辅助使得问题解决比较顺利,当然隐藏层的神经元不能过多,否则会造成记忆效应,即会把所有训练数据的输入和结果记录下来,以致于输入训练集中的一笔数据进入时它的答案会十分正确(类似背书),但是遇到没有见过的数据时就表现很差,也就是存在overfitting(过度拟合)问题。
在上图中,输入层会跟隐藏层的所有神经元做连接,连接的部分就称之为神经键。隐藏层会跟输出层的所有神经元做连接,但是跨层之间是不会连接的,这就是BP神经网络的一个构造。如此前所述,这边展示的是一层的隐藏层,但是隐藏层也可以多层,虽然隐藏层不能过多避免出现记忆效应,但是隐藏层也不能过少甚至没有,否则计算能力不足,预测结果也会不如预期。
上图是一个多层隐藏层,隐藏层的节点个数不必一样多,也不需要同输入层一样多。输入层会跟第一层隐藏层的神经元做一个完全连接,第一层隐藏层跟第二层隐藏层的神经元做一个完全连接,第二层隐藏层会跟输出层的神经元完全连接,这边输出层只有一个节点,代表其只要做一个决策。
当然神经网络的构造还有可以其它形式,比如下面是一个两层的神经网络,只有一个输出节点,且没有隐藏层,这种神经网络用来处理比较简单的单个决策问题。
再来看一个带有隐藏层的三层神经网络,它可以处理比较复杂的一个决策问题。
下面是输出层有多个节点的三层神经网络,可以处理复杂的n个决策问题。我们需要根据要处理的问题复杂程度考虑是否要有隐藏层,并根据要决策的问题个数来决定输出层的构造。
我们来看一个杂志喜好预测的实例。
因为这家公司同时发行五种杂志,所以一次要做五个决策(是否对我们的汽车、房屋、运动、音乐、漫画杂志),所以输出层的决策节点有五个。我们使用年龄,是否拥有房屋,是否拥有汽车,和所住区域四个输入字段来判断。
需要指出的是,神经网络中只允许数值型的输入数据,类似KNN。在本例子中,年龄(age)被离散化成三段(<30, 30-50,>50),不再是数值型,因此需要进行摊平处理(转换为哑变量)才能输入。实际上神经网络中只能输入0到1之间的数据,而不能输入一万这样的数,也必须像KNN一样做极值正规化。
本例中,选择了四个神经元作为隐藏层的个数,前面提到隐藏层的神经元不能过多,那到底要多少神经元个数呢?那就需要根据处理事务的复杂度来决定,在实际中有个不成文的做法,
最终该神经网络输出就是对于各种杂志喜好的概率,Feedforword指的是数据从左往右运行。但是在训练神经网络时,顺序是相反的,backforward,这也是BP神经网络名称的由来。
我们再来看另一个手写数字识别的例子。
要做手写数字的识别,首先我们需要对一张数字影像进行切割,按照单个的数字区分开来。分割完成之后,再对每个数字做辨识,此处我们假设单张数字照片是28*28的点阵,每一个点如果对应的黑色字迹就标位1,否则就为0。
为了解决识别数字这个问题,我们构造一个三层的BP神经网络,输入节点有784个(28*28),输出节点就是0,1,2,3,4,5,6,7,8,9这十个数字的概率,而隐藏层的个数,就是根据
要训练一个BP神经网络,我们首先需要构建一个网络,这涉及到两件事,一是输入数据的表示方式(数值型数据是做极值正规化Minmax normalization,还是离散化后摊平处理),这会影响输入层节点个数,当然输入属性的个数也会影响。二是要考虑做一个决策,两个决策还是多个决策,这会影响输出节点的个数,以及问题的复杂度,如果问题复杂还必须要有隐藏层。输入和输出层必须要有,你唯一可以选择的就是隐藏层要不要有,要有几层,以及隐藏层上的节点个数。就层数而言,深度学习就是具有多层隐藏层的神经网络,所以它可以处理比较复杂的类似下围棋这样的问题。
在网络建立后,就要用训练数据去训练网络。如果是一个分类问题,我们的目标就是获得一组所谓的权重,即神经键上面的值,使得训练集中案例进入神经网络后都能做正确的分类。网络训练好后,就可以去解释结果。
假设我们的训练已经完成,就会生成以下的神经网络。当具备特定特征的一个人进入网络时,就会生成其喜欢各种杂志的概率,从结果中我们可以看出这个人对汽车杂志和漫画是有兴趣的,因此可以向其推销这两种杂志。
但是这个神经网络是怎么训练出来的?我们仍未解决。要给出这个神经网络,我们就需要知道神经元的具体构造。对于输入层来说,神经元是没有构造的,它只做数据的转发,但是隐藏层和输出层是有结构的。有一个好消息是,隐藏层和输出层的每一个神经元的构造都是一样的。
上图就是单个神经元的构造,左侧的X1,X2,Xn是该神经元前一次传递过来的数值,我们会对每一个Xi乘以一个权重,加总后作为上一层传递过来的信息总和。比如要决定是否要去看一部电影,我们会去咨询别人的意见,小张可能给出来一个很高的分数,但是考虑到他的意见经常和我相左,我可能会乘以一个负的权重,小李给出了一个一般的分数,他的意见和我经常一致,因此我会乘以一个高的权重,我们可能还要考虑天气的因素才能决定是否要去看。在方框内部,有一个Bias(偏见),这个指的其实是我自己对于这部电影的意见。因此是否要去看电影的信息总量
下图中的Sigmoid function就是激发函数,Sigmoid函数又叫Logistic函数,它在机器学习领域有极其重要的地位,函数的基本性质:定义域:(−∞,+∞)(−∞,+∞),值域:(−1,1)(−1,1),函数在定义域内为连续和光滑函数,处处可导,导数为:f′(x)=f(x)(1−f(x))。Sigmoid函数之所以叫Sigmoid,是因为函数的图像很想一个字母S。这个函数是一个很有意思的函数,从图像上我们可以观察到一些直观的特性:函数的取值在0-1之间,且在0.5处为中心对称,并且越靠近x=0的取值斜率越大。也就是说当我们的信息输入为0的时候,输出的概率是0.5,当信息输入>0时,输出的概率在0-1之间,当信息输入<0时i,输出的概率在0-0.5之间。
我们具体来计算一个例子。下图中时一个BP神经网络,对于X=(1,0,1)需要预测其概率,真实的数据标签是1。在初始状况下,会随机生成各个神经键的权重(在-1到1之间),如下表所示,也会随机生成各个神经元的偏见。
通过计算,我们得出X输入的输出为0.474,这与实际情况1不符。这就告诉我们,由于一开始神经网络的权重值和偏见值都是随机产生的,因此其结果也是无法预测的。所以我们的目标就是,能否生成一组权重值和偏见值,使得收入(1,0,1)的时候输出结果非常接近1。
在杂志喜好预测例子中,也涉及逆向权重及偏移值的修正,因为初始跑出来结果和实际不符。要修正权重值,必然要解决怎么计算误差这个问题。误差= 期望输出 - 实际输出=
我们希望得到一组最佳的权重值和偏移值,去最小化误差。那对于上面的误差函数,要取到极值,就是要对这个函数偏微分,根据偏微分的结果取到最佳的权重值和偏移值。
对于上图中的神经网络,要使得最终输出节点的误差最小,我们根据偏微分可以得出权重和偏差值调整的公式,此处我们略过的微分的部分。要调整权重值和θ值,我们要计算6号、4号和5号的节点误差,如下表所示(这部分公式就是微分的结果)。基本上同一层的误差公式时一样的,不同层会不相同,从下表的公式可以看出6号的误差会影响4号和5号,4号和5号的误差会影响1号、2号和3号,这就是BP神经网络被称为倒传递网络的原因。
接下来,我们利用4,5,6这三个节点的节点误差来调整权重值和θ值,下表中
根据上面重新生成一组权重值和θ值,我们把101那笔数据重新喂入,但是不会立刻就到1,而是会到0.5多,所以修正一次后还要修正第二次以及第三次等,这就是神经网络学习的过程。在解释一下learning rate的概念,假设-0.3是初始的权重,-0.25是最佳权重,在第一次调整时系统觉得太大可能会调到-0.2,第二次调整时觉得太小可能又会调回-0.3,如此循环始终无法达到最佳的-0.25, 所以我们设置一个限制虽然可以调整-0.1,但每次只允许调整其中的(0.9)比例,当然这个比例可以调整,比如设成0.1,每次进行微调处理。Learning rate设的大,很快就会收敛,但是error降不下来,Learning rate设的小,训练的回合数就比较多,运行效率慢。
如果误差函数比较复杂,神经网络中就有区域最佳的概念,如果初始权重在左侧,权重值就会收敛到左侧的最低点,效果就一般。如果初始权重在右侧,权重值就会收敛到右侧的最低点,这时候误差就比较低。所以在神经网络中,起始的权重值也比较重要,在实际中,我们会用不同的随机种子设置多次不同的起始权重,找一次误差比较低的那一次,当做我们神经网络的初始结果。
总结一下,初始权重和θ值, learning rate ,隐藏层的神经元个数都是可以调整的。
关注我的公众号:nxiaoyou