聊聊从脑神经到神经网络

原文链接:https://juejin.im/post/5bff32aee51d454f392fb34b

前言

神经网络能解决非线性的复杂的模型问题,而且通过增加网络的层数将具备更加强大的学习能力,另外如果再改造改造层的结构则变成各类深度学习模型,例如CNN RNN之类的。

神经网络一般被用来捕捉复杂情况下的特征,比如说视频图像中的动物类别、一名作家的写作风格等等。

大脑神经元

人脑可能有1000多亿个神经元,每个神经元都可能在几个方向上互相连接着,这么大量的神经元及连接就形成了一个超级大型的网络。我们就是因为这些网络而存在各种各样的思想和意识。

大脑神经元即是脑神经细胞,主要包括细胞体、树突、轴突、突触等。

  • 细胞体,由细胞核、细胞质和细胞膜组成。它是神经元新陈代谢的中心,是接收信息并处理的部件。
  • 树突,是细胞体向外延伸树枝状的纤维体,它是神经元的输入通道,接收来自其他神经元的信息。
  • 轴突,是细胞体向处延伸的最长最粗的一条树枝纤维体,即神经纤维,它是神经元的输出通道。轴突有髓鞘纤维和无髓鞘纤维两种结构形式,两者传递信息的速度不同。轴突末端有许多向外延伸的树枝状纤维体,称为神经末梢,它是神经元信息的输出端。
  • 突触,神经元的神经末梢与另一神经元树突或细胞体的接触处即为突触。每一个神经元都通过突触与其他神经元联系,细胞之间通过突触建立起连接,从而实现信息传递,每个神经元约有103~104个突触。

模拟大脑

神经网络就是人们试图对大脑内部运作的模拟形式,在计算机领域,这种模型的起源相当早,可以追溯到20世纪40年代中期,当时计算机其实也刚出现不久。

1943年,麦卡洛克和皮茨发表了论文《神经活动内在概念的逻辑演算》,其中首次提出了表示人脑学习功能的一种数学方法。

如上图中x类似轴突,其它神经元的输出,经过突触连接树突,经过树突后输入到细胞体,细胞体执行一定运算后再经过激活函数最后输出到轴突。

这个简单的模型就是机器学习中神经网络的基础模型了,不经让我们惊呼我们的大脑如此的简单,但事实并不是这样,人类对大脑的认识是在太少,可以说几乎还没有什么实质性进展。而用这种模型模拟的大脑,实际上比大脑差太多太多了,如果人类是上帝造的,那上帝肯定不会让你猜透他是怎么造的。

这个阶段虽然大脑的神经元已经被数学建模了,我们也并不知道这个模型是否正确,而且当时也没有明确权重参数的调整方法。

感知机模型

进入到20世纪50年代,一种最简单的人工神经元模型被提出来了。感知机?一听感觉就像是一个实际存在的东西,就像计算机一样,它应该是看得见摸得着的机器吧!的确,20世纪60年代第一个硬件实现出现,当时直接将整个硬件都叫感知机,但后来感知机被改成是算法的名字了,所以它其实是一个算法。

感知机以前辈的思想作为基础,基于此提出了一种反馈循环的学习机制,通过计算样本输出结果与正确结果之间的误差来进行权重调整。

大致的流程如下:

  • 通过随机数初始化权重参数。
  • 将一个输入向量传入网络。
  • 根据指定的输入向量和权重值计算网络的输出y',感知机的函数如下所示:

  • 如果y'≠y,则通过Δw =yxi增量来调整所有连接权重wi。
  • 返回第2步。

引入梯度下降

与感知机的学习机制不同,ADALINE则是训练神经网络模型的另外一种算法,由于它引入了梯度下降,所以可以说它比感知机更加先进。

大概流程为:

  • 通过随机数初始化权重。
  • 将一个输入向量传入网络。
  • 根据指定的输入向量和权重计算神经网络的输出y'。
  • 最后的输出值使用公式求和,
  • 计算误差,将模型的输出值与正确的标签o进行比较,
  • 使用以下梯度下降递归地调整权重,
  • 返回到步骤2。

早期模型的局限

我们可以看到感知机和ADALINE已经具备了神经网络模型的基本要素,两者都是单层神经网络,主要用于二分类问题,通过学习能实现二分类功能。

对于早期的神经模型,它其实具有非常大的局限性,甚至某种意义上来说,它一点用处都没有。明斯基和帕佩特于1969年出版了《感知机》一书,其中阐明了感知机只能处理线性可分的问题,对于其他复杂问题完全无能为力。

比如对于XOR函数,不存在任何一条直线能将其正确分割,感知机就是存在这种尴尬的情况,这种线性不可分的情况,感知机没法正确将两个类别分开。至此,神经网络进入寒冬。

多层感知机

既然单个神经元的感知机无法解决非线性问题,那么是不是可以推广到多个神经元组成多个神经网络层?于是将多组神经元连接起来,某个神经元的输出可输入到其它神经元中。

多层网络的传播,数据被输入第一层后,将从每个神经元流入到下一层中对应的神经元中。然后在隐含层中进行求和并传递,最后到达输出层进行处理。而学习多层网络则需要反向传播算法来支持,多层网络增加了学习的复杂程度,从输入到最后的输出组成了很长的函数嵌套,这就增加了学习的难度。不过,好在求到时有链式法则的帮忙,让事情简单了很多。

大概流程为:

  • 计算从输入到输出的前馈信号。
  • 根据预测值和目标值计算输出误差E。
  • 通过前一层中的权重和相关激活函数的梯度对它们进行加权反向传播误差信号。
  • 基于反向传播误差信号和输入的前馈信号计算参数的梯度
  • 使用计算好的梯度来更新参数,公式为

问题类型

神经网络可用于回归问题和分类问题。常见的结构差异在于输出层,如果想要得到一个实数结果,我们就不应该使用标准化函数,比如sigmoid的函数。因为标准化函数会使我们的输出结果限定在某个范围内,而有时我们真正想要的是连续的数值结果。

  • 回归/函数逼近问题,此类问题可使用最小二乘误差函数,输出层使用线性激活函数,隐含层使用S形激活函数。
  • 二分类问题,通常使用交叉熵成本函数,输出层及隐含层都使用S形激活函数。
  • 多分类问题,通常使用交叉熵成本函数,输出层使用softmax函数,隐含层使用sigmoid激活函数。

深度神经网络

21世纪第二个十年,深度学习成为了人工智能最闪耀的研究。2011年谷歌X实验室从youtube抽取1000万图片,把它喂给采用了深度学习的谷歌大脑,三天后这个大脑在没有人类的帮助下自己发现了猫。2012年微软使用深度学习,完成演讲者实时语音识别、翻译,也就是完成同声翻译。

虽然深度学习在20世纪80年代就出现了,但受限于当时的硬件能力和数据资源缺乏,并没有体现出效果。只有辛顿带着学生在这个冷门领域坚持耕耘,直到2009年,辛顿他们才获得了意外的成功,他们将深度学习用在语音识别领域,打破了世界纪录,错误率比之前减少25%。深度学习开始火起来。

深度学习之所以有这么大的性能提升,是因为它类似人脑一样的深层神经网络,它更好地模拟了人脑的工作。

卷积神经网络

卷积神经网络的发展主要是为了解决人类视觉问题,不过现在其它方向也都会使用。发展历程主要从Lenet5->Alexnet->VGG->GooLenet->ResNet等。

上世界80年代发明了卷积层,但由于硬件限制无法构建复杂网络,直到后面90年代才开始有实践。

1998年LeCun提出卷积层、池化层和完全连接层组合,以此来解决手写数字的识别问题。此时的效果已经很不错了,能与其它经典的机器学习模型相比。架构如下,一个32 x 32的输入,通过卷积提取特征,然后进行下采样,再一次卷积和下采样,后面进行全连接和高斯连接。即Lenet5。

后来随着可用的结构化数据和处理能力呈指数增长,使得模型能进一步增强,特别是Imagenet开源数据集的出现,数百万张被标记分类的图像。

2012年的LSVRC挑战赛,Hinton和他学生Alex Krizhevsky开发了Alexnet深度卷积网络,结构类似Lenet5,但是卷积层深度更深,参数总数达数千万。多个卷积层且每个网络深度都达数百。即Alexnet。

2014年LSVRC挑战赛强大的竞争者,由牛津大学视觉几何组织提出的VGG模型。比起Alexnet,它主要是将卷积核缩小了,全部改用3x3。大体结构一致,但卷积配置可以不同。激活函数使用ReLU,池化使用max pooling,最后使用softmax输出各项概率。

2014年,GoogLenet网络模型赢得LSVRC挑战赛,该系列赛首次由大型公司参赛并获得成功,此后也一直由拥有巨额预算的大公司赢得比赛。GoogLenet 主要由9个Inception模块组合而成。GoogLenet参数数量降到了一千多万,并且准确性比Alexnet提高,误差从16.4%降到6.7%。

2015年随着《重新思考计算机视觉的Inception架构》文章发表,google研究人员发布新的Inception架构,主要解决协方差移位问题,其中将规范化应用于原始输入及每层的输出值。除此之外卷积核大小也有所变化,且增加了网络总体深度及卷积的分解。

2015年ResNet被提出,由原来微软研究院何恺明博士提出,现为Facebook AI研究科学家。ResNet战绩辉煌,当年一下取得5项第一。

循环神经网络

循环神经网络即recurrent neural network,它的提出主要是为了处理序列数据,序列数据是什么?就是前面的输入和后面的输入是有关联的,比如一句话,前后的词都是有关系的,“我肚子饿了,准备去xx”,根据前面的输入判断“xx”很大可能就是“吃饭”。这个就是序列数据。

循环神经网络有很多变种,比如LSTM、GRU等。

对于传统的神经网络,从输入层到若干隐含层再到输出层,层与层之间都是全连接的,而且层内之间的节点不相连。这种网络模型对于序列数据的预测就基本无能为力。

循环神经网络则擅长处理序列数据,它会对前面的信息进行记忆并且参与当前输出的计算,理论上循环神经网络能处理任意长度的序列数据。

比如可以做字符级别的预测,如下图,假如这里只有四种字符,样本为”hello”单词,则输入h预测下个字符为e,e接着则输出l,l则输出l,最后输入l则输出o。

-------------推荐阅读------------

我的开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)

为什么写《Tomcat内核设计剖析》

我的2017文章汇总——机器学习篇

我的2017文章汇总——Java及中间件

我的2017文章汇总——深度学习篇

我的2017文章汇总——JDK源码篇

我的2017文章汇总——自然语言处理篇

我的2017文章汇总——Java并发篇


跟我交流,向我提问:

欢迎关注:

展开阅读全文

没有更多推荐了,返回首页