Skip to content

[NLP] Word Embedding 筆記

Word Embedding (詞嵌入) 是自然語言處理 (NLP) 當中經常會使用到的一種『技術』,其核心概念為『將文字轉成數值型態』。這有什麼好處呢?比如說在類神經網路的模型訓練當中,我們沒有辦法直接將『文字』帶入其中進行運算,畢竟類神經網路的基礎建立在神經元通過權重運算輸出結果。

但是試想,若是今天我們能將『文字』轉成『數值』型態,也就是將詞『嵌入』到以數學表示的『向量空間』當中,我們是否就能進行類神經網路的訓練了呢?

答案是可以的!若是我們想要知道輸出的結果,只需要將輸出的向量再次按照我們建立的『文字轉向量』格式轉回文字即可。

Word Embedding 的作法有非常多種,要根據當前任務的屬性以及硬體等級作取捨,以下就簡單介紹一些 Word Embedding 的種類,我想以後會再寫出更詳細的單篇文章,全部 Word Embedding 擠在同一篇有點不切實際,而且難以閱讀。

目前常用到的有以下數種,有些也挺不確定是否應該分類到 Word Embedding 這個框架底下,總之我也想在這裡紀錄一下,如有人覺得這個分類不妥、不符合大眾認知,也請告訴我一聲,我會馬上修改掉的。

  • One-hot encoding
  • Word2Vec
  • Doc2Vec
  • Glove
  • FastText
  • ELMO
  • GPT
  • BERT

再次重申,這不是深度研究的文章,只是我想要簡單紀錄 Embedding 的種類。


One-hot encoding

One-hot encoding 是我學到的第一種將文字轉成數值型態的方法,其概念也非常簡單,那就是以序列當中詞的 Index 來標注該詞,簡單來講,比如說我們有以下的句子:

Today is a nice day

我們將其定義為 5 個單詞:

['Today', 'is', 'a', 'nice', 'day']

那麼,每個字轉成向量的型態如下:

Today[1, 0, 0, 0, 0]
is[0, 1, 0, 0, 0]
a [0, 0, 1, 0, 0]
nice [0, 0, 0, 1, 0]
day[0, 0, 0, 0, 1]

但這樣有著很明顯的問題:如果今天我們文本序列非常長,單詞數量極多,我們硬體的運算量就爆炸了。


Word2Vec

論文在此: https://arxiv.org/pdf/1301.3781.pdf

Word2Vec 最早是由 Google 開源的工具,Gensim 即為這個工具的 Python 版本。是經由兩種不同的演算法覺得一個詞的向量,基本上分為 Skip-gram 以及 CBOW 兩種。

訓練速度很快,只使用 CPU,而且不會有像 One-hot 一樣的缺陷。如果硬體設備不夠高級,那麼個人非常推薦 Word2Vec 這種 Word Embedding 的方法。雖然效果及不上 BERT、XLNet 之類的鬼神,但在各自然語言處理的任務結果還是不錯的,算是非常好用的平民工具。

不過我個人先大膽做個假設,之後會有更多更好用的 Word Embedding 方法,甚至整個 NLP 任務都會偏向 Transformer 模型,畢竟實在太好用了。

所以我現在的說法可能只能撐個半年到一兩年,很快就不適用了。


Doc2Vec

論文在此: https://cs.stanford.edu/~quocle/paragraph_vector.pdf

基本上,Doc2Vec 跟 Word2Vec 是非常像的,應該說連論文都是同一個人提出的。

如果說 Word2Vec 是將『文字轉成向量』,那麼 Doc2Vec 就是將『文本轉成向量』。

目前我很難對這種轉向量方法做出評價,因為我只有使用過一次,那次的效果甚至還不如直接使用 Word2Vec。不過如果只有使用過那麼一次的話,也存在著那個 NLP 任務並不適合這種方法,我個人還希望多試幾次再做出評價。


Glove

由著名的 Stanford 研究團隊開發 ,可以去他們的官網看看: https://nlp.stanford.edu/projects/glove/

Glove 也是一種得到 Word Vector 的方式,大部分英文 Word Embedding 的模型都是直接從官網的 Pre-Trained Model 下載調用,中文的話便要自己訓練。

可以從官方的 Github 上研究怎麼使用 Glove,我目前只有在 Linux 系統上運行成功,不確定其它作業系統能不能用: https://github.com/stanfordnlp/GloVe

另外,我在使用英文 Pre-Trained Model 時效果比我使用 Gensim 訓練的英文 Wiki 還要好,但是在中文上卻差 Gensim 滿多的。同樣僅為個人意見,除非實際測試在自己的任務當中,否則都只是猜想。


FastText

FastText 其實我非常少用,不過由於相當知名,故還是一併紀錄在這裡。

FastText 是由 Facebook 開源的工具,除了 NLP 相關的函式庫之外也有著機器學習相關的函式庫。

學習這個工具最快的方法,我建議是直接去官網看其教學: https://fasttext.cc/

如果我之後有幸(有時間)研究的話,會另外開一篇詳細做個筆記吧。


ELMO

2018 年 3 月 ELMO 發表了,跟 2013 年的 Word2Vec 不同的是,ELMO 可以根據不同的情境(使用位置)來給予不同的 Vector,這讓它在許多 NLP 的任務中擁有比單純固定的 Word Vector 更好的效能。

說來慚愧,我並沒有實際使用過(反而是下面的 BERT 我有體會過其強大),作為這麼經典的 Embedding,我之後一定要認真研究一下。


GPT

BERT

GPT (或 GPT-2) 跟 BERT 我想要放在一起簡單討論一下。BERT 是 2018 年 11 月由 Google 發表的工具,全名為 Bidrectional Encoder Representation from Transformers,顧名思義,這便是 Transformer 的模型構成。

BERT 是可以用於將文字轉換為向量的,是 Transformer 的編碼器(Encoder)架構;而 GPT-2 的輸出則是詞彙(token),故是 Transformer 中的解碼器(Decoder)架構。

若想要使用這種 Transformer 的 Embedding,我推薦一個非常好用的工具,Hugging Face 的 Transformer: https://github.com/huggingface/transformers

BERT 的話我可以提一段小故事:之前我曾經使用過 LSTM 和 RNN 來進行經典資料集 IMDB 的評論分類(二元分類:正面或負面),那時候很悲慘的是我可能哪裡沒有調適好,最高只有到 Accuracy 87 %。

那時候我有位朋友只使用了 Scikit Learn 就輕鬆(而且快速)地達到了 90 %,真是個不公平的世道。

然後,我將 Embedding 改為了使用 Transformer 的 BERT。

神奇的事情發生了,我的 Accuracy 高達 93.59 %。

這真的是很誇張的高分,我從前在練習 Keras 的時候從來沒有拿到這麼高分過。我想之後我可以發一篇相關的文章紀錄一下我實做的過程。


以上,簡單的 Word Embedding 大致紀錄到這裡。包含了我過去使用的一些經驗、以及這些不同的 Embedding 方法各自擁有的特色。

當然,實做是最重要的。我之後也將繼續學習、練習不同的模型以及挑戰不同的機器學習任務。

3 thoughts on “[NLP] Word Embedding 筆記”

    1. 天哪~這麼明顯我錯誤我居然沒發現 XDDD
      真是謝謝你告訴我,不然還真不知道哪一年才會突然察覺到哈哈哈。

  1. Pingback: Word Embedding的種類 - 麥可code

Leave a Reply