© 2023 yanghn. All rights reserved. Powered by Obsidian
9.4. 双向循环神经网络
要点
- 双向 RNN 主要的想法是认为后面的词也会影响前面的词的理解,适合做句子的特征提取,例如翻译,而不能用在文本生成或者预测未来
在前面单向循环神经网络中,都是用前面的词来预测下一个词,但有的任务中(例如完形填空),后面的词对也同样重要:
- 我 ___。
- 我 ___ 饿了。
- 我 ___ 饿了,我可以吃半头猪。
根据可获得的信息量,我们可以用不同的词填空,如“很高兴”(“happy”)、“不”(“not”)和“非常”(“very”)。所以,后面的词同样会影响前面的词理解
1. 双向模型
双向循环神经网络(bidirectional RNNs) 添加了反向传递信息的隐藏层,以便更灵活地处理此类信息。
双向循环神经网络架构
一个时间步下双向循环网络计算示意图,两边的状态横着 concat 起来进行训练(相当于把神经元堆叠)
对于任意时间步
其中, 权重
接下来, 将前向隐状态
这里, 权重矩阵
2. 双向 RNN 的简洁实现与错误运用
如果要手动实现双向 RNN,直接在每个批计算的时候将序列逆序,再把对应的前向隐状态
这里用框架实现:
import torch
from torch import nn
from d2l import torch as d2l
# 加载数据
batch_size, num_steps, device = 32, 35, d2l.try_gpu()
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
# 通过设置“bidirective=True”来定义双向LSTM模型
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2
num_inputs = vocab_size
lstm_layer = nn.LSTM(num_inputs, num_hiddens, num_layers, bidirectional=True)
model = d2l.RNNModel(lstm_layer, len(vocab))
model = model.to(device)
# 训练模型
num_epochs, lr = 500, 1
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
perplexity 1.1, 131129.2 tokens/sec on cuda:0
time travellerererererererererererererererererererererererererer
travellerererererererererererererererererererererererererer
预测的时候是没有未来的信息的,虽然 loss 很低,但几乎没有推理能力