Google大脑和人工神经网络
2019年图灵奖颁给对深度学习作出开创性贡献的Yoshua Benjio,Geoffery Hinton和Yann LeCun,通常这样的奖项要么授予第一个吃螃蟹的人,要么是最后一批作出重大贡献的人,他们就属于后者,一方面他们进入领域足够晚,躲过了前人走过的弯路,另一方面又足够早,还有关键性问题没解决,最幸运的是他们的理论一经提出,很快被验证了,最早验证他们理论的是谷歌。
2011年谷歌发布了基于深度学习的“谷歌大脑”,在宣传中这个“大脑”“思考”速度快,而且比现有计算机“聪明”,比如通过谷歌大脑的深度学习(训练)后,语音识别的错误率从13.6%降到11.6%(2个百分点需要全世界语音识别专家努力两年),而谷歌只是用这个大脑重新学习了一遍原有声学模型的参数,没有研究新的语音识别方法,甚至没有使用更多数据。2016年在谷歌大脑架构上开发的AlphaGo战胜李世石,2017年战胜柯洁,从此人类下棋下不过计算机了(阿尔法狗的项目领导者David Silver获得2019年图灵奖)
实际上谷歌大脑只是利用并行计算技术重新实现了一些人工神经网络(artificial neural network)的训练方法,今天其他深度学习工具也是这个原理,要理解谷歌大脑,首先要理解什么是人工神经网络。
1 人工神经网络
人工神经网络似乎是用计算机模拟人脑,其实只是利用生物学名词进行比喻,跟人脑没有半点关系,本质是前面介绍过的有向图,只不过是一种特殊的有向图。有向图包括节点和连接这些节点的有向弧,在人工神经网络中把节点称为神经元,有向弧是连接神经元的神经(这个比喻也有点怪啊,神经元包括细胞体和突起,感觉细胞体作为节点,突起作为有向弧更合适),特殊性如下:1、所有节点都是分层的,每层节点可以通过有向弧指向上一层节点,但同一层节点之间没有弧连接,而且每个节点只和相邻层的节点连接,不能越层连接。理论上人工神经网络的层数可以是任意的,但实际应用中一般不超过五层,因为层数越多计算越复杂。2、每条弧上有一个值(称为权重或权值),根据这些值,可以用简单公式计算它们所指节点的值,比如节点S1的值取决于X1和X2的值(x1,x2代表值),以及相应有向弧上的值w11和w21。
在人工神经网络中约定最下面一层的节点为输入层,模型的输入值只赋给这一层的节点,其他层节点的值通过这些输入值直接或间接得到,比如S1的值直接从X1和X2得到,Y1的值间接从X1和X2得到,最底层为输入层,相应地最顶层称为输出层,最上面一层的节点被称为输出节点,得到模型的输出值,中间层对外不可见,称为隐含层。(在神经系统中就是传入神经元-中枢神经-传出神经元)
这个模型看似简单,用处很大,在计算机科学、通信、生物统计和医学、金融和经济学(包括股市预测)中,很多与“智能”有关的问题都可以归结为在多维空间进行模型分类的问题,而人工神经网络正擅长模型分类,可以用于语音识别、机器翻译、人脸图像识别、癌细胞识别、疾病预测和股市走向预测等。
在语音识别中提到“声学模型”这个概念,在实际语音识别系统中,声学模型一般以“元辅音”为单位建立,每个元音或辅音对应一组数据,这些数据可以看成是多维空间中的坐标,这样就将每个元音或辅音对应到多维空间中的一个点或一个区域,识别这些语音实际上就是在多维空间中划分一些区域,让每个音分属于不同区域。
上图中随机挑选了a,o,e,t,zh的位置,模式分类(语音识别)的任务就是在空间中切几刀,把这些音所在的区域划分开。为了简单说明,假设空间只有二维,要区分的只有a和e,用虚线在空间中切一刀,左边是a,右边是e,当新语音进来时,落到左边识别为a,落到右边识别为e。
现在用人工神经网络实现这个分类器(虚线),网络结构如图所示,这个网络有两个输入节点X1和X2,一个输出节点Y,在X1到Y的弧上,赋予权重w1=3,在X2到Y的弧上,赋予权重w2=-1,然后将Y这一点的数值设为两个输入节点数值x1和x2的线性组合,即y=3x1-x2,这个线性函数也可以看成输入向量(x1,x2)和有向弧权重向量(w1,w2)的内积(或点积),为了后面判断方便,在公式中加入常数项-2,即y=3x1-x2-2
现在将平面上的一些点(0.5,1),(2,2),(1,-1)和(-1,-1)的做表输入到第一层的两个节点,然后看输出节点的值。
如果输出节点Y的值大于0,那么该点属于e,反之属于a,分类器y=3x1-x2-2等价于直线分类器x2=3x1-2,这样就用人工神经网络定义了一个线性分类器。还可以在这个神经网络中将Y变成中间节点S,然后增加一个明显的输出层,包含两个输出节点Y1和Y2,这样Y1和Y2哪个输出节点的值大,就认为这个点应该属于相应那一类。
不过,如果a和e分布比较复杂,不能简单用直线区分,如果分界线可以弯曲,需要用人工神经网络实现一个弯曲的分界线。
这个人工神经网络结构较之前复杂(多了一层),而且每个节点取值的计算也复杂了一些,节点S2是非线性函数(本例中是二次函数),该函数称为神经元函数。怎样选取节点函数?如果随便选取的话,分类器很灵活,但相应的人工神经网络缺少通用性,且函数参数难以训练。因此在人工神经网络中规定神经元函数只能对输入变量(指向它的节点的值)线性组合后的结果作一次非线性变换。
下图是一个人工神经网络的局部。X1,X2,...,Xn指向节点Y,节点上的值分别为x1,x2,...,xn,相应弧的权重分别为w1,w2,...,wn,计算节点Y的取值y分两步,第一步是计算线性组合:G=w0+x1*w1+x2*w2+...+xn*wn;第二步是计算Y的值y=f(G),其实第一步已经得到了一个确定的G值,即使f(G)是非线性函数,因为它只接受一个变量,因此不会很复杂。两个步骤相结合,既保证人工神经网络的灵活性,又保证神经元函数不过于复杂。
下表说明哪些函数可以作为神经元函数,哪些不可以。
对于前面的曲线分割线,我们得到分类器:3x=(y-2)^2+2,理论上如果人工神经网络设计得当,可以实现任何复杂曲线(在高维空间是曲面)的边界。
总结:人工神经网络是一个分层的有向图,第一层输入节点X1,X2,...,Xn(最底层)接受输入信息,也称输入层。来自这些节点的值(x1,x2,...,xn)按输出弧的权重(w1,w2,...,wn)进行线性加权(得到G),然后再做一次函数变换f(G),赋给第二层节点Y。第二层节点将数值向后传递给第三层,层层传递到最后一层,也称输出层。在模式分类时,一个模式(图像、语音、文字等)的特征值(如坐标),从输入层开始按上面规则和公式层层向后传递,最后输出层哪个节点的数值最大,输入模式就被分为相应类。
在人工神经网络中,需要设计的部分只有两个:一、结构,即网络分几层,每层几个节点,节点间如何连接等;二、非线性函数f()的设计,常用函数为指数函数,即f(G)=e^G=e^(w0+x1*w1,x2*w2,...,xn*wn),其模式分类能力等价于最大熵模型。
如果我们把不同输出节点上得到的值看成一种概率分布,那么人工神经网络实际等价于一个概率模型,如统计语音模型。输出弧权重即模型参数(w0,w1,w2,...,wn)和很多机器学习的模型一样,是通过训练得到的。