LightRNN:深度学习之以小见大
LightRNN :深度学习之以小见大
秦涛
微软亚洲研究院
历经沉浮, AI 终去颓势,一扫六合,雄踞当今 IT 江湖之巅,江湖帮派无论大小皆以 AI 为荣。然帮派虽众,论及武功秘籍,江湖中只有一个传说,“深度学习, AI 至尊,号令天下,莫敢不从, RL 不出,谁与争锋”。江湖公认,深度学习,无他,唯大尔。深度学习之大,境界有三重,大数据、大模型、大计算,传言唯有修至三重境者,方能领会深度学习之真谛。然成也萧何、败也萧何,深度学习,因大而崛起闻名于江湖,亦因大而阻碍其一统江湖的步伐:唯有大型帮派,方有财力人力体会三重境之美妙,而限于财力人力小门小派往往不能承受深度学习之大。所幸江湖儿女多豪杰,我辈 AI 中人多志士,诸多英雄好汉前赴后继,不断钻研,力图以小见大,使得深度学习之大能够返璞归真。本文所要讲述的正是发生在 M 帮 AI 部门亚洲分舵的一小段故事。
话说 M 帮是个超大型帮派,帮众甚多,直接服务 IT 江湖的产品部门和分舵也众多。听闻循环神经网络( RNN )乃武功秘籍深度学习中的一大绝招,横扫很多应用,包括语言建模、机器翻译、聊天机器人、看图说话( Image captioning )等等,很多分舵尝试把该绝招应用到产品中。然而尽管前途光明,但道路总是曲折的。大家很快发现 RNN 应用于自然语言处理任务中面临着一个巨大挑战:当语料库词表很大时,模型的体量将变得非常大。例如,当使用 RNN 进行语言建模( language modeling )时,每个词首先需要通过一个输入嵌入矩阵( input-embedding matrix )从 one-hot 向量(其维度与词汇表大小相同)映射到一个词向量。然后为了预测下一词的概率,通过输出嵌入矩阵( output-embedding matrix )将隐藏层映射到词汇表中每个词的概率。当词表包含上千万个不同的词时(这在 Web 语料库中很常见),如果每个词用一个 1024 维的嵌入向量表示,这两个矩阵就会包含数百亿( 10Million × 1024 × 2=20Billion )个不同的元素,这会使 RNN 模型变得过大(超过 80GB ),而当今江湖深度学习的独门武器 GPU 的内存最大也只有 24GB―― 很显然, RNN 模型之大已超出了深度武器的能力,从而阻碍了 RNN 在实际中的应用。
解决这一问题的一种思路是阵法。阵法可以使多个 GPU 组成阵列,从而应对大数据大模型的挑战。这种思路的本质是以力服人、一力降十会,你有大数据大模型,我有大计算。一般来说,阵法非常有效,然而其带来的一个问题就是进一步加剧了对计算资源的需求,这与以小见大的目标背道相驰。为此, M 帮 AI 部门亚洲分舵一小撮帮众聚集在一起,对 RNN 这一深度学习的绝招做出精巧的改进,其本质是四两拨千斤,将标准的 RNN 提升到新的一种境界,即 LightRNN: 标准的 RNN 模型之所以大,是因为每个词都有一个单独的嵌入向量表达。 LightRNN 的解决方案是引入一个二维词表, 其每一行关联了一个行向量(上图中的二维词表的第一行对应的行向量是 x? ),每一列关联了一个列向量(上图中的二维词表的第一列对应的列向量是 y ? )。然后把语料库里的每一个词放到二维词表的一个表格,根据一个词在二维表中的位置,该词可由行向量和列向量联合表示 ( 上图中, January 的表达为( x?,y? ) , two 的向量表达为 ( x?,y?) ) 。因为该表中同一行里的所有词共享相同的行向量,同一列的所有词共享相同的列向量,所以 LightRNN 仅仅需要2√ |V| 个向量来表示有 |V| 个词的词汇表,远远少于标准的 RNN 所需要的向量数 |V| 。这种词嵌入的做法被称做两部共享嵌入。
因为在 LightRNN 中每个词由两部分表达,所以在语言模型中为了预测下一个词, LightRNN 需要首先基于前面所有的词预测其行向量,然后基于前面所有的词和已经预测出来的行向量预测其列向量。 LightRNN 的网络结构具体如下图左边所示,它区别于标准 RNN 结构(见右边)的地方在于,在标准的 RNN 中一次预测即可以找出下一个词。在某种程度上来说, LightRNN 相当于把句子的长度增加了一倍,把对每个词的预测变成了两次预测。有人可能会问, LightRNN 会不会效率变低,训练和测试时间变长。实际情况恰好相反, LightRNN 会减少训练和测试时间,原因在于每次预测的复杂度降低:如果语料库词表有一百万个词,标准的 RNN 为了预测下一个词,需要对这一百万个词每个都打分计算概率,然后选择概率最大的词,因此复杂度是一百万;而 LightRNN 的二维词表只有一千行一千列,对行做预测时只需要对一千行打分计算概率选择概率最大的行,然后再对一千列打分计算概率选择概率最大的列,因此 LightRNN 预测一个词的复杂度是两千,远小于标准的 RNN 。
在公共数据集上测试的结果表明, LightRNN 能够大大降低模型的大小,同时还达到了 无损甚至更好的精度。如下表所示,在 BillionW 这个数据集(词表大小接近一百万)上,传统算法及标准的 RNN 的模型参数个数为 16-41 亿,而 LightRNN 的模型参数个数仅为 4 千万,达到了 40-100 倍的压缩比。并且随着词表的变大, LightRNN 的压缩比会进一步的提高。下表中的 PPL 反映了语言模型的精度, PPL 越小,精度越高。
有读者可能会好奇,为什么在减小模型的同时, LightRNN 还能达到更好的精度。原因在于共享嵌入。标准 RNN 假设每个词都有一个独立的向量表达; LightRNN 中很多词会共享行或者列向量,二维词表的行列向量都是从数据里学习得到的,并且哪些词在同一行或同一列也是学习得到的,因此 LightRNN 能够发现词表中的一些 语义 。如下表所示,通过训练, LightRNN 把很多有语义关联的词放在同一行,如 832 行都是地名, 852 行都是数字, 861 行都是数字 + 单位, 872 行都是被动分词, 877 行都是动词第三人称单数形式,等等。也就是说, LightRNN 的二维词表的共享行列向量比标准 RNN 的独立向量更能发现词之间的语义关联。其次,通过让有语义关联的词共享行或列向量,可以使低频的词的向量表达得到更充分的训练。例如 44kg 这个词在语料库里出现的次数较少,在标准 RNN 里它的嵌入向量学习不充分,而在 LightRNN 里,这个词的行向量由同一行的所有词共同训练,它的列向量也由同一列的所有词共同训练,相当于增加了这个词的训练数据,因此能够提高语言模型的精度。
总结而言, LightRNN 有以下优势。
-
第一,它使单 GPU 训练大词表的语料库成为现实。有人可能会问,实际中有没有必要用非常大的词表,比如说 1 百万个词的词表,因为实际常用汉字或者英文单词也就 3 、 5 千。答案是非常肯定的,现在很多输入法里都把人名地名以及每天不断涌现的新的网络词汇放到词表里以提高输入法的准确度,这会极大地增大词表的大小。另外,在语音识别里,如果某个人名或地名不在词表里,任何语音识别算法基本上都不可能正确识别该人名或地名。这些应用里在计算资源能够容纳的条件下,词表是越大越好。
-
其次,因为 LightRNN极 大地压缩了模型的大小,它对并行机器学习也非常有用。考虑用多 GPU 分布式训练一个语言模型,标准 RNN 的模型大小为数 GB ,这样不同机器之间的模型同步就非常耗时,使通讯时间超过计算时间而成为瓶颈;相比之下 LightRNN 的模型大小仅为几十 MB ,非常容易在机器之间传输,通讯代价非常小,从而大大提高并行训练的效率。
-
第三,考虑到功耗和可定制性,现在很多公司都尝试在 FPGA 上开发深度学习算法和平台。由于 FPGA 的内存较小(相对于 GPU 而言),很多深度学习算法很难在 FPGA 上实现。 LightRNN 因为其模型的极度紧致,为 FPGA 上的 RNN 的实现提供一种可能。
-
第四,现在移动设备在人们的日常生活中扮演着不可或缺的角色。尽管深度学习日益普及,但是在移动设备上的应用始终非常受限,例如当前不可能在手机输入法里使用一个 2-4GB 大小的语言模型,尽管它的准确度可能很高。 LightRNN 的模型大小仅为几十 MB ,非常适合在移动设备上使用,因此 LightRNN 为深度学习在移动场景中的普及提供了一个可行的方案。
如前文所述, RNN 乃是序列建模的绝招,适合非常多的应用,包括 语言建模、机器翻译、聊天机器人、看图说话( Image captioning )、图像生成、语音识别等等。相应的, LightRNN 通过以小见大、返璞归真,推动深度学习在在这些问题、场景里的实用化。我们相信, LightRNN 会进一步提升深度学习在 AI 的江湖地位,并促进 AI 普及化进程( Democratizing AI ,参见“ 萨提亚·纳德拉:面向每个人和每个组织 普及人工智能 ” ),而不是让 AI 或深度学习发展成为大型帮派的特权。
更多详细信息参见我们NIPS 2016 论文。
Xiang Li, Tao Qin, Jian Yang, and Tie-Yan Liu, LightRNN: Memory and Computation-Efficient Recurrent Neural Networks, NIPS 2016. http://papers.nips.cc/paper/6512-lightrnn-memory-and-computation-efficient-recurrent-neural-networks
作者简介
秦涛
秦涛博士,现任微软亚洲研究院主管研究员。他和他的小组的研究领域是机器学习和人工智能,研究重点是深度学习和强化学习的算法设计、理论分析及在实际问题中的应用。他在国际顶级会议和期刊上发表学术论文80余篇,曾任SIGIR、ACML、AAMAS领域主席,担任多个国际学术大会程序委员会成员,包括ICML、NIPS、KDD、IJCAI、AAAI、WSDM、EC、SIGIR、AAMAS、WINE,曾任多个国际学术研讨会联合主席。他是IEEE、ACM会员,中国科学技术大学兼职教授和博士生导师。
你也许还想看:
- 演讲 | 刘铁岩:对偶学习推动人工智能的新浪潮
- 观点 | 霍强:实现并行训练的线性增长,突破数据处理极限
- 开源|微软发布认知工具包:让机器学习更快、更大、更强
- 沈向洋:微软人工智能的下一个新征程
微软小冰 进驻微软研究院微信啦!快去主页和她聊聊天吧。