循环神经网络(基础篇)
RNN适合用来解决序列问题
RNN Cell和RNN
1 | cell = torch.nn.RNN(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers) # num_layers指RNN的隐层数目 |
具体输入输出的说明:
num_layers=3时的情况:
RNN的输入输出向量表示
采用one-hot向量来表示文本
对于每个RNN Cell的损失,可以用交叉熵来计算:
代码表示
采用RNN Cell
1 | class Model(torch.nn.Module): |
训练过程
1 | criterion = torch.nn.CrossEntropyLoss() |
直接采用RNN
相比于使用RNN Cell要简化了不少,主要是不需要手动循环处理每个输入了,而是直接给出开头的$h$和全部的输入,一次调用即可。
1 | class Model(torch.nn.Module): |
训练过程
1 | criterion = torch.nn.CrossEntropyLoss() |
Embedding
One-hot的一些问题:
- 维度过高
- 矩阵稀疏
- 硬编码
解决方案:Embedding
加入Embedding后的网络:
其中Linear Layer是用来保证输出和label的维度一致的。
添加了Embedding层和线性层的模型代码如下:
1 | class Model(torch.nn.Module): |
LSTM和GRU
GRU运算效率要高一些
课程来源:《PyTorch深度学习实践》完结合集