iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
1
AI & Data

30 天學會深度學習和 Tensorflow系列 第 21

20. 深度學習甜點系列:以單字為基礎的語言模型

  • 分享至 

  • xImage
  •  

Neural language model with Feed Forward Network:

下圖的投影片截圖是在 2003 年所發表的類神經網路語言模型,該模型的主要任務是預測下一個字詞(target word)為何。如果還記得我們在之前的文章中有簡短地提到為何 Feed Forward Network 不適合做語言模型的原因。現在我們要先花點時間,來解釋一下為何 Feed Forward Network 對此類工作無法勝任?

首先,第一個原因是因為輸入句子通常是不定長度的,而 Feed Forward Network 的輸入必須是固定的。這個問題很容易用一個類似 convolution network 的方式,以 1D 的 sliding window 取出不定長度句子的片段,而使該模型的輸入是一個固定長度的片段句子。如下圖,使用 window size 為 6,而 y 標示的部分則是這個六字句子片段的下一個字,也就是 juice 的部分。

Neural Language Model

Word representation with one-hot encoding:

要注意的是,在這個模型裡,所有的單詞都是用 “one-hot encoding” 的編碼方法做向量化。可以見上圖,當輸入的句子會先轉成字彙集中的對應索引值(word index),而 “one-hot encoding” 的編碼方式,將每一個字詞以一個長度為字彙集大小的向量表示。如在例子中為字彙集的大小為 10,000 個單詞,所以每一單詞的 one-hot encoding 向量表示法,就是一個 10,000 的向量,裡面的所有元素為零,除了對應該單詞的索引值元素為 1。(每一個向量只有一個元素為 1,所以被稱為 One-hot encoding)

這個使用 Feed Forward Network 的架構來做語言模型,有兩個明顯缺點:

  1. 能使用的字彙歷史受限於 window 長度。若使用 padding 的方式來造成全句輸入,可能會造成過多的參數,而難以訓練。
  2. 字詞間的相關性並沒有被捕捉。Feed Forward Network 學到的比較像是 N-gram 或 N-word 的字頻資訊,這裡的 N 指的是 window size。若以機率來說明,那就是 P(“Orange Juice”) = P(“Juice” | “Orange”)P(“Orange”) 中的 P(“Juice” | “Orange”) 無法被 Feed Forward network 架構學到。若連接 “Orange” 和 “Juice” 兩單詞輸入的隱藏節點為 H,學到的也是 “Orange Juice” 共同出現的字頻機率,也就是 P(H) = P(“Orange Juice”) 。Feed Forward network 在這個節點所學到的機率,應該就是 P(H) = P(H|“Orange”)P(H|“Juice”)。

Softmax output:

另外一個問題,非網路架構專屬,則是該模型需要一個相當龐大的 softmax 輸出,為了能對所有可能出現的單詞做預測,而輸出的大小通常為字彙集大小。但如圖所見,字彙集大小通常都非常龐大,所以顯然地,我們需要一個有效的單詞預測方式,而最有可能實踐的方法,則是對龐大字彙集作取樣。

下圖則為投影片截圖,說明擁有龐大的 softmax 輸出可能有的問題,以及在 Neural Language Model paper 中如何使用 Hierarchical Softmax Sampling 的方式來更新常出現的參數。

Sampling candidate words

與其給予均等的機率來對字彙集的所有字彙來取樣,一個比較有效率的方法是基於不是所有的字彙都是均等出現的想法。Hierarchical Softmax Sampling 則是使用如二元樹對字彙排序,並透過分類器來找出候選字彙最有可能在二元樹出現的例子。一種對字彙排序的方法,則是利用 Huffman Tree 的編碼方式。 Huffman Tree 會將字彙在字典出現的頻率來建立二元樹,較常出現的字彙會在二元樹的頂端(這些字通常不會被選為 context words,由於太過於頻繁出現),而較不常出現的字,則在二元樹的底部(這些字因為出現的頻率過於稀少,反而適合選為 context words)

Neural Language Model 模型雖然在實際應用上無法取得高準確度,卻提供了兩個重要的理論基礎予往後的語言模型:從上下文預測單詞(context words)來建立 word embedding 以及一個取樣更新參數的方法。前者提供了以下所要介紹的 Word2Vec 中使用 skip-gram 的方式來訓練 embedding matrix。後者則提供了 negative sampling 靈感給 Word2Vec 做參數更新。

Word2Vec:

Word2Vec 是由 google 在 2013 年所開發出來的 word embedding 訓練模型,該模型包含兩個部分,一個是和上所述的 Neural Language Model 類似,在給定上下文中 context words 用來預測 target word 的 Continuous Bag of Words (CBoW) 模型。另外一個則是 skip-gram 模型,這個模型的目的則與 CBoW 相反,是由 target word 預測 context words。這三個模型的比較如下:
Language model

與之前所提到的 Neural Language Model ㄧ樣,也是使用預測字詞的方法來建立 word embedding,除了之前提到,在 skip-gram 模型裡,是用 target words 去預測相鄰的 context word,而所用的損失函數也與 Neural Language Model 不盡相同。在 Word2Vec 中,不再使用 softmax 來對候選字詞做預測,而是建立了與字詞大小相同的二元分類器,每個分類器都預測該字詞為 target word 的 context word 的機率有多少。

而這個模型的架構可以由下圖的投影片截圖所示:
binary classifier

Negative Sampling:

但很明顯地,在上圖中可以看到雖然有 |V| 個二元分類器(圖中 |V| = 10k),但真正需要更新的只有非常小的比例。其他的分類器,在大多的情況下都會輸出零,或否的情況。所以,上圖的龐大分類器問題又可進一步的縮減為多次疊代的問題,而每次疊代都只選取 k + 1 個分類器更新參數。k 個分類器輸出為零藉由給定負面訓練例子和一個分類器負責區分正面訓練例子。

選取 k 個負面訓練例子,則是利用下面所述的 negative sampling 的方式來進行。而 k 的選擇則依賴訓練資料量的大小。若是較大的訓練資料,則 k 為 2-5,而 k 可設為 5-20,若訓練資料量較小。

而下圖的投影片截圖則說明 negative sampling 的方式:

Negative sampling

在提出 Word2Vec 的第一篇文章中,作者提議從訓練資料中計算推導出來的機率分佈來選取 k 負面詞彙,以此為 negative sampling 的方式來更新二元分類器的參數,顯然要比隨機有效多。


上一篇
19. 深度學習甜點系列:以字頻為主的語言模型
下一篇
21. 深度學習甜點系列:以字母為基礎的語言模型
系列文
30 天學會深度學習和 Tensorflow30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言