Word Representation,意指用一組數字來代表文字的行為/方式。事實上,有很多種方式可以用一組數字代表文字,目前兩個主流的方式分別為 Distributional Semantics 和 Word Embeddings,而 Word Embeddings 是近年來常用的方式。[1]
為什麼需要 Word Representation?
文字之所以重要,是因為文字本身帶有意涵,我們能從文字中讀到的是其背後的意義,想要對文字的意涵做更多的分析,在計算語言學中就引發了一個問題: 「有沒有辦法用一組數字來代表文字的意涵?」 有了這樣的一組數字,我們便可將文字可以放到數學模型中分析。
Word Representation 的演變
要把文字轉成數字,簡單的方法就是做 one-hot encoding/representation (統計上稱為 dummy variable),也就是令一個向量,長度為所有出現過的字的個數(vocabulary list),這個向量的每一個位置會對應到 vocabulary list 裡面的某一個字,則每個字可以由某個位置為1,其餘為0的向量代表。如下圖所示 我們可以觀察到兩個點:
- 字的向量跟 vocabulary list 的順序有關係;也就是說換個順序,字就有不同的向量表示,所以 vocabulary list 要先固定。
- 向量並無法反映字跟字之間的關係。舉例來說,car 向量跟 bike 向量的歐式距離是$sqrt{2}$,car 向量跟 sun 向量也是$sqrt{2}$,但 car 跟 bike 意義上應該要比較近(同屬交通工具)。
Issues: difficult to compute the similarity
所以我們的目標更明確了,要找出一組數字可以代表文字,且能反映字跟字之間的關係。
Goal: word representation that capture the relationships between words
衡量文字的意涵,經常是由上下文推斷,因此我們想找出來代表文字的數字要能反映字詞之間的關係。
Idea: words with similar meanings often have similar neighbors
我們可以利用前後出現的字,建立一張出現次數表,稱為 Window-based Co-occurrence Matrix。如下圖:
來源: NTU-ADLxMLDS word representation y.v.chen slides
love 前面或後面出現 I 的次數是 2,enjoy 前面或後面出現 I 的次數是 1,我們以每個 column 作為最上面的字的代表向量 (長度一樣為 vocabulary list),則 love 向量跟 enjoy 向量之間的距離,就跟 enjoy 向量和 deep 向量之間的距離不一樣了,也就意味著這樣的 vector representation 可以反映出字跟字之間的關係。 但這樣的表示方法有一些缺點:
- 當字很多的時候,矩陣 size 很大,向量維度也很高
- 矩陣容易有很多 0 ,矩陣 sparse ,則放入模型不容易分析。
Issues:
* matrix size increases with vocabulary
* high dimensional
* sparsity -> poor robustness
所以我們需要對基於 window-based co-occurrence matrix 的 vector representation 降維。 講到降維,第一個想到的應該是 PCA (Principal Component Analysis),PCA 是基於 SVD (Singular Value Decomposition) 的降維方式,SVD 在 NLP 裡的應用叫做 Latent Semantic Analysis (LSA)。 簡單講,令 $C$ 是 所有字的 vector representation 組成的矩陣,對 $C$ 做 SVD 分解如下 其中 $Sigma$ 是特徵值(eigenvalue)為對角線的對角矩陣,保留前 $k$ 個特徵值,剩下的換成 $0$,得到 $Sigma_{k}$,則有以下近似 $C$ 的矩陣 $C_{k}$ 就是新的 latent semantic space。 這個方法的缺點在於:
- 需要很大的計算量。computational complexity: $O(mn^2)$ when $n < m$ for $n times m$ matrix
- 很難新增詞彙。因為每新增字詞,就就要重新計算 SVD 矩陣的 eigenvector/value,並且更新每個字的代表向量。
Issues:
* computationally expensive
* difficult to add new words
所以我們要再想想,有沒有直接用一個低維度向量代表文字的方法?
Idea: directly learn low-dimensional word vectors
把文字轉成實數所組成的向量(vectors of real numbers),這樣的作法稱為 word embeddings。 概念上,word embedding 做的事情是把原本每個字一維的向量空間,投影到一個較低維度的(連續的)向量空間。近年來常用的 word embeddings 模型為 word2vec (Mikolov et al. 2013) 和 Glove (Pennington et al., 2014)。
Word Embeddings 的好處
給一個語料庫(unlabeled training corpus),給每個字一個代表向量,其向量帶有語意訊息(semantic information)的好處在於
- 可以 cosine similarty 衡量語意的相似度
- 詞向量(word vectors)在很多NLP tasks中是有用的、帶有語意的特徵變數
- 可以放到類神經網路中(neural networks)並且在訓練過程中更新
如何找到一個字的 Word Embeddings?
Word Embedding Model - Word2Vec & Glove
Word2Vec
Word2Vec 是一種以類神經網路為基礎的詞向量產生方式,主要有兩種架構,skip-gram 和 Continuous Bag of Words (CBOW)。skip-gram 的概念是給一個字,使用單層的神經網路架構(single hidden layer)去預測這個字的上下文(又稱neighbor),CBOW 是用某個字的上下文(neighbor)去預測這個字,而其中的隱藏層就是我們想要的 word representation,也就是字的 word embedding。
以上圖 skip-gram 為例,$x_{k}$ 是某個字的 one-hot vector,$y_{1j}, …, y_{Cj}$ 代表預測的上下文,$C$ 是上下文的長度,依據要看多少的前後文而決定 $C$ 的大小(也就是看我們覺得這個字會受到多遠的前後文影響,憑此去訂定size)。其中 Hidden layer 是維度 $N (ll V)$ 的結點 $h_{i}$ 所構成的隱藏層,$h = W^{T}x$ 就是字的 word embeddings [3]。
Word2Vec Skip-Gram
Word2Vec Skip-Gram 的作法是輸入是某個字,預測這個字的前後文(給定某個長度內),目標是最大化給定這個字時,前後文出現的機率,
that is, maximize likelihood
等價於 mimize cost/loss function
其中,word vector 在這個神經網路中的 hidden layer 實現,word embedding matrix (某個字對應到某個向量的 lookup table) 就是 hidden layer weight matrix。
word2vec方法的瓶頸在於 output layer 的神經元個數 (也就是 output vectors) 等同於總字彙量,如果字彙量或是corpus很大,會帶來很大的計算負擔,因此有了使用 hierarchical softmax 和 negative sampling 等方法限制每次更新的參數數量的想法。
large vocabularies or large training corpora → expensive computations
⇒ limit the number of output vectors that must be updated per training instance → hierarchical softmax, sampling
Hierarchical Softmax
Idea: compute the probability of leaf nodes using the paths
細節可參考: 大专栏 Word Representation and Word Embeddings · Amy Huangc-neural-networks-neural-network-language-model">類神經網路 – Hierarchical Probabilistic Neural Network Language Model (Hierarchical Softmax)