自然語言處理(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向量就是利用一個 向量來表示單詞。
|V|是辭彙表中單詞的數量。
一個單詞在英文辭彙表中的索引位置是多少,那麼相對應的那一行元素就是1,其他元素都是0。
下面是一個例子,『Aardvark』這個單詞常排在高階英語詞典的第一位,因此『Aardvark』的詞向量就表示為:
再舉一個例子:"zebra"這個單詞在英文辭彙表中排最後一位,所以它的詞向量可以表示為:
one-hot向量表示詞向量的缺點是,由於每一個單詞都有一個獨立的詞向量表示,這樣無法體現出單詞間的相似度,例如單詞motel和hotel有一定的相似度,那麼這兩個單詞的詞向量的乘積應該不等於0,但是:
因此我們應該減少詞空間的大小 |V|,找到一個合適大小的子空間表示詞向量。
下面介紹一些生成詞向量的方法,主要有兩類:矩陣奇異值分解方法(SVD)和基於迭代的方法(Word2vec)
3. 矩陣奇異值分解方法(SVD Based Methods)
SVD( Singular Value Decomposition)矩陣奇異值分解。
首先我們在一個語料庫中累積計算單詞同時出現的次數,形成某種形式的矩陣X(形成哪種形式後面會講)。
對X進行SVD,得到 ,就可以用U的行來表示詞向量了。
下面說一說一些可選的矩陣X。
3.1 詞-文檔矩陣(Word-Document Matrix)
首先假設相似度較高的單詞非常有可能出現在同一個文檔中。
遍曆數以百萬的文檔,當第i個單詞出現在第j個文檔中時,我們給 增加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
- 對共生矩陣進行矩陣奇異值分解得到
- 選擇U的前k列作為k維詞空間
- 如何確定k,計算 (代表前k個 (方差)佔全部的比值,一般很少一部分即可代表全部),然後選定合適的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是目標單詞,其他是上下文單詞,那麼我們就是求 、 、 、 。
2. Continuous Bag of Words (CBOW)連續袋演算法
給出上下文單詞,預測目標單詞。
以下圖為例:
我們求的是 等等。
另外本部分內容還要介紹兩種模型訓練方法:
- 分層softmax(Hierarchical softmax)
- 負採樣(Negative sampling)
下面開始詳細介紹,再次之前,先讓我們來了解以下語言模型。
4.1 語言模型 Language Models (Unigrams, Bigrams, etc.)
Unigram model:
以一個英文句子為例: "The cat jumped over the puddle."
模型的目的就是給這個句子一個概率值P,用 代表句子中的單詞,那麼一個有n個單詞的句子的概率可以表示為:=
這兒就是Unigram model。
Bigram model:
但是Unigram model假設每一個單詞都是獨立的,這並不合理!
如果我們假設每一個單詞都與它的前一個單詞有關,那麼P是下面這種形式:
這就是Bigram model。
理解了Unigrams, Bigrams模型就可以繼續往下進行了,下面介紹一些模型用來得到上述這些概率。
4.2 連續袋模型 Continuous Bag of Words Model (CBOW)
以下面這個句子為例: {"The", "cat", 』over", "the』, "puddle"}。
模型能夠從例句中預測中間缺少一個單詞「jump」,那麼這種模型我們就成為連續袋模型。
首先我們創建兩個矩陣: , 。V是輸入矩陣,U是輸出矩陣。n是輸入的單詞數量,|V|是辭彙表的維度。
表示辭彙表V中的第i個單詞。
表示V的第i列向量,也就是代表輸入單詞 的詞向量。
表示U的第i行向量,也就是代表輸出單詞 的詞向量。
下面介紹連續袋模型的流程:
- 將輸入句子中的單詞生成one-hot詞向量(本文第二部分介紹過什麼是one-hot詞向量):
- 通過將one-hot詞向量和輸入矩陣V相乘,得到輸入單詞的詞向量:
- 對上述詞向量求平均得到:
- 上面的平均詞向量與輸出矩陣進行點乘運算,得到得分向量(score vector) ,我們知道,兩個向量約相似,點乘得到的分數越高,因此將會使相似的詞互相靠近,從而得到較高的分數。
- 將分數轉換成概率 。"softmax"就是對 做如下運算 ,使其每一個元素在[0,1]範圍內,且和為1。
- 我們希望 與真實的 匹配,也就是真實的 的one-hot向量。
上面步驟說明了在有矩陣 和 的情況下,連續袋模型是如何工作的,下面介紹一下如何產生這兩個矩陣:
首先,為了計算預測值的準確性,我們先定義一個測量函數,這裡,我們選擇一個非常流行的測量函數:交叉熵(cross entropy)
由於y是one-hot向量,所以上面的公式可以簡化為:
讓我們舉例說明這個公式:
假設我們的預測是完美的,也就是說 ,那麼H(y?, y) =
?1 log(1) = 0。損失函數為0,也就意味著沒有任何『懲罰』,也就是不需要更新我們的矩陣 和 。假設我們的預測非常糟糕,假設 =0.01,那麼 ,這個值比較大,說明損失較大,需要「懲罰「。
也就是說,為了評估我們的預測結果的好壞,連續袋模型(CBOW)定義了一個代價(cost),為了最優化這個代價,我們需要對矩陣 和 進行升級,採用的升級方法就是隨機梯度下降(stochastic gradient descent)。
讓 最大,根據上面的公式,也就是使 最小。
4.3 Skip-Gram模型 (Skip-Gram Model)
Skip-Gram模型與連續袋模型正好相反。
連續袋模型是根據周圍的詞來預測中心的詞,而Skip-Gram模型是根據中心的詞預測周圍的詞。
4.4 負採樣 Negative Sampling
4.5 Hierarchical Softmax
推薦閱讀:
※從聲學模型演算法總結 2016 年語音識別的重大進步丨硬創公開課
※對話藍馳朱天宇:移動紅利已近關閉,AI和大數據是未來的鑰匙
※【西瓜書】周志華《機器學習》學習筆記與習題探討(三)③
※CNN 入門講解:什麼是卷積
TAG:自然语言处理 | 深度学习DeepLearning | 人工智能 |