来源:投稿 作者:175
编辑:学姐
往期内容:
从零实现深度学习框架:Seq2Seq从理论到实战【理论篇】(本篇)
从零实现深度学习框架:Seq2Seq从理论到实战【实战篇】
引言
本着“凡我不能创造的,我就不能理解”的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。
要深入理解深度学习,从零开始创建的经验非常重要,从自己可以理解的角度出发,尽量不使用外部完备的框架前提下,实现我们想要的模型。本系列文章的宗旨就是通过这样的过程,让大家切实掌握深度学习底层实现,而不是仅做一个调包侠。
本文介绍seq2seq模型,由论文Sequence to Sequence Learning with Neural Networks提出,能解决输入和输出序列长度不等的任务——机器翻译、自动摘要、自动问答等。
博主针对该经典论文提供了中文翻译:[论文翻译]Sequence to Sequence Learning with Neural Networks
Seq2Seq
Seq2Seq网络即sequence to sequence,序列到序列网络,输入一个序列,输出另一个序列。这个架构重要之处在于,输入序列和输出序列的长度是可变的。
Seq2Seq使用的具体方法基本都属于编码器-解码器模型。
其核心思想是通过编码器(Encoder)将输入序列编码成一个定长的向量表示,也称为具有上下文信息的表示,简称为上下文(context)。然后将上下文向量喂给解码器(Decoder),来生成任务相关的输出序列。
总结一下,编码器-解码器架构包含三个组件:
-
编码器接收一个输入序列,,然后生成对应的上下文表示,。常用于编码器的网络可以为RNN、CNN或Transformer等。
-
上下文向量c,由一个函数基于生成,传递输入的核心信息到解码器。
-
解码器接收c作为输入,然后生成一个任意长度的隐藏状态序列,从中可以得到对应的输出。和编码器一样,也有多种实现方案。
基于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的概率:
即我们先生成输出序列第一个单词,然后根据生成,然后根据,生成,依此类推,这是典型的自回归(Autoregressive model)模型。
编码器的目标是生成一个输入的上下文表示,体现在编码器最后的那个隐藏状态,也用来表示,代表上下文。
在时刻,将前面的个单词输入到语言模型,通过前向推理生成隐藏状态序列,并且以最后一个单词的隐藏状态作为起点来生成下一个单词。
但是,这种方法有一个弱点是,随着输出序列的生成,上下文向量的影响将逐渐减弱。一种常用的解决方法是让解码过程的每个时刻都能看到上下文向量:
现在,我们解码器的完整公式,每个解码时间步都可看到上下文。以某种程度上代表RNN,是由上一时刻从softmax生成的输出:
这里通常为线性层,目的是将的维度扩大到词表大小,以后面通过softmax计算概率分布。
最后,每个时间步的输出包含词表中每个单词作为预测单词的概率。我们计算每个时间步最可能的输出,通过:
参考
Dive Into Deep Learning
Speech and Language Processing
关注下方卡片《学姐带你玩AI》🚀🚀🚀
回复“500”
220+篇AI必读论文PDF资料包免费领
码字不易,欢迎大家点赞评论收藏!