本文原載於微信公眾號:磐創AI(ID:xunixs),AI研習社經授權轉載。歡迎關注磐創AI微信公眾號及AI研習社博客專欄。
目錄:
循環神經網路的應用
文本分類
序列標註
機器翻譯
Attention-based model
RNN系列總結
循環神經網路的應用
目前循環神經網路已經被應用在了很多領域,諸如語音識別(ASR)、語音合成(TTS)、聊天機器人、機器翻譯等,近兩年在自然語言處理的分詞、詞性標註等工作的研究中,也不乏循環神經網路的身影。在本節中,我們將介紹幾個較為典型的循環神經網路的應用,以此來了解循環神經網路是如何與我們實際的應用場景所結合。
根據應用場景和需求的不同,我們大致可以將循環神經網路的任務分為兩類:一類是序列到類別的模式,另一類是序列到序列的模式。其中,序列到序列的問題又可以進一步的劃分為:「同步的序列到序列的模式」和「非同步的序列到序列的模式」。接下來我們會通過三個案例來進一步的了解這三種模式。
文本分類
文本分類目前是自然語言處理(Natural LanguageProcessing,NLP)領域中最常見的問題之一,例如做垃圾郵件檢測、用戶評論的情感極性分析等。序列到類別的模式適用於文本分類問題,在文本分類問題中,我們輸入到循環神經網路中的是一段文本,長度為n,神經網路的輸出只有一個類別,長度為1。
假設我們要實現一個外賣行業的用戶評論的情感極性分類,如圖1所示,我們輸入到神經網路中的是一段用戶對外賣商品的評論。
圖1 實現文本分類的循環神經網路示意圖
循環神經網路在每一個「時間步」都有一個輸出,但對於一個簡單的分類問題,我們不需要這麼多的輸出,一個常用且簡單的處理方式是只保留最後一個「時間步」的輸出,如圖2所示:
圖2 「序列到類別模式」的循環神經網路示意圖
序列標註
分詞是自然語言處理中最基礎也是最重要的一個環節,隨著深度學習的發展,不少人開始嘗試將深度學習應用到這一領域,近兩年里也取得了一定的成果。雖然目前在分詞、詞性標註等任務中普遍使用的還是CRF、HMM等傳統演算法,但是深度學習所取得的成果已經被越來越多的人所認可,並且不斷地在自然語言處理的任務中嶄露頭角。
不管是使用傳統的CRF演算法還是使用循環神經網路來訓練分詞模型,我們都需要先對訓練數據進行標註。以4-tag字標註法為例,假設我們有一段訓練樣本「北京市是中國的首都」,標註後的數據形式如下:
在4-tag字標註法中,有四個標籤,分別是:B、M、E和S。其中B代表這個字是一個詞的首字,M代表這個字是一個詞的中間部分(一個詞如果由多個字組成,除了首尾,中間的字都標為M),E代表這個字是一個詞的最後一個字,而S代表這是一個單字,不構成詞。在類似分詞這種序列標註的問題中,每一個「時間步」都對應一個輸入和輸出。對於這種問題,我們採用「同步的序列到序列的模式」,如圖3所示:
圖3 「同步的序列到序列模式」的循環神經網路示意圖
機器翻譯
用於機器翻譯的循環神經網路是一種「非同步的序列到序列模式」的網路結構,同樣是序列到序列的模式,與適用於序列標註的「同步的序列到序列模式」的不同之處在於,「非同步的序列到序列模式」的循環神經網路對於輸入和輸出的序列長度沒有限制。在序列標註問題中,每一個「時間步」都有一個輸入和一個對應的輸出,因此輸入和輸出的序列長度相同,然而在機器翻譯問題中,我們輸入的序列長度和輸出的序列長度不一定等長。
「非同步的序列到序列模式」的循環神經網路就是我們常說的Sequenceto Sequence model,又稱為編碼器-解碼器(Encoder-Decoder)模型。之所以稱之為編碼器-解碼器模型,是因為我們將網路分成了兩部分:編碼器部分和解碼器部分。如圖4所示,編碼器模型對輸入的序列數據進行編碼,得到中間向量:
圖4 編碼器部分示意圖
最簡單的編碼方式是直接把網路最後一個時刻的狀態賦值給,也可以使用一個函數來做變換,函數接收的參數可以是,也可以是從到的所有中間狀態。在得到中間向量之後,接下來要做的就是解碼。一種常用的解碼方式如圖5(左)所示,模型在解碼過程中將編碼得到的向量作為解碼器的初始狀態,並將每一個時間步的輸出作為下一個時間步的輸入,直至解碼完成。「EOS」是輸入和輸出序列結束的標誌。圖5右側所示的是另一種解碼的方式,該方式將編碼得到的向量作為解碼器模型每一個「時間步」的輸入。
更具體的Sequence to Sequence模型,可以閱讀Bengio等人在2014年發表的論文[1],以及Google在2014年的一篇論文[2]。
圖5 兩種不同的解碼器模型示意圖
Attention-based model
雖然採用編碼器-解碼器 (Encoder-Decoder) 結構的模型在機器翻譯、語音識別以及文本摘要等諸多應用中均取得了非常不錯的效果,但同時也存在著不足之處。編碼器將輸入的序列編碼成了一個固定長度的向量,再由解碼器將其解碼得到輸出序列,這個固定長度的向量所具有的表徵能力是有限的,然而解碼器又受限於這個固定長度的向量。因此,當輸入序列較長時,編碼器很難將所有的重要信息都編碼到這個定長的向量中,從而使得模型的效果大打折扣。
為了解決這一問題,我們引入了注意力機制(Attention),這種引入了Attention機制的神經網路模型又稱為Attention-based model。本節我們要介紹的Soft Attention Model是一種最為常見,使用也較多的注意力模型。為了解決傳統的Encoder-Decoder模型中單個定長的編碼向量無法保留較長的輸入序列中的所有有用信息的問題,Attention-based model引入多個編碼向量,在解碼器中一個輸出對應一個編碼向量,如圖6所示。
圖6 沒有Attention機制的Encoder-Decoder模型示意圖
圖7 Attention-based model示意圖
舉個簡單的例子,假設解碼器的輸出與編碼器的輸入、的關係較大,那麼編碼得到的向量就會更多的保存和的信息,同理得到其它的編碼向量。因此,Attention機制的核心就是編碼向量的計算,假設我們的編碼器和解碼器均使用的是循環神經網路,計算過程如圖8所示。
圖8 Attention計算過程示意圖
我們以第一個編碼向量的計算為例,首先用解碼器的初始狀態分別和編碼器中每個時間步的輸出計算相似度,得到輸出,再通過一個softmax運算將轉換成概率值,最後由公式計算得到編碼向量。接下來再利用解碼器中神經網路的輸出計算編碼向量,以此類推,直到解碼過程結束。
以上就是傳統的Soft Attention Model,除此之外還有一些其它形式的Attention-based model,有適用於自然語言處理領域的,也有適用於圖像領域的。Google在2017年發表的一篇論文《Attention is All You Need》[3],試圖擺脫CNN和RNN,想要用純粹的Attention來實現Encoder-Decoder模型的任務,並且取得了非常不錯的效果。
RNN系列總結
到這裡,本章內容就全部結束了。在這一章里,我們從最基礎的簡單結構的循環神經網路開始介紹,介紹了循環神經網路的計算過程以及如何使用TensorFlow去實現,又介紹了幾種常用的循環神經網路結構;在第四節里,我們介紹了循環神經網路所面臨的問題——長期依賴問題,以及相應的解決辦法;之後,我們介紹了兩種基於門控制的循環神經網路,這是目前在循環神經網路里使用較多的兩種網路結構,這兩種網路結構通過在前後兩個網路狀態之間增加線性的依賴關係,在一定程度上解決了梯度消失和梯度爆炸的問題;在第六節里,我們介紹了循環神經網路的一些應用,並藉此介紹了應用在不同任務中時網路結構的不同;最後,我們介紹了對傳統Encoder-Decoder模型的一種改進:Attention-based model。希望進一步了解循環神經網路相關應用的讀者,推薦參考本書GitHub項目中整理的相關資源。
在下一章里,我們將使用循環神經網路實現幾個完整的項目,在學會使用TensorFlow搭建循環神經網路模型的同時,加深對循環神經網路的理解。
參考文獻
[1]Bengio: Learning Phrase Representations using RNN Encoder–Decoder for StatisticalMachine Translation
[2] Google: Sequence toSequence Learning with Neural Networks
[3]Google: Attention is All You Need
獨家中文版 CMU 秋季深度學習課程免費開學!
CMU 2018 秋季《深度學習導論》為官方開源最新版本,由卡耐基梅隆大學教授 Bhiksha Raj 授權 AI 研習社翻譯。學員將在本課程中學習深度神經網路的基礎知識,以及它們在眾多 AI 任務中的應用。課程結束後,期望學生能對深度學習有足夠的了解,並且能夠在眾多的實際任務中應用深度學習。
掃碼即可免費學習