个人对于RNN的一些总结,如有错误欢迎指出。
RNN的输入和输出
RNN的经典图如下所示 各个参数的含义 Xt: t时刻的输入,形状为[batch_size, input_dim]。对于整个RNN来说,总的X输入为[seq_len, batch_size, input_dim],具体如何理解batch_size和seq_len在下面有说明。 St: t时刻隐藏层的状态,也有时用ht表示,形状为[batch_size, hidden_size],St=f(U·Xt+W·St-1),通过W和U矩阵的映射,将embedding后的Xt和上一状态St-1转为St Ot: t时刻的输出,Ot=g(V·St),形状为[batch_size, hidden_size],总的为输出O为[seq_len, batch_size, hidden_size]
Pytorch中的使用
Pytorch中RNN函数如下
RNN的主要参数如下
nn.RNN(input_size, hidden_size, num_layers=1, bias=True)
参数解释 input_size: 输入特征的维度,一般rnn中输入的是词向量,那么就为embedding-dim hidden_size: 隐藏层神经元的个数,或者也叫输出的维度 num_layers: 隐藏层的个数,默认为1
output=输出O, 隐藏状态St,其中输出O=[time_step, batch_size, hidden_size],St为t时刻的隐藏层状态
理解RNN中的batch_size和seq_len
深度学习中采用mini-batch的方法进行迭代优化,在CNN中batch的思想较容易理解,一次输入batch个图片,进行迭代。但是RNN中引入了seq_len(time_step), 理解较为困难,下面是我自己的一些理解。
首先假如我有五句话,作为训练的语料。
sentences = ["i like dog", "i love coffee", "i hate milk", "i like music", "i hate you"]
那么在输入RNN之前要先进行embedding,比如one-hot encoding,容易得到这里的embedding-dim为9.
那么输入的sentences可以表示为如下方式
| t=0 | t=1 | t=2 |
---|
batch1 | i | like | dog | batch2 | i | love | coffee | batch3 | i | hate | milk | batch4 | i | like | music | batch5 | i | hate | you |
那么在RNN的训练中。 t=0时, 输入第一个batch[i, i, i, i, i]这里用字符表示,其实应该是对应的one-hot编码。 t=1时,输入第二个batch[like, love, hate, like, hate] t=2时,输入第三个batch[dog, coffee, milk, music, you] 那么对应的时间t来说,RNN需要对先后输入的batch_size个字符进行前向计算迭代,得到输出。
|