摘要: 在離人工智能越來越近的今天,研究界和工業界對神經網絡和深度學習的興趣也越來越濃,期待也越來越高。我們在深度學習與計算機視覺專欄中看過計算機通過卷積神經網絡學會了識別圖片的內容——模仿人類的看,而工業界大量的應用也證明了神經網絡能讓計算機學會聽(比如百度的語音識別),於是大量的精力開始投向NLP領域,讓計算機學會寫也一定是非常有意思的事情,試想一下,如果計算機通過讀韓寒和小四的小說,就能寫出有一樣的調調的文字,這是多帶勁的一件事啊。.......
▲(來源:36大數據)
你還別說,還真有這麼一類神經網絡,能夠在NLP上發揮巨大的作用,處理從語言模型(language model)到雙語翻譯,到文本生成,甚至到代碼風格模仿的問題。這就是我麼今天要介紹的RNN(循環神經網絡)。
RNN是一個和時間序列有關係的神經網絡,大家想想,對單張圖片而言,像素信息是靜止的,而對於一段話而言,裡面的詞的組成是有先後的,而且通常情況下,後續的詞和前面的詞有順序關聯。這時候,獨立層級結構的捲積神經網絡通常就很難處理這種時序關聯信息了,而RNN卻能有效地進行處理。
RNN在處理時間序列的內容有多有效呢,咱們列一些RNN處理的例子來一起看看。我們知道卷積神經網絡在0-9數字識別上已經能有人類的識別精確度了,但是對於一連串的數字,還是得有一些特殊的處理的。比如說,下面是讓RNN學會了從左到右讀數字門牌號。
我們也能讓RNN學著從右到左自己繪出門牌號圖片:
RNN能模仿各種格式的文件,比如說下面是RNN學習出來的XML文件,和Latex代數幾何文件樣本:
我們暫時不管內容正確性,這個格式編排能力,已經讓我瞠目結舌。
傳統的神經網絡(包括CNN)中我們假定所有輸入和輸出都是相互獨立的。很遺憾,對於許多任務而言,這一個假設是不成立的。如果你想預測下一個單詞或一個句子,你就需要知道前面的詞。循環神經網絡之所以被稱作循環,是因為每個元素都執行相同的任務序列,但輸出依賴之前的計算結果。我們換一種方法說明一下RNN:大家可以想像RNN模型是有“記憶”的,“記憶”中存儲著之前已經計算的信息。理論上說RNN可以記得併使用任意長度的序列中的信息,不過實際應用中,我們通常只回溯幾個步驟(後面詳細討論)。我們先一起來看一個典型的RNN的圖例:
上圖顯示了將RNN展開成一個完整的網絡的過程。之所以我們用展開這個字眼,因為循環神經網絡每一層(或者我們叫做每個時間點t)到下一層(下一個時間點),其變換的過程(權重W)是一致的。舉個例子說,如果我們關注的序列是包含5個單詞的句子,循環神經網絡將會依據先後順序展開成五層神經網絡,每個單詞為一層。RNN是根據下面的步驟來迭代和做計算的:
1.假定xt是時間t處的輸入,比如x1可以是句子中第二個單詞one-hot編碼後的詞向量。
2.假定st是次數t的隱藏狀態,哈哈,這就是我們提到的神經網絡的“記憶大腦”。st由當前步驟的輸入和先前隱藏狀態共同計算求得:st=f(Uxt+Wst−1)。這個計算函數f通常是非線性的,比如說神經網絡裡經常用到的tanh或ReLU. s−1是第一個隱藏狀態,通常我們把它初始化為0。
3.ot是第t步的輸出。舉個例子說,如果我們要預測在之前的詞序列下,下一個詞是什麼,那我們可能拿到的是整個詞表中,每個詞的概率(通過softmax得到的),即ot=softmax (Vst)
針對上面的步驟,咱們再細提幾個點:
1.我們就可以直接把隱狀態st想作神經網絡的“記憶體”,st捕捉和保留了之前時間點上的一些信息。輸出ot是由當前時間點t上的“所有記憶信息”來計算得到的。實際工程應用中,通常我們會做一些處理,因為實際上st並不能捕捉和保留之前的所有時間點的信息。
2.不像普通的深度神經網絡,每一層和每一層之間都會有不同的權重參數,一個RNN神經網絡共享同一組參數(U,V,W)(如圖中所示),每一步都一樣。這實際上表示我們在每一步到下一步都是做的同樣的操作,只是輸入不同。這樣的一個好處是,極大地減小了需要訓練和預估的參數量。
3.上面的圖表在每一步都有輸出/output,但是根據任務不同,有時候並沒有必要在每一步都有輸出。比如說我們對句子的情感做判定的時候,我們其實只關心最後的情感判定結果,而不是中間每個詞的結果。RNN最主要的特徵是隱狀態,因為它是“記憶體”,保留了之前的絕大多數信息。
剛才我們提到的RNN只是最原始版本的RNN,而近幾年隨著研究者的深入,提出了一系列新的RNN網絡類型。比如: 雙向RNN、深層雙向RNN、LSTM神經網絡......
轉貼自: 36大數據
留下你的回應
以訪客張貼回應