LightRNN:深度学习之以小见大

mjvfwnarao 8年前
   <p>​</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/0bc7d6719c727e5fd86d907f90f0603d.jpg"></p>    <p>​</p>    <p><strong>LightRNN:深度学习之以小见大</strong></p>    <p>历经沉浮,AI终去颓势,一扫六合,雄踞当今IT江湖之巅,江湖帮派无论大小皆以AI为荣。然帮派虽众,论及武功秘籍,江湖中只有一个传说,“深度学习,AI至尊,号令天下,莫敢不从,RL不出,谁与争锋”。江湖公认,深度学习,无他,唯大尔。深度学习之大,境界有三重,大数据、大模型、大计算,传言唯有修至三重境者,方能领会深度学习之真谛。然成也萧何、败也萧何,深度学习,因大而崛起闻名于江湖,亦因大而阻碍其一统江湖的步伐:唯有大型帮派,方有财力人力体会三重境之美妙,而限于财力人力小门小派往往不能承受深度学习之大。所幸江湖儿女多豪杰,我辈AI中人多志士,诸多英雄好汉前赴后继,不断钻研,力图以小见大,使得深度学习之大能够返璞归真。本文所要讲述的正是发生在M帮AI部门亚洲分舵的一小段故事。</p>    <p>话说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在实际中的应用。</p>    <p><img src="https://simg.open-open.com/show/152d478cda782e4b9faa58ce6ba694ec.jpg"></p>    <p>​</p>    <p>解决这一问题的一种思路是阵法。阵法可以使多个GPU组成阵列,从而应对大数据大模型的挑战。这种思路的本质是以力服人、一力降十会,你有大数据大模型,我有大计算。一般来说,阵法非常有效,然而其带来的一个问题就是进一步加剧了对计算资源的需求,这与以小见大的目标背道相驰。为此,M帮AI部门亚洲分舵一小撮帮众聚集在一起,对RNN这一深度学习的绝招做出精巧的改进,其本质是四两拨千斤,将标准的RNN提升到新的一种境界,即LightRNN:标准的RNN模型之所以大,是因为每个词都有一个单独的嵌入向量表达。LightRNN的解决方案是引入一个二维词表,其每一行关联了一个行向量(上图中的二维词表的第一行对应的行向量是x₁),每一列关联了一个列向量(上图中的二维词表的第一列对应的列向量是y₁)。然后把语料库里的每一个词放到二维词表的一个表格,根据一个词在二维表中的位置,该词可由行向量和列向量联合表示(上图中,January的表达为(x₁,y₁), two的向量表达为(x₂,y₂))。因为该表中同一行里的所有词共享相同的行向量,同一列的所有词共享相同的列向量,所以LightRNN仅仅需要2√|V|个向量来表示有|V|个词的词汇表,远远少于标准的RNN所需要的向量数|V|。这种词嵌入的做法被称做两部共享嵌入。</p>    <p>因为在LightRNN中每个词由两部分表达,所以在语言模型中为了预测下一个词,LightRNN需要首先基于前面所有的词预测其行向量,然后基于前面所有的词和已经预测出来的行向量预测其列向量。LightRNN的网络结构具体如下图左边所示,它区别于标准RNN结构(见右边)的地方在于,在标准的RNN中一次预测即可以找出下一个词。在某种程度上来说,LightRNN相当于把句子的长度增加了一倍,把对每个词的预测变成了两次预测。有人可能会问,LightRNN会不会效率变低,训练和测试时间变长。实际情况恰好相反,LightRNN会减少训练和测试时间,原因在于每次预测的复杂度降低:如果语料库词表有一百万个词,标准的RNN为了预测下一个词,需要对这一百万个词每个都打分计算概率,然后选择概率最大的词,因此复杂度是一百万;而LightRNN的二维词表只有一千行一千列,对行做预测时只需要对一千行打分计算概率选择概率最大的行,然后再对一千列打分计算概率选择概率最大的列,因此LightRNN预测一个词的复杂度是两千,远小于标准的RNN。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/7c415b6e978b8832ecfe3b23976a941c.jpg"></p>    <p>​</p>    <p>在公共数据集上测试的结果表明,LightRNN能够大大降低模型的大小,同时还达到了无损甚至更好的精度。如下表所示,在BillionW这个数据集(词表大小接近一百万)上,传统算法及标准的RNN的模型参数个数为16-41亿,而LightRNN的模型参数个数仅为4千万,达到了40-100倍的压缩比。并且随着词表的变大,LightRNN的压缩比会进一步的提高。下表中的PPL反映了语言模型的精度,PPL越小,精度越高。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/7a213abfbfba8f3c2a801e44b7bffdc5.jpg"></p>    <p>​</p>    <p>有读者可能会好奇,为什么在减小模型的同时,LightRNN还能达到更好的精度。原因在于共享嵌入。标准RNN假设每个词都有一个独立的向量表达;LightRNN中很多词会共享行或者列向量,二维词表的行列向量都是从数据里学习得到的,并且哪些词在同一行或同一列也是学习得到的,因此LightRNN能够发现词表中的一些 语义 。如下表所示,通过训练,LightRNN把很多有语义关联的词放在同一行,如832行都是地名,852行都是数字,861行都是数字 单位,872行都是被动分词,877行都是动词第三人称单数形式,等等。也就是说,LightRNN的二维词表的共享行列向量比标准RNN的独立向量更能发现词之间的语义关联。其次,通过让有语义关联的词共享行或列向量,可以使低频的词的向量表达得到更充分的训练。例如44kg这个词在语料库里出现的次数较少,在标准RNN里它的嵌入向量学习不充分,而在LightRNN里,这个词的行向量由同一行的所有词共同训练,它的列向量也由同一列的所有词共同训练,相当于增加了这个词的训练数据,因此能够提高语言模型的精度。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/33bf084d95d164057bb080a8e3b579b3.jpg"></p>    <p>​</p>    <p>总结而言,LightRNN有以下优势。</p>    <p>第一,它使单GPU训练大词表的语料库成为现实。有人可能会问,实际中有没有必要用非常大的词表,比如说1百万个词的词表,因为实际常用汉字或者英文单词也就3、5千。答案是非常肯定的,现在很多输入法里都把人名地名以及每天不断涌现的新的网络词汇放到词表里以提高输入法的准确度,这会极大地增大词表的大小。另外,在语音识别里,如果某个人名或地名不在词表里,任何语音识别算法基本上都不可能正确识别该人名或地名。这些应用里在计算资源能够容纳的条件下,词表是越大越好。</p>    <p>其次,因为LightRNN极大地压缩了模型的大小,它对并行机器学习也非常有用。考虑用多GPU分布式训练一个语言模型,标准RNN的模型大小为数GB,这样不同机器之间的模型同步就非常耗时,使通讯时间超过计算时间而成为瓶颈;相比之下LightRNN的模型大小仅为几十MB,非常容易在机器之间传输,通讯代价非常小,从而大大提高并行训练的效率。</p>    <p>第三,考虑到功耗和可定制性,现在很多公司都尝试在FPGA上开发深度学习算法和平台。由于FPGA的内存较小(相对于GPU而言),很多深度学习算法很难在FPGA上实现。LightRNN因为其模型的极度紧致,为FPGA上的RNN的实现提供一种可能。</p>    <p>第四,现在移动设备在人们的日常生活中扮演着不可或缺的角色。尽管深度学习日益普及,但是在移动设备上的应用始终非常受限,例如当前不可能在手机输入法里使用一个2-4GB大小的语言模型,尽管它的准确度可能很高。LightRNN的模型大小仅为几十MB,非常适合在移动设备上使用,因此LightRNN为深度学习在移动场景中的普及提供了一个可行的方案。</p>    <p>如前文所述,RNN乃是序列建模的绝招,适合非常多的应用,包括语言建模、机器翻译、聊天机器人、看图说话(Image captioning)、图像生成、语音识别等等。相应的,LightRNN通过以小见大、返璞归真,推动深度学习在在这些问题、场景里的实用化。我们相信,LightRNN会进一步提升深度学习在AI的江湖地位,并促进AI普及化进程,而不是让AI或深度学习发展成为大型帮派的特权。</p>    <p> </p>    <p> </p>    <p>来自:http://blog.sina.com.cn/s/blog_4caedc7a0102wq5x.html</p>    <p> </p>