最近AlphaGo的胜利引起很大反响,大众对于AI的关注一下子热火了起来。现在的人工智能领域,神经网络已经是一个相对比较成熟的领域,深度学习目前不仅仅依靠神经网络,但是它本身仍然是一个基础的、不可避免的底层组成部分,而且也是整个体系里面消耗计算量的大头。制作专用处理器看来已经成为一种刚需。
神经网络的专用机?听起来不妙。
在当初日本为了赶超美国开发“第五代计算机”的时候,出现了很多推理(lisp、prolog)专用机,但是最后都落得了一个黯然收场的结果。主要是专用机很难利用现有的技术积累,一旦理论领域发生极小的变化,由于没有动机在商业上得到持续的优化投入,于是最后只会在价格和速度上双双落败,成为鸡肋。
但是现在神经网络的计算量问题基本上可以比较确信的成为一个必须突破的瓶颈,和相对成熟稳定的应用前景。神经网络有训练和应用两块,训练的部分要比应用略微复杂一点。但是两者都是简单的乘法和加法的叠加,从而是一个原理相对简单、相对比较容易设计、兼容和可替代性、可升级性比较简单的应用,制作专用处理器完全可以一步一步来。
举例来说,中科院现在已经有人研制出有专用指令的处理器
可以把神经网络推理部分的“乘以系数叠加然后判断是否超过阈值”的多个指令,做成一个指令,从而把一百多个cpu指令简化成一个,从而加速运算。
但是熟悉cpu设计的人可能会指出,现代cpu已经作了高度优化,这种把多个指令打包成一个指令的做法,除了保证了计算路径的无关度、深挖了cpu计算单元的并行效率外,增加的速度其实非常有限。但是鉴于现代cpu往往有很多核每个核有多个计算单元,而缺省并行效率并不好,这种做法在不大幅度改变现有计算体系的情况下,能够轻松得到几倍的冗余效率提升,不失为一种物廉价美的应急方案,但比起另一个类似方案而言并不算好。
神经网络计算的特点是数据量大,单位数据的计算次数却并不大,并行性好,这些都和图像计算非常类似,属于计算强度不如IO强度重要的范围,于是使用GPU进行神经网络计算就成了一个很好的选择。这次使用的阿法狗软件除了cpu外,也使用了大量的GPU。但是我们要看到,通用的GPU使用的计算单元数目多,独立性强,相对CPU而言流程并行优化度没那么高,从而专用指令相对原生指令的优化提升更大,从而引入专用指令的“提速、降能耗”程度也就更高。我想随着神经网络的流行,在GPU里面加入“多个数同时相乘、大小判断、相加”一气呵成的专用指令,想必和“三个数平方和的平方根倒数”指令一样会成为非常自然的流行选择。
除了GPU专用指令外,是否还能有更加激进的专用神经网络计算体系设计呢?
我们可以看到,到了后来,神经网络最大的瓶颈是数据带宽而不是计算能力。在视觉识别、声音识别等领域,训练数据并不大而且可以固化在硬件中,而大部分计算数据是不需要存储的,只要有最后一个“是或者否”的结果即可,因此神经网络计算完全可以用“输入流”-DSP-“输出流”的方法工作,使用大规模多级DSP串联的方法即可对数据进行即时处理,从而进一步简化设计、提高并行性,降低计算时间和能耗。但是这种方法过于简单,显然是无法在围棋这种更复杂的神经网络计算中应用的。
那么能否更更更激进一点呢?
现代计算体系,很多人认为优点在于“CPU的通用化”以及程序存储在内存里面,从而极大的提高了灵活性和降低设计难度。但是这个优点的隐含意义,其实是在于存储设备的廉价和快速上。现代的很多大数据处理,其实对于数据的加工超级简单,无非就是“查找有没有某个字符串”“一串数字中过滤出大于某个值的数据”“按权重求总和”“从一块内存集体拷贝到另外一个内存”这几个需求。一个数据库软件,把大量数据运输到cpu,处理后又送回存储器,其实想想这些需求根本无需由cpu或者gpu处理,为什么不直接在存储器端就做出来呢?
有人会说,这样不是把存储器端做复杂了吗?我们的cpu再复杂,也无非是几亿个CMOS管,相当于几兆内存所用的晶体管数目而已,你这样搞相当于把存储器复杂度翻几番,假设用到的新型存储器有几G,等于是多做了几千个cpu。这怎么可能划算呢?
或者说你这个方案不就等于每个内存都是一个小型单片机,这样并没有什么新鲜内容?
我认为
新型内置计算功能内存的复杂度没有cpu那么高,独立性强,做坏了某个区域标记为坏块即可,不像cpu或者单片机那么严格,成品率高得多,制备价格并不会提高太多。而且所有内存提价几倍,也不过和一块cpu的提价相当。
对于数据库处理、神经网络这种应用,相同计算量前提下利用智能内存可以极大减小CPU体系、多处理器体系、并行处理的复杂度和IO瓶颈,减少需要的CPU数量,等于就是降低了处理器的总价格。计算价格的主要费用现在越来越从cpu的价格,转变为电费了。减少IO就大幅度减少计算能耗了,长期节能看比硬件价格更省钱。
cpu提高并行度是有IO瓶颈的,而且很快就会达到。这个方法可以极大减少IO交换。
专用方案的最大问题并不在于价格,而是在通用性。随着数据库需求分解的稳定,和神经网络计算需求的稳定,保证了通用性,那么就有做出来的可能
仿生学的角度
从仿生学的角度来看,人类的神经元细胞,是使用电流脉冲来实现半数字半模拟信号的神经网络的。从这个角度来说,如果使用忆阻器,也就是可以随外加电流而改变电阻的元器件,把整个神经网络做成基于电流脉冲的半数字运算形式,那么使用十多个晶体管完成一个神经网络计算单元代替几千个晶体管的计算单元,最后把存储和计算完全一体化,并不是难以实现的事情。当然,一旦要用到半模拟电路,在相同计算频率的前提下,随着计算能力提升耗电量相比数字电路就直线上升了,这点简化并不一定划算。
不过考虑到人脑的耗电量大大小于阿法狗,在保证相同计算量的前提下,使用频率只有数字电路千分之一的脉冲半数字半模拟电路,这就完全值得考虑了。当然,这个时候,真正的问题反而在于如何编程了。这样的体系,由于存储和计算合一,在编程上会变成全新的系统,可能要在理论上进行进一步突破才有可能。
后记
我本人是赞同技术进步的。但是对于神经网络,我却并不希望在应用上做过了头。毕竟,神经网络往往“知其然而不知其所以然”,理论上我们是无法保证其算法是鲁棒性好、在未知环境稳定发挥的,而我们的生活永远充满着例外。
日常的神经网络应用,大家可以试用一下waifu2x这个软件。它的降噪和放大图片功能都非常强。