1. 程式人生 > >二十六、圖解遞迴神經網路(RNN)

二十六、圖解遞迴神經網路(RNN)


聊天機器人是需要智慧的,而如果他記不住任何資訊,就談不上智慧,遞迴神經網路是一種可以儲存記憶的神經網路,LSTM是遞迴神經網路的一種,在NLP領域應用效果不錯,本節我們來介紹RNN和LSTM

遞迴神經網路

遞迴神經網路RNN)是兩種人工神經網路的總稱。一種是時間遞迴神經網路(recurrent neural network),另一種是結構遞迴神經網路(recursive neural network)。時間遞迴神經網路的神經元間連線構成有向圖,而結構遞迴神經網路利用相似的神經網路結構遞迴構造更為複雜的深度網路。兩者訓練的演算法不同,但屬於同一演算法變體(百度百科)。本節我們重點介紹時間遞迴神經網路,下面提到RNN特指時間遞迴神經網路。

時間遞迴神經網路

傳統的神經網路叫做FNN(Feed-Forward Neural Networks),也就是前向反饋神經網路,有關傳統神經網路的介紹請見《機器學習教程 十二-神經網路模型的原理》,RNN是在此基礎上引入了定向迴圈,也就是已神經元為節點組成的圖中存在有向的環,這種神經網路可以表達某些前後關聯關係,事實上,真正的生物神經元之間也是存在這種環形資訊傳播的,RNN也是神經網路向真實生物神經網路靠近的一個進步。一個典型的RNN是這樣的:

圖中隱藏層中的節點之間構成了全連線,也就是一個隱藏層節點的輸出可以作為另一個隱藏層節點甚至它自己的輸入

這種結構可以抽象成:

其中U、V、W都是變換概率矩陣,x是輸入,o是輸出

比較容易看出RNN的關鍵是隱藏層,因為隱藏層能夠捕捉到序列的資訊,也就是一種記憶的能力

在RNN中U、V、W的引數都是共享的,也就是隻需要關注每一步都在做相同的事情,只是輸入不同,這樣來降低引數個數和計算量

RNN在NLP中的應用比較多,因為語言模型就是在已知已經出現的詞的情況下預測下一個詞的概率的,這正是一個有時序的模型,下一個詞的出現取決於前幾個詞,剛好對應著RNN中隱藏層之間的內部連線

RNN的訓練方法

RNN的訓練方法和傳統神經網路一樣,都是使用BP誤差反向傳播演算法來更新和訓練引數。

因為從輸入到最終的輸出中間經過了幾步是不確定的,因此為了計算方便,我們利用時序的方式來做前向計算,我們假設x表示輸入值,s表示輸入x經過U矩陣變換後的值,h表示隱藏層的啟用值,o表示輸出層的值, f表示隱藏層的啟用函式,g表示輸出層的啟用函式:

當t=0時,輸入為x0, 隱藏層為h0

當t=1時,輸入為x1, s1 = Ux1+Wh0, h1 = f(s1), o1 = g(Vh1)

當t=2時,s2 = Ux2+Wh1, h2 = f(s2), o2 = g(Vh2)

以此類推,st = Uxt + Wh(t-1), ht = f(st), ot = g(Vht)

這裡面h=f(現有的輸入+過去記憶總結)是對RNN的記憶能力的全然體現

通過這樣的前向推導,我們是不是可以對RNN的結構做一個展開,成如下的樣子:

這樣從時序上來看更直觀明瞭

下面就是反向修正引數的過程了,每一步輸出o和實際的o值總會有誤差,和傳統神經網路反向更新的方法一樣,用誤差來反向推導,利用鏈式求導求出每層的梯度,從而更新引數,反向推導過程中我們還是把神經網路結構看成展開後的樣子:

根據鏈式求導法則,得出隱藏層的殘差計算公式為:

因此W和U的梯度就是:

LSTM(Long Short Tem Momery networks)

特別講解一下LSTM是因為LSTM是一種特別的RNN,它是RNN能得到成功應用的關鍵,當下非常流行。RNN存在一個長序列依賴(Long-Term Dependencies)的問題:下一個詞的出現概率和非常久遠的之前的詞有關,但考慮到計算量的問題,我們會對依賴的長度做限制,LSTM很好的解決了這個問題,因為它專門為此而設計。

借用http://colah.github.io/posts/2015-08-Understanding-LSTMs/中經典的幾張圖來說明下,第一張圖是傳統RNN的另一種形式的示意圖,它只包含一個隱藏層,以tanh為激發函式,這裡面的“記憶”體現在t的滑動視窗上,也就是有多少個t就有多少記憶,如下圖

那麼我們看LSTM的設計,如下,這裡面有一些符號,其中黃色方框是神經網路層(意味著有權重係數和啟用函式,σ表示sigmoid啟用函式,tanh表示tanh啟用函式),粉紅圓圈表示矩陣運算(矩陣乘或矩陣加)

這裡需要分部分來說,下面這部分是一個歷史資訊的傳遞和記憶,其中粉紅×是就像一個能調大小的閥門(乘以一個0到1之間的係數),下面的第一個sigmoid層計算輸出0到1之間的係數,作用到粉紅×門上,這個操作表達上一階段傳遞過來的記憶保留多少,忘掉多少

其中的sigmoid公式如下:

可以看出忘掉記憶多少取決於上一隱藏層的輸出h{t-1}和本層的輸入x{t}

下面這部分是由上一層的輸出h{t-1}和本層的輸入x{t}得出的新資訊,存到記憶中:

其中包括計算輸出值Ct部分的tanh神經元和計算比例係數的sigmoid神經元(這裡面既存在sigmoid又存在tanh原因在於sigmoid取值範圍是[0,1]天然作為比例係數,而tanh取值範圍是[-1,1]可以作為一個輸出值)。其中i{t}和Ct計算公式如下:

那麼Ct輸出就是:

下面部分是隱藏層輸出h的計算部分,它考慮了當前擁有的全部資訊(上一時序隱藏層的輸出、本層的輸入x和當前整體的記憶資訊),其中本單元狀態部分C通過tanh啟用並做一個過濾(上一時序輸出值和當前輸入值通過sigmoid啟用後的係數)

計算公式如下:

LSTM非常適合在NLP領域應用,比如一句話出現的詞可以認為是不同時序的輸入x,而在某一時間t出現詞A的概率可以通過LSTM計算,因為詞A出現的概率是取決於前面出現過的詞的,但取決於前面多少個詞是不確定的,這正是LSTM所做的儲存著記憶資訊C,使得能夠得出較接近的概率。

總結

RNN就是這樣一種神經網路,它讓隱藏層自身之間存在有向環,從而更接近生物神經網路,也具有了儲存記憶的能力,而LSTM作為RNN中更有實用價值的一種,通過它特殊的結構設計實現了永久記憶留存,更適合於NLP,這也為將深度學習應用到自然語言處理開了先河,有記憶是給聊天機器人賦予智慧的前提,這也為我們的聊天機器人奠定了實踐基礎。

相關推薦

圖解神經網路(RNN)

聊天機器人是需要智慧的,而如果他記不住任何資訊,就談不上智慧,遞迴神經網路是一種可以儲存記憶的神經網路,LSTM是遞迴神經網路的一種,在NLP領域應用效果不錯,本節我們來介紹RNN和LSTM 遞迴神經網路 遞迴神經網路(RNN)是兩種人工神經網路的總稱。一種是時間遞迴神經網路(recurrent n

長短期記憶(LSTM)系列_2.1~2.3神經網路簡要介紹序列預測模型

前置課程 https://machinelearningmastery.com/sequence-prediction/ https://machinelearningmastery.com/gentle-introduction-long-short-term-memory-network

神經網路(RNN)隨記

基本概念 想法:在之後的輸入要把之前的資訊利用起來。W3就相當於對中間資訊進行一個保留。 X和U組合成一個特徵圖,A表示一個記憶單元。 V矩陣相當於對St進行一個全連線的操作。最終的輸出需要通過softmax將向量轉化成概率的形式。RNN最適合做自然語言處理

神經網路RNN網路 LSTM

前言: 根據我本人學習 TensorFlow 實現 LSTM 的經歷,發現網上雖然也有不少教程,其中很多都是根據官方給出的例子,用多層 LSTM 來實現 PTBModel 語言模型,比如: tensorflow筆記:多層LSTM程式碼分析 但是感覺這些例子還是

吳恩達Coursera深度學習(5-1)神經網路 RNN

Class 5:序列模型 Sequence Models Week 1:迴圈神經網路 RNN(Recurrent) 目錄 本課程將教你如何建立自然語言,音訊和其他序列資料的模型。 由於深入的學習,序列演算法的執行速度遠遠超過兩年前,這

神經網路RNN

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 載入資料 mnist = input_data.read_data_sets('MNIST

Tensorflow— 神經網路RNN

程式碼:import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data/', o

李理:神經網路RNN扼要

1. 內容簡介前面我們介紹了CNN,這對於Image Caption來說是基礎的特徵提取部分,或者說是對影象的“理解”部分,而接下來需要用一句話來“描述”影象的內容,這就要藉助RNN了。 我們這幾篇文章首先會介紹RNN/LSTM的基本概念和實現方法。這一部分的主

XML

aso 模式 測試 ext dom2 val body sof eof 二十六、XML 隨著互聯網的發展,Web應用程序的豐富,開發人員越來越希望能夠使用客戶端來操作XML技術。而XML技術一度成為存儲和傳輸結構化數據的標準。所以,本章就詳細探討一下JavaScript

正則介紹grep上grep中grep下

grep egrep 二十六、正則介紹grep上、grep中、grep下正則介紹grep正則:一串有規律的字符串。它使用單個字符串來描述或匹配一系列符合某個句法規則的字符串。很多文本編輯器或其他工具裏,正則表達式通常用來檢索和替換那些符合某個模式的文本內容。許多程序設計語言也都支持利用正則表達式進行字

Linux 進程與信號---system 函數 和進程狀態切換

idt erro lib IV lin sig 進入 空指針 權限 26.1 system 函數 26.1.1 函數說明 system(執行shell 命令)相關函數 fork,execve,waitpid,popen 1 #include <stdlib.h>

python中json學習

十六 bank cbc bsp python文件 Coding pickle passwd strong 1.json序列介紹:提供4個關鍵字:dumps,dump,loads,load(與pickle用法完全相同)   語法:f.write(bytes(json.dump

python學習之前端(九):JQuery資料互動

一.juqery物件: js中的物件,就是python中的字典: 1定義方法: 定義方法1: var obj1 = {name:"張三", "age":18, "address":"三里屯"} 定義方法2: var obj2 = new Object(); ob

COUNT(*)與COUNT(列)到底誰更快?

        COUNT(*)與COUNT(列)到底誰更快? *count(列)當列值為空,將不被統計。 1、資料準備 以下命令執行有問題請參照上篇文章 --做個試驗,看看到底誰更快? dr

Springboot整合kafka

(一)新增依賴 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</a

深入理解JVM學習筆記(JVM 記憶體分配----優先分配到eden&空間分配擔保)

一、優先分配到eden 我們寫一個程式來驗證物件優先分配到eden,原始碼如下: package com.zjt.test.jvm008; public class Main { public static void main(String[] args) { b

mongodb和python互動

1. mongdb和python互動的模組 pymongo 提供了mongdb和python互動的所有方法 安裝方式: pip install pymongo 2. 使用pymongo 2.1 匯入pymongo並選擇要操作的集合 資料庫和集合能夠自動建立

【深度學習】6:RNN神經網路原理與MNIST資料集實現數字識別

前言:自己學習研究完CNN卷積神經網路後,很久的一段時間因為要完成自己的畢業設計就把更新部落格給耽擱了。瞎忙了這麼久,還是要把之前留的補上來。因為“種一棵樹最好的時間是在十年前,其次就是現在!” –—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—

閒談Tomcat效能優化

Tomcat在各位JavaWeb從業者常常就是預設的開發環境,但是Tomcat的預設配置作為生產環境,尤其是記憶體和執行緒的配置,預設都很低,容易成為效能瓶頸. 幸好Tomcat還有很多的提升空間.下文介紹一下Tomcat優化,可以分為記憶體,執行緒,IO. 一:Tomcat記憶體優

PyTorch--雙向神經網路(B-RNN)概念,原始碼分析

  關於概念:   BRNN連線兩個相反的隱藏層到同一個輸出.基於生成性深度學習,輸出層能夠同時的從前向和後向接收資訊.該架構是1997年被Schuster和Paliwal提出的.引入BRNNS是為了增加網路所用的輸入資訊量.例如,多層感知機(MLPS)和延時神經網路(TDNNS)在輸入資料的靈活性方面是非