超級乾貨:Word2Vec課堂筆記(內附教學視頻)
這篇筆記是我記錄在學習了香港理工大學在讀博士生小S李嫣然在集智俱樂部所開設的【自然語言處理與深度學習系列課程】第一節課。課程視頻請點擊:Word2Vec: 詞向量技術的基礎與模型 - 深度學習與自然語言處理1
Word2Vec是目前基於深度神經網路的自然語言處理方法的基礎,它可以為每一個單詞計算得到一個向量表示。當進行句法翻譯等高級自然語言處理任務的時候,這些向量表示可以作為神經網路的輸入信息。
本課程主要內容包括:
詞嵌入問題:為什麼要研究詞嵌入,以及目前詞嵌入方法的分類,Word2Vec的簡單歷史。
Word2Vec介紹:Word2Vec是在2013年Google開發的一套詞嵌入方法,它包含CBOW和Skip-Gram兩種方法。目前,人們使用比較多的是Skip-Gram方法。
Skip-Gram:詳細介紹了Skip-Gram的工作原理。進一步,課程介紹了什麼是負採樣(Negative sampling),它的目的是為了解決什麼問題。
課件下載:Word2Vec介紹
一、背景
傳統自然語言處理的表達,一般以詞為單位。自然語言字元表達成計算機能處理的信息,採取離散表達。假設有個詞表,可以理解為字典,如何在這一萬個字中表達這一個字。用一萬維的向量表達這個字,某個字只可能在某一維地方為1,其他位置都為0。如下圖所示:
這種方法特點:根據詞表大小決定向量長度。很占空間,即使稀疏表示。缺乏泛化性(lack of generalization)。這種表示沒法表達相似的概念。所以希望能夠有一種方式計算這種泛化性,稠密向量。
「You shall know a word by the company it keeps.」--J.R. Firth(1957)基於同一種思想,生出很多方法,主要有兩種假說。
假說一:The distributional hypothesis 分散式假說
一個詞由周圍詞來推斷。相似的詞會出現在相似的語境里。例如今晚的天空有很多星星。句子中天空和星星相關,橫向共現。這樣,我們可以由詞跟語境的關係來判斷相似度,天空和星星就是想死的。BOW, LSI, LDA等模型都是由這種假說出發的,產生的很多種方法來計算這個實值向量。1954年BOW模型不考慮語序,出現一次加1。2003年LDA模型,是主題模型中的某一個特例。PMI/PPMI等方法都研究共現,相關詞共同出現幾次,然後再做SVD矩陣分解等。
假說二:Distributed models
相似詞在相似語境contex下。例如今天天空有很多星星。今天天空有個太陽。這兩個句子中的星星和太陽這兩個詞出現在了同樣的上下文之中,它們是相似的,但它們是一種縱向的相似性。基於這種假說誕生的方法,最重要的就是這個Word2Vec。
因此,我們可以看到,對於這兩種方法來說,兩個詞的相似性依賴於它們彼此所處的環境,而環境又有兩種,一種是同一個句子之中,另一種是在不同句子,但是相似的上下文之中。
當然,我們要講解的重點是Word2Vec。事實上,Word2Vec是由神經網路語言模型得到的一個副產物。這就是Bangio的那篇經典的論文:(Citation Query A Neural Probabilistic Language Model),文中提出了一種利用神經網路的方法來做自然語言理解的思路:
儘管這一框架本身並不實用,但是卻包含了將單詞進行向量編碼的操作,而這卻成為了後來詞向量演算法Word2Vec的前身。於是,到了2013年Google的Mikolov提出了兩套實用的演算法,它們統稱為Word2Vec。Word2vec 是代碼項目的名字,只是計算詞嵌入(word embedding)的一個工具,是CBOW和Skip-Gram這兩個模型的合體,目前這套工具完全開源。。如下圖所示,左邊的CBOW是利用詞的上下文預測當前的單詞;而Skip-Gram則是利用當前詞來預測上下文。
二、Skipgram的原理
在這節課中,我們重點介紹後一種,即Skipgram,它的結構如圖:
它的工作原理如下:
首先要有語料庫和詞庫,大概詞庫需要包含所有語料庫中的詞,或者把沒囊括的詞encode成一個統一的值。如上圖所示,每一個input都是一個1-hot編碼的詞。每一個output是一個概率Vector表示Vector位置上的詞出現在當前output位置的概率,Vector的位置和input的詞的位置相符。舉個例子吧,如果有這樣一個詞序列 (我愛中國)那麼就會有四個1-hot 編碼的輸入向量: 1000, 0100,0010,0001。這就是可能的CBow模型的輸入,假設我們當前的輸入是0100,也就是「愛」這個字。
再來看輸出,假如我們希望預測「愛」這個詞的上下文,,比如說取前後各一個。
那麼就會有兩個output,剛才說了每個output是一個概率Vector, 假設這兩個output Vector是(0.3, 0.5, 0.7,), (0.1,0.9,0.1)。第一個(0.3,0.5,0.7)中的數字表示的就是「我」出現在「愛」之前一位的概率是0.3, 「愛」出現在「愛」之前一位的概率是0.5, 「中國」出現在「愛」前一位的概率是0.7。同樣,後一個向量(0.1,0.9,0.1)則表示「我」出現在「愛」之後的概率是0.1,「愛」出現在「愛」之後的概率是0.1,……。
這樣的話,只要我們給定了一個詞,整個CBow網路就可以得到這個詞上下文中各個詞出現的概率,我們用蒙特卡洛模擬的方法根據哪些概率值去採樣,就能得到一個具體的上下文。
如果這部分理解了,那麼我們就可以有一個優化的目標了,就是使得這一系列的Output Vector最接近真實的情況。所謂真實的情況就是機器通過隨機採樣得到的序列能夠逼近真實的人類語言序列。也就是說在收集的大量文本數據中,對於「愛」這個詞,之前(第一個Vector)出現「我」,之後出現「中國」的次數如果足夠多,那麼我們的模型預測這兩個詞的概率也應該足夠大,這就是所謂的極大似然原理(maximum likelihood principle)。
這樣,Input 、 output優化目標都有了,那麼通過一系列複雜的公式,以及參照上圖,就會得到兩個參數W和W』。 W我們可以簡單的理解為詞向量,也就是說這樣的形式:
我 (0.9,-0.2,0.1)
愛 (0.8, 0.2,0.2)
中 (0.1, 0.3,0.4)
國 (0.2, 0.3,0.6)
那麼這一系列的複雜運算是怎麼做的呢?答案就在於優化。我們讓訓練這個網路的最終目標就是去根據當前詞來優化預測出它的上下文的概率,於是,我們就可以寫出目標函數:
其中,T是語料庫單詞的總個數,p(wt+j|wt)是已知當前詞wt,預測周圍詞的總概率對數值。
(1)一個 tips: 這裡值得注意的不是函數本身,因為之所以在目標函數中用對數,完全是為了計算方便,值得注意的是第二個求和號的下標,需要在第 j 個詞的左右分別有 c個詞。這裡,概率的計算方式如下:(2)再來一個 tips:這裡無論是 v 還是 v』對應的都是向量,維度是 v-dim,因此這裡的乘法是向量乘法。而後,我們依然可以採用反向傳播等方式計算。
三、負採樣
然而,在實際的計算過程中,運算量過於巨大,於是人們就像出了一個絕妙的解決辦法,從而快速地完成任務。這種方法就被稱為「負採樣」(Negative sampling)。 負採樣的核心思想是,如果將自然語言看作是一串單詞的隨機組合,那麼它的出現概率是很小的。於是,如果我們將拼湊的單詞隨機組合(負採樣)起來將會以很大的概率不會出現在當前文章中。於是,我們很顯然應該至少讓我們的模型在這些負採樣出來的單片語合上面出現概率應該儘可能地小,同時要讓真正出現在文中的單片語合出現概率大。這樣我們的模型才足夠有效。於是,我們的目標變成了優化新的概率函數:
,從而得到最優的詞向量嵌入。這裡D是出現在文章中的那些單片語合,Dbar是所有的未出現的,但是由機器生成的隨機單片語合。Theta則是包含詞向量的待優化參數。 實驗證明,採用了新的目標函數以後,我們整個計算過程會非常快,而詞向量嵌入的效果也很好。
四、聯想:與統計物理的聯繫
從第一次課程對 word2vec 的「前世今生」的剖析我們似乎可看出:這是一個工業界至少是實驗室的 project 中很好用的工具,它的原理已經很清楚。但是,關於 word2vec 或者 說關於 distributed representation 可以做的工作遠遠沒有結束,尤其是從統計物理的角度而言。 第 I 部分的最後一個 tips 中我簡單提到如果把分母都理解成配分函數的話, word2vec 與 RBM 的關係就更加清楚了。
下面我將用一部分的文字更加詳細的說明。因為,與 RBM 的聯繫,遠遠不限於配分函數。我看到 distributed representation 的第一反應,就是和統計物理及機器學習等都密 切相關的 representation learning。 事實上,Bengio 在 2013 年發表的 review:《Representation Learning: A Review and New Perspectives》中就已經指出了基於能量的模型 Boltzmann machine 和 Restricted Boltzmann machine 與 appropriate objectives for learning good representations 之間千絲萬縷的聯繫。
人們為了研究 representation 的種種訓練演算法,以得到更好的語言模型,很多工作都已經開展。例如,為了建立 deep representations, Hinton 和學生在 2009 年就研究了 Deep Boltzmann Machine(DBM),這裡所提到的 Boltzmann Machine(BM) 與上文說到的RBM 一樣,都是一個基於能量的模型,甚至可以說 RBM 是 BM 的一個特例:因為它們兩個都是兩層神經網路,但是 BM 是層間和層內都全連接,而 RBM 是層內無連接,層間全連接。下圖展示了 RBM 的網路模型結構。
▲RBM 的網路結構
這裡,W 是連接隱藏層和顯層之間的權值矩陣。
當然,當年也是 Hinton 等人為了訓練 RBM 並提出了 CD-k 演算法,當然,這是另外一個內容了。至於文獻中常常能看到的 Deep Belief Networks (DBNs)和 DBM 一樣,都是基於 RBM 的一種擴展。這裡,我們主要講 distributed representation 和 RBM 的關係,至於 DBN 和 DBM,留下節課的課後作為腦洞分別說明。
通過上面的整理我們看出,無論是 word2vec 訓練過程中的目標函數,還是目前工業界多用於分類的 RBM(當然包括 DBN,DBM),還是 planted 自旋玻璃模型,最後都可以歸結到統計推斷問題上面來。所以,是不是可以將大家的分析方式進行相互借鑒?將統計物理中求解配分函數的方式用到(1)式中,而將這裡的負採樣的想法用到配分函數的數值模擬中,當然,這裡,如果定義「負」才是問題的核心。
參考資料
Deep Learning in NLP (1)Efficient Estimation of Word Representations in Vector SpaceFrom Frequency to Meaning: Vector Space Models of Semantics
這是一個自然語言與深度學習的系列課程,課程大綱如下:
- Word2Vec: 詞向量技術的基礎與模型 - 深度學習與自然語言處理1(免費試聽)
本課程介紹自然語言處理中的基本工具:Word2Vec,它的歷史淵源、原理、架構以及實現技術。 主要內容包括: 詞嵌入問題:為什麼要研究詞嵌入,以及目前詞嵌入方法的分類,Word2Vec的簡單歷史。
1、Word2Vec介紹:Word2Vec是在2013年Google開發的一套詞嵌入方法,它包含CBOW和Skip-Gram兩種方法。目前,人們使用比較多的是Skip-Gram方法。
2、Skip-Gram:詳細介紹了Skip-Gram的工作原理。
3、進一步,課程介紹了什麼是負採樣(Negative sampling),它的目的是為了解決什麼問題。 (課時:84分鐘)
- Word2Vec: 編碼與實踐-自然語言處理與深度學習2
Word2Vec是Google推出的一種實現單詞的向量化表示的重要方法。本節課主要介紹如何用編碼來使用Word2Vec,包括Google版本的Word2Vec。 (課時:50分鐘)
- 詞嵌入的相關問題 - 自然語言理解與深度學習3
本節課繼續討論詞嵌入問題,除了Word2Vec方法以外,我們還介紹了其它的各類詞嵌入方法,如GlovVe,並與Word2Vec方法做了比較。 (課時:50分鐘)
- 神經網路基礎- 自然語言理解與深度學習4
本課程將介紹神經網路模型中的一些基本知識,包括神經元模型、反向傳播演算法、優化求解方法等等。 (課時:76分鐘)
- RNN在自然語言處理中的應用-自然語言理解與深度學習5
本節課主要講述循環神經網路(Recurrent Neural Networks, RNN)的基本原理,並簡略介紹了 RNN 在自然語言處理中的若干應用。 (課時:80分鐘)
- 自然語言中的RNN實戰 - 自然語言理解與深度學習6
這是一節自然語言處理的實戰課程,主要內容包括目前主流深度學習框架介紹和古詩詞生成的模型實現這兩部分。 (課時:68分鐘)
- 自然語言處理中的卷積神經網路 - 自然語言處理與深度學習 7
卷積神經網路(Convolutional Neural Network,簡稱)是一種在圖像中常用的深度學習網路架構。然而,CNN也可以應用在自然語言處理的任務中。本講座的內容包括:自然語言處理中的CNN的特點、CNN的工作原理以及自然語言處理中的CNN模型變種和改進 (課時:60分鐘)
- 情感分析 - 自然語言處理與深度學習8
為什麼文章和馬伊琍事件會影響伊利股份的股票價格大起大落?如何根據對產品的評價就知道顧客是否喜歡它?答案是:智能情感分析系統。本講座將詳細解讀什麼是情感分析,如何用深度學習的方式解決它。 (課時:58分鐘)
- 機器翻譯 - 自然語言處理與深度學習9
2016年九月份,Google發布了最新的機器翻譯系統GNMT,該系統已經非常接近人類的翻譯水平了。本節課將全面解讀GNMT的架構。
內容包括:(1)編碼-解碼器系統:Encoder-Decoder目前已經成為自然語言處理、圖像分析等多種機器學習任務的主流框架。它使得完全自動化、端到端(End2End)的機器翻譯系統成為了可能,省去了大量繁瑣的中間處理環節和人工特徵工程;
(2)注意力機制:注意力機制(Attention mechanism)不僅可以大大提高機器翻譯的準確度,而且具有非常廣泛的用途,包括圖像標註、視頻標註、閱讀理解等;
(3)殘差網路:殘差網路(Residual network,簡稱ResNet)是2015年提出來的一種神經網路設計機制,通過實現跨層次的連邊,轉換訓練目標為殘差函數,就可以使得我們更加有效的讓神經網路實現收斂,並大大提高深度神經網路的深度。本課詳細講解了每一種機制提出的背景和實際用途。 (課時:105分鐘)
- 自然語言生成 - 自然語言處理與深度學習10
自然語言生成是自然語言處理領域中一個非常熱門的研究課題,本講座對對話生成系統做了一個比較全面詳細的綜述。
課程內容包括:回顧了語言生成的發展簡史;
主流框架:講解了基於編碼-解碼(Encoder-decoder)框架的端到端(End2end)架構,以及對其的改進:可變編碼-解碼(Variational encoder-decoder)方法、可變自編碼(Variational autoencoder)方法;
常見問題:介紹了目前對話系統中的一些常見問題,例如語義漂移、高頻模式、文不對題等,以及相應的解決方案,如混合生成策略;谷歌對話系統Allo架構:刨析了Google對話系統Allo的架構。 (課時:84分鐘)
- 記憶與記憶網路 - 自然語言處理與深度學習11
本次課程介紹了神經圖靈模型,著重於各種定址方式。另外,還對memeory network模型做了介紹,並對它與神經圖靈機進行了比較。最後,針對從統計物理的視角如何看待記憶的問題進行了討論。 (課時:90分鐘)
課程大綱
李嫣然@李嫣然 最新的課程:打造你自己的聊天機器人還在報名中,別錯過,不然後悔的話我也沒法幫你。
推薦閱讀:
※聊聊一致性哈希
※分散式系統理論基礎 - CAP
※未來已來,Google Cloud Spanner 展開 NewSQL 時代
※理解這兩點,也就理解了paxos協議的精髓
TAG:自然语言处理 | 分布式系统 | 深度学习DeepLearning |