機器學習之循環神經網絡(RNN)入門

一、循環神經網絡

1. 主要用途:處理和預測序列數據。

2. 區別:全連接神經網絡和卷積神經網絡,都是從輸入層到隱含層再到輸出層,層與層之間是全連接或者部分連接,但是每層之間的節點是無連接的。而循環神經網絡的隱藏層之間的結點是有連接的,隱藏層的輸入不僅包括輸入層的輸出,還包括上一時刻隱藏層的輸出。循環神經網絡會記憶之前信息,並利用之前的信息影響後面結點的輸出。

3. 結構:

 

4. 前向傳播:

 

 

假設輸入向量的維度爲x,然後在t時刻循環體的全連接層神經網絡的輸入大小位h+x。也就是將上一時刻的狀態與當前時刻的輸入拼接成一個大的向量作爲循環體中神經網絡的輸入。輸出層的節點個數爲h,循環體中參數的個數(h+x×h+h個。

前向傳播計算示意圖:

 

5. 損失函數:因爲它每一個時刻都有一個輸出,所以循環神經網絡的總損失爲所有時刻上的損失函數的總和。

6. Tensorflow用法:

 

# coding:utf-8
import numpy as np

#輸入序列
X=[1,2]
#上一層狀態
state=[0.0,0.0]

#定義不同輸入部分的權重以方便操作
w_cell_state=np.asarray([[0.1,0.2],[0.3,0.4]])
w_cell_input=np.asarray([0.5,0.6])
b_cell=np.asarray([0.1,-0.1])

#定義用於輸出的全連接層參數。
w_output=np.asarray([[1.0],[2.0]])
b_output=0.1

#按照時間順序執行循環神經網絡的前向傳播過程
for i in range(len(X)):
    #計算循環體中的全連接層神經網絡
    #這裏是分開乘的然後相加,也可以先把w_cell_state和state合併起來
    # 和w_cell_state和w_cell_input相乘

    before_activation=np.dot(state,w_cell_state)+X[i]*w_cell_input+b_cell
    state=np.tanh(before_activation)

    #根據當前時刻狀態計算最終輸出。
    #每一個循環網絡神經元都有一個輸出
    final_output=np.dot(state,w_output)+b_output

    #輸出每個時刻的信息
    print "before activation:",before_activation
    print "state:",state
    print "output:",final_output

 

二. 長短時記憶網絡(LTSM)結構:

1. 目的:解決了循環神經網絡的的長期依賴問題。

2. 結構:

 

 

LSTM利用一些門結構,讓信息有選擇性地影響循環神經網絡中每個時刻的狀態。所謂門的結構就是一個使用sigmod神經網絡和一個按位做乘法的操作,這個兩個操作合在一起就是一個門結構。於是這個結構的功能就類似一扇門,當門打開時(sigmod神經網絡層輸出爲1時),全部信息都可以通過,當門關上的時候(sigmod神經網絡層輸出爲0時),任何信息都無法通過。

遺忘門作用:讓循環神經網絡忘記之前沒有用的信息。

輸入門作用:爲神經網絡補充最新的記憶

輸出門作用:輸出當前時刻的狀態。

 3.Tensorflow用法

# coding: utf-8
import tensorflow as tf
from tensorflow.models.rnn import rnn_cell
#長度都是隨便定義
lstm_hidden_size=10
batch_size=10
num_steps=10
#定義一個LSTM結構。在Tensorflow中通過一句簡單的命令就可以實現一個完整LSTM結構
#LSTM中使用的變量也會在該函數中自動被聲明
lstm=rnn_cell.BasicLSTMCell(lstm_hidden_size)

#將LSTM中的狀態初始化爲全0數組,和其他神經網絡類似,在優化循環神經網絡時,
#每次也會使用一個batch的訓練樣本,以下代碼中 batch_size給出了一個batch的大小
#BasicLSTMCell類提供了zero_state函數來生成全0的初始狀態
state=lstm.zero_state(batch_size, tf.float32)

#定義損失函數
loss=0.0
X=[]#輸入值
#雖然理論上循環神經網絡可以隨意處理任意長度的序列,但是在訓練時爲了
#避免梯度消散的問題,會規定一個最大的序列長度。
for i in range(num_steps):
    #在第一個時刻聲明LSTM結構中使用的變量,都需要複用之前定義好的變量
    if i>0:tf.get_variable_scope().reuse_variables()

    #每一步處理時間序列中的一個時刻,將當前輸入(X[i])和前一個時刻
    #狀態(state)傳入定義的LSTM結構可以得到當前LSTM結構的輸出和最後狀態
    lstm_output,state=lstm(X[i],state)
    #進入全連接層(以下全爲僞代碼)
    #final_output=fully_connected(lstm_output)
    #計算損失函數
    #loss+=calc_loss(final_output,expected_output)


三. 循環神經網絡的變種:

1.雙向循環神經網絡:

a) 目的: 用來解決那些和輸出和之前的狀態有關係,也和輸出之後狀態有關係的問題,例如:預測一個語句中的缺失單詞。

b) 結構: 雙向循環神經網絡的主體結構就是兩個單向循環神經網絡的結合。

 

 

2.深層循環神經網絡

a) 目的:增強模型的表達能力。

b) 結構:在每一個時刻將循環體結構複製多次,和卷積神經網絡類似,每一層的循環體中參數是一致的,而不同層中的參數可以不同。

 

 3.Tensorflow用法

#coding :utf-8
import tensorflow as tf
from tensorflow.models.rnn import rnn_cell
lstm_size=10
number_of_layers=10
batch_size=10

#定義一個基本的LSTM結構作爲循環體的基礎結構,深層循環神經網絡也支持是使用
#其他的循環體結
lstm=rnn_cell.BasicLSTMCell(lstm_size)
#通過MultiRNNCell類實現深層循環神經網絡中每一個時刻的前向傳播過程。
#其中number_of_layers表示有多少層,也就是,每一個結構要循環多少次
stacked_lstm=rnn_cell.MultiRNNCell([lstm]*number_of_layers)
#和經典的循環神經網絡一樣
state=stacked_lstm.zero_state(batch_size,tf.float32)
#計算每一個時刻的前向傳播過程
for i in range(len(num_steps)):
    if i>0:tf.get_variable_scope().reuse_variables()
    #current_input 當前層輸入
    stacked_lstm_output,state=stacked_lstm(current_input,state)
    # 進入全連接層(以下全爲僞代碼)
    # final_output=fully_connected(lstm_output)
    # 計算損失函數
    # loss+=calc_loss(final_output,expected_output)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章