back to index
[DLHLP 2020] Speech Recognition (7/7) - Language Modeling

link |
我們講一下怎麼把Language Model放在語音辨識裡面
link |
講完這一段,我們就進入Voice Conversion
link |
為什麼我們會需要Language Model這個東西在語音辨識裡面呢?
link |
我們先來看一下所謂的Language Model指的是什麼
link |
Language Model我們常常縮寫成LM
link |
它要做的事情是去估測一串Token Sequence出現的機率
link |
過去在文獻上比較常講說Language Model就是估測Word Sequence出現的機率
link |
不過今天我們文字的Sequence不一定是Word Sequence
link |
我們可能是拿Character當作單位
link |
我們可能是拿Morphing當作單位
link |
所以我這邊用Token Sequence來代表Language Model
link |
所以我們說Language Model是在估測Token Sequence的機率
link |
我們有一個Token Sequence大Y Language Model
link |
就是想要估測這個大Y這一個Sequence它出現的機率有多少
link |
在Hidden Mark of Model裡面,估測Language Model的機率這件事情是非常必然的
link |
因為我們說Hidden Mark of Model把Decoding的這個式子寫成這樣
link |
我們要找一個Y,讓P of X given Y乘上P of Y的值最大
link |
而P of Y就是Language Model
link |
而今天我們進入了這種Deep Learning Base的
link |
全Deep Learning End-to-End語音辨識的模型以後
link |
好像就不需要Language Model了
link |
因為這種全Deep Learning的語音辨識模型
link |
它Decoding的式子寫成這個樣子
link |
我們是要找一個Token Sequence Y,讓P of Y given X越大越好
link |
這裡面似乎沒有Language Model存在的空間
link |
你可以直接把Decoding這個式子寫成P of Y given X乘上P of Y
link |
這個P of Y就是Language Model
link |
你直接把Decoding的式子寫成P of Y given X乘上P of Y
link |
就是這邊好像不太需要乘上P of Y啊
link |
如果是Hidden Mark of Model乘上P of Y
link |
但P of Y given X又乘上P of Y
link |
就不知道在幹什麼,在機率上面不好解釋
link |
在機率上面不知道為什麼要乘一個P of Y上來
link |
但是啊,為什麼這邊乘一個P of Y往往還是會有用呢?
link |
為什麼就算是今天進入了全Deep Learning的語音辨識
link |
加上Language Model還是會有用呢?
link |
那是因為啊,通常這個P of Y given X跟P of Y
link |
就是說這個P of Y given X啊
link |
你如果要估測這一項,你需要成對的資料
link |
而如果你要估測P of Y,你只需要收集大量的文字
link |
所以收集需要估測P of Y的資料的成本是比較低的
link |
所以讓比較容易估的好的P of Y來這邊
link |
這個使用Language Model的招數啊
link |
在很多其他的Application裡面都會用到
link |
基本上如果你今天要Learn一個End-to-End的Model
link |
往往加上Language Model就有用
link |
加上這種Language Model往往就有用
link |
比如說如果你要做Translation
link |
你可以加上Language Model
link |
加上Language Model也往往會有用
link |
所以像這樣加入Language Model的技巧
link |
就算是今天在Deep Learning的時代
link |
來訓練來找出P of Y given X
link |
來訓練他們的end-to-end model
link |
所以我們把12500乘60乘上130
link |
這個是如果你要蒐集成對資料的case
link |
這個一個人平均每分鐘是說一百三十個字
link |
他是金氏世界紀錄說話最快的紀錄保持人
link |
不過多數人講話都沒有辦法那麼快就是了
link |
是一個巨大的language model就好了
link |
那如果你現在就想知道BERT是什麼的話
link |
之前我們在機器學習的課其實有稍微提到BERT
link |
這就是為什麼我們需要加入py這個東西
link |
怎麼估測一個token sequence
link |
在還沒有deep learning的技術之前
link |
N-Gram的language model
link |
什麼是N-Gram的language model呢
link |
如果我們要估測一個token sequence的機率
link |
這個token sequence出現的次數
link |
隨便給你一個token sequence
link |
所以就有了N-Gram language model的想法
link |
N-Gram language model是把
link |
舉例來說假設你要算recognize speech這個句子的機率
link |
那為什麼舉recognize speech這個句子當作例子呢
link |
那因為recognize speech這個句子
link |
就語音辨識是recognize speech
link |
跟破壞一個好的海灘recognize speech
link |
在提到language model的時候
link |
這個recognize speech
link |
你不會直接估測這個token sequence的機率
link |
這個是N-Gram的language model
link |
舉例來說怎麼估測nice後面接beach的機率呢
link |
nice跟beach這個片語出現幾次
link |
你把nice後面接beach出現的次數
link |
你就知道nice後面接beach的機率了
link |
這樣子的language model
link |
是5-Gram的language model
link |
那你可以把5-Gram的language model
link |
那3-Gram就是given兩個詞彙
link |
這是N-Gram的language model
link |
那N-Gram的language model有什麼問題呢
link |
就算是我們今天已經把整個token sequence的機率
link |
拆成很多項N-Gram,很多項小的component
link |
讓我們準確的計算出一個句子的出現的機率
link |
N-Gram的Language Model
link |
Language Model Moving的技巧
link |
有一些N-Gram雖然統計出來機率是0
link |
因為他不是0他只是出現的機率很低而已
link |
那這個技術叫做Language Model的Smoothing
link |
可以參考李靈山老師的數位語音處理這門課
link |
好那後來就逐漸的進入了Deep Learning的時代
link |
在進入Deep Learning的時代之前
link |
人們是怎麼處理Language Model Smoothing這個問題的呢
link |
叫做Continuous的Language Model
link |
這Continuous Language Model
link |
所以我們超展開一下突然跳來講推薦系統
link |
本來在講語音辨識突然超展開要講推薦系統
link |
然後現在有五個使用者在看NicoNico上的四部動畫
link |
然後有一些使用者會給某些動畫打個分數
link |
你知道使用者B曾經給過涼宮春日很高的分數
link |
那你就可以從其他的使用者的行為去推估出來
link |
那就發現說喜歡涼宮春日的人也會喜歡超電磁炮
link |
那可能是因為涼宮春日跟玉板美琴背後都有同樣的屬性
link |
所以喜歡涼宮春日的人就會喜歡玉板美琴
link |
有一個技術叫做Matrix Factorization
link |
Matrix Factorization可以幫你把這個table裡面
link |
然後就有人想到說把這個技術用在Language Model上
link |
這個技術怎麼用在Language Model上呢
link |
只是現在這個表格不是使用者跟要推薦給使用者看的動畫
link |
這個表格的縱軸跟橫軸是你vocabulary
link |
這個表格裡面橫軸跟縱軸就是你所有可能的token
link |
某一個token後面接另外一個token
link |
但貓不會哭 貓不會笑 狗不會哭 狗不會笑
link |
metric factorization的技術
link |
是vector的inner product
link |
所以n1 2就是v1跟h2的inner product
link |
n2 1就是v2跟h1的inner product
link |
你要去learn的這個loss function
link |
可以讓這個loss function的值越小越好
link |
因為這邊假設說vi跟hj做inner product
link |
我們就可以藉由minimize這個loss function
link |
那這個只需要用gradient descent
link |
我們就不是直接看table裡面統計的結果了
link |
他們做inner product以後
link |
他們做inner product以後
link |
language model smoothing的方法
link |
那傳統language model smoothing的方法
link |
但是可以在continuous language model裡面
link |
我們自動做到了language model smoothing
link |
他是透過learning的方法認出來的
link |
那continuous language model
link |
用到language model裡面啊
link |
可以解決language model smoothing的問題
link |
也逐漸被deep learning取代掉了
link |
hidden Markov model的時候
link |
這個hidden Markov model
link |
stay time的方法叫做suspect CNN
link |
他是一個更直覺的解決stay time的問題
link |
讓所有stay都共用一個model方法
link |
所以就逐漸把suspect CNN淘汰掉了
link |
那其實language model也是一樣
link |
continuous language model乍看之下
link |
好像跟deep learning沒有很直覺的關係
link |
其實你可以把continuous language model
link |
想成是deep learning based language model的
link |
可能覺得說deep learning
link |
有天突然冒出來一個deep learning
link |
但其實從原來的技術變到deep learning
link |
像有點像是deep learning的略化版
link |
然後才進入deep learning
link |
就像我們從hidden Markov model
link |
原來的N-Gram based language model
link |
所以有了一個continuous language model
link |
然後接下來進入deep learning based language model
link |
而continuous language model
link |
就得到狗後面接rand估計出來的次數
link |
我們有一個training的target
link |
因為從training data裡面
link |
這就是我們右上角這個loss function寫的事情
link |
我們可以把它當成一個簡單的neural network來看
link |
這個neural network只有一個hidden layer
link |
這個hidden layer裡面沒有activation function
link |
它是linear的hidden layer
link |
當作是這個neural network的第一個layer的參數
link |
當作是這個network的第一個layer的參數
link |
你就輸入一個one-half vector
link |
所謂one-half vector的意思是說
link |
中間hidden layer的輸出就是h dog
link |
每一個token估測出來的次數有多少
link |
那你要去minimize一個loss function
link |
所以continuous language model
link |
可以看作是一個只有一個hidden layer的
link |
那既然這是一個deep network
link |
一個general的neural network
link |
所以有了NN-based language model
link |
NN-based language model
link |
那NN-based language model
link |
然後NN-based language model
link |
N-grain的language model
link |
跟N-grain的language model很像
link |
N-grain的language model是given幾個詞彙
link |
比如說trigger language model
link |
那neural network也是一樣
link |
比如說如果你要用你的NN-based language model
link |
那你就trigger neural network
link |
你就有一個NN-based language model
link |
就可以用NN-based language model
link |
你今天本來recognize speech
link |
是一連串的by-grain乘起來的結果
link |
就你訓練訓練好一個neural network
link |
下一個詞彙應該是某一個token的機率
link |
所以你訓練好一個NN-based language model
link |
你要算recognize speech的機率
link |
把nice丟進去看看beech出現的機率
link |
你就得到這個token sequence
link |
這是NN-based language model
link |
那事實上NN-based language model
link |
是比continuous language model還要早的
link |
直到continuous language model熱潮過了以後
link |
continuous language model崛起以後
link |
然後才有人把NN-based language model
link |
那直到今天NN-based language model
link |
好,那NN-based language model
link |
用NN來取代language model
link |
不過今天NN-based language model
link |
我們知道說word embedding
link |
Thomas Mikhailov在13年、14年的時候發明的
link |
是有提到word embedding的概念
link |
later representation拿出來visualize
link |
我們大家所熟知的word embedding
link |
RNN-based language model
link |
那為什麼要有RNN-based language model呢
link |
因為你可能會想看非常長的history
link |
引入一個recurrent的network
link |
用recurrent的network
link |
然後最後一個hidden layer
link |
輸出一個representation ht
link |
再把這個ht乘上每一個word所對應的V
link |
然後去估測下一個word應該出現的基地
link |
所以如果用RNN-based language model
link |
RNN-based language model
link |
過去如果是一般的NN language model
link |
但是今天如果有RNN-based language model
link |
RNN-based language model
link |
他用Neural Turing Machine
link |
他把Neural Turing Machine改一改
link |
language model的RNN-based的模型
link |
你只要好好的做Optimization
link |
好好的做Regularization
link |
怎麼跟今天的Deep Learning Based的
link |
這些N-to-N的model結合起來呢
link |
看Neural Network Based的language model
link |
你就可以看到比如說有Shallow Fusion
link |
怎麼把language model跟LAS結合
link |
也可以在兩個model的hidden layer結合
link |
你可以先把language model跟LAS
link |
也可以把language model先train好
link |
先把train好language model
link |
Shallow Fusion Deep Fusion
link |
跟Code Fusion分別是怎麼做的
link |
Shallow Fusion的做法是這樣
link |
我們有一個deep learning based
link |
我們有一個language model
link |
今天LAS output一個probability distribution
link |
那language model output一個
link |
probability distribution叫做PLN
link |
你就把這兩個probability distribution
link |
得到最終的probability distribution
link |
你要把它當做hyperparameter
link |
用depth set來決定這個參數是多少
link |
看你要相信language model多一點
link |
decode的方法就跟我們之前講的都一樣
link |
那你可能會需要用bin search
link |
或者假設你不用bin search的話
link |
同樣的process同樣的fusion process
link |
這個叫做shallow fusion
link |
shallow fusion是直接在輸出的地方相加
link |
所以你今天有一個train好的language model
link |
你會把他們的hidden layer的輸出
link |
你會把他們hidden layer的輸出拉出來
link |
然後丟到一個neural network裡面去
link |
去決定最終output的distribution
link |
那可是這個network是怎麼來的呢
link |
所以你訓練好一個language model
link |
那如果你是把hidden layer接出來
link |
你不能夠任意換你的language model
link |
如果你今天想要把language model抽換掉
link |
你覺得這個language model不是你要的
link |
你得重train你的neural network才行
link |
你每次要抽換掉這個language model
link |
你得重train你的neural network
link |
如果你是把hidden layer拉出來
link |
常常抽換language model呢
link |
你可能就會想要抽換你的language model
link |
city跟城市語言的城市programming
link |
選不同的language model
link |
對這個LAS的model來說是差不多的
link |
那我們需要language model來決定說
link |
到底應該是city還是programming
link |
你就train不同的language model
link |
一般人使用的language model
link |
如果是一般人使用的language model的話
link |
使用的language model的話
link |
那可能programming的機率就高一點
link |
所以你可以透過換language model
link |
每個人都有一個不同的language model
link |
那可是如果是deep fusion的方法的話
link |
你不能夠輕易的拔掉你的language model
link |
你拔掉你的language model換一個新的進來
link |
你這個灰色的block得重train才行
link |
你把你的language model
link |
不要把它的hidden layer接進來
link |
你把你的language model跑到最後
link |
跟你的token的size一樣大的向量
link |
把這個跟token size一樣大的向量
link |
你其實可以任意更換language model
link |
而不見得需要重train灰色的這個block
link |
因為這個灰色的block可能就是學到說
link |
它要怎麼跟這個hidden layer把它整合起來
link |
你今天就算是換了language model
link |
它還是output一個token的distribution
link |
對一個language model來說
link |
在這個vocabulary size的這個vector裡面
link |
每一個dimension的意義都是一樣的
link |
對不同的language model來說
link |
你的hidden layer的每一個dimension
link |
你train了兩個不同的language model
link |
它的同一個hidden layer的同一個dimension
link |
就算是不同的language model
link |
所以你就可以任意的替換你的language model
link |
而不見得需要重train灰色的這個block
link |
假設你的vocabulary size很大
link |
你的token是以word為當作單位
link |
也許你就可以真的考慮使用這樣子的方式
link |
如果你今天是要把hidden layer
link |
那NN-based的language model
link |
傳統的NN-based的language model
link |
它也有辦法給每一個token一個機率
link |
你也可以把傳統NN-based的language model
link |
那接下來呢我們講code fusion
link |
code fusion相較於前面那兩個方法
link |
我們什麼時候把language model加進來
link |
我們先有一個已經訓練好的language model
link |
它的參數還是random initialized
link |
然後在end to end去把這個部分訓練出來
link |
我們就沒有讓大家做一個真正的語音辨識系統
link |
我們做出來的語音辨識系統只有一個speaker
link |
要用這個colab在一個半小時內做出來
link |
好 那個如果是用confusion的話
link |
因為你已經有一個language model了
link |
language model就可以解的問題
link |
它只需要專注在聲音和文字之間的關係就好
link |
反正language model已經train好了
link |
這次你真的就不能夠隨便換language model了
link |
這邊如果一換language model
link |
它是跟某一個language model
link |
這個language model就在了
link |
如果把這個language model拔掉
link |
換了一個language model
link |
你真的就不能夠隨便換language model了
link |
這個co-fusion跟前頁的deep fusion有什麼不同
link |
那這個這一頁的co-fusion的圖
link |
不就是從前頁的deep fusion直接copy過來的嗎
link |
那co-fusion跟deep fusion有什麼不同呢
link |
language model已經train了
link |
你的language model跟LAS都已經train好了
link |
就是常見的三種language model加LAS的方式