目录
0. 前言
- 课程全部代码(pytorch版)已上传到附件
- 本章节为原书第9章(现代循环网络),共分为8节,本篇是第7节:序列到序列的学习
- 本节的代码位置为:chapter_recurrent-modern/seq2seq.ipynb
- 本节的视频链接:62 序列到序列学习(seq2seq)【动手学深度学习v2】
正如我们在 :numref:sec_machine_translation
中看到的, 机器翻译中的输入序列和输出序列都是长度可变的。 为了解决这类问题,我们在 :numref:sec_encoder-decoder
中 设计了一个通用的”编码器-解码器“架构。 本节,我们将使用两个循环神经网络的编码器和解码器, 并将其应用于序列到序列(sequence to sequence,seq2seq)类的学习任务 :cite:Sutskever.Vinyals.Le.2014,Cho.Van-Merrienboer.Gulcehre.ea.2014
。
遵循编码器-解码器架构的设计原则, 循环神经网络编码器使用长度可变的序列作为输入, 将其转换为固定形状的隐状态。 换言之,输入序列的信息被编码到循环神经网络编码器的隐状态中。 为了连续生成输出序列的词元, 独立的循环神经网络解码器是基于输入序列的编码信息 和输出序列已经看见的或者生成的词元来预测下一个词元。 :numref:fig_seq2seq
演示了 如何在机器翻译中使用两个循环神经网络进行序列到序列学习。
:label:fig_seq2seq
在 :numref:fig_seq2seq
中, 特定的“<eos>”表示序列结束词元。 一旦输出序列生成此词元,模型就会停止预测。 在循环神经网络解码器的初始化时间步,有两个特定的设计决定: 首先,特定的“<bos>”表示序列开始词元,它是解码器的输入序列的第一个词元。 其次,使用循环神经网络编码器最终的隐状态来初始化解码器的隐状态。 例如,在 :cite:Sutskever.Vinyals.Le.2014
的设计中, 正是基于这种设计将输入序列的编码信息送入到解码器中来生成输出序列的。 在其他一些设计中 :cite:Cho.Van-Merrienboer.Gulcehre.ea.2014
, 如 :numref:fig_seq2seq
所示, 编码器最终的隐状态在每一个时间步都作为解码器的输入序列的一部分。 类似于 :numref:sec_language_model
中语言模型的训练, 可以允许标签成为原始的输出序列, 从源序列词元“<bos>”“Ils”“regardent”“.” 到新序列词元 “Ils”“regardent”“.”“<eos>”来移动预测的位置。
- 从计算损失的角度理解,输入英语(编码器输入)+法语(解码器输入),得出的法语预测;
- 当整个法语句子的预测完成后,会将预测的法语句子和真实的法语输入句子进行比较来做损失(如交叉熵)。
- 在序列到序列学习中,解码器的输入(本篇用到的)可以是真值(教师强制模式-收敛快),也可以是上个时间步输出的预测值(学得慢-性能好)
下面,我们动手构建 :numref:fig_seq2seq
的设计, 并将基于 :numref:sec_machine_translation
中 介绍的“英-法”数据集来训练这个机器翻译模型。
In [1]:
import collections
import math
import torch
from torch import nn
from d2l import torch as d2l
1. 编码器 (encoder)
从技术上讲,编码器将长度可变的输入序列转换成 形状固定的上下文变量
标签:解码器,torch,mask,batch,掩码,num,序列,size From: https://blog.csdn.net/weixin_57972634/article/details/144082045