1. 程式人生 > >深度學習之五:序列模型與詞向量

深度學習之五:序列模型與詞向量

1 迴圈序列模型

1.1 序列模型的適用範圍

序列模型是一種用於處理序列資料的模型,它可以用於語音識別,音樂生成,情感分類,機器翻譯,命名實體識別等。模型的輸出也可能是一個序列。

1.2 相關的符號約定

x<k> 表示輸入序列中的第k個元素
y<k> 表示輸出序列中的第k個元素
x(i)<k> 表示第i個輸入序列中的第k個元素
y(i)<k> 表示第i個輸出序列中的第k個元素
Tx 表示輸入序列的長度
Tx(i) 表示第i個輸入序列的長度

Ty 表示輸出序列的長度
Ty(i) 表示第i個輸出序列的長度

1.3 RNN模型

1.3.1 詞的one-hot表示

構造一個詞彙表(也稱為詞典),若詞彙個數為n,詞(word)在詞典中的位置i記作wi,則詞可表示為一個長度為n的一維向量,向量中第wi位置的元素為1,其他位置為0。

1.3.2 模型示意

在處理序列資料時,由於輸入和輸出長度的不同,且序列模型的維度過高,引數過多,無法使用傳統的全聯接神經網路來處理,因此必須要使用新的序列化的模型。見下圖:
RNN單元示意圖

在圖中,RNN單元在時刻t0接收輸入x0併產生輸出y0。在下一個時刻t1,RNN單元同時接收輸入

x1和上一個時刻的輸出h0,從而產生本時刻的輸出。這使得RNN可以考慮歷史輸入的影響。

1.3.3 前向傳播

從上圖的RNN單元的結構中,可以推導前向傳播的計算公式
ht=g(Whht1+Wixt+bh)
可以將Wh,Wi橫向堆疊,將ht1,xt縱向堆疊,則公式改寫為:
ht=g([Wh|Wi][ht1xt]+bh)
yt=f(Woht+bo)

1.3.4 RNN前向傳播實現

# 實現單個RNN單元內部的計算
def rnn_cell_forward(xt, a_prev, parameters): Wax = parameters["Wax"] #alias Wt Waa = parameters["Waa"] #alias Wh Wya = parameters["Wya"] #alias Wo ba = parameters["ba"] #alias bh by = parameters["by"] #alias bo # compute next activation state a_next = np.tanh(np.dot(Wax, xt) + np.dot(Waa, a_prev) + ba) yt_pred = softmax(np.dot(Wya, a_next) + by) cache = (a_next, a_prev, xt, parameters) return a_next, yt_pred, cache # 實現沿時間序列向前計算 def rnn_forward(x, a0, parameters): caches = [] n_x, m, T_x = x.shape n_y, n_a = parameters["Wya"].shape # initialize "a" and "y" with zeros a = np.zeros((n_a, m, T_x)) y_pred = np.zeros((n_y, m, T_x)) a_next = a0 # loop over all time-steps for t in range(T_x): # Update next hidden state, compute the prediction, get the cache a_next, yt_pred, cache = rnn_cell_forward(x[:,:,t], a_next, parameters) a[:,:,t] = a_next y_pred[:,:,t] = yt_pred caches.append(cache) caches = (caches, x) return a, y_pred, caches

1.3.4 損失函式

單個樣本的損失函式定義為: