RNN(recurrent neural Network)循環神經網絡
主要用于自然語言處理(nature language processing,NLP)
RNN主要用途是處理和預測序列數據
RNN廣泛的用于 語音識別、語言模型、機器翻譯
RNN的來源就是為了刻畫一個序列當前的輸出與之前的信息影響后面節點的輸出
RNN 是包含循環的網絡,允許信息的持久化。
RNN會記憶之前的信息,并利用之前的信息影響后面節點的輸出。
RNN的隱藏層之間的節點是有相連的,隱藏層的輸入不僅僅包括輸入層的輸出,還包括上一時刻隱藏層的輸出。
RNN會對于每一個時刻的輸入結合當前模型的狀態給出一個輸出。
RNN理論上被看作同一個神經網絡結構被無限復制的結果,目前RNN無法做到真正的無限循環,一般以循環體展開。
RNN圖:

RNN最擅長的問題是與時間序列相關的。
RNN對于一個序列數據,可以將序列上不同時刻的數據依次輸入循環神經網絡的輸入層,而輸出可以是對序列中下一個時刻的預測,也可以是對當前時刻信息的處理結果。
RNN 的關鍵點之一就是他們可以用來連接先前的信息到當前的任務上
展開后的RNN:

循環體網絡中的參數在不同的時刻也是共享的。
RNN的狀態是通過一個向量來表示,這個向量的維度也稱為RNN隱藏層的大小。
假如該向量為h,輸入為x,激活函數為tanh,則有如圖:

前向傳播的計算過程:

理論上RNN可以支持任意長度的序列,但是如果序列太長會導致優化時實現梯度消失的問題,一般會設置最大長度,超長會對其截斷。
代碼實現簡單的RNN:
import numpy as np # 定義RNN的參數。 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)): 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) LSTM(long short-term memory)長短時記憶網絡:
LSTM解決了RNN不支持長期依賴的問題,使其大幅度提升記憶時長。
|
新聞熱點
疑難解答