1. 程式人生 > >深度學習與人類語言處理-語言模型

深度學習與人類語言處理-語言模型

[上節課](https://www.cnblogs.com/gongyanzh/p/12536836.html)學習了seq2seq模型如何用於語音識別,這節課我們將學習如何將語言模型加入到模型中 --- ### 為什麼需要語言模型 - token sequence 的概率 - token sequence: $Y=y_1,y_2,...,y_n$ - $P(y_1,y_2,...,y_n)$ token 可以是字元、詞等等,可以見[深度學習與人類語言處理-語音識別(part1)](https://www.cnblogs.com/gongyanzh/p/12496037.html) **HMM** $$ \begin{equation}\mathrm{Y}^{*}=\arg \max _{\mathrm{Y}} P(X | \mathrm{Y}) P(\mathrm{Y})\end{equation} $$ 在使用HMM進行語音識別時,$P(Y)$就是語言模型 **LAS** $$ \begin{equation}Y^{*}=\arg \max _{Y} P(Y | X)\end{equation} $$ 在端到端的深度學習模型中,是在給定$X$的情況下找到最大的$Y$,似乎沒有語言模型存在的空間,但神奇的是,我們可以直接把Decoding的式子寫為 $$ \begin{equation}Y^{*}=\arg \max _{Y} P(Y | X)P(Y)\end{equation} $$ 從概率的角度來看,我們很難解釋這個式子的含義,乘個$P(Y)$幹啥?但是為什麼乘$P(Y)$有用呢,因為$P(Y|X)$和$P(Y)$的資料來源可以不同。具體來說$P(Y|X)$需要收整合對的資料,而$P(Y)$只需要收集大量的文字 成對資料和單獨的文字資料量差了多少呢? google的語言識別系統使用了12500小時的聲音訊號,包含的詞數:$12500*60*130$(60分鐘,每分鐘平均可以說130個詞),大約**1億**個詞 單純文字資料:BERT用了**30億**以上的詞 > BERT資料是的語音資料的30倍,所以可以很容易的收集到大量文字資料,把$P(Y)$估的比較準,這就是為什麼需要加入語言模型 ### N-gram - 怎麼估計一個token sequence 的概率? - 直觀的想法,收集大量的資料,統計 $y_1,y_2,...,y_n$這個序列出現的次數,但人類的句子非常複雜,很可能句子沒有出現在訓練資料中,顯然不能因為句子沒有在訓練資料中出現就認為它出現的概率是0 - N-gram語言模型:$$P\left(y_{1}, y_{2}, \ldots \ldots, y_{n}\right)=P\left(y_{1} | B O S\right) P\left(y_{2} | y_{1}\right) \ldots P\left(y_{n} | y_{n-1}\right)$$,就是二元語言模型,舉個栗子 $P(“wreck a nice beach”) =P(wreck|START)P(a|wreck) P(nice|a)P(beach|nice)$ 計算$P(beach|nice)$的概率: $$ P(\text { beach } | \text { nice })=\frac{C(\text {nice beach})}{C(\text {nice})} $$ #### N-gram 有什麼問題? ``` 訓練資料: the dog ran... the cat jumped... ``` 估計新句子的概率: $P(\text { jumped } | \text { the }, \operatorname{dog})=0$ $$P(\text { ran } | \text { the }, \text { cat })=0$$ 這顯然是不合理的,只是因為出現的概率低,不能設定為0.這種情況需要進行平滑處理,例如add-1 smoothing, add-k smoothing,這個大家可以自行了解。 #### Continuous LM 除了傳統的自定義平滑規則,還有一種自動化的平滑方法,continuous LM ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401112540726-1722731532.png) 表格中數字表示詞數,例如$Count(ran|dog)=3,Count(ran|cat)=3$, 值為0表示訓練資料中沒有出現,我們想估計它的實際值,我們來看看Continuous LM怎麼做 ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401112600774-778192338.png) 每一個token有一個對應的向量,分別表示為$h,v$, 代表詞的屬性,需要根據訓練集學習得到,假設表中數值用$n$表示,同時假設$n$可以由$v,h$的內積表示,例如 $$ \begin{array}{l}n_{12}=v^{1} \cdot h^{2} \\n_{21}=v^{2} \cdot h^{1} \ldots\end{array} $$ 對應的損失函式: $$ L=\sum_{(i, j)}\left(v^{i} \cdot h^{j}-n_{i j}\right)^{2} $$ $n_{i j}$是表中可以直接得到的, $v^{i}, h^{j}$ 可以通過梯度下降求解 將$v^{i} \cdot h^{j}$表示估計到的對應詞彙被接在一起的概率 - 這樣做有什麼好處? 假設“dog”和“cat”有某些同樣的屬性,就會得到相似的向量$h^{dog}$和$h^{cat}$, 如果訓練資料中已經知道“cat”通常會接“jumped”,也就是 $v^{jumped} \cdot h ^{cat}$ 很大,那對應的$ v^{jumped} \cdot h ^{dog}$也會很大, 可以看到這是可以通過學習得到的語言模型平滑方法 看到這裡熟悉word2vec的同學會發現這有點像啊,我們來看看他們之間有什麼聯絡? 我們具體看下continuous LM的學習過程 ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401112618419-1614899679.png) 我們希望$h,v$相乘後結果和目標越接近越好 我們可以把這個看作是一個簡單神經網路,只有一個隱層,沒有啟用函式。把h當做引數,輸入是one-hot,就得到了下面的樣子 ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401112636554-1750103917.png) ### NN-based LM 我們將上面的模型拓展更深,就是NN-based 語言模型 - training ``` data: 潮水 退了 就 知道 誰 ... 不爽 不要 買 ... ``` 假設使用NN代替一個**tri-gram**語言模型,就是輸入前兩個單詞,預測下一個 ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401112650693-92838976.png) 同樣的,如果是一個二元語言模型,也可以用NN來代替 $P(“wreck a nice beach”) =P(wreck|START)P(a|wreck)P(nice|a)P(beach|nice)$ $P(b|a)$:NN 預測下一個詞的概率 訓練如下 ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401112734835-1067411831.png) 實際上NNLM(2003)比continuous LM(2010)出現的還早,只是在語音領域沒有引起重視,後來才被挖出來 ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401112755555-1096298038.png) ### RNN-based LM 看很長的history決定下一個詞,如果用NN的話,輸入會非常長,需要非常多的引數,所以引入一個RNN,將歷史詞輸入到RNN,用Ht表示,在乘以每個詞對應的v輸出下一個詞對應的概率 ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401112811517-394765011.png) ### How to use LM to improve LAS ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401112826211-1930471529.png) 先說幾個整合方法怎麼做: - shallow fusion 分別訓練LM和LAS,訓練好後將各自的**輸出**接到一起,整合 - deep fusion 分別訓練LM和LAS,訓練好後將各自的**隱層**接到一起,整合 - cold fusion 先訓練LM,再將LM的隱層接到LAS進行訓練 #### Shallow Fusion ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401112957170-1173574256.png) ### Deep Fusion 隱層被接到一起,在訓練一個Network進行輸出 將隱層接到一起的缺點在於:如果LM改變了,network需要重新訓練 ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401113010983-482072554.png) ### Cold Fusion 由於LM已經被訓練號,LM的收斂會比較快 缺點在於:如果LM改變了,network需要重新訓練 ![](https://img2020.cnblogs.com/blog/1043283/202004/1043283-20200401113025358-793119425.png) 這節課就到這裡了,下節課我們將學習語音合成。 references: http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP