合体!模拟-数字电路(2)——用SPICE搞机器学习

在前一期(合体!模拟-数字电路(1)——写Verilog设计模拟电路)中我们讨论了用数字电路以及设计方法实现传统的模拟电路。在这一期中,我们反其道而行之,看看如何用模拟电路高效来实现传统上用数字电路做的运算。


机器学习,可谓是今天的当红炸子鸡,这年头的paper关键词里面没有“机器学习”相关的字眼都不好意思和人打招呼。机器学习的一系列算法,包括卷积、非线性激活(activation)函数、SVM核函数等等,看上去就和模拟没关系而需要使用数字电路实现。然而,你没有看错,使用模拟电路做机器学习运算,尤其是超低功耗下的机器学习芯片,渐渐成为了潮流。下面我们来仔细介绍一下如何用SPICE搞机器学习。


1.数字电路做机器学习有什么问题?


首先,我们说说用数字电路实现机器学习遇到的瓶颈。


简单来说,最近机器学习发展最好的方向是监督(supervised)机器学习,其目的是实现分类(classification)问题。



线性与非线性分类


分类问题,从数学上来看就是在坐标平面(或者超平面)上,把点分到正确的类别里去。上图中,就是需要找到一种函数,把蓝色点与灰色点分开。最简单的分类就是线性回归(上图左),大家高中就学过,就是使用一个线性函数曲线把两种点分开。然而,对于上图右面那种比较复杂的情况,显然无法找到一种简单的线性函数曲线把两种点分开,而必须使用非线性函数。近年来机器学习大跃进就是因为找到了非常强力的非线性函数来完成分类问题,这种函数叫做神经网络。使用神经网络,理论上可以拟合任意复杂度的函数(包括线性和非线性),因此在监督机器学习问题中游刃有余,也造就了这波机器学习热潮。


然而,非线性计算对于数字电路来说需要大量的时间和能量来计算。举个例子,神经网络里一种常用的非线性函数是sigmoid(下图),需要用到除法和指数运算。大家在大学数字电路课本里一般会讲到加减法和乘法数字电路实现,除法往往已经是选读内容了,至于指数运算更是一般不会出现在课本里。此类非线性计算实现起来往往比较复杂,需要较长的延迟并消耗大量能量。在云端计算这种场合,因为对于能量消耗需求并不严格,因此可以用GPU堆性能,问题不大;然而,在需要超低功耗的场合,使用数字电路硬算可能就没法满足功耗要求了。


Sigmoid非线性函数


2.模拟电路如何解决这个问题?


大家再仔细看一眼上面的Sigmoid函数,是不是很像带饱和的放大器传输曲线?那么能不能用模拟放大器来“模拟”这条曲线呢?答案是可以!神经网络一个特点就是对于误差有一定的容忍性,即即使非线性函数离理想特性有一定偏差,最后得到的分类结果并不会差太多!因此,在低功耗的情况下,我们可以用超低功耗模拟电路来完成非线性运算,即使结果有一些误差仍然在允许的范围之内!


韩国KAIST的H. Yoo教授领衔的研究组是机器学习芯片领域的领军人物(每年ISSCC都能发表三篇以上论文),而在模拟电路实现机器学习方面也走在了世界前列。在2016年发表在JSSC上的论文A 502-GOPS and 0.984-mW Dual-Mode Intelligent ADAS SoC With Real-Time Semiglobal Matchingand Intention Prediction for Smart Automotive Black Box System里,他们实现了有超低功耗模式(功耗仅0.984mW)的机器学习芯片,其中在超低功耗模式下,非线性函数使用的就是模拟电流放大器来实现,并且通过调整放大器的电流增益还能调整Sigmoid曲线。



除了Sigmoid之外,Yoo组还用模拟电路实现了机器视觉中常用的高维高斯滤波,在A 1.22 TOPS and 1.52 mW/MHz Augmented Reality Multicore Processor With Neural Network NoC for HMD Applications论文中,用尾电流控制电路实现了接近高斯滤波的传递函数。



3.线性运算也可以用模拟处理!


“物联网”和“机器学习”是当今最热的两大技术关键词,而把它们结合到一起时,就产生了“智能物联网”(Intelligent IoT)的概念。在智能物联网中,传感器负责把环境中的信号收集,并且用机器学习算法处理。环境中的信号当然是模拟的,因此在送入机器学习算法处理前,需要经过模拟-数字转换。


但是,这么做存在很多冗余!如果把环境信号无脑转换成数字信号,那么ADC需要跑在比较高的频率。从另一个角度看,机器学习也是一种信号压缩的过程,把大量的环境信号(几百甚至上千比特)收集之后,最后输出的结果只是一个分类结果(几个比特)。那么,能不能在模拟-数字转换的时候顺便把分类给做了呢?这样ADC只要跑在比较低的频率!


这是可以的。2015年的ISSCC上,来自普林斯顿大学的Jintao Zhang等人发表了A Matrix-Multiplying ADC Implementing a Machine-Learning Classifier Directlywith Data Conversion,利用电容阵列在ADC这边直接就做了矩阵相乘并且完成了AdaBoost机器学习算法,最后输出就直接是分类结果了。使用模拟电路完成矩阵乘法这种线性运算的特点仍然是功耗很低,比较适合使用在超低功耗的应用中。在需要高精度和高速的场合,模拟电路会的种种非理想因素开始体现,这时候还是老老实实用数字电路实现比较方便。



在2017年ISSCC,使用模拟电路实现矩阵运算的趋势仍在继续。


 

UCSD的空间滤波阵列(Spatial Filter Bank)继续沿用MDAC的理念,并疯狂地将乘法的位宽增加到14位。在传统模拟/数字信号处理的教科书上,这种计算的应用一般是数字电路的天下。

 

另一个基于模拟实现的场景也和多径有关。在超声的片上系统应用领域,波束成形(beamforming)逐渐取代了原有的单点超声。传统的波速成形往往采用先量化在数字延迟的方法,这样对ADC的数量、匹配和面积提出了很高的设计要求。而在今年的ISSCC中日本日立集团的3072道超声应用中,采用了先采样,在电荷域求和延迟的技术,最后仅需要对求和后的信号进行一次模数转换即可。



类似的空间运算和延迟技术不仅对于生物系统有重要的参考价值,更是在MIMO/雷达等先进的通信系统存在中的广泛应用。于是越来愈多的模拟计算技术是否会为未来的通信电路带来新的基带架构也是一个值得期待的问题。

 

4.结语


在两期文章中,我们介绍了使用数字电路实现的传统模拟电路,以及用模拟电路实现的传统数字运算模块。数字电路能更好地享受特征尺寸缩小的好处,而模拟电路更适合实现超低功耗运算电路。实际上,在信号处理中,采用模拟还是数字的方式的争论由来已久。具体问题往往需要具体分析。但是片面地将设计思路固步自封的模拟或者数字中往往是不可取的。总之,未来的集成电路电路设计工程师恐怕再也不能仅以“模拟”或者“数字”自居了。



入门UCLA入门硬件电路
1
暂无评论
暂无评论~