RNN對於變長序列採用mask處理

2021-10-05 15:08:44 字數 2112 閱讀 9704

文字資料在處理的時候,由於各樣本的長度並不一樣,有的句子長有的句子短。拋開動態圖、靜態圖模型的差異,由於需要進行矩陣運算,句長需要是等長的才可以,這就需要padding操作。padding一般是用最長的句子長度為最大長度,然後其他樣本補0到最大長度,這樣樣本就是等長的了。

但是注意padding後的樣本如果不作處理只用普通的迴圈神經網路來做的話其實是有影響的,因為即使輸入的是0,做了embedding後也不是0,而且還有上一時刻隱藏層,所以輸出不會是0。但是在實際使用中,padding的這種操作如果不做特殊處理,模型也是可以學到它是無用的padding。

但是這會有乙個問題,什麼問題呢?比如上圖,句子「yes」只有乙個單詞,但是padding了5的pad符號,這樣會導致lstm對它的表示通過了非常多無用的字元,這樣得到的句子表示就會有誤差,更直觀的如下圖:

結論:直接填充0,在資料運算上沒有問題,但是從序列的整個含義來說,這是不合理的,所以一般情況下不能這麼做。

在使用rnn based model處理序列的應用中,如果使用並行運算batch sample,我們幾乎一定會遇到變長序列的問題。

通常解決變長的方法主要是將過長的序列截斷,將過短序列用0補齊到乙個固定長度(例如max_length)。

最後由n個sample組成的dataset能形成乙個shape == (n, max_length)的矩陣。然後可以將這個矩陣傳遞到後續的模型中使用。

然而我們可以很明顯,如果用0或者其他整數補齊,勢必會影響到模型自身(莫名其妙被輸入很多個0,顯然是有問題的)。有什麼方法能夠做到「能夠使用乙個二維矩陣作為輸入資料集,從而達到並行化的同時,還能讓rnn模型自行決定真正輸入其中的序列的長度。

mask主要用於解決rnn中輸入有多種長度的問題。要輸入rnn中的是尺寸固定的張量,即批尺寸(batch size) * 序列長度(sequence length) * 嵌入大小(embedding size)。因為rnn在計算狀態向量時不僅考慮當前,也考慮前一次的狀態向量,如果為了維持真實長度,採用補0的方式,在進行狀態向量計算的時候也會包含進用0補上的位置,而且這種方式無法進行徹底的遮蔽。由於喂到模型中是fixed-size tensor(如256*100*50, batch size * sequence length * embedding size), rnn需要用mask來maintain序列真實長度,從而在計算loss的時候去除掉padding的部分。

相比於補0,mask會得到不同的狀態向量。對於每乙個用0初始化的的樣本,我們建立乙個mask,並使其長度與資料集中最長的序列相同。然後樣本中所有有數值的地方,我們用1把mask中對應的位置填充起來。

舉個例子,資料集中最長的序列長度為10,所以所有的mask將以如下的方式初始化:

mask = [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]

同時,我們還有乙個如下的樣本:

a = [ 2., 0. ,5. ,6. ]

現在我們用1將mask中所有有數值的地方填充起來,因而得到以下的mask:

mask_a = [ 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.]

在這之後,我們將樣本與mask輸入rnn中,rnn將會把所有沒有值的的地方加上0,所以a變成了:

a_hood = [ 2., 0. ,5. ,6., 0., 0., 0., 0., 0., 0.]

但是如果我們任由rnn用這種補0的方式,rnn會認為所有的序列長度都為10,並且在計算時用上所有的補上的0。

mask_a = [ 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.]

而此時mask_a的作用就是讓rnn跳過所有mask為0的輸入,複製cell中前一次的隱藏狀態;對於mask為1的輸入rnn將按常規處理。

對於cnn來說,首先它的輸入已經是固定尺寸,不需要mask,其次就算用上mask,結果和補0一樣,所以採用補0這種方便的方法,而cnn是卷積操作,補0的位置對卷積結果沒有影響,即補0和mask兩種方式的結果是一樣的,因此大家為了省事起見,就普遍在cnn使用補0的方法了。cnn的的輸入本身就是fixed-size,所以不需要mask。

對於區域性變數 LabVIEW小白入門 區域性變數

今天,加油鴨學習區域性變數,內容也是十分的簡單。區域性變數,顧名思義,就是在區域性使用的變數,類似c語言中的區域性變數。在不同的vi程式是不可以傳遞資料的。一大優勢就是省去了複雜的連線。與之對應的則是全域性變數,全域性變數可以在不同的vi程式間使用,下次我們講一下全域性變數。區域性變數的驗證思路 給...

RNN應用 基於RNN的語言模型

rnn迴圈神經網路,具有處理序列資料的能力,也就是前面的資料跟後面的資料出現順序是有關係的。以下內容來自 我 昨天 上學 遲到 了 神經網路的輸出如下圖所示 其中,s和e是兩個特殊的詞,分別表示乙個序列的開始和結束。使用這種向量化方法,我們就得到了乙個高維 稀疏的向量 稀疏是指絕大部分元素的值都是0...

RNN系列之三 RNN簡單應用

將以語言模型進行分析。建立語言模型所採用的訓練集是乙個大型的語料庫 corpus 建立過程中,需要先建立乙個字典,之後將語料庫中每個詞表示為對應的one hot向量。此外需要額外定義乙個標記eos end of sentence 表示乙個句子的結尾,也可以將其中的標點符號加入字典後也用one hot...