你好,游客 登录
背景:
阅读新闻

气和深度学习2:人工神经网络

[日期:2018-03-05] 来源:知乎  作者: [字体: ]

这一篇我们抽象一下人工神经网络是什么。首先要说明的是,作者本身不是人工神经网络的专家,甚至连深度学习工程师都不是,作者是做平台软件的,但因为平台同样要支持深度学习,那么,支持深度学习到底需要我们干什么,都显得有意义了。同时,这样从一个“外人”的角度来看一下人工神经网络,也能帮助其他相关行业的人理解它。正如我在第一篇里面总结的,所谓特征,是特定角度和特定维度对信息的提取。任何一个角度的提取,都有助于我们发现新的特征。

在我所在的单位中,常常有其他产品的,或者法务的,战略的,投资的,标准组织的同事来找我,了解开源社区,软件,操作系统等方面的情况,他们问的问题很多对于我这个领域来说可以说是比较“幼稚”的,但我每次都从这样的交流中获益良多,比和不少同行的交流获得的收益还多。因为我从来没有从这些角度中考虑过我这个领域的问题。所以这里这个总结,也是这个意思,对于人工神经网络,我是相当的外行,但一个外行的总结,很可能也是有益的。

另外,再说明一下,本文也不准备涉及到深入的数学细节,要深入到那种细节不如直接看教材本身,没有必要做这个抽象。等我们建好这层逻辑了,我们要深入看数学细节,那是另一个问题。所以,看本文,你不用拿纸笔出来,理一下基本的逻辑链就好了。

 

正如我们在第一篇中讨论过的,深度学习,主要是从复杂的数据关系中,抽象出它的特征,从而成为我们的一种知识。那里举了几个例子,比如线性回归,点回归等等。但这些方法都有比较明显的缺陷,就是它的参数是非常有限的,你眼睛看到一个五彩斑斓的图景,耳朵听到一个一个闹闹嚷嚷的声音,你一下就能捕获某个特定的特征,这使用的参数就不是简单几个斜率,角度,位置这样的参数可以决定的了。我们需要有很多的参数,而且,我们肯定这些参数不是线性的。做了这么多年的数学,我们会有一个基本的感性:线性关系的组合,常常还是线性的。我们需要一个模型,这个模型可以提供很多参数,有共性的东西,可以得到相似的结果。基于这样一个模型,我们就可以不断学习,提取特征,从而发现事实中的“规律”来了。

 

也不知道是数学家还是生物学家,从人的大脑中发现了一个挺好用的模型。他们发现,人的大脑皮层的结构非常简单,它由一个个的神经元(Neutro)组成,Neutro伸出很多触突(Dentritic)和感官神经相连,然后在通过长触突(Axon)连到其他的神经元上。当Dentritic受到刺激的时候,比如眼神经看到东西了,就会形成不同的信号,刺激到神经元,神经元把这个信号组合一下,就直接影响到下一个神经元。这样在外界的刺激下,信号会在神经元上形成一个扩散,最后,“有规律”的刺激,就会得到增强,如果下次这种规律再进来,人就会认为,“这就是同一个东西”,这就是“抽象”或者“感性认识”了。“抽象”之上“再抽象”,就成为“逻辑”,“逻辑”再抽象,就成为“哲学”了:)

 

数学家抽象了这个模型,他们把触突加入到神经元的信号抽象为一个数字,简单把他们按权重卷积在一起(如果你已经忘了什么是卷积,不要紧,这个东西简单理解,就是比如我突触上有10个输入[a1,a2...a10],每个权重是[w1, w2, ...w10],卷积就是a1*w1+a2*w2+...+a10*w10,就是加权和而已,然后神经元本身再耍一点点小脾气,把这个结果非线性化一下,把它匹配到一条曲线上,比如匹配到Sigmoid:

为什么是Sigmoid,暂时来说是没关系的,就是让它变一下而已,最后加个偏置(加上一个常数),然后就作为本神经元的参数传递出去,搞定。

除了可以用Sigmoid,其实也有很多曲线可以用,比如tanh(双曲正切函数,中学课程了),它是这样的:

其实都差不多,就是让这东西非线性,而且范围受限,不能特别大,然后通过偏置参数把它放到一个中心的位置上而已。

用这种方法把这些神经元分成多层,连起来:

可以看到,感官的信息传递进来,根据触突的权重不同,以及神经元的属性(就是那个Sigmod函数和偏置)了,我们就可以得到一个新的值,用这个值来刺激下一个神经元,就可以形成波动。最后是否会形成特征?那就要看运气和输入本身是不是有特征了。

看看这个数据结构,你就知道这个计算量有多大了。人的大脑可有大概一万个神经元,每个神经元对外伸出6000个连接。这个计算简直是天文数字,人脑其实是一个超级并行计算机啊。所以这个原理几十年前就知道了,但一直毛用没有,因为根本就没有东西能做这种运算,现在计算机变快了,所以这个技术又重新火热起来而已。

而且,就算现在计算机变快了,能够弄的层数也不到十层,每层有几百个节点之类的,远远不能和人脑比。所以只能干针对性的活。人脑可以可以基于自身拿到的好处,坏处,是否可以生存,是否吃得更好,妈妈的教导,书本的强化,快速对自己的神经元(那些w)进行训练,从而形成一个高级的训练模型。而现在的人工神经网络,不过就是看幅图,然后人告诉它,“这是花”,看上几万幅,看看能否归结为一个“规律”来。图的大小,使用的格式,这个格式如何定义(比如是RGB的还是UVY的),都有要求,而且,关键在于,它还不能自己教自己。它必须是我们(人)认出了10000张花的照片,然后让它用这个来训练自己,从而得到一组“花”的参数。这些参数,就是人工神经网络的输出了。

而人脑,是要先从感受的“痛”,“不舒服”,来修正对这个世界“好”,“坏”的看法,然后从这些好坏中,抽象中间模型,得到“危险”,“食物”,“亲近”这样的概念,再形成文字,思考,逻辑……想象一下,两者相差的层次有多远?

 

扯远了,我们用这个对比,可以看到所谓人工神经网络是什么,它其实是个带有成百成千的个参数的一个函数,我们要通过回归,把这些参数调整到适配一个模式,这些“参数”,让这些参数可以用于判断下一个复杂的情况。用更接近的数学语言来描述,假如有一副图像,每个点的RGB值可以表现为一个向量x=[p1,p2,p3,...,px],它是一朵花,我们也可以表现为一个向量y=[0,1,0,0,0](每个向量的成员表示一种“东西”,1表示是这种东西,0表示不是这种东西,如果有两个1,就表示这里面两种东西都有。还可以是0.7,表示有70%的可能是这种东西),而神经网络就是一个带有一个向量w=[w1, w2, w3...]的函数y=f(w,x)。

 

这本质上和线性回归没有区别,这看看上面这个算法的组织过程,你就会发现,它是一个混沌系统,随着w的不同,它可以变成任何形状,从而看看我们能不能匹配出合理的“抽象”来。

 

由于神经网络的自由度如此之高,几乎可以说无论你有没有规律,它都能给你“总结”出一个规律来,所以,它的总结是不能做准的。实践中,人们把“经验”数据(比如一万张花的照片,分成两个部分,一部分用来训练,一部分用来测试(或者更复杂一点,是三个部分:训练,校验,测试),如果训练的规律用在测试上也成立,这个计算出来的w向量,就认为是有效的,如果不成立,我们就称它为“过度匹配”(Overfit)。

 

关于过度匹配,下面这幅图很好地表达了这个意思:

过度匹配通过了训练用的每个点,却离验证和实用的样本十万八千里。

 

从这个观点上可以获得很多关于人类思维模型的深入理解,但在我们感叹前,还是专心理解一下人工神经网络算法本身。

 

稍考虑一下前面这个问题,你很快就发现,整个问题最难的其实是怎么调整w。这个技巧照理说应该从人脑来学,但我很怀疑我们都没有研究清楚人脑是怎么弄这个东西的。所以,现在书本上看到的方法都相当“人工”,它还是有一定“逻辑”的。这个方法叫“梯度下降”。基本原理是“基于输出反馈一点点调”:

首先,我们可以随机产生一组w,这时,算出的结果肯定是错的。那么结果和正确的输出就会有一个偏差。计算总标准方差 E=\frac {\sum_{}^{}{(y-\bar{y})^2}}{2} ,就可以得到一个偏差值,我们希望让这个偏差值变成0,我们的逼近就是最好的。但向哪个方向调整呢?调整多少呢?那就需要知道需要调整的那个点的导数了。这样,我们可以对这个标准方差对每个 w_{i} 求偏导,如果我们想象f(w,x)是一个在区域内连续可导的曲线,它就会符合泰勒级数的要求(别担心,我的泰勒级数知识也都还给工程数学老师了,我们记得原理就行),这样,我们基于统计和激活公式,可以计算在当前点上E对于每个w的偏导 \frac{\delta E}{\delta w} ,用这个偏导乘以一个“步长s”,就有机会降低E,通过多次这样的一个过程,E就会一点点下降到一个较低的水平,这样我们就可以得到一个最优的w了。

这个用一维毕竟来理解(很多教材都用二维偏导理解,这样更好理解,但画那种图对我来说太耗时间了,我们对付一下,读者看懂这里了,再看那些描述就容易脑补了):

请注意一下这个图的横坐标和纵坐标是什么。这两者和f不是直接的关系。它的目的是让f的结果逼近整个训练空间。

梯度下降法想想真是细思恐极,本来我们觉得计算一次f(x)(把w当作常数)已经是很大的计算量了,然后有一万个样本,这玩意儿还要计算10000次。但10000次还不算,这只是得到了一组“偏差”,然后我们得用梯度下降法来把这个过程重复一次又一次,等着这个E降下去,这个计算量就要让人晕过去了。

为了让这个计算过程快一点,我们当然希望是把步长设置得大一点,但步长设置太大了,在 w_{0} 点上的偏导就管不到了,它会跳到拐点之外,让你的逼近失去效果。还有其他优化方法,比如你用全部数据来计算E(Batch Gradient Descent),我也可以基于最近10次的数据来计算E(mini Batch Gradient Descent)来进行调整,反正这个东西又不严格,步长的选取,和偏微分其他参数都会对这个东西造成影响,所以也不在乎这个不严格了。想想我们在第一篇里的一个总结:特征在特定的精度和维度上呈现。

理解梯度下降法,我们一定程度上可以理解为什么人工神经网络有“层”这个概念。其实我认为“层”在算法本身是没有意义的,它本质上是一种简化。实际上在提到人的神经网络的时候,我们并没有看到有人提到“层”,因为那就是一个自然组网。神经元之间互互相连。它的连接也不是我们这种基于w的数字化的数据,而是模拟化的组合效果。把结果进行组合,然后激活出去,这是我们人为加出来的。激活函数是什么,在我们这里是单一的算法,在人的神经元中,可能是个模拟的组合结果。而人工神经网络的所谓层,是为了软件组织的方便而建立的,因为用了层,我们不需要给每个神经元一个算法,这简单很多,同时,因为同层的神经元算法单一,就为数学上推演前面要求的那个偏导带来了证明上的便利。这是为什么需要层,同一个层的神经元,使用同一个算法,仅仅是w参数不同,他们在偏导上呈现相似的特征,就可以用相似的方法计算偏导并进行梯度下降。

 

实用中的人工神经网络,通常包括一个输入层,一个输出层和一组“隐层”。一般来说,输入层用作标准化,控制输入向量的范围等内容,基本上代表原始数据。输出层常常用的是softmax算法,用来帮助结果在整个输出向量中“聚集”并且总概率正好是1(查一下wiki就可以知道,这算法主要用于概率论中对结果进行“分类归纳(categorical distribution)”)。而真正导致训练结果在不同的数据集下呈现不同的样子,就是靠中间非线性化的“隐层”,这里用的算法常常是卷积,LeRU,Sigmoid,Tanh这一类的算法了。

 

而梯度下降,是反着的,先用输出层算出偏差,根据输出层函数在这个偏差点上算出这个位置的偏导,反馈给上一层输出,让上一层用这个作为偏差,计算它在这个点上的偏导,基于链式规则,就一点点可以得到整个网络的调整了。(这部分原理推荐参考这个描述:胡逸夫:如何直观地解释 back propagation 算法?

 

综合起来,现在的神经网络更像是人脑的一个“脑残”版本,拿到了人脑的万分之一或者百万分之一的能力,然后看看能不能干一些人脑“不屑”干的活。它的优势主要有两个,一个是人脑会自动收敛,不接受反复重复的脑力计算要求,它不会有这个问题,因为它“一根筋”。第二是它的存储能力很强。人脑的东西很容易遗忘,然后那些特征就没用了,人脑的整个训练目的都是“保护自己”,但“脑残”的人工神经网络没有这个问题。如果某一天,人工神经网络完善到人一样的水平了,我估计它的文化,目的,思考角度,都会和我们人完全不一样的:)

 

作为平台工程师,我注意到这个业务对平台的要求是这样的:

  1. 数据量极大,要反反复复在一组巨大的数据中进行浮点运算,所以,它需要极高的计算总线带宽。由于每次梯度下降,都涉及整个网络的重新计算,分布式运算之间的通讯要求极高,所以如果进行分布式运算,对带宽和时延的要求也很高,所以高性能RDMA对大容量训练平台来说,很可能是个必须的功能。
  2. 大量的矢量计算,应对方法可能是高维矢量计算,或者类似GPU那样依靠多个计算节点进行多线程计算。
  3. 大量的低精度运算,甚至非准确计算。如果像一些人说的那样,非准确计算可以降低芯片的设计成本,那么这将改变整个CPU的设计逻辑。比如,我们不再需要1000+1000必须等于2000,只要它能等于 2000\pm50 可能就可以了。
  4. 逻辑思维很少,却极为消耗算力。好比卷积,只需要反复乘了再加就可以了,不需要任何逻辑,这会改变很多东西。比如,我这样的靠逻辑吃饭的人会少很多,也不需要很高的IO,但会占满整个CPU,里面全部都是加加乘乘,我们原来习惯的那些profile方法会统统失效,只需要粗暴的计算,计算之间也没有什么逻辑关系,CPU会像块砖那样来用。总的来说,这最后需要的不是个CPU,只是需要一个“算法器”(TPU),里面没有逻辑,只有“一小片脑子”,用来进行逻辑判断的CPU只是需要这些脑子的“投票结果”。这听起来有点越来越像人了:CPU充当上意识,进行逻辑判断,TPU充当下意识,进行快速“模式判定”,也应该计算机下一步的,不远的未来吧。而且,我猜,到最后,会想现在大部分SoC一样,模拟部分功能虽然少,却占据整个SoC面积的主要部分,而数字部分功能多,复杂,会占据SoC面积的很小的部分。在未来的SoC中,CPU将占据少数的部分,TPU将占据主要的面积。
  5. 和CPU程序不同,神经网络的开发和调试过程也需要算力,买台PC或者Laptop就想开发软件的时代将会过去,没有算力你什么都开发不了……
收藏 推荐 打印 | 录入:Cstor | 阅读:
相关新闻      
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款