實時翻譯的發動機:矢量語義(斯坦福大學課程解讀)
大家好,我是為人造的智能操碎了心的智能禪師。
GraphDB 近期剛剛升級到 8.7 版本號,此次特別更新了矢量語義包。直接以插件形式整合到程序中。
矢量語義在 NLP 領域,有著非常重要的意義。它用矢量的方式。加快了計算機學習新詞匯的速度。讓機器翻譯、實時翻譯、聊天機器人智能化等,成為可能。
全文大約5500字。讀完可能須要好幾首以下這首歌的時間
??
預備知識
回想一下我們讀書時候,碰到不認識的詞是怎樣操作的。
一種方式是直接查字典;還有一種方式是先不理會這個詞,繼續往下閱讀,當你越來越多的讀到包括這個詞的句子。詞的含義也開始逐漸清楚起來。
來源:Reaching Higher NH
傳統 NLP,比方之前禪師發過的文章,類似查字典的方式,非常可能導致詞義和上下文脫節。比如 one-hot encoding。他覺得“狗”和“貓”就是兩個東西。即使你在下文中,明白指出來他們都是動物、都是寵物。
非常明顯,這種方式去做分詞、打標簽還能夠,要想實現翻譯、甚至聊天功能,那簡直是不可能。
舉個樣例。?Tesgüino
桌子上有一瓶 Tesgüino?
大家都喜歡 Tesgüino
Tesgüino 能喝醉
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有優點:
不會造成維度爆炸,由於維度是我們自己設置的。通常比較小
向量是稠密的,不須要稀疏向量所採用的各種優化算法來提升計算效率
詞嵌入理解了,那麽什麽是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。
有了正負樣本之後。我們的模型訓練就有以下目標了:
最大化正樣本的概率。也就是正樣本的類似度最大化
最小化負樣本的概率,也就是負樣本的類似度最小化
在整個訓練集上,用數學表示出上面的目標就是:
假設從單個訓練數據對來看(一個 (t,c) 對和 k 個噪聲 n1,n2,…,nk)。就有:
概率P由simoid函數計算,有:
展開,有:
能夠看出,最大化上面的目標,就是最大化正樣本 c?t,同一時候最小化負樣本 ni?t。
有了上面的概率表示。那麽我們就能夠使用交叉熵作為損失函數,然後訓練模型了。
值得註意的是,TensorFlow 裏面把上面的兩個過程合並了,合並在tf.nn.nce_loss
這個函數裏面。你能夠看到 TensorFlow 的教程裏面的損失函數就是使用的tf.nn.nce_loss
作為損失函數。可是你繼續追蹤源代碼就會發現,這個損失函數僅僅只是是:
進行採樣。計算出概率
使用交叉熵計算損失
可見,和我們上面的訓練分析過程是吻合的.
兩個權重矩陣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 ?你
實時翻譯的發動機:矢量語義(斯坦福大學課程解讀)