1. 程式人生 > >實時翻譯的發動機:矢量語義(斯坦福大學課程解讀)

實時翻譯的發動機:矢量語義(斯坦福大學課程解讀)

處理 多個 abi rod 進一步 ews 有一種 deb rac

技術分享圖片


大家好,我是為人造的智能操碎了心的智能禪師。

GraphDB 近期剛剛升級到 8.7 版本號,此次特別更新了矢量語義包。直接以插件形式整合到程序中。

矢量語義在 NLP 領域,有著非常重要的意義。它用矢量的方式。加快了計算機學習新詞匯的速度。讓機器翻譯、實時翻譯、聊天機器人智能化等,成為可能。

全文大約5500字。讀完可能須要好幾首以下這首歌的時間

??

技術分享圖片

預備知識

回想一下我們讀書時候,碰到不認識的詞是怎樣操作的。

一種方式是直接查字典;還有一種方式是先不理會這個詞,繼續往下閱讀,當你越來越多的讀到包括這個詞的句子。詞的含義也開始逐漸清楚起來。

技術分享圖片

來源:Reaching Higher NH


傳統 NLP,比方之前禪師發過的文章,類似查字典的方式,非常可能導致詞義和上下文脫節。比如 one-hot encoding。他覺得“狗”和“貓”就是兩個東西。即使你在下文中,明白指出來他們都是動物、都是寵物。

非常明顯,這種方式去做分詞、打標簽還能夠,要想實現翻譯、甚至聊天功能,那簡直是不可能。

舉個樣例。?Tesgüino

?這個詞。預計沒幾個人認識,機器自然也不僅僅是。可是當我們有了以下 4 個句子:

  1. 桌子上有一瓶 Tesgüino?

  2. 大家都喜歡 Tesgüino

  3. Tesgüino 能喝醉

  4. Tesgüino 是用玉米制成的

非常easy就能聯想出,Tesgüino 是一種酒(能喝醉)。是裝在瓶子裏,用玉米制成。

盡管還是不知道 Tesgüino 什麽樣子。聞起來什麽味道,喝起來什麽感覺。但我們已經能夠想象出這東西可能和高粱酒、伏特加、龍舌蘭幾乎相同。可能還更好喝一點(大家都喜歡)。

就這樣。通過一個新詞周邊的近似詞,我們也能猜測出這個新詞的含義。

單詞向量是一行實數值(與虛數相對),當中每個點捕獲單詞的含義的維度。而且語義上類似的單詞具有類似的向量。

所以我們僅僅要計算出語義向量的類似度。就能非常好的解決 NLU。那麽接下來,考驗智商的時刻到了(假設實在看不懂,拉到文末,相信會對你有所幫助)。

有請 NLP 一線開發人員羅周楊,為大家解讀一下斯坦福經典 NLP 課程中,矢量語義向量類似度計算。

關於羅周楊:

某互聯網公司 NLP 開發人員

最不喜歡的語言:JavaScript

推薦的電腦軟件:Jetbrains 全家桶

推薦3本書:《Java編程思想》《深入理解計算機系統》《深度學習》

向量

文檔和向量

假設用向量來表示一個文檔,該怎麽表示呢?

我們再莎士比亞的4部作品裏(文檔),找了4個詞,我們統計各個單詞在文檔中出現的次數,能夠得到一張表格:

技術分享圖片


上面表中。有4個單詞。所以每個文檔能夠表示成一個由單詞頻率組成的向量:

技術分享圖片


假設單詞有非常多個,假設是N,那麽每個文檔就能夠表示成一個N維的向量。可見,這種向量表示是稀疏的(sparse)。

單詞和向量

除了文檔能夠表示成一個向量。單詞也能夠。

和文檔類似,我們能夠統計出一張表格,可是不同的是,我們不是統計單詞的個數。而是統計兩個單詞出如今一起的頻數。

看一張表格你就知道了:

技術分享圖片


這個表格是一個 V×V 的表格,每個數字表示當前列的單詞出如今當前行單詞後面的次數,這就構成了上下文,所以這個表格事實上就是一個上下文矩陣,當中 V 就是總的詞典的大小,也就是單詞的數量。

我們取出每一行。就能夠得到一個單詞的向量表示,比如:

技術分享圖片


相同的,這種表示也是稀疏的。

Cos 計算類似度

如今我們已經有文檔或者單詞的向量表示了,那麽該怎樣計算它們之間的類似度呢?一個非經常見的方法就是余弦類似度(Cosine similarity)。

學過高中數學就知道,兩個向量的點積(dot-product)或者內積(inner product)能夠由以下公式計算:

技術分享圖片


而向量的模(vector length)為:

技術分享圖片

又:

技術分享圖片

即:

技術分享圖片

所以。我們能夠計算技術分享圖片技術分享圖片的余弦值:

技術分享圖片

所以,兩個向量的余弦值越大,它們越類似。

接下來就要介紹TF-IDF了。

TF-IDF

首先解釋一下這個詞:TF-IDF = Term Frequency - Inverse Document Frequency

當中term-frequency是單詞

技術分享圖片

在文檔中出現的次數。

那麽什麽是 IDF 呢?首先我們弄清楚 DF(document frequency)。

DFT 表示出現過這個單詞的文檔(document)的個數。

那麽,IDF就是:

技術分享圖片

當中。N就是一個集合(collection)中的documents數量。

為了避免數值過大,一般會取對數:

技術分享圖片

至此。我們能夠計算這個單詞 t 的tf-idf權值:

技術分享圖片

此時,我們的第一個表格,就變成了:

技術分享圖片


到眼下為止,上面的全部向量表示都是稀疏的。接下來要介紹一種稠密的(dense))的向量表示:word2vec

Word2Vec

這個大家應該非常熟悉了,應該算是NLP領域的標配了。,可是假設你沒有一點基礎的話,有些概念還是難以理解。想要相對完整地理解 word2vec。你須要結合多方面的資料。

TensorFlow 有一個教程《Vector Representations of Words》,文末擴展閱讀也給出了參考鏈接。

Word embedding

首先我們解釋一下詞嵌入(word embedding)的概念。咱們之前的全部向量表示都是稀疏的。通常都是一個高維的向量。向量裏面的元素大部分都是0。那麽 embedding 有什麽不一樣的呢?

Embedding 相同也是用一個向量來表示一個詞,可是它是使用一個較低維度、稠密地表示。

假設使用之前的稀疏表示。你可能會這樣表示hello這個詞語:

技術分享圖片

使用 embedding 表示後:

技術分享圖片

當中的差異一眼就看出來了。所以非常明顯。word embedding有優點:

  1. 不會造成維度爆炸,由於維度是我們自己設置的。通常比較小

  2. 向量是稠密的,不須要稀疏向量所採用的各種優化算法來提升計算效率

詞嵌入理解了,那麽什麽是word2vec呢?事實上就是把單詞表示成固定維度的稠密的向量!

說起來簡單,可是也有非常多小技巧的。

數據模型

假設我們有一個非常大的文本語料,我們須要用這個語料來訓練出單詞的向量表示。那麽該怎麽訓練呢?

word2vec 有兩種經常使用的數據準備方式:

CBOW。用前後詞(context words)預測目標詞(target word) skip-gram,用目標詞(target word)預測前後詞(context word)。

我們用一個英語標準的測試鍵盤按鍵是否工作完善的句子開始:

the quick brown fox jumped over the lazy dog

這句話裏包括了全部的英文字母。

假設我們的窗體大小(window size)是2,目標詞選擇 fox。

假設是 skip-gram 模型,我們會這樣準備數據:

技術分享圖片

也就是一個目標詞,我們能夠構造出window_size個訓練數據對。

假設是 CBOW 模型。我們會這樣準備數據:

技術分享圖片

看出當中的差異了吧?

總之,skip-gram 和 CBOW 就是兩個相反的數據模型。

Learning Word Embedding有兩張圖能夠分別表示兩種模型的輸入方式:

技術分享圖片

??skip-gram 模型


技術分享圖片

??CBOW 模型


數據模型應該清楚了。

與之前不同的是,word2vec 並不關心相鄰單詞之前一起出現的頻數,而是僅僅關心,這個單詞是不是屬於還有一個單詞的上下文(context)!也就是說,word2vec 不關系依據這個詞預測出的下一個詞語是什麽。而是僅僅關心這兩個詞語之間是不是有上下文關系。

於是,word2vec 須要的僅僅是一個二分類器:“這個單詞是還有一個單詞的上下文單詞嗎?”

所以,要訓練一個 word2vec 模型。我們事實上是在訓練一個二分類器。而二分類器,你肯定非常easy就想到了 Logistic Regression。

實際情況,skip-gram 用的比較多,由於有一個說法。CBOW 模型在小的數據集上面表現不錯,在大的數據集裏,skip-gram 表現更好。

神經語言模型

這裏須要說明進一步說明一下。

TensorFlow 裏面有關於神經概率語言模型 (nerual probability language model) 的描寫敘述。

傳統的神經概率語言模型的訓練一般是用最大似然 (maximum likelihood) 法則來最大化下一個詞的softmax概率,基於前面的詞。也就是:

技術分享圖片

當中,score(wt,h) 事實上就是 wt 和 h 的點積 (dot-production)。

那麽這樣訓練模型的目標就是,最大化對數似然概率 (log likelihood):

技術分享圖片

這種問題是計算量太大了,由於在每個訓練步裏,須要對詞典裏的每個詞,使用 softmax 計算出一個概率值。這個模型例如以下圖所看到的:

技術分享圖片


正如前面所說。我們的 word2vec 並不須要一個完整的概率模型,我們僅僅須要訓練一個二分類器,從 k 個噪聲單詞 (noise words) 裏面判別出正確的目標詞 (target words)。

這 k 個噪聲單詞是隨機選擇出來的,這個技術叫做負採樣 (negative sampling),由於選出來的一批詞都是不是正確的 target word。這個模型例如以下圖所看到的:

技術分享圖片


這樣一來,我們要最大化的目標就是:

技術分享圖片


技術分享圖片?表示二分類邏輯回歸在數據集 D 中的上下文 h 中包括目標 wt 的概率。

The classifier

上面說到了負採樣。什麽事負採樣呢?事實上就是隨機選取k個詞語,和目標詞組成負樣本訓練。

如今我們回到斯坦福的教材上來。

這裏列出訓練一個 skip-gram 模型的要點:

把目標詞和上下文詞組成的樣本當做訓練的正樣本 (positive sample)

隨機選取一些詞和目標詞組成的樣本當做訓練的負樣本 (negtive sample)

使用 logistic regression 訓練一個二分類器來區分兩種情況 regression 的權重就是我們的 embedding word2vec 須要的是訓練一個 binary logistic regression,給定一個目標t和候選上下文 c 的元組 (t,c),返回 c 正好是 t 的上下文詞的概率:

技術分享圖片

那麽,c 不是 t 的上下文詞的概率就是:

技術分享圖片

那麽分類器怎樣計算這個概率 P 呢?skip-gram 模型有這樣一個假設:相近的詞它們的嵌入表示也非常近。

也就是,我們能夠把兩個詞語的嵌入表示的類似度。用來表示概率 P。

類似度就用我們上文說到的余弦類似度:

技術分享圖片

當然。點積的結果並非概率表示。我們須要用 logistic 或者叫 sigmoid 函數。把它轉化為概率表示:

技術分享圖片

那麽:

技術分享圖片

上面的公式僅僅是一個單詞的概率,可是我們須要把整個 window 裏面的單詞計算進來。skip-gram 模型還有一個假設:全部的上下文單詞之間是獨立的。

假設我們的 window_size = k,於是有:

技術分享圖片

通常。我們會使用對數概率:

技術分享圖片

skip-gram 模型的訓練

為了訓練這個 word2vec。我們除了正樣本,還須要負樣本。實際上。負樣本通常比正樣本很多其它。一般用一個比率k來控制正負樣本。假設 k=2 則說明。每個正樣本,相應2個負樣本。這就是前面說的負採樣技術。

構造負樣本選擇的詞語(噪聲詞 noise words)是依據一個頻率來的:

技術分享圖片


當中,α是一個比率。一般來說取值技術分享圖片

為什麽須要這個比例呢?這樣能夠讓出現次數少的詞被選擇的可能性變大。

舉個樣例,假設沒有這個比率。假設P(a)=0.99,P(b)=0.01,加上這個比率之後:

技術分享圖片

可見。b得選擇的概率從0.01提升到了0.03。

有了正負樣本之後。我們的模型訓練就有以下目標了:

  1. 最大化正樣本的概率。也就是正樣本的類似度最大化

  2. 最小化負樣本的概率,也就是負樣本的類似度最小化

在整個訓練集上,用數學表示出上面的目標就是:

技術分享圖片

假設從單個訓練數據對來看(一個 (t,c) 對和 k 個噪聲 n1,n2,…,nk)。就有:

技術分享圖片

概率P由simoid函數計算,有:

技術分享圖片

展開,有:

技術分享圖片

能夠看出,最大化上面的目標,就是最大化正樣本 c?t,同一時候最小化負樣本 ni?t。

有了上面的概率表示。那麽我們就能夠使用交叉熵作為損失函數,然後訓練模型了。

值得註意的是,TensorFlow 裏面把上面的兩個過程合並了,合並在tf.nn.nce_loss這個函數裏面。你能夠看到 TensorFlow 的教程裏面的損失函數就是使用的tf.nn.nce_loss作為損失函數。可是你繼續追蹤源代碼就會發現,這個損失函數僅僅只是是:

  1. 進行採樣。計算出概率

  2. 使用交叉熵計算損失

可見,和我們上面的訓練分析過程是吻合的.

兩個權重矩陣W和C

還記得我們上面 skip-gram 模型訓練的最後一個要點 regression 的權重作為 embedding 嗎?

事實上,word2vec 訓練之後會有兩個權重矩陣,各自是嵌入矩陣 W 和上下文矩陣 C,回想一下這張圖:

技術分享圖片


上圖中的W權重矩陣就是我們的 embedding 矩陣,而 W′ 權重矩陣就是我們的 Context 矩陣.

假設我們要得到每個單詞的向量表示,僅僅要從 W 中取出相應的行就可以!由於。訓練的每個單詞,都是用 one-hot 編碼的,直接和 W 相乘就可以得到改詞的向量表示.

所以,整個 word2vec 模型就是一個淺層的神經網絡.

我們訓練結束後,得到的兩個矩陣 W 和 C 怎麽用呢?普通情況下。我們不須要使用 C,直接忽略掉就可以。可是你也能夠把兩個矩陣相加。一起來表示新的N維嵌入表示,或者把他們合並,即 [W,C],用來創建一個新的2*N的嵌入表示。

文末

至此,我們把斯坦福課程關於矢量語義的主要內容解讀完成了。禪師知道,非常多人肯定沒看懂。沒關系,別被這一大堆公式嚇住了,我們能夠先從簡單的入手??:

參考閱讀《中文NLP用什麽?中文自然語言處理的完整機器處理流程》

技術分享圖片




技術分享圖片

幸福
無非就是
我 ?AI ?你


技術分享圖片

實時翻譯的發動機:矢量語義(斯坦福大學課程解讀)