DeepLearning.ai學習筆記(五)序列模型 -- week2 序列模型和注意力機制

1、基礎模型

假設要翻譯下面這句話:算法

"簡將要在9月訪問中國"網絡

正確的翻譯結果應該是:學習

"Jane is visiting China in September"大數據

在這個例子中輸入數據是10箇中文漢字,輸出爲6個英文單詞,\(T_x\)\(T_y\)數量不一致,這就須要用到序列到序列的RNN模型。

優化



相似的例子還有看圖說話:spa

只須要將encoder部分用一個CNN模型替換就能夠了,好比AlexNet,就能夠獲得「一隻(可愛的)貓躺在樓梯上」翻譯

2、選擇最優句子

下面將以前學習的語言模型和機器翻譯模型作一個對比, P爲機率3d

下圖是語言模型,能夠用在自動生成文章或者預測文字之類的應用中,即根據前一個字輸出下一個字。code

下圖是機器翻譯模型,能夠看到後半部分(紫色)其實就是語言模型,吳大大稱之爲「條件語言模型」,即在語言模型以前有一個條件,也就是被翻譯的句子。視頻

用數學公式表示就是:

\[P(y^{<1>},…,y^{<T_y>}|x^{<1>},…,x^{<T_x>})\]

可是咱們知道翻譯是有不少種方式的,同一句話能夠翻譯成不少不一樣的句子,那麼咱們如何判斷那一個句子是最好的呢?

仍是翻譯上面那句話,有以下幾種翻譯結果:

  • "Jane is visiting China in September."
  • "Jane is going to visit China in September."
  • "In September, Jane will visit China"
  • "Jane's Chinese friend welcomed her in September."
  • ....

與語言模型不一樣的是,機器模型在輸出部分再也不使用softmax隨機分佈的形式進行取樣,由於很容易獲得一
個不許確的翻譯,取而代之的是使用Beam Search作最優化的選擇。這個方法會在後下一小節介紹,在此以前先介紹一下貪婪搜索(Greedy Search)及其弊端,這樣才能更好地瞭解Beam Search的優勢。

獲得最好的翻譯結果,轉換成數學公式就是

\[argmax P(y^{<1>},…,y^{<T_y>}|x^{<1>},…,x^{<T_x>})\]

那麼貪婪搜索是什麼呢?

通俗解釋就是每次輸出的那個都必須是最好的。仍是以翻譯那句話爲例。

如今假設經過貪婪搜索已經肯定最好的翻譯的前兩個單詞是:"Jane is "

而後由於"going"這個單詞出現頻率較高和其它緣由,因此根據貪婪算法得出此時第三個單詞的最好結果是"going"。

因此根據貪婪算法最後的翻譯結果多是下圖中的第二個句子,可是第一句可能會更好(不服氣的話,咱們就假設第一句更好hhhh)。

因此貪婪搜索的缺點是局部最優並不表明全局最優,就好像五黑,一隊都是很牛逼的,可是各個都太優秀,就顯得沒那麼優秀了,而另外一隊雖說不是每一個都是最優秀,可是湊在一塊兒就是能carry全場。

更形象的理解可能就是貪婪搜索更加短視,看的不長遠,並且也更加耗時。假設字典中共有10000個單詞,若是使用貪婪搜索,那麼可能的組合有\(10000^{10}\)種,因此仍是挺恐怖的2333~~

3、定向搜索(Beam Search)

Beam Search是貪婪搜索的增強版,首先它須要設置beam width,下面設置爲3。(若是設置爲1,就是貪婪搜索)

步驟一

以下圖示,由於beam width=3,因此根據輸入的須要翻譯的句子選出3個\(y^{<1>}\)最可能的輸出值,即選出\(P(y^{<1>|x})\)最大的前3個值。假設分別是"in","jane","september"。

步驟二

以"in"爲例進行說明,其餘同理。
以下圖示,在給定被翻譯句子\(x\)和肯定 \(y^{<1>}\)="in" 的條件下,下一個輸出值的條件機率是\(P(y^{<2>}|x,"in")\)。此時須要從10000種可能中找出條件機率最高的前3個。

又由公式\(P(y^{<1>},y^{<2>}|x)=P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})\),咱們此時已經獲得了給定輸入數據,前兩個輸出值的輸出機率比較大的組合了。

另外2個單詞也作一樣的計算。






此時咱們獲得了9組\(P(y^{<1>},y^{<2>}|x)\),此時咱們再從這9組中選出機率值最高的前3個。以下圖示,假設是這3個:

  • "in september"
  • "jane is"
  • "jane visits"


步驟3:

繼續步驟2的過程,根據\(P(y^{<3>}|x,y^{<1>},y^{<2>})\)選出\(P(y^{<1>},y^{<2>},y^{<3>}|x)\)最大的前3個組合。

後面重複上述步驟得出結果。

總結一下上面的步驟就是:

  • 第一步
    通過encoder之後,decoder給出最有可能的三個開頭詞依次爲「in」, "jane", "september" --- \(P(y^{<1>}|x)\)
  • 第二步
    通過將第一步獲得的值輸入到第二步中,最有可能的三個個翻譯爲「in september」, "jane is", "jane visits" ---\(P(y^{<2>}|x,y^{<1>})\)
    (這裏,september開頭的句子因爲機率沒有其餘的可能性大,已經失去了做爲開頭詞資格)
  • 第三步
    繼續這個過程... ---- \(P(y^{<3>}|x,y^{<1>},y^{<2>})\)

4、改進定向搜索

由於
\[P(y^{<1>},….,P(y^{T_y})|x)=P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>})…P(y^{<T_y>}|x,y^{<1>},…y^{<{T_y-1}>})\]

因此要知足\(argmax P(y^{<1>},….,P(y^{T_y})|x)\),也就等同於要知足

\[argmax \prod_{t=1}^{T_y}P(y^{<t>}|x,y^{<1>},…y^{<{t-1}>})\]

可是上面的公式存在一個問題,由於機率都是小於1的,累乘以後會愈來愈小,可能小到計算機沒法精確存儲,因此能夠將其轉變成log形式(由於log是單調遞增的,因此對最終結果不會有影響),其公式以下:

\[argmax \sum_{t=1}^{T_y}logP(y^{<t>}|x,y^{<1>},…y^{<{t-1}>})\]

But!!!上述公式仍然存在bug,觀察能夠知道,機率值都是小於1的,那麼log以後都是負數,因此爲了使得最後的值最大,那麼只要保證翻譯的句子越短,那麼值就越大,因此若是使用這個公式,那麼最後翻譯的句子一般都是比較短的句子,這顯然不行。

因此咱們能夠經過歸一化的方式來糾正,即保證平均到每一個單詞都能獲得最大值。其公式以下:

\[argmax \frac{1}{T_y}\sum_{t=1}^{T_y}logP(y^{<t>}|x,y^{<1>},…y^{<{t-1}>})\]

經過歸一化的確能很好的解決上述問題,可是在實際運用中,會額外添加一個參數\(α\),其大小介於0和1之間,公式以下:

\[argmax \frac{1}{T_y^α}\sum_{t=1}^{T_y}logP(y^{<t>}|x,y^{<1>},…y^{<{t-1}>})\]

5、定向搜索的偏差分析

靜下心來仔細想一想beam search,咱們會發現其實它是近似搜索,也就是說可能使用這種方法最終獲得的結果並非最好的。固然也有多是由於使用的RNN模型有缺陷致使結果不是最好的。

因此咱們如何判斷偏差是出在哪一個地方呢?

仍是以翻譯這句話爲例:「簡在9月訪問中國」。

假設按照人類的習慣翻譯成英文是「Jane visits China in September.」,該結果用 \(y^*\) 表示。

假設經過算法得出的翻譯結果是:「Jane visited China in September.」,該結果用\(\hat{y}\)表示。

要判斷偏差出在哪,只須要比較\(P(y^*|x)\)\(P(\hat{y}|x)\)的大小便可。

下面分兩種狀況討論:

1.\(P(y^*|x)>P(\hat{y}|x)\)

上面的不等式的含義是beam search最後選出的結果不如人類,也就是beam search並無選出最好的結果,因此問題出在beam search。

2.\(P(y^*|x)≤P(\hat{y}|x)\)

上面不等式表示beam search最後選出的結果要比人類的更好,也就是說beam search已經選出了最好的結果,可是模型對各個組合的預測機率值並不符合人類的預期,因此這個鍋須要模型背。



上面已經介紹了偏差分析的方式,但時僅憑一次偏差分析就斷定誰該背鍋確定也不行,因此還須要進行屢次偏差分析屢次。

以下圖示已經進行了屢次的偏差分析,每次分析以後都斷定了鍋該誰背,最後計算出beam search和模型背鍋的比例,根據比例做出相應的調整。

例如若是beam search更高,能夠相應調整beam width。
若是模型背鍋比例更高,那麼能夠考慮增長正則化,增長數據等操做。



6、Bleu得分(選修)

主要介紹瞭如何給機器翻譯結果打分,由於是選修內容。。。so。。。emm

7、注意力模型直觀理解

1.爲何要用注意力模型

​以前介紹的RNN翻譯模型存在一個很明顯的問題就是機器翻譯的翻譯過程是首先將全部須要翻譯的句子輸入到Encoder中,以後再經過Decoder輸出翻譯語句。以下圖示機器算法將法語翻譯成英語的模型。

機器翻譯與人類的翻譯過程不太相同。由於人類翻譯通常是逐句翻譯,或者是講一段很長的句子分解開來進行翻譯。

因此上述模型的翻譯結果的Bleu評分與被翻譯句子的長短有很大關係,句子較短時,模型可能沒法捕捉到關鍵信息,因此翻譯結果不是很高;可是當句子過長時,模型又抓不到重點等緣由使得結果也不是很高。

​而若是機器能像人同樣逐句或者每次將注意力只集中在一小部分進行翻譯,那麼翻譯結果將不受句子長度的影響。下圖中的綠色線即爲使用了注意力模型後的翻譯句子得分。

2.模型介紹


下圖展現了普通的翻譯模型雙向RNN結構,該結構可根據輸入\(x^{<t>}\)直接獲得輸出\(y^{<t>}\)



注意力模型在此基礎上作進一步處理。

爲避免誤解,使用另外一個符號\(s\)來表示節點。

以下圖示,根據下面一層的雙向RNN計算結果可獲得節點\(s^{<1>}\)與其餘節點權重\(α^{<1,1>},α^{<1,2>},…\),經過這些權重能夠知道該節點與其餘節點的相關聯程度,從而能夠達到將注意力集中到部分區域的效果。

​其餘節點同理。整個注意力模型結構以下圖示。

8、注意力模型

特別要區分\(a\) (字母a)\(α\) (alpha)。前者表示特徵節點,後者表示注意力權重。

1.參數介紹

​以下圖示,注意力模型採用雙向RNN結構,因此每一個節點有兩個值,用(\(\overrightarrow{a}^{<t'>},\overleftarrow{a}^{<t'>}\))表示,爲了使公式更簡化,令\(a^{<t'>}=(\overrightarrow{a}^{<t'>},\overleftarrow{a}^{<t'>})\)。其中\(t'\)表示輸入數據的索引。

上一節已經介紹了注意力權重\(α^{<t,t'>}\),以第一個節點爲例,它的權重值能夠用\(α^{<1,t'>}\)表示,且全部權重值知足\(\sum{α^{<1,t'>}}=1\)

全部權重與對應節點的線性之和用\(c^{<t'>}\)表示(爲方便書寫,用\(c\)表示),c表示context,即上下文變量。

仍是以第一個節點爲例,c的計算公式以下:

\[c^{<1>}=\sum_{t'}α^{<1,t'>}a^{<t'>}\]



2.注意力權值計算公式

\[\alpha^{<t,t'>}=\frac{exp(e^{<t,t'>})}{\sum_{t''=1}^{T_x}{exp(e^{t,t''})}}\]

上面公式中的\(e^{<t,t'>}\)計算圖以下:

其中\(s^{<t-1>}\)表示上一個狀態的值,\(a^{<t'>}\)表示第t'個特徵節點。



視頻中吳大大並無很詳細的介紹上面的網絡,只是一筆帶過,說反向傳播和梯度降低會自動學習,emmm。。。那就這樣吧。

結合下圖能夠獨自參考一下上面的公式是什麼意思。



3.舶來品

下面的筆記是《大數據文摘》的筆記,感受他寫的清楚一些。

如圖所示,這是一個雙向的rnn,而且在普通rnn的基礎上增長attention層,將階段性的輸入部分轉化爲輸出,這樣的方式也更符合人類的翻譯過程。

讓咱們拿出細節部分仔細的理解一下,首先是attention層,也就是下圖中\(context^{<t>}\),每個attention單元接受 三個單詞的輸入因此也稱做語境單元(context), \(α\)是每單個輸入詞在語境單元中佔得權重。對每個語境單元t 來講,由於\(α\)是經過softmax決定的,因此\(\sum_{i=1}^{T_x}α^{t,i}=1\)。這裏決定終每個單詞佔得語境權重仍然是經過一 個小型的神經網絡來進行計算而且後獲得的。

輸出的\(context^{<t>}\)進入到下一層Post LSTM 這一步就和以前學習過的那樣子,將前一步的輸出與這一步通過重重分析的輸入綜合到一塊兒產生這一步的輸出。

讓咱們評估一下attention model: 因爲結構的複雜,計算量與時間比普通的語言模型要多和慢許多。不過對於機 器翻譯來講,因爲每一句話並不會特別特比特的長,因此有的時候稍微慢一點也不是徹底沒法接受:p

一個很重要attention model的應用就是語音識別,人經過麥克風輸入一句話讓機器來翻譯輸入的內容,讓咱們來 看一下是如何實現的

9、語音辨識

通常語音識別過程是以下圖示的,即首相將原音頻(黑白的,縱軸表示振幅)轉化成縱軸爲頻率的音譜圖,而且經過人工預先設定的音素(phonemes)再來識別。



而引入注意力機制後的模型就表現優秀得多了



CTC(connectionist temporal classification)是以前較爲經常使用的方法。

具體原理以下:

假設每秒音頻能夠提取出100個特徵值,那麼假設10秒的音頻就有1000個特徵值,那麼輸出值也有1000個,可是說出的話並無這麼多啊,那該怎麼處理呢?

方法很簡單,只須要把「_」進行壓縮便可,注意須要將 "_"和空額區分開來,由於空格也是佔一個字符的。



10、觸發字檢測

假設下圖式訓練集中的一段音頻,其中包含了兩次喚醒詞

搭建一個attention model,在聽到喚醒詞以前一直輸出的是0,在聽到喚醒詞之後輸出1,但由於一個喚醒詞會持 續半秒左右因此咱們也不只僅只輸出一次1,而是將輸出的1持續一段時間,經過這樣的方式訓練出的rnn就能夠很 有效的檢測到喚醒詞了。

11、結論和致謝

啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦了,終於學完了。雖然好像也並不能說明什麼~~~2333333333



MARSGGBO原創




2018-6-3

相關文章
相關標籤/搜索