深度學習之循環神經網絡(Recurrent Neural Network,RNN)

遞歸神經網絡和循環神經網絡

  • 循環神經網絡(recurrent neural network):時間上的展開,處理的是序列結構的信息,是有環圖
  • 遞歸神經網絡(recursive neural network):空間上的展開,處理的是樹狀結構的信息,是無環圖
  • 二者簡稱都是 RNN,但是一般提到的RNN指的是循環神經網絡(recurrent neural network)。

為什么有bp神經網絡、CNN、還需要RNN?

  • BP神經網絡和CNN的輸入輸出都是互相獨立的;但是實際應用中有些場景輸出內容和之前的內 容是有關聯的。
  • RNN引入“記憶”的概念;遞歸指其每一個元素都執行相同的任務,但是輸出依賴于輸入和“記憶”

什么是循環神經網絡 RNN

我們已經學習了前饋網絡的兩種結構——bp神經網絡和卷積神經網絡。這兩種結構有一個特點,就是假設輸入是一個獨立的沒有上下文聯系的單位。但是對于一些有明顯的上下文特征的序列化輸入,比如預測視頻中下一幀的播放內容,那么很明顯這樣的輸出必須依賴以前的輸入, 也就是說網絡必須擁有一定的”記憶能力”。為了賦予網絡這樣的記憶力,一種特殊結構的神經網絡——循環神經網絡(Recurrent Neural Network)便應運而生了

循環神經網絡RNN的應用場景

自然語言處理(NLP)

RNNs已經被在實踐中證明對NLP是非常成功的。如詞向量表達、語句合法性檢查、詞性標注等。在RNNs中,目前使用最廣泛最成功的模型便是LSTMs(Long Short-Term Memory,長短時記憶模型)模型,該模型通常比vanilla RNNs能夠更好地對長短時依賴進行表達,該模型相對于一般的RNNs,只是在隱藏層做了手腳。對于LSTMs,后面會進行詳細地介紹。下面對RNNs在NLP中的應用進行簡單的介紹。

自然語言處理(NLP)——語言模型與文本生成

給你一個單詞序列,我們需要根據前面的單詞預測每一個單詞的可能性。語言模型能夠一個語句正確的可能性,這是機器翻譯的一部分,往往可能性越大,語句越正確。另一種應用便是使用生成模型預測下一個單詞的概率,從而生成新的文本根據輸出概率的采樣。語言模型中,典型的輸入是單詞序列中每個單詞的詞向量(如 One-hot vector),輸出時預測的單詞序列。當在對網絡進行訓練時,如果,那么第步的輸出便是下一步的輸入。?
??下面是RNNs中的語言模型和文本生成研究的三篇文章:

  • Recurrent neural network based language model
  • Extensions of Recurrent neural network based language model
  • Generating Text with Recurrent Neural Networks

機器翻譯

機器翻譯是將一種源語言語句變成意思相同的另一種源語言語句,如將英語語句變成同樣意思的中文語句。與語言模型關鍵的區別在于,需要將源語言語句序列輸入后,才進行輸出,即輸出第一個單詞時,便需要從完整的輸入序列中進行獲取。機器翻譯如下圖所示:?

MT

RNN for Machine Translation.?Image Source?。下面是關于RNNs中機器翻譯研究的三篇文章:

  • A Recursive Recurrent Neural Network for Statistical Machine Translation
  • Sequence to Sequence Learning with Neural Networks
  • Joint Language and Translation Modeling with Recurrent Neural Networks

語音識別

語音識別是指給一段聲波的聲音信號,預測該聲波對應的某種指定源語言的語句以及該語句的概率值。?

RNNs中的語音識別研究論文:

  • Towards End-to-End Speech Recognition with Recurrent Neural Networks

圖像描述生成

和卷積神經網絡(convolutional Neural Networks, CNNs)一樣,RNNs已經在對無標圖像描述自動生成中得到應用。將CNNs與RNNs結合進行圖像描述自動生成。這是一個非常神奇的研究與應用。該組合模型能夠根據圖像的特征生成描述。如下圖所示:?

GID

圖像描述生成中的深度視覺語義對比.?Image Source

文本相似度計算等 。。。。。

循環神經網絡 RNN 結構

循環神經網絡是一類用于處理序列數據的神經網絡,就像卷積神經網絡是專門用于處理網格化數據(如一張圖像)的神經網絡,循環神經網絡時專門用于處理序列?x^{(1)},...,x^{(T)} 的神經網絡。

同一個神經元在不同時刻的狀態構成了RNN神經網絡,簡化版的RNN結構如下:

循環神經網絡的結果相比于卷積神經網絡較簡單,通常循環神經網絡只包含輸入層、隱藏層和輸出層,加上輸入輸出層最多也就5層

以樣本 ‘我是誰’? 為例,體會一下

將一個神經元序列按時間展開就可以得到RNN的結構

  • 網絡某一時刻 t 的輸入X_t,和之前介紹的 bp 神經網絡的輸入一樣,X_t?是一個n維向量,不同的是遞歸網絡的輸入將是一整個序列,也就是X=[X_1,…,X_{t-1},X_t,X_{t+1},…X_t]。對于語言模型,每一個?X_t?代表一個詞向量,一整個序列就代表一句話
  • h_t?代表時刻 t 隱神經元對于線性轉換值
  • S_t?是時間 t 處的“記憶”,S_t = f(UX_t + WS_{t-1}),f() 可以是非線性轉換函數,比如 tanh 等, 通常我們把?S_t?叫做一個細胞,它有兩個輸出
  • o_t?代表時刻t的輸出(神經元激活后的輸出結果),比如是預測下一個詞的話,可能是 sigmoid(softmax) 輸出的屬于每個候選詞的概率,O_t = softamx(VS_t)
  • 輸入層到隱藏層直接的權重由U表示,它將我們的原始輸入進行抽象作為隱藏層的輸入
  • 隱藏層到隱藏層的權重W,它是網絡的記憶控制者,負責調度記憶。
  • 隱藏層到輸出層的權重V,從隱藏層學習到的表示將通過它再一次抽象,并作為最終輸出

循環神經網絡RNN-BPTT?

RNN 的訓練和 CNN/ANN 訓練一樣,同樣適用 BP算法誤差反向傳播算法。區別在于:RNN中的參數U\V\W是共享的,并且在隨機梯度下降算法中,每一步的輸出不僅僅依賴當前步的網絡,并且還需要前若干步網絡的狀態,那么這種BP改版的算法叫做Backpropagation Through Time(BPTT);BPTT算法和BP算法一樣,在多層訓練過程中(長時依賴<即當前的輸出和前面很長的一段序列有關,一般超過10步>),可能產生梯度消失和梯度爆炸的問題。

BPTT和BP算法思路一樣,都是求偏導,區別在于需要考慮時間對step的影響。

RNN正向傳播階段

在t=1的時刻,U,V,W都被隨機初始化好,h0通常初始化為0,然后進行如下計算:

\begin{aligned} h_1 &= Ux_1+Ws_0 \\ s_1 &= f(h_1) \\ o_1 &= g(Vs_1) \end{aligned}

時間就向前推進,此時的狀態 h1 作為時刻 t=1?的記憶狀態將參與下一次的預測活動,也就是:

\begin{aligned} h_2 &= Ux_2 + Ws_1 \\ s_2 &= f(h_2) \\ o_2 &= g(Vs_2) \end{aligned}

以此類推,可得任意時刻t,神經元的計算過程

\begin{aligned} h_t &= Ux_t + Ws_{t-1} \\ s_t &= f(h_t) \\ o_t &= g(Vs_t) \end{aligned}

其中 f 可以是 tanh,relu,sigmoid?等激活函數, g 通常是 softmax,也可以是其他。 值得注意的是,我們說循環神經網絡擁有記憶能力,而這種能力就是通過 W 將以往的輸入狀態進行總結,而作為下次輸入的輔助,可以這樣理解隱藏狀態:h=f(現有的輸入+過去記憶總結)

RNN反向傳播階段

bp神經網絡用到 誤差反向傳播 方法將輸出層的誤差總和,對各個權重的梯度 ?U,?V,?W,求偏導數,然后利用梯度下降法更新各個權重。

對于每一時刻 t 的 RNN 網絡,網絡的輸出?o_t?都會產生一定誤差?e_t?,誤差的損失函數,可以是交叉熵也可以是平方誤差等等。那么總的誤差為E=\sum_te_t,我們的目標就是要求取各個權重(U、V、W)對總誤差的偏導

\begin{aligned} \bigtriangledown U &= \frac{\partial E }{\partial U} = \sum_t \frac{\partial e_t }{\partial U} \\ \bigtriangledown V &= \frac{\partial E }{\partial V} = \sum_t \frac{\partial e_t }{\partial V} \\ \bigtriangledown W &= \frac{\partial E }{\partial W} = \sum_t \frac{\partial e_t }{\partial W} \end{aligned}

求V的偏導

對于輸出?o_t = g(Vs_t),任意損失函數,求?V是非常簡單的,我們可以直接求取每個時刻的?\frac{\partial e_t }{\partial V},由于它不存在和之前的狀態依賴,可以直接求導取得,然后簡單地求和即可。對于?W、?U的計算不能直接求導,需要用鏈式求導法則。

求w的偏導

\begin{aligned} s_t &= f(Ux_t + Wh_{t-1}) \\ o_t &= g(Vs_t) \\ E &= \sum_t E_t\\ \frac{\partial E}{\partial W} &= \sum_t \frac{\partial E_t}{\partial W} \end{aligned}

求U的偏導

RNN 缺點

假如?t = 0 時刻的值,到?t = 100? 時,由于前面的?W 次數過大,又可能會使其忘記?t = 0 時刻的信息,我們稱之為?RNN梯度消失,但是不是真正意思上的消失,因為梯度是累加的過程,不可能為0,只是在某個時刻的梯度太小,忘記了前面時刻的內容

為了克服梯度消失的問題,LSTM和GRU模型便后續被推出了,LSTM和GRU都有特殊的方式存儲”記憶”,以前梯度比較大的”記憶”不會像RNN一樣馬上被抹除,因此可以一定程度上克服梯度消失問題。

另一個簡單的技巧 gradient clipping(梯度截取) 可以用來克服梯度爆炸的問題,也就是當你計算的梯度超過閾值c的或者小于閾值?c時候,便把此時的梯度設置成c或?c

下圖所示是RNN的誤差平面,可以看到RNN的誤差平面要么非常陡峭,要么非常平坦,如果不采取任何措施,當你的參數在某一次更新之后,剛好碰到陡峭的地方,此時梯度變得非常大,那么你的參數更新也會非常大,很容易導致震蕩問題。而如果你采取了gradient clipping,那么即使你不幸碰到陡峭的地方,梯度也不會爆炸,因為梯度被限制在某個閾值c

雙向RNN Bidirectional RNN

Bidirectional RNN(雙向RNN)假設當前t的輸出不僅僅和之前的序列有關,并且還與之后的序列有關,例如:預測一個語句中缺失的詞語那么需要根據上下文進行預測;Bidirectional RNN是一個相對簡單的RNNs,由兩個RNNs上下疊加在 一起組成。輸出由這兩個RNNs的隱藏層的狀態決定

或者如下圖

深度雙向 RNN

Deep Bidirectional RNN(深度雙向RNN)類似Bidirectional RNN,區別在于每個每一步的輸入有多層網絡,這樣的話該網絡便具有更加強大的表達能力和學習能力,但是復雜性也提高了,同時需要訓練更多的數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453952.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453952.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453952.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從北京回來的年輕人,我該告訴你點什么?

前言 就在上周末&#xff0c;我與公眾號里的一個當地粉絲見面了&#xff0c;一起吃了頓飯&#xff0c;順便聊了聊。先來簡單交代下我們這位粉絲&#xff08;以下簡稱小L&#xff09;的經歷以及訴求。 小L之前在北京八維研修學院培訓的PHP&#xff0c;因為家庭原因&#xff0c;沒…

Linphone編譯【轉載】

Linphone依賴太多的庫&#xff0c;以致于稍有疏失&#xff0c;就會在編譯&#xff0c;運行出錯&#xff0c;都是由于依賴庫安裝的問題。 1 基礎知識 1.1 動態庫的連接 很多人安裝完庫后&#xff0c;configure依然報告這個庫沒有。這是對linux動態庫知識匱乏造成&#xff0c;也就…

python助教的面試題_python面試題----持續更新中

為什么學習Python&#xff1f;通過什么途徑學習的Python&#xff1f;Python和Java、PHP、C、C#、C等其他語言的對比&#xff1f;python 解釋型語言&#xff0c;語法簡潔優雅。C C 編譯型語言&#xff0c;先編譯后運行&#xff0c;偏底層。簡述解釋型和編譯型編程語言&#xff1…

python3模塊: requests

Python標準庫中提供了&#xff1a;urllib等模塊以供Http請求&#xff0c;但是&#xff0c;它的 API 太渣了。它是為另一個時代、另一個互聯網所創建的。它需要巨量的工作&#xff0c;甚至包括各種方法覆蓋&#xff0c;來完成最簡單的任務。 發送GET請求 import urllib.requestf…

SUSE12系統安裝及LVM設置詳解

SUSE12自定義安裝跟以往版本差不多&#xff0c;只是調整了一些功能安裝順序&#xff0c;例如網絡設置放到很靠前&#xff0c;SUSE11的時候幾乎是在后半部分&#xff0c;自定義分區也調整到網絡設置之后&#xff0c;入口設置也隱秘&#xff0c;如果是熟悉suse11安裝&#xff0c;…

在windows下編譯FFMPEG-最新2009版本

轉】在windows下編譯FFMPEG-最新2009版本2010-11-17 18:50大家可以看到&#xff0c;此篇之前有很多個版本的“在windows下編譯FFMPEG”&#xff0c;那些都是我在網上搜羅來的&#xff0c;在看了無數篇那些過期的、有借鑒價值的文章后&#xff0c;我終于成功在windows下編譯出了…

CentOS7 安裝nginx

1、官網下載安裝包 官網&#xff1a;http://nginx.org/en/download.html 選擇適合Linux的版本&#xff0c;這里選擇最新的版本&#xff0c;下載到本地后上傳到服務器或者centos下直接wget命令下載。 切換到/usr/local目錄&#xff0c;下載軟件包 # cd /usr/local # wget htt…

dvwa如何打開_DVWA詳細 安裝

Wamp就是Windows Apache Mysql PHP集成安裝環境&#xff0c;即在window下的apache、php和mysql的服務器軟件。PHP擴展、Apache模塊&#xff0c;開啟/關閉鼠標點點就搞定&#xff0c;再也不用親自去修改配置文件了&#xff0c;WAMP它會去做。再也不用到處詢問php的安裝問題了&am…

CentOS7安裝OpenFire

下載openfire wget http://download.igniterealtime.org/openfire/openfire-3.9.3-1.i386.rpm安裝openfire yum install -y /home/openfire-3.9.3-1.i386.rpm安裝運行庫 yum install -y glibc.i686添加開啟啟動 chkconfig openfire on啟動openfire服務 systemctlstart openfire…

CentOS 安裝 php

大致步驟&#xff1a;下載–解壓–編譯–安裝–配置 php官網&#xff1a; https://www.php.net/releases/ php5.6連接地址 http://hk1.php.net/get/php-5.6.36.tar.gz/from/this/mirror http://hk2.php.net/get/php-5.6.36.tar.gz/from/this/mirror 1.安裝php 所依賴的軟件 yu…

怎么利用ffmpeg和AviSynth給在windows下面為flv文件加水印

之前一直在找怎么為flv文件加上自己的水印,ffmpeg和vhook是在linux下面支持.在windows下面不支持.所以我就選擇用ffmpeg和AviSynth為flv文件加水印.詳細步驟如下: 1 首先當然下載ffmpeg和AviSynth了.具體的地址自己google一下就能找到很多.這里就不再詳細介紹了. 一般情況ffm…

【Hibernate框架開發之九】Hibernate 性能優化筆記!(遍歷、一級/二級/查詢/緩存/樂觀悲觀鎖等優化算法)...

1. 循環分頁或者循環進行部分讀取處理數據的時候&#xff0c;使用 session.clear() ; 2. 對應1N&#xff08;N1&#xff09;問題使用如下解決方式&#xff1a; 1&#xff09;&#xff1a; 使用createCriteria進行查詢(join fetch) 2&#xff09;&#xff1a;HQL -> joi…

vscode中安裝webpack_VSCode下手動構建webpack項目(示例代碼)

1.執行npm install nrm -g&#xff0c;安裝nrm&#xff0c;此模塊主要用于切換npm鏡像源&#xff0c;簡化手動配置步驟2.執行 nrm ls&#xff0c;可以看到npm源地址列表&#xff0c;當前使用的是默認源&#xff0c;npm https://registry.npmjs.org/3.執行 nrm use taobao&#…

Python html 代碼轉成 word(docx)

安裝 sudo apt install pandoc pip3 install pypandoc示例代碼 import pypandochtml """ <h3>This is a title</h3> <p><img src"http://placehold.it/150x150" alt"I go below the image as a caption"></p…

最新ffmpeg編譯和用eclipse進行源碼調試

最近由于項目需要&#xff0c;必須修改ffmpeg的源碼進行修改才能滿足項目的需求&#xff0c;但以前我從來沒有自己去編譯和使用ffmpeg的源代碼&#xff0c;一直都是用別人編譯好了的sdk&#xff0c;再加上習慣了vs方便的編譯環境&#xff0c;要在linux下對如此多的源代碼進行編…

Django補充知識點——用戶管理

內容概要 1、Form表單2、Ajax3、布局&#xff0c;Django母板4、序列化5、Ajax相關6、分頁7、XSS攻擊8、CSRF9、CBV、FBV 10、類中用裝飾器的兩種方法 11、上傳文件 12、數據庫正向查詢、反向查詢、多對多查詢 13、jQuery對象和DOM對象可以互相轉換 14、cookie和session 用戶管理…

easypoi導出excel 效率_Spring Boot 入門(十二):報表導出,對比poi、jxl和esayExcel的效率...

關于poi、jxl和esayExcel的介紹自行百度。jxl最多支持03版excel&#xff0c;所以單個sheet頁面最多只能導出65536條數據。我直接將excel導入到瀏覽器并打開&#xff0c;以下統計導出時長指將數據從數據庫查詢&#xff0c;并寫入到excel的過程。不包括打開excel所消耗的時間為了…

Python html 代碼轉成圖片、PDF

一、下載 1、python的imgkit、pdfkit庫 pip install imgkit pip install pdfkit 2、wkhtmltopdf工具包 下載地址&#xff1a;https://wkhtmltopdf.org/downloads.html 下載之后安裝&#xff0c;安裝完成會生成兩個程序&#xff0c;分別用來轉圖片和pdf&#xff1a; 二、使…

SpringEL expression:

2019獨角獸企業重金招聘Python工程師標準>>> 這個異常有下面幾種情況 1、你寫的 EL 表達式有語法錯誤。 2、再者就是你取得變量是多級的話比如 student.address.prevince 屬性model 關聯有問題。 3、還有就是你取得值為空&#xff08;null&#xff09; 比如 Thymel…

利用qt和ffmpeg軟件來制作視頻裁剪工具

0 什么是ffmpeg? Libav&#xff08;舊稱&#xff1a;FFmpeg&#xff09;是一個自由軟件&#xff0c;可以運行音頻和視頻多種格式的錄影、轉檔、流功能[1]&#xff0c;包含了libavcodec ─這是一個用于多個專案中音頻和視頻的解碼器庫&#xff0c;以及 libavformat ——一個音頻…