自然語言處理(NLP)基礎概念(一):詞向量(word vector)及其生成方法介紹

該文章是系列文章「利用深度學習進行自然語言處理( Natural Language Processing with Deep Learning)」的第一部分。

該系列文章主要是2017年斯坦福大學CS224n課程的學習筆記。

課程地址:CS224n: Natural Language Processing with Deep Learning

=================================================================

1. 自然語言處理介紹 Introduction to Natural Language Processing

1.1 NLP有什麼特別之處

人類語言是一套用來傳達含義的系統,不由任何形式的身體行為( a physical manifestation)產生,所以它和其他一些機器學期任務非常不同。

大部分的單詞只是一種符號而已,例如 "rocket"代表火箭的概念,也可以擴展為一個火箭。當我們用 "Whooompaa"來表達含義時,這個符號可以被編碼為多種形式,例如聲音,手勢等等的連續信號,因為 "Whooompaa"可能表示的含義超過單詞本身,更多的是一種強烈的情緒。

1.2 一些自然語言處理任務的例子

自然語言處理的目標是使機器能夠理解自然語言,從而執行一些任務。這些任務按照難度有不同的等級

簡單任務:

  • 拼寫檢查(Spell Checking)
  • 關鍵字搜索(Keyword Search)
  • 尋找同義詞(Finding Synonyms)

中級任務:

  • 從網頁和文檔解析信息(Parsing information from websites, documents, etc.)

複雜任務:

  • 機器翻譯(Machine Translation )
  • 語義分析(Semantic Analysis)
  • 指代分析(Coreference)例如,"he" 和 "it" 在文檔中指誰或什麼?
  • 問答系統(Question Answering)

1.3 怎麼表示單詞

怎麼表示單詞是自然語言處理的最基本問題。

詞向量(word vectors)能夠將單詞與單詞間的相似性和差異性編碼進詞向量,方法是利用距離測量方法如Jaccard, Cosine, Eu-clidean。

2. 詞向量(Word Vectors)

英語大概有約1300萬單詞。詞向量就是將單詞映射到詞空間的一個點。

注意,詞向量在英文里有兩個可以互相替換使用的說法: word embeddings和word vectors

為什麼利用詞向量?一個最直觀的原因是,我們可以找到一個N維(N小於1300萬)的空間,足夠編碼我們所有的單詞。

每一個維度可以編碼一些意思,例如語義空間可以編碼時態、單複數和性別。

one-hot向量(one-hot vector):

one-hot向量就是利用一個 R^{|V|	imes1} 向量來表示單詞。

|V|是辭彙表中單詞的數量。

一個單詞在英文辭彙表中的索引位置是多少,那麼相對應的那一行元素就是1,其他元素都是0。

下面是一個例子,『Aardvark』這個單詞常排在高階英語詞典的第一位,因此『Aardvark』的詞向量就表示為:

w^{Aardvark}=egin{vmatrix} 1 \0 \0 \vdots \0 end{vmatrix}

再舉一個例子:"zebra"這個單詞在英文辭彙表中排最後一位,所以它的詞向量可以表示為:

w^{zebra}=egin{vmatrix} 0 \0 \0 \vdots \1 end{vmatrix}

one-hot向量表示詞向量的缺點是,由於每一個單詞都有一個獨立的詞向量表示,這樣無法體現出單詞間的相似度,例如單詞motel和hotel有一定的相似度,那麼這兩個單詞的詞向量的乘積應該不等於0,但是:

(w^{hotel})^Tw^{motel} = 0

因此我們應該減少詞空間的大小 |V|,找到一個合適大小的子空間表示詞向量。

下面介紹一些生成詞向量的方法,主要有兩類:矩陣奇異值分解方法(SVD)和基於迭代的方法(Word2vec)

3. 矩陣奇異值分解方法(SVD Based Methods)

SVD( Singular Value Decomposition)矩陣奇異值分解。

首先我們在一個語料庫中累積計算單詞同時出現的次數,形成某種形式的矩陣X(形成哪種形式後面會講)。

對X進行SVD,得到 USV^T ,就可以用U的行來表示詞向量了。

下面說一說一些可選的矩陣X。

3.1 詞-文檔矩陣(Word-Document Matrix)

首先假設相似度較高的單詞非常有可能出現在同一個文檔中。

遍曆數以百萬的文檔,當第i個單詞出現在第j個文檔中時,我們給 X_{ij} 增加1。

當然,這會形成一個巨大的矩陣,所以我們可惡意嘗試一下其他的矩陣X。

3.2 基於窗口的共生矩陣(Window based Co-occurrence Matrix)

基於窗口的共生矩陣就是在詞-文檔矩陣的基礎上,設定一個我們感興趣的單詞數量作為窗口大小,使矩陣不至於太大。

例如,假設我們的語料庫只有三個句子,如下:

1. I enjoy flying.

2. I like NLP.

3. I like deep learning.

那麼生成的共生矩陣如下:

3.3 對共生矩陣進行矩陣奇異值分解(Applying SVD to the cooccurrence matrix)

  • 生成 |V| × |V|共生矩陣X
  • 對共生矩陣進行矩陣奇異值分解得到 USV^T

  • 選擇U的前k列作為k維詞空間

  • 如何確定k,計算 frac{sum_{i=1}^{k}{sigma_i}}{{sum_{i=1}^{|V|}{sigma_i}}} (代表前k個 sigma (方差)佔全部的比值,一般很少一部分即可代表全部),然後選定合適的k。
  • 那麼 U_{1:|V|,1:k} 就是我們的k維詞向量

矩陣奇異值分解方法方法存在的問題:

  • 矩陣的維度經常變化(新單詞加入頻繁引起語料庫的規模變化)。
  • 矩陣稀疏性太大,因為大多數單詞不是同時出現的。
  • 矩陣維度太大。
  • 訓練成本太大(例如應用SVD時)。
  • 需要對X矩陣進行大量處理來避免單詞頻率的過大差異。

解決方法:

  • 忽略一些功能性單詞,如 "the", "he", "has"等等。
  • 給窗口加權重
  • 用Pearson correlation將0次計數記為負數

下面即將要講的方法 「Word2vec—基於迭代的方法(iteration based methods)」可以用更優雅的方式解決上述問題。

4. Word2vec—基於迭代的方法(iteration based methods)

接下來的內容我們要介紹兩個 Word2vec演算法:Skip-grams(SG)演算法和連續袋演算法(Continuous Bag of Words)一般簡寫為CBOW。

1. Skip-grams (SG)演算法

給出目標單詞,預測它的上下文單詞。

以下圖為例:

圖中的love是目標單詞,其他是上下文單詞,那麼我們就是求 P(w_{you}|w_{love})P(w_{Do}|w_{love})P(w_{deep}|w_{love})P(w_{learning}|w_{love})

2. Continuous Bag of Words (CBOW)連續袋演算法

給出上下文單詞,預測目標單詞。

以下圖為例:

我們求的是 P(w_{love}|w_{do}) 等等。

另外本部分內容還要介紹兩種模型訓練方法:

  1. 分層softmax(Hierarchical softmax)
  2. 負採樣(Negative sampling)

下面開始詳細介紹,再次之前,先讓我們來了解以下語言模型。

4.1 語言模型 Language Models (Unigrams, Bigrams, etc.)

Unigram model:

以一個英文句子為例: "The cat jumped over the puddle."

模型的目的就是給這個句子一個概率值P,用 W_i 代表句子中的單詞,那麼一個有n個單詞的句子的概率可以表示為:

P(w_1,w_2,cdots,w_n) = prod_{i=1}^{n}P(w_i)

這兒就是Unigram model。

Bigram model:

但是Unigram model假設每一個單詞都是獨立的,這並不合理!

如果我們假設每一個單詞都與它的前一個單詞有關,那麼P是下面這種形式:

P(w_1,w_2,cdots,w_n)=prod_{i=2}^{n}P(w_i|w_i-1)

這就是Bigram model。

理解了Unigrams, Bigrams模型就可以繼續往下進行了,下面介紹一些模型用來得到上述這些概率。

4.2 連續袋模型 Continuous Bag of Words Model (CBOW)

以下面這個句子為例: {"The", "cat", 』over", "the』, "puddle"}。

模型能夠從例句中預測中間缺少一個單詞「jump」,那麼這種模型我們就成為連續袋模型。

首先我們創建兩個矩陣: Uin R^{|V|	imes{n}}V in R^{n	imes |V|} 。V是輸入矩陣,U是輸出矩陣。n是輸入的單詞數量,|V|是辭彙表的維度。

w_i 表示辭彙表V中的第i個單詞。


u_i 表示V的第i列向量,也就是代表輸入單詞 w_i 的詞向量。

mu_i 表示U的第i行向量,也就是代表輸出單詞 w_i 的詞向量。

下面介紹連續袋模型的流程:

  1. 將輸入句子中的單詞生成one-hot詞向量(本文第二部分介紹過什麼是one-hot詞向量): left( x^{c-m},dots,x^{c-1},x^{c+1},dots,x^{c+m} in R^{|V|} 
ight)
  2. 通過將one-hot詞向量和輸入矩陣V相乘,得到輸入單詞的詞向量: 
u_{c-m} = Vx^{c-m}, 
u_{c-m+1}=Vx^{c-m+1},dots,
u_{c+m}=Vx^{c+m}
  3. 對上述詞向量求平均得到: ar{
u} = frac{
u_{c-m}+
u_{c-m+1}+dots+
u_{c+m}}{2m} in R^n
  4. 上面的平均詞向量與輸出矩陣進行點乘運算,得到得分向量(score vector) z = Uar{
u} in R^{|V|} ,我們知道,兩個向量約相似,點乘得到的分數越高,因此將會使相似的詞互相靠近,從而得到較高的分數。
  5. 將分數轉換成概率 ar {y} = softmax(z) in R^{|V|} 。"softmax"就是對 ar {y} 做如下運算 frac{e^{ar{y_i}}}{sum_{k=1}^{|V|}{e^{ar{y_k}}}} ,使其每一個元素在[0,1]範圍內,且和為1。
  6. 我們希望 ar y 與真實的 y 匹配,也就是真實的 y 的one-hot向量。

上面步驟說明了在有矩陣 UV 的情況下,連續袋模型是如何工作的,下面介紹一下如何產生這兩個矩陣:

首先,為了計算預測值的準確性,我們先定義一個測量函數,這裡,我們選擇一個非常流行的測量函數:交叉熵(cross entropy) H(ar{y},y)

H(ar{y},y) = - sum_{j=1}^{|V|}{y_jlog{ar{y_j}}}

由於y是one-hot向量,所以上面的公式可以簡化為:

H(ar{y},y) = -{y_jlog{ar{y_j}}}

讓我們舉例說明這個公式:

假設我們的預測是完美的,也就是說 ar {y_c}=1,那麼H(y?, y) =

?1 log(1) = 0。損失函數為0,也就意味著沒有任何『懲罰』,也就是不需要更新我們的矩陣 UV

假設我們的預測非常糟糕,假設 ar{y_c} =0.01,那麼 H = -1log(0.01) approx4.6.5 ,這個值比較大,說明損失較大,需要「懲罰「。

也就是說,為了評估我們的預測結果的好壞,連續袋模型(CBOW)定義了一個代價(cost),為了最優化這個代價,我們需要對矩陣 UV 進行升級,採用的升級方法就是隨機梯度下降(stochastic gradient descent)。

P(w_c|w_{c-m},w_{c-m+1},dots,w_{c+m-1},w_{c+m}) 最大,根據上面的公式,也就是使 J 最小。

4.3 Skip-Gram模型 (Skip-Gram Model)

Skip-Gram模型與連續袋模型正好相反。

連續袋模型是根據周圍的詞來預測中心的詞,而Skip-Gram模型是根據中心的詞預測周圍的詞。

4.4 負採樣 Negative Sampling

4.5 Hierarchical Softmax


推薦閱讀:

從聲學模型演算法總結 2016 年語音識別的重大進步丨硬創公開課
對話藍馳朱天宇:移動紅利已近關閉,AI和大數據是未來的鑰匙
【西瓜書】周志華《機器學習》學習筆記與習題探討(三)③
CNN 入門講解:什麼是卷積

TAG:自然语言处理 | 深度学习DeepLearning | 人工智能 |