1. 程式人生 > >LightRNN 論文筆記:LightRNN: Memory and Computation-Efficient Recurrent Neural Networks

LightRNN 論文筆記:LightRNN: Memory and Computation-Efficient Recurrent Neural Networks

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

筆記就到這裡吧,先,剩下的我不關心,也沒看了