本課程來自深度之眼deepshare.net,部分截圖來自課程視頻。
循環神經網絡(RNN)是什麼?
RNN:循環神經網絡
·處理不定長輸入的模型
·常用於NLP及時間序列任務(輸入數據具有前後關係)
RNN網絡結構
圖片來源
xt:時刻t的輸入,shape=(1,57)
st:時刻t的狀態值,shape=(1,128)
ot:時刻t的輸出值,shape=(1,18)這裏的18對應的下面姓名分類任務中的18個國家。
U:linear層的權重參數,shape=(128,57),這裏128是神經元的個數,57是輸入數據x的長度
W:linear層的權重參數,shape=(128,128)
V:linear層的權重參數,shape=(57,128)
數據流動過程如下:
x經過U,上個狀態的s經過W,前面兩項加起來再經過V,得到o,具體公式如下:
hidden state:隱藏層狀態信息,記錄過往時刻的信息
訓練RNN實現人名分類
問題定義:輸入任意長度姓名(字符串),輸出姓名來自哪一個國家(18分類任務)
數據:https://download.pytorch.org/tutorial/data.zip
Jackie Chan——成龍
Jay Chou——周杰倫
Tingsong Yue——餘霆嵩
思考:計算機如何實現不定長字符串到分類向量的映射?
Chou(字符串)→RNN→Chinese(分類類別)
流程:
1單個字符→數字
2.數字→model
3.下一個字符→數字→model
4.最後一個字符>數字→model→分類向量
for string in [C,h,o,u]:
1. one-hot: string [0,0.….1.….0]
2.y,h=model([0,0.…,1.,0],h)
這裏,chou對應的RNN結構如下,目前的應用中,前面三個輸入是不需要的,只需要最後一個輸出y
all_letters=string.ascii_letters+".,;""all_letters:'abcdefghijklmnopqrstuvwxyZABCDEFGHIJKLNINOPORSTUVwXYZ.,;\'
n_letters=len(all letters)#52+5字符總數n letters:57,爲什麼模型中輸入向量的大小是57?因爲有57種字符,然後轉爲onehot向量就是57維的了。
下面的代碼是RNN的init函數中的結構定義:
self.hidden_size=hidden_size
self.u=nn.Linear(input_size, hidden_size)
self.w=nn.Linear(hidden_size, hidden_size)
self.v=nn.Linear(hidden_size, output_size)
self.tanh=nn. Tanh()
self.softmax=nn.LogSoftmax(dim=1)
PyTorch中對不定長數據的處理是通過下面的循環實現的,就是結合前一個狀態的隱藏層解決的
for i in range(line_tensor.size()[0]):
output, hidden=rnn(line_tensor[i], hidden)