您的位置:首页 > 理论基础 > 计算机网络

LightRNN 论文笔记:LightRNN: Memory and Computation-Efficient Recurrent Neural Networks

2017-04-08 21:48 417 查看

Introduction

近年来RNN被广泛的应用于基于神经网络的NLP任务当中,比如说语言模型,QA等等,并且通常来说由RNN的相关结构能够在这些任务当中取得state of art的表现。

不过呢,虽然RNN相关的网络在NLP任务中表现十分优异,但是其也有一些非常显著的缺点,比如说当一个语料库所对应的词表数量非常大的情况下,整个模型的大小也会随之变大。比如,当我们使用RNN构建语言模型的时候,我们首先将词语从one-hot的向量,通过词嵌入的手段,转变为一个稠密的向量形式(如Word2Vec),并且所有词转变后构成一个embedding matrix,而当这个语料中的词语非常多的时候,将会导致这个matrix非常的大,大到我们使用GPU训练的时候,都没有办法将它放到GPU的显存里面。与此同时,除了模型会变的非常大以外,整个模型的训练开销也会随着词表的增大而急速增长。

在RNN LM或者相关的模型的计算中,最耗费时间的一个步骤在于计算预测词的概率,因为必须要通过softmax去计算概率值,而softmax需要计算一个规则项,该规则项需要遍历整个词表。



为了解决这个由于词表增大,而导致的模型大小和计算速度上的开销急剧增大的问题,这篇文章提出了一种新颖的做法,就是在做词嵌入的时候,将一个词对应的词嵌入拆成两部分,一部分可以理解为行嵌入部分,另一部分是列嵌入部分,并且这两部分都是共享的,只保证每个行和每个列的组合,只对应一个词。在传统的RNNLM做法中,一个词的词嵌入表示是一个独立的、唯一的表示,如果有V个词,那么就需要有V个向量来表示。而在这个RNNLM中,由于词嵌入的表示,由行向量和列向量组成,并且行列向量都是共享的,那么对于V个词的预料,那么其实只需要(根号V)的大小去表示,极大的改善了模型大小,并且改善了训练速度。

对于LightRNN的这种做法,其主要难点在于如何构建这种行列向量表示的词嵌入方案,以及如何应用到RNN当中。

对于向量的表示方式,LightRNN的做法是,使用一个Table来表示所有词,每个词对应一个坐标(i,j),所有行坐标为i的词,共享一个行向量,所有列坐标为j的词,共享一个列向量,这样在保证共享行列向量的基础上,保证了词表中的每一个词的具体值都是不一样的。 而在训练中,则是首先随机的将所有词放到一个Table当中,然后再把这些行列向量当做参数来进行训练。

而应用到RNN则其实是以一种特殊的方法,将行列分别输入到RNN当中,这个随后再说。

在试验中,LightRNN主要是训练了一个语言模型,并且取得了减小模型100倍,提升速度2倍的基础上,做到了不逊色于传统语言模型的性能。而LightRNN的目的也就是构建一个十分轻量化、但是不失性能的模型。

Related Work

为了解决当词表增大后,模型复杂度增加的问题,业界已经提出了很多的工作。

其中一部分工作,着力于解决由于Softmax需要遍历整个词表去计算概率所带来的时间开销问题。比如说引入层级的概念,将所有词进行聚类,并且使用一个二叉树去表示整个聚类后的结构,可以将时间复杂度降低到log(V)的级别。当然还有一些类似的方案,能够将它降低到根号V的这个级别。不过总体来说,这些方法都只能加速训练的时间,降低时间复杂度,但是并不能降低模型的大小。

而另一部分的工作,则是着力于解决模型的大小问题,比如一些特殊的Softmax结构,比如说Char-Level的卷积等等,但是这些工作减少的也并不显著,并且也不能降低训练的时间开销。

总而言之,似乎现在没有一种能够同时减少模型大小和提升训练速度的好方法,而本文提出的LightRNN却能够同时做到。

LightRNN

从这里开始,将会详细的介绍下LightRNN。

2-Component Shared Embedding

在LightRNN中,

这种共享行列向量的词嵌入方法,被称为2-Component Shared Embedding。



上图就是这种共享方法的一个示意图。

简单来说,在传统的词嵌入方法中,一个词对应一个embedding vector,而在LightRNN当中,将所有词放入一个表格当中,每个词拥有一个行坐标和一个列坐标,所有行坐标相同的词有着相同的行向量表示,对应的,相同的列坐标有着相同的列坐标表示。也就是一个Embedding Vector分成了两部分(2Component),一个是行,一个是列,并且按照对应的位置共享。于是乎,我们只需要 根号V个行向量,根号V个列向量,就可以表示整个词表了。极大的压缩的模型的大小。

2-Component Shared Embedding应用到RNN网络中的方式,也非常的简单,我们只需要交替的输出行、列向量进入RNN网络就可以。



需要说明的是,对于wt的预测,LightRNN使用的是上一个时刻的Xc和当前时刻的Xr的输出来计算的,这点需要注意下。

假设一个词的坐标是(n,m),并且我们需要计算的是wt这个词的概率,那么我们只需要简单的先后输入行列向量,并且将随后输出的两个值相乘使用,就可以计算出概率了。



相乘方法:



而在具体怎么训练词向量和列向量上,方式就是:

1、首先见表,然后随机初始化

2、和训练语言模型类似,并且设定一个停止条件(比如困惑度或者时间,达到一个标准后)就停止

3、固定2中学到的向量,调整上述表格中的分配,目标是最小化loss func

笔记就到这里吧,先,剩下的我不关心,也没看了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐