欢迎光临散文网 会员登陆 & 注册

Seq2Seq从理论到实战【理论篇】

2023-05-25 11:45 作者:深度之眼官方账号  | 我要投稿

来源:投稿 作者:175
编辑:学姐

引言

本着“凡我不能创造的,我就不能理解”的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。

要深入理解深度学习,从零开始创建的经验非常重要,从自己可以理解的角度出发,尽量不使用外部完备的框架前提下,实现我们想要的模型。本系列文章的宗旨就是通过这样的过程,让大家切实掌握深度学习底层实现,而不是仅做一个调包侠。

本文介绍seq2seq模型,由论文Sequence to Sequence Learning with Neural Networks提出,能解决输入和输出序列长度不等的任务——机器翻译、自动摘要、自动问答等。

Seq2Seq

Seq2Seq网络即sequence to sequence,序列到序列网络,输入一个序列,输出另一个序列。这个架构重要之处在于,输入序列和输出序列的长度是可变的。

Seq2Seq使用的具体方法基本都属于编码器-解码器模型。

其核心思想是通过编码器(Encoder)将输入序列编码成一个定长的向量表示,也称为具有上下文信息的表示,简称为上下文(context)。然后将上下文向量喂给解码器(Decoder),来生成任务相关的输出序列。

总结一下,编码器-解码器架构包含三个组件:

  • 编码器接收一个输入序列,x_1%5En,然后生成对应的上下文表示,h_1%5En。常用于编码器的网络可以为RNN、CNN或Transformer等。

  • 上下文向量c,由一个函数基于h_1%5En生成,传递输入的核心信息到解码器。

  • 解码器接收c作为输入,然后生成一个任意长度的隐藏状态序列h_1%5Em,从中可以得到对应的输出y_1%5Em。和编码器一样,也有多种实现方案。

基于RNN实现编码器-解码器

[翻译]Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation使用RNN作为编码器和解码器实现机器翻译。

我们本小节来看如何通过RNN来实现编码器-解码器网络。

实际上会有两个不同的RNN网络,一个作为编码器,将变长的输入序列转换为定长的编码(上下文向量);另一个作为解码器,通过该上下文向量连续生成输出序列,基于输入序列的编码信息和输出序列已经生成的单词来预测一下单词。上图演示了如何在机器翻译中使用两个RNN进行序列号序列学习。

这里有两个特殊单词<eos><bos>,分别表示序列结束和开始标志。

还有一种方式,如上图,我们只需要在输入末尾添加<EOS>,比如这里有输入序列A B C <EOS>。我们将输入序列传入模型后,将其映射为序列W X Y Z <EOS>作为输出。

回顾RNN语言模型计算序列y的概率p(y):

编码器的目标是生成一个输入的上下文表示,体现在编码器最后的那个隐藏状态,h%5Ee_n,也用c来表示,代表上下文。

在时刻t,将前面的t-1个单词输入到语言模型,通过前向推理生成隐藏状态序列,并且以最后一个单词的隐藏状态作为起点来生成下一个单词。


但是,这种方法有一个弱点是,随着输出序列的生成,上下文向量c的影响将逐渐减弱。一种常用的解决方法是让解码过程的每个时刻都能看到上下文向量c:

参考

Dive Into Deep Learning

Speech and Language Processing

关注“学姐带你玩AI”公众号

回复“深度学习”免费领取必读电子书+课件

学起来学起来!

Seq2Seq从理论到实战【理论篇】的评论 (共 条)

分享到微博请遵守国家法律