作者:Gidi Shperber
編譯:ronghuaiyang
在這篇文章中,你將學習什麼是doc2vec,它是如何構建的,它與word2vec有什麼關係,你可以用它做什麼,沒有數學公式。
介紹文本文檔的數字表示是機器學習中的一個具有挑戰性的任務。這種表示形式可以用於多種目的,例如:文檔檢索、web搜索、垃圾郵件過濾、主題建模等。
然而,沒有很多好的技術可以做到這一點。許多任務使用眾所周知的但過於簡單的方法如詞袋(BOW),但結果將大多是平庸的,因為BOW丟掉了許多微妙的可能的良好的表示,比如考慮單詞的順序。
LDA也是一種常見的主題建模技術(從文本中提取主題/關鍵字),但它很難調試,結果也很難評估。
在這篇文章中。我將回顧doc2vec的方法,在2014年由Mikilov和Le提出,我們要通過這篇文章提到很多次。值得一提的是,Mikilov也是word2vec的作者之一。
Doc2vec是一個非常好的技術。它很容易使用,結果很好,而且從它的名字就可以看出來,它主要基於word2vec。我們先來簡單介紹一下word2vec。
word2vecword2vec是一個眾所周知的概念,用於從單詞中生成表示向量。
網上有很多關於word2vec的好教程,但是如果描述doc2vec而沒有word2vec,就沒有意義了,所以我就簡單介紹一下。
一般來說,當你喜歡使用單詞構建模型時,簡單地標記/one-hot編碼是一種可行的方法。然而,當使用這種編碼時,這些詞就失去了它們的意義。比如,如果我們將Paris編碼為id_4, France編碼為id_6, power編碼為id_8,那麼France與power的關係將與Paris相同。我們希望France和Paris能比France和power更接近。
2013年在這篇文章:https://arxiv.org/abs/1301.3781中提出的word2vec,可以給你每個單詞的數字表示,並且能夠捕獲上述關係。這是機器學習中一個更廣泛概念的一部分——特徵向量。
這種表示法封裝了詞與詞之間的不同關係,如同義詞、反義詞或類似的東西,如這個:
圖1:國王對王后就像男人對女人。寫關於word2vec不附加這個內容是非法的Word2vec算法
這是怎麼做到的呢?word2vec表示使用兩種算法:連續的單詞袋模型(CBOW)和跳躍模型( Skip-Gram)。
連續詞袋模型連續的單詞包在當前單詞周圍創建一個滑動窗口,從「上下文」 — 周圍的單詞來預測它。每個單詞都表示為一個特徵向量。經過訓練,這些向量就變成了詞向量。
圖2:CBOW算法示意圖:用單詞「the」,「cat」,「sat」來預測「on」如前所述,表示相似單詞的向量對於不同的距離度量是相近的,並且額外地封裝了數值關係,如上面的king-queen=man。
Skip gram第二種算法,在同一篇文章中有描述,與CBOW完全相反:我們不是每次預測一個單詞,而是使用一個單詞來預測所有周圍的單詞(「上下文」)。Skip gram比CBOW慢得多,但是對於不經常出現的單詞,它被認為更準確。
Doc2vec在理解了word2vec是什麼之後,理解doc2vec是如何工作的就容易多了。
如前所述,doc2vec的目標是創建文檔的數字表示,而不管其長度如何。但與單詞不同的是,文檔不是以單詞這樣的邏輯結構出現的,因此必須找到另一種方法。
Mikilov和Le使用的概念很簡單,但很聰明:他們使用了word2vec模型,並添加了另一個向量(下面的段落ID),如下所示:
圖3:PV-DM模型如果你對上面的示意圖感到很熟悉,那是因為它是CBOW模型的一個小擴展。但是,除了使用單詞來預測下一個單詞之外,我們還添加了另一個特徵向量,它對於每個文檔是唯一的。
因此,當訓練單詞向量W時,也訓練了文檔向量D,在訓練結束時,它就有了文檔的數字表示。
上面的模型稱為Distributed Memory version of Paragraph Vector(PV-DM)。它就像一個記憶體,記住當前上下文缺少的內容 — 或者作為段落的主題。單詞向量表示單詞的概念,而文檔向量表示文檔的概念。
在word2vec中,可以使用另一種類似於skip-gram的算法,即Distributed Bag of Words version of Paragraph Vector (PV-DBOW)。
圖4:PV-DBOW模型在這裡,這個算法實際上更快(與word2vec相反),並且消耗更少的內存,因為不需要保存詞向量。
在這篇文章中,作者聲明他們推薦使用這兩種算法的組合,儘管PV-DM模型更優,並且通常會自己就可以得到最先進的結果。
doc2vec模型可按以下方式使用:對於訓練,需要一組文檔。每個單詞生成一個單詞向量W,每個文檔生成一個文檔向量D。該模型還為softmax隱層訓練權重。在推理階段,可以使用一個新的文檔,然後固定所有的權值來計算文檔向量。
模型評估和一點想法這種無監督模型的問題在於,它們沒有被訓練去完成它們本來要完成的任務。比如說, word2vec訓練完成語料庫中的包圍詞,但用於估計詞之間的相似度或關係。因此,衡量這些算法的性能可能具有挑戰性。我們已經看到了「國王」、「皇后」、「男人」、「女人」的例子,但我們想讓它成為一種評估機器學習模型的嚴格方法。
因此,在訓練這些算法時,我們應該注意相關的度量。word2vec的一個可能的度量標準是對上述示例的概括,稱為類比推理。它包含許多類似的組合,如下:
happy happily — furious furiously
immediate immediately — infrequent infrequently
slowing slowed — sleeping slept
spending spent — striking struck
這個任務的成功之處在於,當計算匹配對之間的距離時,可以得到非常接近的結果。
數據集在http://download.tensorflow.org/data/questions-words.txt。
Doc2vec在文章中測試了兩個任務:第一個是情緒分析,第二個類似於上面的類比推理。
這是文章中的三段。這些段落的數據集被用來比較模型。很容易看出哪兩個比較接近:
這個數據集(據我所知沒有共享)用來比較一些模型,doc2vec是最好的:
我的一個客戶,使用機器學習方法來進行you-tube視頻到內容文章的匹配。Doc2vec似乎是一個很好的匹配方法。
有個例子是這樣的,有一篇文章,是關於在家裡用樹樁做燈的,在文章的底部,可以看到4部木工相關的視頻。
ScaleAbout當前的模型使用標籤機制對視頻和文章進行標註(「topic modeling」),並測量標籤之間的距離。
ScaleAbout有一些與客戶主題相關的語料庫。比如說,有一個10萬手動標記的文件「do it yourself」,就像上面說過的,是給出版商準備的。每篇文章有17個可能的標籤。如「家居裝飾」、「園藝」、「改建及翻新」等。在這個實驗中,我們決定嘗試使用doc2vec和其他一些模型來預測標籤。
ScaleAbout目前最好的模型是一個卷積神經網絡,它建立在word2vec的基礎上,在預測文檔標籤方面達到了70%的準確率。
Doc2vec模型本身是一個無監督的方法,所以需要稍微調整一下「參與」這個比賽。幸運的是,在大多數情況下,我們可以使用一些技巧:如果你還記得,在圖3中我們添加了另一個文檔向量,它對於每個文檔都是惟一的。如果你想一下,可以添加更多的向量,它們不一定是唯一的:例如,如果我們的文檔有標籤(實際上我們有),我們可以添加它們,並得到它們作為向量的表示。
此外,它們不必是唯一的。通過這種方式,我們可以將17個標記中的一個添加到唯一的文檔標記中,並為它們創建一個doc2vec表示!見下圖:
圖5:帶標籤向量的doc2vec模型我們使用gensim實現了doc2vec。下面是gensim TaggedDocument:
gensim TaggedDocument。SENT_3是惟一的文檔id,remodeling和renovating是標記使用gensim doc2vec非常簡單。像往常一樣,模型應該被初始化,訓練幾個階段:
然後我們可以檢查每個唯一的文檔與每個標籤的相似度,這樣做:
預測與文檔相似度最高的標籤。
使用這種方法,我們在100K篇文章中只訓練了10K篇,我們的準確率就達到了74%,比以前更好。
總結我們已經看到,通過一些調整,我們可以從一個已經非常有用的word2vec模型中獲得更多。這很好,因為正如前面所說,在我看來,表示文檔的標記和匹配還有很長的路要走。
此外,這表明,這是一個很好的例子,說明機器學習模型如何封裝了更多的能力,而不僅僅是它們所訓練的特定任務。這可以在深度CNNs中看到,它訓練用於對象分類,但也可以用於語義分割或聚類圖像。
最後,如果你有一些與文檔相關的任務 — 這可能是一個很好的模型!
英文原文:https://medium.com/wisio/a-gentle-introduction-to-doc2vec-db3e8c0cce5e