中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

教你幾招搞定 LSTMS 的獨門絕技(附代碼)

2018-07-12    來源:raincent

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

原標題 Taming LSTMs: Variable-sized mini-batches and why PyTorch is good for your health,作者為 William Falcon 。

 

 

如果你用過 PyTorch 進行深度學習研究和實驗的話,你可能經(jīng)歷過欣喜愉悅、能量爆棚的體驗,甚至有點像是走在陽光下,感覺生活竟然如此美好 。但是直到你試著用 PyTorch 實現(xiàn)可變大小的 mini-batch RNNs 的時候,瞬間一切又回到了解放前。

不怕,我們還是有希望的。讀完這篇文章,你又會找回那種感覺,你和 PyTorch 步入陽光中,此時你的循環(huán)神經(jīng)網(wǎng)絡(luò)模型的準確率又創(chuàng)新高,而這種準確率你只在 Arxiv 上讀到過。真讓人覺得興奮!

我們將告訴你幾個獨門絕技:

1.如何在 PyTorch 中采用 mini-batch 中的可變大小序列實現(xiàn) LSTM 。

2. PyTorch 中 pack_padded_sequence 和 pad_packed_sequence 的原理和作用。

3.在基于時間維度的反向傳播算法中屏蔽(Mask Out)用于填充的符號。

TIPS: 文本填充,使所有文本長度相等,pack_padded_sequence , 運行LSTM,使用 pad_packed_sequence,扁平化所有輸出和標簽, 屏蔽填充輸出, 計算交叉熵損失函數(shù)(Cross-Entropy)。

為何知其難而為之?

當然是速度和性能啦。

將可變長度元素同時輸入到 LSTM 曾經(jīng)可是一個艱巨的技術(shù)挑戰(zhàn),不過像 PyTorch 這樣的框架已經(jīng)基本解決了( Tensorflow 也有一個很好的解決方案,但它看起來非常非常復雜)。

此外,文檔也沒有很清楚的解釋,用例也很老舊。正確的做法是使用來自多個示樣本的梯度,而不是僅僅來自一個樣本。這將加快訓練速度,提高梯度下降的準確性 。

盡管 RNNs 很難并行化,因為每一步都依賴于上一步,但是使用 mini-batch 在速度上將會使其得到很大的提升。

序列標注

先來嘗試一個簡單的序列標注問題,在這里我們會創(chuàng)建一個 LSTM/GRU 模型 對賈斯汀·比伯的歌詞做詞性標注。譬如:“is it too late now to say sorry?” (移除 ’to’ 和 ’?’ )。

 

 

數(shù)據(jù)格式化

在實際情況中你會做大量的格式化處理,但在這里由于篇幅限制我們不會這樣做。為簡單起見,讓我們用不同長度的序列來制作這組人造數(shù)據(jù)。

 

 

當我們將每個句子輸入到嵌入層(Embedding Layer)的時候,每個單詞(word)將會映射(mapping)到一個索引(index),所以我們需要將他們轉(zhuǎn)換成整數(shù)列表(list)。

 

 

索引一個詞嵌入矩陣(Embedding Matrix)

這里我們將這些句子映射到相應(yīng)的詞匯表(V)索引

 

 

對于分類標簽也是一樣的(在我們的例子中是 POS 標記),這些不會嵌入 。

 

 

技巧1:利用填充(Padding)使 mini-batch 中中所有的序列具有相同的長度。

在模型里有著不同長度的是什么?當然不會是我們的每批數(shù)據(jù)!

利用 PyTorch 處理時,在填充之前,我們需要保存每個序列的長度。我們需要利用這些信息去掩蓋(mask out)損失函數(shù),使其不對填充元素進行計算。

 

 

我們用同樣的方法處理標簽 :

 

 

數(shù)據(jù)處理總結(jié):

我們將這些元素轉(zhuǎn)換成索引序列并通過加入 0 元素對每個序列進行填充(Zero Padding),這樣每批數(shù)據(jù)就可以擁有相同的長度。

現(xiàn)在我們的數(shù)據(jù)的形式如下:

 

 

構(gòu)建模型

借助 PyTorch 我們可以搭建一個非常簡單的 LSTM 網(wǎng)絡(luò)。模型的層結(jié)構(gòu)如下:

1. 詞嵌入層(Embedding Layer)

2. LSTM 層

3. 線性全連接層

4. Softmax 層

 

 

技巧2:使用 PyTorch 中的 pack_padded_sequence 和 pad_packed_sequence API

再次重申一下,現(xiàn)在我們輸入的一批數(shù)據(jù)中的每組數(shù)據(jù)均已被填充為相同長度。

在前向傳播中,我們將:

1. 對序列進行詞嵌入(Word Embedding)操作

2. 使用 pack_padded_sequence 來確保 LSTM 模型不會處理用于填充的元素。

3. 在 LSTM 上運行 packed_batch

4. 使用 pad_packed_sequence 解包(unpack)pack_padded_sequence 操作后的序列

5. 對 LSTM 的輸出進行變換,從而可以被輸入到線性全連接層中

6. 再通過對序列計算 log_softmax

7. 最后將數(shù)據(jù)維度轉(zhuǎn)換回來,最終的數(shù)據(jù)維度為 (batch_size, seq_len, nb_tags)

 

 

技巧 3 : 屏蔽(Mask Out )我們并不想在損失函數(shù)中處理的網(wǎng)絡(luò)輸出

 

 

屏蔽(Mask Out) 那些填充的激活函數(shù)

最終,我們準備要計算損失函數(shù)了。這里的重點在于我們并不想讓用于填充的元素影響到最終的輸出。

小提醒:最好的方法是將所有的網(wǎng)絡(luò)輸出和標簽展平。然后計算其所在序列的損失值。

 

 

哇哦~ 就是這么簡單不是嗎?現(xiàn)在使用 mini-batches 你可以更快地訓練你的模型了!

 

 

當然這還僅僅是個非常簡單的 LSTM 原型。你還可以做這樣一些事情來增加模型的復雜度,以此提升模型的效果:

1. 利用 Glove Embeddings 進行初始化。

2. 使用 GRU Cell 代替 LSTM 部分結(jié)構(gòu)

3. 采用雙向機制(別忘了修改 init_hidden 函數(shù))

4. 通過用卷積神經(jīng)網(wǎng)絡(luò)生成編碼向量并加入詞向量中來使用字符級特征

5. 添加 Dropout 層

6. 增加神經(jīng)網(wǎng)絡(luò)的層數(shù)

7. 當然,也可以使用基于 Python 的超參數(shù)優(yōu)化庫(test-tube,鏈接:https://github.com/williamFalcon/test_tube) 來尋找最優(yōu)超參數(shù)。

總結(jié)一下:

這便是在 PyTorch 中解決 LSTM 變長批輸入的最佳實踐。

1. 將序列從長到短進行排序

2. 通過序列填充使得輸入序列長度保持一致

3. 使用 pack_padded_sequence 確保 LSTM 不會額外處理序列中的填充項(Facebook 的 Pytorch 團隊真應(yīng)該考慮為這個繞口的 API 換個名字 !)

4. 使用 pad_packed_sequence 對步驟 3的操作進行還原

5. 將輸出和標記展平為一個長的向量

6. 屏蔽(Mask Out) 你不想要的輸出

7. 計算其 Cross-Entropy (交叉熵)

完整代碼:

 

 

原文鏈接:https://towardsdatascience.com/taming-lstms-variable-sized-mini-batches-and-why-pytorch-is-good-for-your-health-61d35642972e

標簽: 代碼 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:資源 | Kaggle數(shù)據(jù)科學項目索引表,10大類93項

下一篇:大數(shù)據(jù)技術(shù)與應(yīng)用解讀及案例分析