2013年,Google開源了一款用於詞向量計算的工具——word2vec,引發了工業界和學術界的關注。首先,word2vec能夠在百萬數量級的詞典和上億的數據集上進行高效地訓練;其次,該工具獲得的訓練結果——詞向量(word embedding),能夠很好地度量詞與詞之間的類似性。隨着深度學習(Deep Learning)在天然語言處理中應用的普及,不少人誤覺得word2vec是一種深度學習算法。其實word2vec算法的背後是一個淺層神經網絡。另外須要強調的一點是,word2vec是一個計算word vector的開源工具。當咱們在說word2vec算法或模型的時候,其實指的是其背後用於計算word vector的CBoW模型和Skip-gram模型。不少人覺得word2vec指的是一個算法或模型,這也是一種謬誤。接下來,本文將從統計語言模型出發,儘量詳細地介紹word2vec工具背後的算法模型的前因後果。算法
在深刻word2vec算法的細節以前,咱們首先回顧一下天然語言處理中的一個基本問題:如何計算一段文本序列在某種語言下出現的機率?之所爲稱其爲一個基本問題,是由於它在不少NLP任務中都扮演着重要的角色。例如,在機器翻譯的問題中,若是咱們知道了目標語言中每句話的機率,就能夠從候選集合中挑選出最合理的句子作爲翻譯結果返回。網絡
統計語言模型給出了這一類問題的一個基本解決框架。對於一段文本序列
\[ S=w_1, w_2, ... , w_T \]
它的機率能夠表示爲:
\[ P(S)=P(w_1, w_2, ..., w_T)=\prod_{t=1}^Tp(w_t|w_1, w_2, ..., w_{t-1}) \]
即將序列的聯合機率轉化爲一系列條件機率的乘積。問題變成了如何去預測這些給定previous words下的條件機率:
\[ p(w_t|w_1,w_2,...,w_{t-1}) \]
因爲其巨大的參數空間,這樣一個原始的模型在實際中並無什麼用。咱們更多的是採用其簡化版本——Ngram模型:
\[ p(w_t|w_1, w_2, ..., w_{t-1}) \approx p(w_t|w_{t-n+1}, ..., w_{t-1}) \]
常見的如bigram模型(N=2)和trigram模型(N=3)。事實上,因爲模型複雜度和預測精度的限制,咱們不多會考慮N>3的模型。app
咱們能夠用最大似然法去求解Ngram模型的參數——等價於去統計每一個Ngram的條件詞頻。框架
爲了不統計中出現的零機率問題(一段從未在訓練集中出現過的Ngram片斷會使得整個序列的機率爲0),人們基於原始的Ngram模型進一步發展出了back-off trigram模型(用低階的bigram和unigram代替零機率的trigram)和interpolated trigram模型(將條件機率表示爲unigram、bigram、trigram三者的線性函數)。此處再也不贅述。感興趣者可進一步閱讀相關的文獻[3]。分佈式
不過,Ngram模型仍有其侷限性。首先,因爲參數空間的爆炸式增加,它沒法處理更長程的context(N>3)。其次,它沒有考慮詞與詞之間內在的聯繫性。例如,考慮"the cat is walking in the bedroom"這句話。若是咱們在訓練語料中看到了不少相似「the dog is walking in the bedroom」或是「the cat is running in the bedroom」這樣的句子,那麼,即便咱們沒有見過這句話,也能夠從「cat」和「dog」(「walking」和「running」)之間的類似性,推測出這句話的機率[3]。然而, Ngram模型作不到。函數
這是由於,Ngram本質上是將詞當作一個個孤立的原子單元(atomic unit)去處理的。這種處理方式對應到數學上的形式是一個個離散的one-hot向量(除了一個詞典索引的下標對應的方向上是1 ,其他方向上都是0)。例如,對於一個大小爲5的詞典:{"I", "love", "nature", "luaguage", "processing"},「nature」對應的one-hot向量爲:[0,0,1,0,0] 。顯然,one-hot向量的維度等於詞典的大小。這在動輒上萬甚至百萬詞典的實際應用中,面臨着巨大的維度災難問題(The Curse of Dimensionality)工具
因而,人們就天然而然地想到,可否用一個連續的稠密向量去刻畫一個word的特徵呢?這樣,咱們不只能夠直接刻畫詞與詞之間的類似度,還能夠創建一個從向量到機率的平滑函數模型,使得類似的詞向量能夠映射到相近的機率空間上。這個稠密連續向量也被稱爲word的distributed representation[3]。學習
事實上,這個概念在信息檢索(Information Retrieval)領域早就已經被普遍地使用了。只不過,在IR領域裏,這個概念被稱爲向量空間模型(Vector Space Model,如下簡稱VSM)。優化
VSM是基於一種Statistical Semantics Hypothesis[4]:語言的統計特徵隱藏着語義的信息(Statistical pattern of human word usage can be used to figure out what people mean)。例如,兩篇具備類似詞分佈的文檔能夠被認爲是有着相近的主題。這個Hypothesis有不少衍生版本。其中,比較廣爲人知的兩個版本是Bag of Words Hypothesis和Distributional Hypothesis。前者是說,一篇文檔的詞頻(而不是詞序)表明了文檔的主題;後者是說,上下文環境類似的兩個詞有着相近的語義。後面咱們會看到,word2vec算法也是基於Distributional的假設。ui
那麼,VSM是如何將稀疏離散的one-hot詞向量映射爲稠密連續的Distributional Representation的呢?
簡單來講,基於Bag of Words Hypothesis,咱們能夠構造一個term-document矩陣\(A\):矩陣的行\(A_{i,:}\): 對應着詞典裏的一個word;矩陣的列\(A_{:,j}\)對應着訓練語料裏的一篇文檔;矩陣裏的元素\(A_{i,j}\)表明着word\(w_i\)在文檔\(D_j\)中出現的次數(或頻率)。那麼,咱們就能夠提取行向量作爲word的語義向量(不過,在實際應用中,咱們更多的是用列向量作爲文檔的主題向量)。
相似地,咱們能夠基於Distributional Hypothesis構造一個word-context的矩陣。此時,矩陣的列變成了context裏的word,矩陣的元素也變成了一個context窗口裏word的共現次數。
注意,這兩類矩陣的行向量所計算的類似度有着細微的差別:term-document矩陣會給常常出如今同一篇document裏的兩個word賦予更高的類似度;而word-context矩陣會給那些有着相同context的兩個word賦予更高的類似度。後者相對於前者是一種更高階的類似度,所以在傳統的信息檢索領域中獲得了更加普遍的應用。
不過,這種co-occurrence矩陣仍然存在着數據稀疏性和維度災難的問題。爲此,人們提出了一系列對矩陣進行降維的方法(如LSI/LSA等)。這些方法大都是基於SVD的思想,將原始的稀疏矩陣分解爲兩個低秩矩陣乘積的形式。
關於VSM更多的介紹,能夠進一步閱讀文末的參考文獻[4]。
接下來,讓咱們回到對統計語言模型的討論。鑑於Ngram等模型的不足,2003年,Bengio等人發表了一篇開創性的文章:A neural probabilistic language model[3]。在這篇文章裏,他們總結出了一套用神經網絡創建統計語言模型的框架(Neural Network Language Model,如下簡稱NNLM),並首次提出了word embedding的概念(雖然沒有叫這個名字),從而奠基了包括word2vec在內後續研究word representation learning的基礎。
NNLM模型的基本思想能夠歸納以下:
值得注意的一點是,這裏的詞向量也是要學習的參數。
在03年的論文裏,Bengio等人採用了一個簡單的前向反饋神經網絡\(f(w_{t-n+1},...,w_{t})\)來擬合一個詞序列的條件機率\(p(w_t|w_1,w_2,...,w_{t-1})\)。整個模型的網絡結構見下圖:
咱們能夠將整個模型拆分紅兩部分加以理解:
首先是一個線性的Embedding層。它將輸入的N−1個one-hot詞向量,經過一個共享的D×V的矩陣C,映射爲N−1個分佈式的詞向量(distributed vector)。其中,V是詞典的大小,D是Embedding向量的維度(一個先驗參數)。C矩陣裏存儲了要學習的word vector。
其次是一個簡單的前向反饋神經網絡g。它由一個tanh隱層和一個softmax輸出層組成。經過將Embedding層輸出的N−1個詞向量映射爲一個長度爲V的機率分佈向量,從而對詞典中的word在輸入context下的條件機率作出預估:
\[ p(w_i|w_1,w_2,...,w_{t-1}) \approx f(w_i, w_{t-1}, ..., w_{t-n+1}) = g(w_i, C(w_{t-n+1}), ..., C(w_{t-1})) \]
咱們能夠經過最小化一個cross-entropy的正則化損失函數來調整模型的參數θ:
\[ L(\theta)=\frac{1}{T}\sum_t{\log{f(w_t, w_{t-1}, ..., w_{t-n+1})}}+R(\theta) \]
其中,模型的參數θ包括了Embedding層矩陣C的元素,和前向反饋神經網絡模型g裏的權重。這是一個巨大的參數空間。不過,在用SGD學習更新模型的參數時,並非全部的參數都須要調整(例如未在輸入的context中出現的詞對應的詞向量)。計算的瓶頸主要是在softmax層的歸一化函數上(須要對詞典中全部的word計算一遍條件機率)。
然而,拋卻複雜的參數空間,咱們不由要問,爲何這樣一個簡單的模型會取得巨大的成功呢?
仔細觀察這個模型就會發現,它其實在同時解決兩個問題:一個是統計語言模型裏關注的條件機率\(p(w_t|context)\)的計算;一個是向量空間模型裏關注的詞向量的表達。而這兩個問題本質上並不獨立。經過引入連續的詞向量和平滑的機率模型,咱們就能夠在一個連續空間裏對序列機率進行建模,從而從根本上緩解數據稀疏性和維度災難的問題。另外一方面,以條件機率\(p(w_t|context)\)爲學習目標去更新詞向量的權重,具備更強的導向性,同時也與VSM裏的Distributional Hypothesis不謀而合。
鋪墊了這麼多,終於要輪到主角出場了。
不過在主角正式登場前,咱們先看一下NNLM存在的幾個問題。
一個問題是,同Ngram模型同樣,NNLM模型只能處理定長的序列。在03年的論文裏,Bengio等人將模型可以一次處理的序列長度N提升到了5,雖然相比bigram和trigram已是很大的提高,但依然缺乏靈活性。
所以,Mikolov等人在2010年提出了一種RNNLM模型[7],用遞歸神經網絡代替原始模型裏的前向反饋神經網絡,並將Embedding層與RNN裏的隱藏層合併,從而解決了變長序列的問題。
另外一個問題就比較嚴重了。NNLM的訓練太慢了。即使是在百萬量級的數據集上,即使是藉助了40個CPU進行訓練,NNLM也須要耗時數週才能給出一個稍微靠譜的解來。顯然,對於如今動輒上千萬甚至上億的真實語料庫,訓練一個NNLM模型幾乎是一個impossible mission。
這時候,仍是那個Mikolov站了出來。他注意到,原始的NNLM模型的訓練其實能夠拆分紅兩個步驟:
若是咱們只是想獲得word的連續特徵向量,是否是能夠對第二步裏的神經網絡模型進行簡化呢?
Mikolov是這麼想的,也是這麼作的。他在2013年一口氣推出了兩篇paper,並開源了一款計算詞向量的工具——至此,word2vec橫空出世,主角閃亮登場。
下面,我將帶領你們簡單剖析下word2vec算法的原理。有了前文的基礎,理解word2vec算法就變得很簡單了。
首先,咱們對原始的NNLM模型作以下改造:
獲得的模型稱之爲CBoW模型(Continuous Bag-of-Words Model),也是word2vec算法的第一個模型:
從數學上看,CBoW模型等價於一個詞袋模型的向量乘以一個Embedding矩陣,從而獲得一個連續的embedding向量。這也是CBoW模型名稱的由來。
CBoW模型依然是從context對target word的預測中學習到詞向量的表達。反過來,咱們可否從target word對context的預測中學習到word vector呢?答案顯然是能夠的:
這個模型被稱爲Skip-gram模型(名稱源於該模型在訓練時會對上下文環境裏的word進行採樣)。
若是將Skip-gram模型的前向計算過程寫成數學形式,咱們獲得:
\[ p(w_o|w_i)=\frac{e^{U_o \cdot V_i}}{\sum_j{e^{U_j \cdot V_i}}} \]
其中,\(V_i\)是Embedding層矩陣裏的列向量,也被稱爲\(w_i\)的input vector。\(U_j\)是softmax層矩陣裏的行向量,也被稱爲\(w_i\)的output vector。
所以,Skip-gram模型的本質是計算輸入word的input vector與目標word的output vector之間的餘弦類似度,並進行softmax歸一化。咱們要學習的模型參數正是這兩類詞向量。
然而,直接對詞典裏的V個詞計算類似度並歸一化,顯然是一件極其耗時的impossible mission。爲此,Mikolov引入了兩種優化算法:層次Softmax(Hierarchical Softmax)和負採樣(Negative Sampling)。
層次Softmax的方法最先由Bengio在05年引入到語言模型中。它的基本思想是將複雜的歸一化機率分解爲一系列條件機率乘積的形式:
\[ p(v|context)=\prod_{i=1}^m{p(b_i(v)|b_1(v), ..., b_{i-1}(v), context)} \]
其中,每一層條件機率對應一個二分類問題,能夠經過一個簡單的邏輯迴歸函數去擬合。這樣,咱們將對V個詞的機率歸一化問題,轉化成了對logV個詞的機率擬合問題。
咱們能夠經過構造一顆分類二叉樹來直觀地理解這個過程。首先,咱們將原始字典D劃分爲兩個子集D一、D2,並假設在給定context下,target word屬於子集D1的機率\(p(w_t \in D_1|context)\)服從logistical function的形式:
\[ p(w_t \in D_1|context)=\frac{1}{1+e^{-U_{D_{root}} \cdot V_{w_t}}} \]
其中,\(U_{D_{root}}\)和\(V_{w_t}\)都是模型的參數。
接下來,咱們能夠對子集D1和D2進一步劃分。重複這一過程,直到集合裏只剩下一個word。這樣,咱們就將原始大小爲V的字典D轉換成了一顆深度爲logV的二叉樹。樹的葉子節點與原始字典裏的word一一對應;非葉節點則對應着某一類word的集合。顯然,從根節點出發到任意一個葉子節點都只有一條惟一路徑——這條路徑也編碼了這個葉子節點所屬的類別。
同時,從根節點出發到葉子節點也是一個隨機遊走的過程。所以,咱們能夠基於這顆二叉樹對葉子節點出現的似然機率進行計算。例如,對於訓練樣本里的一個target word \(w_t\),假設其對應的二叉樹編碼爲\(\{1, 0, 1, ..., 1\}\),則咱們構造的似然函數爲:
\[ p(w_t|context)=p(D_1=1|context)p(D_2=0|D_1=1)\dots p(w_t|D_k=1) \]
乘積中的每一項都是一個邏輯迴歸的函數。
咱們能夠經過最大化這個似然函數來求解二叉樹上的參數——非葉節點上的向量,用來計算遊走到某一個子節點的機率。
層次Softmax是一個很巧妙的模型。它經過構造一顆二叉樹,將目標機率的計算複雜度從最初的V下降到了logV 的量級。不過付出的代價是人爲加強了詞與詞之間的耦合性。例如,一個word出現的條件機率的變化,會影響到其路徑上全部非葉節點的機率變化,間接地對其餘word出現的條件機率帶來不一樣程度的影響。所以,構造一顆有意義的二叉樹就顯得十分重要。實踐證實,在實際的應用中,基於Huffman編碼的二叉樹能夠知足大部分應用場景的需求。
負採樣的思想最初來源於一種叫作Noise-Contrastive Estimation的算法[6],本來是爲了解決那些沒法歸一化的機率模型的參數預估問題。與改造模型輸出機率的Hierarchical Softmax算法不一樣,NCE算法改造的是模型的似然函數。
以Skip-gram模型爲例,其原始的似然函數對應着一個Multinomial的分佈。在用最大似然法求解這個似然函數時,咱們獲得一個cross-entropy的損失函數:
\[ J(\theta)=-\frac{1}{T}\sum_{t=1}^T{\sum_{-c \leq j \leq c, j \neq 0}{\log p(w_{t+j}|w_t)}} \]
式中的\(p(w_{t+j}|w_t)\)是一個在整個字典上歸一化了的機率。
而在NCE算法中,咱們構造了這樣一個問題:對於一組訓練樣本,咱們想知道,target word的出現,是來自於context的驅動,仍是一個事先假定的背景噪聲的驅動?顯然,咱們能夠用一個邏輯迴歸的函數來回答這個問題:
\[ p(D=1|w, context)=\frac{p(w|context)}{p(w|context)+kp_n(w)}=\sigma (\log p(w|context) - \log kp_n(w)) \]
這個式子給出了一個target word \(w\)來自於context驅動的機率。其中,\(k\)是一個先驗參數,代表噪聲的採樣頻率。\(p(w|context)\)是一個非歸一化的機率分佈,這裏採用softmax歸一化函數中的分子部分。\(p_n(w)\)則是背景噪聲的詞分佈。一般採用word的unigram分佈。
經過對噪聲分佈的\(k\)採樣,咱們獲得一個新的數據集。其中,label標記了數據的來源(真實數據分佈仍是背景噪聲分佈?)。在這個新的數據集上,咱們就能夠用最大化上式中邏輯迴歸的似然函數來求解模型的參數。
而Mikolov在2013年的論文裏提出的負採樣算法, 是NCE的一個簡化版本。在這個算法裏,Mikolov拋棄了NCE似然函數中對噪聲分佈的依賴,直接用原始softmax函數裏的分子定義了邏輯迴歸的函數,進一步簡化了計算:
\[ p(D=1|w_o, w_i)=\sigma (U_o \cdot V_i) \]
此時,模型相應的目標函數變爲:
\[ J(\theta) = \log \sigma(U_o \cdot V_i) + \sum_{j=1}^k{E_{w_j \sim p_n(w)}[\log \sigma(- U_j \cdot V_i)]} \]
除了這裏介紹的層次Softmax和負採樣的優化算法,Mikolov在13年的論文裏還介紹了另外一個trick:下采樣(subsampling)。其基本思想是在訓練時依機率隨機丟棄掉那些高頻的詞:
\[ p_{discard}(w) = 1 - \sqrt{\frac{t}{f(w)}} \]
其中,\(t\)是一個先驗參數,通常取爲\(10^{-5}\)。\(f(w)\)是\(f(w)\)在語料中出現的頻率。
實驗證實,這種下采樣技術能夠顯著提升低頻詞的詞向量的準確度。
介紹完word2vec模型的算法和原理,咱們來討論一些輕鬆點的話題——模型的應用。
13年word2vec模型橫空出世後,人們最津津樂道的是它學到的向量在語義和語法類似性上的應用——尤爲是這種類似性竟然對數學上的加減操做有意義[8]!最經典的一個例子是,\(v("King") - v("Man") + v("Woman") = v("Queen")\)。然而,這種例子彷佛並無太多實際的用途。
除此以外,word2vec模型還被應用於機器翻譯和推薦系統領域。
與後來提出的在sentence level上進行機器翻譯的RNN模型不一樣,word2vec模型主要是用於詞粒度上的機器翻譯。
具體來講,咱們首先從大量的單語種語料中學習到每種語言的word2vec表達,再借助一個小的雙語語料庫學習到兩種語言word2vec表達的線性映射關係\(W\)。構造的損失函數爲:
\[ J(W)=\sum_{i=1}^n{||Wx_i - z_i||^2} \]
在翻譯的過程當中,咱們首先將源語言的word2vec向量經過矩陣W映射到目標語言的向量空間上;再在目標語言的向量空間中找出與投影向量距離最近的word作爲翻譯的結果返回。
其原理是,不一樣語言學習到的word2vec向量空間在幾何上具備必定的同構性。映射矩陣W本質上是一種空間對齊的線性變換。
本質上,word2vec模型是在word-context的co-occurrence矩陣基礎上創建起來的。所以,任何基於co-occurrence矩陣的算法模型,均可以套用word2vec算法的思路加以改進。
好比,推薦系統領域的協同過濾算法。
協同過濾算法是創建在一個user-item的co-occurrence矩陣的基礎上,經過行向量或列向量的類似性進行推薦。若是咱們將同一個user購買的item視爲一個context,就能夠創建一個item-context的矩陣。進一步的,能夠在這個矩陣上借鑑CBoW模型或Skip-gram模型計算出item的向量表達,在更高階上計算item間的類似度。
關於word2vec更多應用的介紹,能夠進一步參考這篇文獻[10]。
最後,我想簡單闡述下我對Word Embedding的幾點思考。不必定正確,也歡迎你們提出不一樣的意見。
Word embedding最先出現於Bengio在03年發表的開創性文章中[3]。經過嵌入一個線性的投影矩陣(projection matrix),將原始的one-hot向量映射爲一個稠密的連續向量,並經過一個語言模型的任務去學習這個向量的權重。這一思想後來被普遍應用於包括word2vec在內的各類NLP模型中。
Word Embedding的訓練方法大體能夠分爲兩類:一類是無監督或弱監督的預訓練;一類是端對端(end to end)的有監督訓練。
無監督或弱監督的預訓練以word2vec和auto-encoder爲表明。這一類模型的特色是,不須要大量的人工標記樣本就能夠獲得質量還不錯的Embedding向量。不過由於缺乏了任務導向,可能和咱們要解決的問題還有必定的距離。所以,咱們每每會在獲得預訓練的Embedding向量後,用少許人工標註的樣本去fine-tune整個模型。
相比之下,端對端的有監督模型在最近幾年裏愈來愈受到人們的關注。與無監督模型相比,端對端的模型在結構上每每更加複雜。同時,也由於有着明確的任務導向,端對端模型學習到的Embedding向量也每每更加準確。例如,經過一個Embedding層和若干個卷積層鏈接而成的深度神經網絡以實現對句子的情感分類,能夠學習到語義更豐富的詞向量表達。
Word Embedding的另外一個研究方向是在更高層次上對Sentence的Embedding向量進行建模。
咱們知道,word是sentence的基本組成單位。一個最簡單也是最直接獲得sentence embedding的方法是將組成sentence的全部word的embedding向量所有加起來——相似於CBoW模型。
顯然,這種簡單粗暴的方法會丟失不少信息。
另外一種方法借鑑了word2vec的思想——將sentence或是paragraph視爲一個特殊的word,而後用CBoW模型或是Skip-gram進行訓練[12]。這種方法的問題在於,對於一篇新文章,老是須要從新訓練一個新的sentence2vec。此外,同word2vec同樣,這個模型缺乏有監督的訓練導向。
我的感受比較靠譜的是第三種方法——基於word embedding的端對端的訓練。Sentence本質上是word的序列。所以,在word embedding的基礎上,咱們能夠鏈接多個RNN模型或是卷積神經網絡,對word embedding序列進行編碼,從而獲得sentence embedding。
這方面的工做已有不少。有機會,我會再寫一篇關於sentence embedding的綜述。
[1]: Mikolov, T., Chen, K., Corrado, G., & Dean, J. (2013, January 17). Efficient Estimation of Word Representations in Vector Space. arXiv.org.
[2]: Mikolov, T., Sutskever, I., Chen, K., Corrado, G., & Dean, J. (2013, October 17). Distributed Representations of Words and Phrases and their Compositionality. arXiv.org.
[3]: Bengio, Y., Ducharme, R., Vincent, P., & Janvin, C. (2003). A neural probabilistic language model. The Journal of Machine Learning Research, 3, 1137–1155.
[4]: Turney, P. D., & Pantel, P. (2010). From frequency to meaning: vector space models of semantics. Journal of Artificial Intelligence Research, 37(1).
[5]: Morin, F., & Bengio, Y. (2005). Hierarchical Probabilistic Neural Network Language Model. Aistats.
[6]: Mnih, A., & Kavukcuoglu, K. (2013). Learning word embeddings efficiently with noise-contrastive estimation, 2265–2273.
[7]: Mikolov, T., Karafiát, M., Burget, L., & Cernocký, J. (2010). Recurrent neural network based language model. Interspeech.
[8]: Mikolov, T., Yih, W., & Zweig, G. (2013). Linguistic Regularities in Continuous Space Word Representations. Hlt-Naacl.
[9]: Mikolov, T., Le, Q. V., & Sutskever, I. (2013, September 17). Exploiting Similarities among Languages for Machine Translation. arXiv.org.
[10]: Collobert, R., Weston, J., Bottou, L., Karlen, M., Kavukcuoglu, K., & Kuksa, P. (2011). Natural Language Processing (Almost) from Scratch. Journal of Machine Learning Research, 12(Aug), 2493–2537.
[11]: Barkan, O., & Koenigstein, N. (2016, March 14). Item2Vec: Neural Item Embedding for Collaborative Filtering. arXiv.org.
[12]: Le, Q. V., & Mikolov, T. (2014, May 16). Distributed Representations of Sentences and Documents. arXiv.org.