TensorFlow框架(6)之RNN迴圈神經網路詳解

来源:http://www.cnblogs.com/huliangwen/archive/2017/09/01/7464813.html
-Advertisement-
Play Games

1. RNN迴圈神經網路 1.1 結構 迴圈神經網路(recurrent neural network,RNN)源自於1982年由Saratha Sathasivam 提出的霍普菲爾德網路。RNN的主要用途是處理和預測序列數據。全連接的前饋神經網路和捲積神經網路模型中,網路結構都是從輸入層到隱藏層再 ...


1. RNN迴圈神經網路

1.1 結構

  迴圈神經網路(recurrent neural network,RNN)源自於1982年由Saratha Sathasivam 提出的霍普菲爾德網路。RNN的主要用途是處理和預測序列數據。全連接的前饋神經網路和捲積神經網路模型中,網路結構都是從輸入層到隱藏層再到輸出層,層與層之間是全連接或部分連接的,但每層之間的節點是無連接的。

圖 11 RNN-rolled

    如圖 11所示是一個典型的迴圈神經網路。對於迴圈神經網路,一個非常重要的概念就是時刻。迴圈神經網路會對於每一個時刻的輸入結合當前模型的狀態給出一個輸出。從圖 11中可以看到,迴圈神經網路的主體結構A的輸入除了來自輸入層Xt,還有一個迴圈的邊來提供當前時刻的狀態。在每一個時刻,迴圈神經網路的模塊A會讀取t時刻的輸入Xt,並輸出一個值Ht。同時A的狀態會從當前步傳遞到下一步。因此,迴圈神經網路理論上可以被看作是同一神經網路結構被無限複製的結果。但出於優化的考慮,目前迴圈神經網路無法做到真正的無限迴圈,所以,現實中一般會將迴圈體展開,於是可以得到圖 12所示的展示結構。

圖 12 RNN-unrolled

  在圖 12中可以更加清楚的看到迴圈神經網路在每一個時刻會有一個輸入Xt,然後根據迴圈神經網路當前的狀態At,提供一個輸出ht。而迴圈神經網路的結構特征可以很容易得出它最擅長解決的問題是與世界序列相關的。迴圈神經網路也是處理這類問題時最自然的神經網路結構。對於一個序列數據,可以將這個序列上不同時刻的數據依次傳入迴圈神經網路的輸入層,而輸出可以是對序列中下一個時刻的預測,也可以是對當前時刻信息的處理結果(比如語音識別結果)。迴圈神經網路要求每一個時刻都有一個輸入,但是不一定每一個時刻都需要有輸出。

1.2 網路

  如之前所介紹,迴圈神經網路可以被看作是同一神經網路結構在時間序列上被覆制多次的結果,這個複製多次的結構被稱為迴圈體。如何設計迴圈體的網路結構是迴圈神經網路解決實際問題的關鍵。和捲積神經網路每層神經元中參數是共用的類似,在迴圈神經網路中,迴圈體網路結構中的參數(權值和偏置)在不同時刻也是共用的。

圖 13 SimpleRNN

  圖 13展示了一個使用最簡單的迴圈體結構的迴圈神經網路,在這個迴圈體中只使用了一個類似全連接層的神經網路結構。下麵將通過圖 13中所展示的神經網路來介紹迴圈神經網路前向傳播的完整流程。迴圈神經網路中的狀態是通過一個向量來表示的,這個向量的維度也稱為神經網路隱藏層的大小,假設其為h。從圖 13種可以看出,迴圈體中的神經網路的輸入有兩部分,一部分為上一時刻的狀態,另一部分為當前時刻的輸入樣本。對於時間序列數據來說,每一時刻的輸入樣例可以是當前時刻的數據;對於語言模型來說,輸入樣例可以是當前單詞對應的單詞向量。

  假設輸入向量的維度為x,那麼圖 13中迴圈體的全連接層神經網路的輸入大小為h+x。也就是將上一時刻的狀態與當前時刻的輸入拼接成一個大的向量作為迴圈體中神經網路的輸入。因為該神經網路的輸出為當前時刻的狀態,於是輸出層的節點個數也為h,迴圈體中的參數個數為(h+x)*h+h個(因為有h個元素的輸入向量和x個元素的輸入向量,及h個元素的輸出向量;可用簡單理解為輸入層有h+x個神經元,輸出層有h個神經元,從而形成一個全連接的前饋神經網路,有(h+x)*h個權值,有h個偏置)。

圖 14 example RNN

  如圖 14所示具有兩個時刻的RNN網路,其中t0和t1的權值和偏置是相同的,只是不同的輸入而已;同時由於輸入向量是1維的,而輸入狀態為2維的,合併起來的向量是3維的;其中在每個迴圈體的狀態輸出是2維的,然後經過一個全連接的神經網路計算後,最終輸出是1維向量結構。

1.3 問題

  迴圈神經網路工作的關鍵點就是使用歷史的信息來幫助當前的決策。例如使用之前出現的單詞來加強對當前文字的理解。迴圈神經網路可以更好地利用傳統神經網路結構所不能建模的信息,但同時,這也帶來了更大的技術挑戰——長期依賴(long-term dependencies)問題。

  在有些問題中,模型僅僅需要短期內的信息來執行當前的任務。比如預測短語"大海的顏色是藍色"中最後一個單詞"藍色"時,模型並不需要記憶這個短語之前更長的上下文信息——因為這一句話已經包含了足夠信息來預測最後一個詞。在這樣的場景中,相關的信息和待預測詞的位置之間的間隔很小,迴圈神經網路可以比較容易地利用先前信息。

  但同樣也會有一些上下文場景比較複雜的情況。比如當模型試著去預測段落"某地開設了大量工廠,空氣污染十分嚴重……這裡的天空都是灰色的"的最後一個單詞時,僅僅根據短期依賴就無法很好的解決這種問題。因為只根據最後一小段,最後一個詞可以是"藍色的"或者"灰色的"。但如果模型需要預測清楚具體是什麼顏色,就需要考慮先前提到但離當前位置較遠的上下文信息。因此,當前預測位置和相關信息之間的文本間隔就有可能變得很大。當這個間隔不斷增大時,類似圖 13中給出的簡單迴圈神經網路有可能喪失學習到距離如此遠的信息的能力。或者在複雜語言場景中,有用信息的間隔有大有小、長短不一,迴圈神經網路的性能也會受到限制。

2. LSTM長短記憶網路

2.1 概述

  長短記憶網路(long short term memory, LSTM)的設計正是為瞭解決上述RNN的依賴問題,即為瞭解決RNN有時依賴的間隔短,有時依賴的間隔長的問題。其中迴圈神經網路被成功應用的關鍵就是LSTM。在很多的任務上,採用LSTM結構的迴圈神經網路比標準的迴圈神經網路的表現更好。LSTM結構是由Sepp hochreiter和Jurgen Schemidhuber於1997年提出的,它是一種特殊的迴圈神經網路結構。

2.2 結構

  LSTM的設計就是為了精確解決RNN的長短記憶問題,其中預設情況下LSTM是記住長時間依賴的信息,而不是讓LSTM努力去學習記住長時間的依賴。

圖 21 LSTM

  所有迴圈神經網路都有一個重覆結構的模型形式,在標準的RNN中,重覆的結構是一個簡單的迴圈體,如圖 13 所示的A迴圈體。然而LSTM的迴圈體是一個擁有四個相互關聯的全連接前饋神經網路的複製結構,如圖 21所示。

  目前可以先不必瞭解LSTM細節,只需先明白圖 22所示的符號語義:

圖 22 notation

  • Neural NetWork Layer:該圖表示一個神經網路層;
  • Pointwise Operation:該圖表示一種操作,如加號表示矩陣或向量的求和、乘號表示向量的乘法操作;
  • Vector Tansfer:每一條線表示一個向量,從一個節點輸出到另一個節點;
  • Concatenate:該圖表示兩個向量的合併,即由兩個向量合併為一個向量,如有X1X2兩向量合併後為[X1,X2]向量;
  • Copy:該圖表示一個向量複製了兩個向量,其中兩個向量值相同。

2.3 分析

2.3.1 核心設計

  LSTM設計的關鍵是神經元的狀態,如圖 23所示頂部的水平線。神經元的狀態類似傳送帶一樣,按照傳送方向從左端被傳送到右端,在傳送過程中基本不會改變,只是進行一些簡單的線性運算:加或減操作。神經元的通過線性操作能夠小心地管理神經元的狀態信息,將這種管理方式稱為門操作(gate)。

圖 23 C-line

  門操作能夠隨意的控制神經元狀態信息的流動,如圖 24所示,它由一個sigmoid激活函數的神經網路層和一個點乘運算組成。Sigmoid層輸出要麼是1要麼是0,若是0則不能讓任何數據通過;若是1則意味著任何數據都能通過。

圖 24 gate

LSTM有三個門來管理和控制神經元的狀態信息。

2.3.2 遺忘門

  LSTM的第一步是決定要從上一個時刻的狀態中丟棄什麼信息,其是由一個sigmoid全連接的前饋神經網路的輸出阿裡管理,將這種操作稱為遺忘門(forget get layer)。如圖 25所示。這個全連接的前饋神經網路的輸入是ht-1和Xt組成的向量,輸出是ft向量。ft向量是由1和0組成,1表示能夠通過,0表示不能通過。

圖 25 focus-f

2.3.3 輸入門

  第二步決定哪些輸入信息要保存到神經元的狀態中。這又兩隊前饋神經網路,如圖 26所示。首先是一個sigmoid層的全連接前饋神經網路,稱為輸入門(input gate layer),其決定了哪些值將被更新;然後是一個tanh層的全連接前饋神經網路,其輸出是一個向量Ct,Ct向量可以被添加到當前時刻的神經元狀態中;最後根據兩個神經網路的結果創建一個新的神經元狀態。

圖 26 focus-i

2.3.4 狀態控制

  第三步就可以更新上一時刻的狀態Ct-1為當前時刻的狀態Ct了。上述的第一步的遺忘門計算了一個控制向量,此時可通過這個向量過濾了一部分Ct-1狀態,如圖 27所示的乘法操作;上述第二步的輸入門根據輸入向量計算了新狀態,此時可以通過這個新狀態和Ct-1狀態根據一個新的狀態Ct,如圖 27所示的加法操作。

圖 27 focus-C

2.3.5 輸出門

  最後一步就是決定神經元的輸出向量ht是什麼,此時的輸出是根據上述第三步的Ct狀態進行計算的,即根據一個sigmoid層的全連接前饋神經網路過濾到一部分Ct狀態作為當前時刻神經元的輸出,入土2-8所示。這個計算過程是:首先通過sigmoid層生成一個過濾向量;然後通過一個tanh函數計算當前時刻的Ct狀態向量(即將向量每個值的範圍變換到[-1,1]之間);接著通過sigmoid層的輸出向量過濾tanh函數結果,即為當前時刻神經元的輸出。

圖 28 focus-o

2.4 LSTM 延伸網路

  上述介紹的LSTM結構是一個正常的網路結構,然而並不是所有的LSTM網路都是這種結構,實際上,LSTM有很多種變體,即為很多種變化形態。如下介紹幾種常用形態結構:

2.4.1 Peephole connections

  一種流行的LSTM變體是由Gers&Schmidhuber(2000)提出的網路結構,如圖 29所示。通過將上一時刻的狀態Ct-1合併到各個門上,從而更詳細控制各個門的管理。

圖 29 var-peepholes

2.4.2 Coupled forget and input gates

  另一種變體是使用耦合的遺忘門和輸入門,如圖 210所示。

圖 210 var-tired

2.4.3 Gated Recurrent Unit

  另一種變體是Gated Recurrrent Unit,如圖 211所示。

圖 211 var-GRU

3. 參考文獻

[1]. Understanding LSTM Networks.

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 添加了 1 2 3 ( 1, 2, 3 ) 最前面插入了4 ( 4, 1, 2, 3 ) 刪除了1 ( 4, 2, 3 ) 刪除了0 (一個不存在的元素) ( 4, 2, 3 ) ...
  • 在iOS中常用的框架是Quartz 2D,它是Core Graphics框架的一部分,是一個強大的二維圖像繪製引擎。我們日常開發所用到的UIKit的組件都是由Core Graphics框架進行繪製的。當我們導入UIKit框架時,會自動導入Core Graphics框架。 在iOS中繪圖一般分為以下幾 ...
  • 前言 上個知識點介紹了OKHttp的基本使用,在Activity中寫了大量訪問網路的代碼,這種代碼寫起來很無聊,並且對技術沒什麼提升。在真實的企業開發中,肯定是把這些代碼封裝起來,做一個庫,給Activity調用。 封裝之前我們需要考慮以下這些問題: 封裝基本的公共方法給外部調用。get請求,Pos ...
  • 有的網頁中會使用"<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">"這個標簽來設置網頁的寬度,不 ...
  • + (CGSize)boundingALLRectWithSize:(NSString *)txt Font:(UIFont *)font Size:(CGSize)size { NSMutableAttributedString *attributedString = [[NSMutableAtt... ...
  • cordova-plugin-IFlyspeech 科大訊飛的語音聽說讀寫的cordova插件 Supported Platforms iOS android Installation 插件安裝命令:cordova plugin add https://github.com/Edc-zhang/co ...
  • 引言:交互的概念是很難用語言描述的,怎樣才能讓一個抽象的想法得到充分溝通和測試呢?一個原型工具就能回答這個問題。 原型是一個想法成為App或者網頁的旅途上的伴侶。一個建築師不會從一開始就去挖地下室,他會在繪製完草圖後,一步一步地設計電腦上的和真實的模型,並且反覆地測試和修訂。同樣平面設計師也會在UI ...
  • 最近在做一個Toolbar,setNavigationIcon()這個方法一直無效,說什麼的都有,什麼getSupportActionBar().setNavigationIcon()的,說設置style的,說放到setSupportActionBar()之後的。 其實沒有說全,還應該放到Drawe ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...