[自然語言處理] #1 Word to Vector 實作教學 (理論篇)

Roye Qiu
Roye’s ResearchCraft
8 min readOct 9, 2018

--

Word2Vec 理論基礎架構

[自然語言處理] #2 Word to Vector 實作教學 (實作篇)

以下幾個點,我想大家為什麼會點進這篇文章來看:

  • Tensorflow (介紹請點連結)
  • Word to Vector
  • 用Tensorflow 實作word to vector

[前言]

希望大家看完這篇文章可以讓自己對於之前不熟悉的內容可以有比較清楚的roadmap。 因為不希望在一篇文章中講太多東西,所以這一篇先讓我們由淺入深先針對Word to Vector作說明,第二篇再由講解程式實作,那讓我們開始吧。

Word to Vector

甚麼是Word2Vec? 他是一種Word Embedding 的方法,是由 Tomas Mikolov在2013年所發表的論文Efficient Estimation of Word Representations in Vector Space中提到的一種用來表示每個字的方法,但是在講Word2Vec的細節前,我們要先來了解一下下面這個問題。

甚麼是Word Embedding呢? 那要先來聊聊甚麼是Embedding。

所謂的Embedding,中文的意思是遷入的意思,在這裡的意思是遷入一個空間概念,並且在其中有可以表達得自己的一個形式。 空間概念可能有很多種不同的空間概念,舉例像是我們最熟悉的座標空間x軸,y軸,z軸,並且當我們給定一組(x,y,z)之後我們可以得到一個對應的位置。

有沒有覺得很熟悉? 沒錯又出現我們在機器學習基本概念中提到的f(x)=y。
所以f(),你可以視為那個空間概念,而x則是embedding也就是表示法,而y就是我們預期的結果。

可能聽到這邊我們還是有點陌生,我們再來舉個簡單的例子,我們的概念空間是從班級中挑出一個學生,那我們要想像的是怎樣表達代表一個學生呢? 可以想像的有身高、體重、髮型、血型、名字等等的作為我們的表示法,那這樣班級內的學生就可以用剛剛上述提到的[身高,體重,髮型,血型,名字],這五個值,作為遷入在班級這個空間概念的表示法,只要給定這五項就能告訴你是哪個學生,那這種方式你也可以說自己說student embedding。

回到Word Embedding,用簡單的話來說就是,要怎麼樣表示一個字,讓他可以遷入到語言模型,這個空間概念之中。

在傳統的語言模型,是採用詞袋(bag of words)的方式,將所有的詞視為向量中的一個位置表示,這種稱做one-hot的表示形式。下面用一個例子說明。

我的corpus:

Corpus Example.

Set(corpus)=[‘I’,’love’,’NLP’,’is’,’a’,’good’,’topic’,’monkey’]那麼整個向量表示法為長度為8的向量。第一個位置是I,第二個位置是love…以此類推,假如有那個字那個位置就是1不然就是0。 我們把上面三個句子根據one-hot下去做轉換。

第一句話:
[1,1,1,0,0,0,0,0]
第二句話:
[0,0,1,1,1,1,1,0]
第三句話:
[1,1,0,0,0,0,0,1]
那麼這樣的方式,有很多問題,主要的兩個問題,也是Word2Vec解決的問題:

1. 無法表達詞跟詞之間的語意關係

因為每個詞都代表著一個位置,所以兩個詞之間的關係都會是 orthogonal,也就是垂直的,代表彼此之間沒有關係。
I=[1,0,0,0,0,0,0,0]
love=[0,1,0,0,0,0,0,0]
dot(I-vec,love-vec) = 0.0

2. 向量表示會很鬆散(Sparse)

大家可以想像,假如詞彙很多的時候,整個的向量長度會非常的長,那麼對於一句話來說,會只有少數幾個位置有值,大多數都是0,這樣的Data,再做machine learning 相關應用的時候,訓練起來會非常沒有效率,而且gradient很有可能是無意義的,因為很多值都是0。

Word2Vec

這邊試著用身邊同學們,針對大家比較不了解的地方,去說明他的概念。
假如英文比較好或是好奇原文的話:文章連結
是一篇非常淺顯易懂的文章,給他32個讚。0w0)b

Word2Vec,可以想像成一種分類應用的副產物。

我這邊要說明一 下,不是說Word2Vec是分類應用做一做意外發現的,而是指,這項Task主要是在做一件分類應用,然後取其一部分作為Word Vector。

作者Tomas Mikolov,希望每個詞彙可以表達出他在語意上的意義,而想出了一個Idea,一個詞彙的意義,或許可以用身邊的詞(Context)去表示他。 就像是自己身邊的朋友們,可以反映出自己是個怎麼樣的人一樣。 是不是很哲學阿XD

所以他基於這個Idea的概念,建了兩個模型去實作這個Idea。分別是CBOW以及Skip-gram兩個Model。

CBOW跟Skip-gram的Model是非常相似的,主要的差異點是Cbow是用周圍的字預測現在這個字,而Skip-gram則是用現在的字去預測周圍的字。

也就是在Model的input跟output作手腳。
CBOW的input是Context而Output是現在的字,而Skip-gram則是相反,Input是現在的字而Output則是Context。

用例子來說明:
Corpus: I love NLP.
Window size = 1 (上下文的範圍)

CBOW:

CBOW Input Output Example

Skip-Gram:

Skip-Gram Model Input Output Example

了解了Input與Output,讓我們來了解一下Model的架構。

Context Prediction Architecture

根據論文中,整個Model構造為Input Layer,Projection Layer,Hidden Layer 以及Output Layer。而其中的Projection Layer就是我們的Word to Vector的Vector了,也就是在TensorFlow tutorial裡面的那張圖中的Embedding的位置。

CBOW Architecture of word to vector in TensorFlow tutorial

接下來根據各個層去做說明:

Input Layer

就是把每個詞用One-Hot的形式作表示做為Input,所以大家可以了解到,Input Layer的長度就是你有的詞的總數。以上面的例子來說,假如現在的詞是”I”那麼Input就會是[1,0,0,0,0,0,0,0]。

為什麼要用One-Hot來做為Input呢? 還記得上面有提到One-Hot表示法會讓每個詞,彼此之間都是orthogonal,那麼Input * Projection Layer的時候,就有兩個方便的點。

矩陣乘法示意圖
  1. 可以像是把Projection那一列作為Embedding。
  2. 這樣的動作就像是look up 查找而已。

Projection Layer

Word Embedding就是在這一層,因為他的Input的長度是words_size所以他這裡的矩陣的大小就會是words_size x embedding_size。

Hidden Layer

語意隱藏的一層,其實並沒有具體的證明這一層的物理意義,不過你可以想像他是空間概念中銜接在中間的轉接口。因為他銜接Projection Layer所以它的長度會是embedding_size 。

Output Layer

最後模型輸出的預測的每一個詞的機率,所以他它的長度會是words_size。

[結語]

講解到這邊,基本上把概念,意義,模型架構,Input,Output都講完了,其實這個概念跟AutoEncoder是一樣的。
有ML實作經驗或是TensorFlow使用經驗的朋友們,說不定已經可以實作出來了呢 0w<)*。

我們的下一篇,就是正式用Tensorflow去實作Word Embedding了,上面假如哪裡講不清楚或寫不好,或是還有甚麼疑問,歡迎留言詢問或指教,假如覺得講得不錯,也請給鼓勵跟分享。

--

--

Roye Qiu
Roye’s ResearchCraft

一個喜歡科技、技術的自然語言工程師,喜歡參與workshop活動與參加比賽,曾獲得總統盃黑客松優勝與司法院團隊一起與總統蔡英文介紹自然語言對於司法改革的重要性~