如何理解循环神经网络
一、RNN
1.1 RNN公式
h t = tanh ( W i h x t + b i h + W h h h ( t − 1 ) + b h h ) h_t = \tanh(W_{ih} x_t + b_{ih} + W_{hh} h_{(t-1)} + b_{hh}) ht=tanh(Wihxt+bih+Whhh(t−1)+bhh)
1.2 最基本的RNN(level 1)
初始化参数
(input_size, hidden_size, num_layers) = (输入数据的维度,输出的维度,RNN层数)
rnn = nn.RNN(input_size=7,hidden_size=11,num_layers=1)
#w1 = (11x7) b1(11)
#w2 = (11x11) b2(11)
内部运算
假设:input = [a(3x7), b(3x7), c(3x7), d(3x7), e(3x7)] seq_len x batch x dim(5,3,7)
batch,seq_len,input_size = 3,5,7
#(5,3,7)|(s,b,d)
input = torch.randn(seq_len,batch,input_size)
h 1 = tanh ( W 1 a + b 1 + W 2 h ( 0 ) + b 2 ) h_1 = \tanh(W_{1} a + b_{1} + W_{2} h_{(0)} + b_{2}) h1=tanh(W1a+b1+W2h(0)+b2)
h 2 = tanh ( W 1 b + b 1 + W 2 h ( 1 ) + b 2 ) h_2 = \tanh(W_{1} b + b_{1} + W_{2} h_{(1)} + b_{2}) h2=tanh(W1b+b1+W2h(1)+b2)
输出结果
output,hn = rnn(input)
#output (5,3,11)
#hn (1,3,11)
1.3 什么是num_layer (level 2)
初始化参数
(input_size, hidden_size, num_layers) = (输入数据的维度,输出的维度,RNN层数)
rnn = nn.RNN(input_size=7,hidden_size=11,num_layers=2)
#第一层
#w1_1 (11x7) b1_1(11)用于和input计算
#w1_2 (11x11) b1_2(11)用于和ht-1计算
#第二层
#w2_1 (11x7) b2_1(11)用于和第一层相同位置output计算
#w2_2 (11x11) b2_2(11)用于和第二层前一位置的output计算
输出结果
output,hn = rnn(input)
#output (5,3,11)
#hn (num_layer,3,11)
1.4 什么是双向 (level 3)
(input_size, hidden_size, num_layers) = (输入数据的维度,输出的维度,RNN层数)
rnn = nn.RNN(input_size=7,hidden_size=11,num_layers=2)
#第一层
#w1_1 (11x7)
#w1_2 (11x22) 变成2x11,分别用于前向计算和后向计算
输出结果
output,hn = rnn(input)
#output (5,3,11xbid)
#hn (num_layer*bid,3,11)