1. 程式人生 > >DeepLearning.ai筆記:(5-3) -- 序列模型和注意力機制

DeepLearning.ai筆記:(5-3) -- 序列模型和注意力機制


title: ‘DeepLearning.ai筆記:(5-3) – 序列模型和注意力機制’
id: dl-ai-5-3
tags:

  • dl.ai
    categories:
  • AI
  • Deep Learning
    date: 2018-10-18 18:39:10

基礎模型

sequence to sequence 模型:

sequence to sequence 模型最為常見的就是機器翻譯,假如這裡我們要將法語翻譯成英文。

對於機器翻譯的序列對序列模型,如果我們擁有大量的句子語料,則可以得到一個很有效的機器翻譯模型。模型的前部分使用一個編碼網路來對輸入的法語句子進行編碼,後半部分則使用一個解碼網路來生成對應的英文翻譯。網路結構如下圖所示:

還有輸入影象,輸出描述圖片的句子的:

挑選最可能的句子

機器翻譯:條件語言模型

對於機器翻譯來說和之前幾節介紹的語言模型有很大的相似性但也有不同之處。

在語言模型中,我們通過估計句子的可能性,來生成新的句子。語言模型總是以零向量開始,也就是其第一個時間步的輸入可以直接為零向量;

在機器翻譯中,包含了編碼網路和解碼網路,其中解碼網路的結構與語言模型的結構是相似的。機器翻譯以句子中每個單詞的一系列向量作為輸入,所以相比語言模型來說,機器翻譯可以稱作條件語言模型,其輸出的句子概率是相對於輸入的條件概率。

集束搜尋(Beam search)

Beam search 演算法:

這裡我們還是以法語翻譯成英語的機器翻譯為例:

  • Step 1:對於我們的詞彙表,我們將法語句子輸入到編碼網路中得到句子的編碼,通過一個softmax層計算各個單詞(詞彙表中的所有單詞)輸出的概率值,通過設定集束寬度(beam width)的大小如3,我們則取前3個最大輸出概率的單詞,並儲存起來。

  • Step 2:在第一步中得到的集束寬度的單詞數,我們分別對第一步得到的每一個單詞計算其與單詞表中的所有單片語成詞對的概率。並與第一步的概率相乘,得到第一和第二兩個詞對的概率。有3×10000個選擇,(這裡假設詞彙表有10000個單詞),最後再通過beam width大小選擇前3個概率最大的輸出對;

  • Step 3~Step T:與Step2的過程是相似的,直到遇到句尾符號結束。

集束搜尋的改進

上面的集束搜尋有個問題,就是因為每一項的概率都很小,所以句子越長,概率越小,因此會傾向於選擇比較短的句子,這樣是不太好的。

首先,為了保證不會太小而導致數值下溢,先取對數,把連乘變成求和。

然後在前面加上一個係數

1 T y α \frac{1}{T_{y}^{\alpha}}

α \alpha 為 1 時,就表示概率為句子長度的平均;為0時,就表示沒有係數;在這裡一般取 α = 0.7 \alpha = 0.7

集束搜尋討論:

Beam width:B的選擇,B越大考慮的情況越多,但是所需要進行的計算量也就相應的越大。在常見的產品系統中,一般設定B = 10,而更大的值(如100,1000,…)則需要對應用的領域和場景進行選擇。

相比於演算法範疇中的搜尋演算法像BFS或者DFS這些精確的搜尋演算法,Beam Search 演算法執行的速度很快,但是不能保證找到目標準確的最大值。

集束搜尋的誤差分析

集束搜尋演算法是一種近似搜尋演算法,也被稱為啟發式搜尋演算法。而不是一種精確的搜尋。

如果我們的集束搜素演算法出現錯誤了要怎麼辦呢?如何確定是演算法出現了錯誤還是模型出現了錯誤呢?此時集束搜尋演算法的誤差分析就顯示出了作用。

模型分為兩個部分:

  • RNN 部分:編碼網路 + 解碼網路
  • Beam Search 部分:選取最大的幾個值

誤差分析

計算人類翻譯的概率P(y∗|x)以及模型翻譯的概率P(ŷ |x)

  • P(y∗|x) > P(ŷ |x):Beam search演算法選擇了ŷ ,但是y∗ 卻得到了更高的概率,所以Beam search 演算法出錯了;

  • P(y∗|x) <= P(ŷ |x) 的情況:翻譯結果y∗相比ŷ 要更好,但是RNN模型卻預測P(y∗|x)

Bleu 得分(選修)

PASS

注意力模型直觀理解

之前我們的翻譯模型分為編碼網路和解碼網路,先記憶整個句子再翻譯,這對於較短的句子效果不錯,但是對於很長的句子,翻譯結果就會變差。

回想當我們人類翻譯長句子時,都是一部分一部分的翻譯,翻譯每個部分的時候也會顧及到該部分周圍上下文對其的影響。同理,引入注意力機制,一部分一部分的翻譯,每次翻譯時給該部分及上下文不同的注意力權重以及已經譯出的部分,直至翻譯出整個句子。

注意力模型

以一個雙向的RNN模型來對法語進行翻譯,得到相應的英語句子。其中的每個RNN單元均是LSTM或者GRU單元。

對於雙向RNN,通過前向和後向的傳播,可以得到每個時間步的前向啟用值和反向啟用值,我們用一個符號來表示前向和反向啟用值的組合。

然後得到每個輸入單詞的注意力權重:

計算公式為:

這裡的KaTeX parse error: Expected '}', got '\>' at position 17: …^{<t,t^{\prime}\̲>̲}則是通過一層神經網路來進行計算得到的,其值取決於輸出RNN中前一步的啟用值KaTeX parse error: Expected '}', got '\>' at position 8: s^{<t-1\̲>̲}和輸入RNN當前步的啟用值KaTeX parse error: Expected '}', got '\>' at position 15: a^{<t^{\prime}\̲>̲}。我們可以通過訓練這個小的神經網路模型,使用反向傳播演算法來學習一個對應的關係函式。

語音識別

語音識別就是將一段音訊轉化為相應文字。

之前用音位來識別,現在 end-to-end 模型中已經不需要音位了,但是需要大量的資料常見的語音資料大小為300h、3000h或者更大。

注意力模型的語音識別

CTC 損失函式的語音識別

另外一種效果較好的就是使用CTC損失函式的語音識別模型(CTC,Connectionist temporal classification)

模型會有很多個輸入和輸出,對於一個10s的語音片段,我們就能夠得到1000個特徵的輸入片段,而往往我們的輸出僅僅是幾個單詞。

在CTC損失函式中,允許RNN模型輸出有重複的字元和插入空白符的方式,強制使得我們的輸出和輸入的大小保持一致。

觸發字檢測

觸發字檢測:關鍵詞語音喚醒。

一種可以簡單應用的觸發字檢測演算法,就是使用RNN模型,將音訊訊號進行聲譜圖轉化得到影象特徵或者使用音訊特徵,輸入到RNN中作為我們的輸入。而輸出的標籤,我們可以以觸發字前的輸出都標記為0,觸發字後的輸出則標記為1。

一種簡單應用的觸發字檢測演算法,就是使用RNN模型,將音訊訊號進行聲譜圖轉化音訊特徵,輸入到RNN中作為我們的輸入。而輸出的標籤,非觸發字的輸出都標記為0,觸發字的輸出則標記為1。

上面方法的缺點就是0、1標籤的不均衡,0比1多很多。一種簡單粗暴的方法就是在觸發字及其之後多個目標標籤都標記為1,在一定程度上可以提高系統的精確度。