设计多个隐藏层,目的是为了获取更多的非线性性。深度循环神经网络需要大量的调参(如学习率和修剪) 来确保合适的收敛,模型的初始化也需要谨慎。
配置超参数
import torch
from torch import nn
from d2l import torch as d2l
batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2
num_inputs = vocab_size
device = d2l.try_gpu()
lstm_layer = nn.LSTM(num_inputs, num_hiddens, num_layers)
model = d2l.RNNModel(lstm_layer, len(vocab))
model = model.to(device)
训练&预测
num_epochs, lr = 500, 2
d2l.train_ch8(model, train_iter, vocab, lr*1.0, num_epochs, device)
适合抽取特征,填空,如:填充缺失的单词、词元注释。
并不适合预测未来,它需要上下文,下文(未来)未知逻辑上讲不通的一个结构。
原理图
前向隐状态
H t → = Φ ( X t W x h ( f ) + H t − 1 → w h h ( f ) + b h ( f ) ) H^→_t = Φ(X_tW_{xh}^{(f)}+H_{t-1}^→w_{hh}^{(f)}+b_{h}^{(f)}) Ht→=Φ(XtWxh(f)+Ht−1→whh(f)+bh(f))
反向隐状态
H t ← = Φ ( X t W x h ( b ) + H t + 1 ← w h h ( b ) + b h ( b ) ) H_t^← = Φ(X_tW_{xh}^{(b)}+H_{t+1}^←w_{hh}^{(b)}+b_h^{(b)}) Ht←=Φ(XtWxh(b)+Ht+1←whh(b)+bh(b))
隐状态
两者连接后,得到 H t H_t Ht
输出
O t = H t W h q + b q O_t= H_tW_{hq} +b_q Ot=HtWhq+bq
双向循环神经网络的错误应用
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)
不能盲目地将这一语言模型应用于任何预测任务。 尽管模型产出的困惑度是合理的, 该模型预测未来词元的能力却可能存在严重缺陷。
将序列从一种语言自动翻译成另一种语言。
神经网络机器翻译方法,强调的是端到端的学习。机器翻译的数据集是由源语言和目标语言的文本序列对组成的。
(待补充。。。)
这个架构常用于编码器-解码器架构是一种常用于序列到序列(Seq2Seq)任务的深度学习架构。序列到序列的问题举例:NLP
问题(机器翻译、问答系统和文本摘要)。
编码器(Encoder)
将输入形式编码成中间表达形式。
中间表示被称为“编码”或“特征”。
解码器(Decoder)
将中间表示解码成输出形式。
也会有额外的输入。为啥?
输入一些额外的信息来帮助解码器生成正确的输出序列。这些额外的信息可以是一些上下文信息,例如输入序列的长度、标点符号和语法结构等。