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