自己動手實現深度學習框架-8 RNN文字分類和文字生成模型
阿新 • • 發佈:2020-06-15
程式碼倉庫: https://github.com/brandonlyg/cute-dl
# 目標
上階段cute-dl已經可以構建基礎的RNN模型。但對文字相模型的支援不夠友好, 這個階段的目標是, 讓框架能夠友好地支援文字分類和本文生成任務。具體包括:
1. 新增嵌入層, 為文字尋找高效的向量表示。
2. 新增類別抽樣函式, 根據模型輸出的類別分佈抽樣得到生成的文字。
3. 使用imdb-review資料集驗證文字分類模型。
4. 使用一個古詩資料集驗證文字生成模型。
這階段涉及到的程式碼比較簡單因此接下來會重點描述RNN語言相關模型中涉及到的數學原理和工程方法。
# 數學原理
## 文字分類模型
可以把文字看成是一個詞的序列$W=[w_1, w_2, ..., w_T]$, 在訓練資料集中每個文字屬於一個類別$a_i$, $a_i∈A$, 集合 $A = \{ a_1, a_2, ..., a_k \}$ 是一個類別別集合. 分類模型要做的是給定一個文字W, 計算所有類別的後驗概率:
$$
P(a_i|W) = P(a_i|w_1,w_2,...,w_T), \quad i=1,2,...k
$$
那麼文字序列W的類別為:
$$
a = arg \max_{a_i} P(a_i|w_1,w_2,...,w_T)
$$
即在給定文字的條件下, 具有最大後驗概率的類別就是文字序列W所屬的類別.
## 文字預測模型
設任意一個文字序列為$W=[w_1,w_2,...,W_T]$, 任意一個詞$w_i ∈ V$, V是所有詞彙的集合,也叫詞彙表, 這裡需要強調的是$w_i$在V中是無序的, 但在W中是有序的, 文字預測的任務是, 計算任意一個詞$w_i ∈ V$在給定一個序列中的任意一個位置出現的概率:
$$
P(w_1,...,W_T) = ∏_{t=1}^T P(w_t|w_1,...,w_{t-1})
$$
文字預測輸出一個$w_i ∈ V$的分佈列, 根據這個分佈列從V中抽取一個詞即為預測結果。不同於分類任務,這裡不是取概率最大的詞, 這裡的預測結果是某個詞出現的在一個序列特定位置的個概率,只要概率不是0都有可能出現,所以要用抽樣的方法確定某次預測的結果。
# 詞的數字化表示
任意一條資料在送入模型之前都要表示為一個數字化的向量, 文字資料也不例外。一個文字可以看成詞的序列,因此只要把詞數字化了,文字自然也就數字化了。對於詞來說,最簡單的方式是用詞在詞彙表中的唯一ID來表示, ID需要遵守兩個最基本的規則:
1. 每個詞的ID在詞彙表中必須是唯一的.
2. 每個詞的ID一旦確定不能變化.
這種表示很難表達詞之間的關係, 例如: 在詞彙表中把"好"的ID指定為100, 如果希望ID能夠反映詞意的關係, 需要把"好"的近意詞: "善", "美", "良", "可以"編碼為98, 99, 101, 102. 目前為止這看起還行. 如果還希望ID能夠反映詞之間的語法關係, "好"前後經常出現的詞: "友", "人", "的", 這幾個詞的ID就很難選擇, 不論怎樣, 都會發現兩個詞它們在語義和語法上的關係都很遠,但ID卻很接近。這也說明了標量的表達能力很有限,無法表達多個維度的關係。為了能夠表達詞之間多個維度的的關係,多維向量是一個很好的選擇. 向量之間的夾大小衡量它們之間的關係:
$$
cos(θ)