循環神經網絡(RNN) 基礎淺析

2021-02-19 機器學習之家


讓小編自言自語一會

關於RNN多麼有用,小編就不需要多嘴了,相信每天刷AI技術群、AI公眾號的看官都知道「雲知聲將LSTM的深度學習技術應用到了雲知聲語音識別、語音合成、語義理解中」「百度採用LSTM+CTC 漢語普通話識別率高達97%」等等新聞。RNN由於其序列建模的突出優點,在處理序列數據(如文本、語音)的任務中表現出卓越的性能。

         什麼?你居然說你沒聽說過這兩個新聞?

        那你真的得多多關注一些相關資訊啦!!

        !!

        不過話說回來,其實我也是剛剛百度上搜出來的這兩則新聞。

 

小編不僅僅是知識的搬運工



1.RNN原理

     大家好,今天給大家介紹一位新朋友,它叫RNN,它的英文全稱,是recurrent neural network,中文名稱叫 循環神經網絡。不過要提醒大家注意的是,它還有一個遠房親戚,也經常自稱為RNN,它的全名是Recursive neural network,中文學名叫 遞歸神經網絡。大家注意分辨千萬別把這兩個搞混了,會鬧笑話的。

        對於遞歸神經網絡感興趣的同學,可以到它的發明者、史丹福大學年輕有為的Richard Sochar博士授課的CS22D課程中查看,傳送連結:斯坦福CS22D課程

        大家知道,機器學習和深度學習領域各種名詞特別多,名詞縮寫也很多,由此很容易鬧出血案。例如

某同學去參加面試,面試官說「說一下你對topic model LDA的理解」,該同學聽完以後心中嘀咕「LDA不是線性判別分析嗎,線性判別分析和topic model哪有半毛錢關係?」。(沒聽懂的同學,請自覺反省,本公眾號以前也介紹過LDA(Latent Dirichlet Allocation))

1.1 RNN為序列數據而生

詞序其實是很重要的。

例如下面兩句英文:


      一句說的是白細胞殺死了感染病毒,一句說的是感染病毒殺死了白細胞。意思完全不同,但是如果不考慮詞序,例如採用詞袋(BOW)模型,這兩句話會被認為是同一句話。

        什麼?你說不知道詞袋模型什麼鬼?百度一下吧,so easy!

       閒扯一下,近日某狗搜索發起一個討論:

       

大致說的是「百度要推行帳號實名制了,你還會繼續用百度嗎」,本意是想藉此繼續抹黑百度,把用戶騙到自己的搜索平臺上,結果偷雞不成蝕把米。群眾的眼睛是雪亮的!來看看點讚數最多的一條評論:

       偏題了。。咳咳。我們繼續舉慄子。

       中文中,這樣的例子也很多。「怎麼樣投資白銀」vs「白銀投資怎麼樣」;「北京到上海的機票」vs「上海到北京的機票」。

設計RNNs的目的,就是處理序列數據。

      在傳統的神經網絡模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連接的,每層之間的節點是無連接的。但是這種普通的神經網絡對於很多問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNNs之所以稱為循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網絡會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNNs能夠對任何長度的序列數據進行處理。

RNN was born in 1980s!

1.2 圖靈機(Turing machine)

圖靈機Turing machine可以看作等價於任何有限邏輯數學過程的終極強大邏輯機器。圖靈機又稱確定型圖靈機,是英國數學家艾倫·圖靈於1936年提出的一種抽象計算模型,其更抽象的意義為一種數學邏輯機。

turing-complete的定義:

A Turing Complete system means a system in which a program can be written that will find an answer (although with no guarantees regarding runtime or memory).  So, if somebody says "my new thing is Turing Complete" that means in principle (although often not in practice) it could be used to solve any computation problem.

神經圖靈機(Neural Turing Machine)


1.3 RNN的價值

我們知道,一個三層的前饋神經網絡可以學到任何的函數,而RNN則是「turing-complete」的,它可以逼近任何算法。

RNN can approximate any algorithm. A recurrent neural network RNN is Turing complete and so can compute anything that can be computed.

RNN具有強大的計算和建模能力,因而只要合理建模,它就可以模擬任何計算過程。RNN具有記憶能力。給RNN同樣的輸入,得到的輸出可能是不一樣的。當然我們知道CNN不是這樣的。

2 RNN的基本結構

RNNs包含輸入單元(Input units),輸入集標記為{x0,x1,...,xt,xt+1,...},而輸出單元(Output units)的輸出集則被標記為{y0,y1,...,yt,yt+1.,..}。RNNs還包含隱藏單元(Hidden units),我們將其輸出集標記為{h0,h1,...,ht,ht+1,...},這些隱藏單元完成了最為主要的工作。


各個變量的含義:


展開以後形式:


一個RNN的小例子:


把RNN做深(deep)


字符級別RNN


char-rnn的代碼

Torch版本

https://github.com/karpathy/char-rnn

Tensorflow版本

https://github.com/sherjilozair/char-rnn-tensorflow

3 RNN的高級形式

3.1 雙向RNN (Bidirectional RNN )

RNN既然能繼承歷史信息,是不是也能吸收點未來的信息呢?因為在序列信號分析中,如果我能預知未來,對識別一定也是有所幫助的。因此就有了雙向RNN、雙向LSTM,同時利用歷史和未來的信息。


雙向RNN


值得一提的是,但由於RNN 建模中的遺忘性,最後一個 state 中包含的信息是有損的,且序列越靠前的信息損失可能越嚴重。一種比較可行的解決方法是同時訓練兩個RNN,一個正向學習,一個反向學習,將正向的和反向的最後一個state 對應向量 concate 後得到的向量作為最終產物。


對於正向RNN最後一個向量中記錄的信息量從前往後依次增強,反向的最後一個state記錄的信息從後往前依次增強,兩者組合正好記錄了比較完整的信息

3.2 LSTM(Long Short-term Memory)

名字很有意思,又長又短的記憶?其實不是,注意「Short-term」中間有一個「—」連接。代表LSTM本質上還是短期記憶(short-term memory),只是它是比較長一點的short-term memory。


由於LSTM有四個參數做輸入,LSTM需要的參數量是一般的神經網絡模型的4倍。


臺灣大學李宏毅講的LSTM的小例子,非常清晰。

https://www.youtube.com/watch?v=xCGidAeyS4M

LSTM在1997年由「Hochreiter & Schmidhuber」提出,目前已經成為RNN中的標準形式。

3.3 GRU(Gated Recurrent Unit)

LSTM的一個稍微簡化一點的版本。只有兩個gate,據說效果和LSTM差不多,但是參數少了1/3,不容易過擬合。

如果發現LSTM訓練出來的模型過擬合比較嚴重,可以試試GRU

LSTM vs GRU


4 RNN的訓練

4.1 普通的RNN(simple RNN)不好訓練

相較於CNN,RNN訓練過程較不穩定,訓練難度和計算量都大得多。當然,RNN用GPU加速效果會比較明顯。


RNN不好訓練的原因


weight被高頻地使用,0.99的1000次方和1.01的1000次方有本質的區別。導致RNN的誤差面(error surface)常常要麼是很平坦要麼是很陡峭(The error surface is either very flat or very steep)。


4.2 LSTM,讓RNN的訓練更簡單

1997年,LSTM的提出就是為了解決RNN的梯度彌散的問題(gradient vanish)。那麼LSTM比普通的RNN好在哪呢?LSTM為什麼能夠解決gradient vanish的問題?

LSTM如何避免梯度消失:


雖然LSTM並沒有解決梯度爆炸的問題,但是梯度膨脹(gradient explosion)不是個嚴重的問題,一般靠裁剪後的優化算法即可解決,比如gradient clipping(如果梯度的範數大於某個給定值,將梯度同比收縮)。

經驗:

訓練LSTM要保證forget gate多數情況下 都是開啟的;

97年最開始提出LSTM就是為了解決梯度彌散的問題,最開始LSTM是沒有forget gate的,forget gate是後來才加上的。

         

        本文總結只有一句話:「終於講完了!」。說了這麼多,你的眼睛估計也花了吧。神經網絡博大精深,本系列文章未完待續。

         

卷積神經網絡淺析

卷積神經網絡CNN 在自然語言處理中的應用

基於CNN的文本分類(Paper介紹和代碼解析)

為什麼Tensorflow在訓練神經網絡時,需要讓交叉熵最小

史丹福大學課程CS224D下載《Deep Learning for Natural Language Processing》

Tensorflow源碼講解視頻下載

客官,請關注我,常來翻我的牌子。

相關焦點

  • 循環神經網絡(RNN)入門帖:向量到序列,序列到序列,雙向RNN,馬爾科夫化
    作者:David 9地址:http://nooverfit.com/rnn似乎更擅長信息的保存和更新,而cnn似乎更擅長精確的特徵提取;rnn輸入輸出尺寸靈活,而cnn尺寸相對刻板。聊到循環神經網絡RNN,我們第一反應可能是:時間序列 (time sequence)。
  • TensorFlow練手 | 使用循環神經網絡(RNN)實現影評情感分類
    沒那麼神秘,三分鐘學會人工智慧作為對循環神經網絡的實踐,我用循環神經網絡做了個影評情感的分類2.使用LSTM作為循環神經網絡的基本單元長短時記憶網絡(LSTM)能夠自動完成前文信息的「記憶」和「遺忘」,在循環神經網絡中表現良好,已經成為在循環神經網絡中大部分人的首選
  • 循環神經網絡RNN打開手冊
    這裡的技術核心, 就是RNN- 我們常說的傳說中的循環神經網絡。 RNN可以稱得上是深度學習未來最有前景的工具之一。  你想了解它的威力的根源嗎? 你想知道一些最新的RNN應用?請看下文。為什麼RNN會有如此強大的效力? 讓我們從基礎學起。
  • 【深度學習】循環神經網絡(RNN)簡易教程
    我們從以下問題開始循環神經網絡能解決人工神經網絡和卷積神經網絡存在的問題。假設我們正在寫一條信息「Let’s meet for___」,我們需要預測下一個單詞是什麼。下一個詞可以是午餐、晚餐、早餐或咖啡。我們更容易根據上下文作出推論。
  • 循環神經網絡(RNN)簡介
    下面從循環神經網絡的記憶能力、單向循環神經網絡、參數學習、長期依賴問題、工作模式及應用領域幾個方面闡述RNN。       前饋神經網絡(如CNN)是一個靜態網絡,信息的傳遞是單向的,網絡的輸出只依賴於當前的輸入,不具備記憶能力。
  • 神經網絡解析|RNN(循環神經網絡)
    RNN是兩種神經網絡模型的縮寫,一種是遞歸神經網絡(Recursive Neural Network),一種是循環神經網絡(Recurrent Neural Network)。雖然這兩種神經網絡有著千絲萬縷的聯繫,但是本文主要討論的是第二種神經網絡模型——循環神經網絡(Recurrent Neural Network)。
  • 輕鬆學Pytorch –構建循環神經網絡
    大家好,使用pytorch實現簡單的人工神經網絡跟卷積神經網絡的mnist手寫識別案例之後,今天給大家分享一下如何基於循環神經網絡實現mnist手寫數字識別。這裡基於pytorch提供的函數,簡單封裝分別實現了一個RNN跟LSTM的模型,然後分別使用這兩個模型完成了mnist數字識別。下面就來說說數據集跟模型實現部分。
  • RNN遞歸神經網絡原理介紹+數字識別應用
    +圖片識別應用(附源碼)BP神經網絡+TensorFlow做圖片識別前言:自己學習研究完CNN卷積神經網絡後,很久的一段時間因為要完成自己的畢業設計就把更新博客給耽擱了。介紹CNN卷積神經網絡和RNN遞歸神經網絡都是由BP神經網絡演化而來的。CNN卷積神經網絡主要應用在圖像識別領域;而RNN遞歸神經網絡的改進版LSTM網絡主要應用於自然語言處理中;為什麼我介紹RNN是叫——遞歸神經網絡?這之前是一個困擾我很久的問題。
  • 循環神經網絡 RNN、LSTM、GRU
    與傳統的前向神經網絡和卷積神經網絡 (CNN) 不同,循環神經網絡 (Recurrent Neural Networks,RNN)是一種擅於處理序列數據的模型,例如文本、時間序列、股票市場等。
  • RNN循環神經網絡
    點擊上方「AI與計算機視覺」,選擇加"星標"或「置頂」重磅乾貨,第一時間送達什麼是RNNRNN主要用來處理序列數據在傳統的神經網絡模型中但是這種普通的神經網絡對於很多問題卻無能為力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNN之所以稱為循環神經網絡,即一個序列當前的輸出與前面的輸出也有關。
  • 循環神經網絡(RNN)簡易教程
    我們從以下問題開始循環神經網絡能解決人工神經網絡和卷積神經網絡存在的問題。在哪裡可以使用RNN?RNN是什麼以及它是如何工作的?挑戰RNN的消梯度失和梯度爆炸LSTM和GRU如何解決這些挑戰假設我們正在寫一條信息「Let’s meet for___」,我們需要預測下一個單詞是什麼。下一個詞可以是午餐、晚餐、早餐或咖啡。我們更容易根據上下文作出推論。
  • 【人工智慧】8RNN循環神經網絡(課件摘抄)
    5.2.BPTT(隨時間反向傳播)5.2.1.隨時間反向傳播是通過類似於前饋神經網絡的錯誤反向傳播算法來計算梯度。5.2.2.將循環神經網絡展開為多層前饋神經網絡,每一層對應著循環神經網絡的每個時刻,即可用前饋神經網絡中的後向傳播來計算參數梯度。5.2.3.展開的FNN中,所有層參數共享,真實梯度為所有「展開層」的參數梯度之和。
  • TensorFlow系列專題(八):七步帶你實現RNN循環神經網絡小示例
    編輯 | 安可出品 | 磐創AI技術團隊【前言】:在前面的內容裡,我們已經學習了循環神經網絡的基本結構和運算過程
  • PyTorch實現用於文本生成的循環神經網絡
    當一個機器學習模型工作在諸如循環神經網絡、LSTM-RNN、GRU等序列模型上時,它們可以生成輸入文本的下一個序列。PyTorch提供了一組功能強大的工具和庫,這些工具和庫為這些基於NLP的任務增添了動力。它不僅需要較少的預處理量,而且加快了訓練過程。
  • 零基礎入門深度學習 |最終篇:遞歸神經網絡
    在前面的文章中,我們介紹了循環神經網絡,它可以用來處理包含序列結構的信息。然而,除此之外,信息往往還存在著諸如樹結構、圖結構等更複雜的結構。對於這種複雜的結構,循環神經網絡就無能為力了。本文介紹一種更為強大、複雜的神經網絡:遞歸神經網絡 (Recursive Neural Network, RNN),以及它的訓練算法BPTS (Back Propagation Through Structure)。顧名思義,遞歸神經網絡(巧合的是,它的縮寫和循環神經網絡一樣,也是RNN)可以處理諸如樹、圖這樣的遞歸結構。在文章的最後,我們將實現一個遞歸神經網絡,並介紹它的幾個應用場景。
  • 教程| 如何使用TensorFlow構建、訓練和改進循環神經網絡
    選自SVDS作者:Matthew Rubashkin、Matt Mollison機器之心編譯參與:李澤南、吳攀來自 Silicon Valley Data Science 公司的研究人員為我們展示了循環神經網絡(RNN)探索時間序列和開發語音識別模型的能力。
  • 循環神經網絡和LSTM初學者指南
    文章中詳細介紹了循環神經網絡(RNN),及其變體長短期記憶(LSTM)背後的原理。 具體內容,從前饋網絡(Feedforward Networks)開始講起,先後講述了循環神經網絡、時序反向傳播算法(BPTT)、LSTM等模型的原理與運作方式。
  • 理解神經網絡:從神經元到RNN、CNN、深度學習
    神經網絡對於數據科學和或者機器學習從業者,就像線性回歸對於統計學家一樣。因此,對神經網絡是什麼有一個基本的理解是有必要的,比如,它是怎麼構成的,它能處理問題的範圍以及它的局限性是什麼。這篇文章嘗試去介紹神經網絡,從一個最基礎的構件,即一個神經元,深入到它的各種流行的種類,像CNN,RNN等。 神經元是什麼?
  • 深度學習網絡之RNN(遞歸神經網絡)
    遞歸神經網絡提出於1990年,被視為循環神經網絡(recurrent neural network)的推廣。當遞歸神經網絡的每個父節點都僅與一個子節點連接時,其結構等價於全連接的循環神經網絡。遞歸神經網絡可以引入門控機制(gated mechanism)以學習長距離依賴。
  • 教程 | 如何快速訓練免費的文本生成神經網絡
    文本生成是這一波神經網絡革命中誕生的一個有趣的應用。大多數目前流行的實現方法都基於 Andrej Karpathy 的「char-rnn」架構(https://github.com/karpathy/char-rnn)或者這篇博文(http://karpathy.github.io/2015/05/21/rnn-effectiveness/),它通過訓練使循環神經網絡根據之前的 n 個字符預測序列中的下一個字符。