编码器—解码器(seq2seq)+ Attention

本文介绍了编码器-解码器(seq2seq)结构在处理不定长序列任务如机器翻译中的应用。讨论了编码器如何将输入序列转换为固定长度的上下文变量,解码器如何基于此生成输出序列。特别地,文章详细阐述了注意力机制(Attention),以及在解码过程中如何利用不同时间步的注意力权重来改进输出。此外,还探讨了模型训练方法及束搜索(Beam Search)在序列预测中的作用,分析了不同搜索策略的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入和输出都可以是不定长序列,例如机器翻译、图像描述

这里写图片描述

在训练数据集中,我们可以在每个句子后附上特殊符号“”(end of sequence)表示序列的终止。

编码器

编码器的作用是把一个不定长的输入序列变换成一个定长的背景变量 c,并在该背景变量中编码输入序列信息。常用的编码器是循环神经网络。

循环神经网络隐藏层的变换:

ht=f(xt,ht1). h t = f ( x t , h t − 1 ) .

通过自定义函数 q 将各个时间步的隐藏状态变换为背景变量:

c=q(h1,,hT). c = q ( h 1 , … , h T ) .

例如,当选择 q(h1,,hT)=hT q ( h 1 , … , h T ) = h T 时,背景变量是输入序列最终时间步的隐藏状态 hT h T

编码器也可以时双向RNN,需要注意的是,编码器和解码器通常需要使用多层循环神经网络。(可以是多种多样的,网络结构以及自定义函数q)

class Encoder(nn.Block):
    def __init__(self, num_inputs, embed_size, num_hiddens, num_layers,
                 drop_prob, **kwargs):
        super(Encoder, self).__init__(**kwargs)
        self.embedding = nn.Embedding(num_inputs, embed_size)
        self.dropout = nn.Dropout(drop_prob)
        self.rnn = rnn.GRU(num_hiddens, num_layers, dropout=drop_prob,
                           input_size=embed_size)

    def forward(self, inputs, state):
        embedding = self.embedding(inputs).swapaxes(0, 1)
        embedding = self.dropout(embedding)
        output, state = self.rnn(embedding, state)
        return output, state

    def begin_state(self, *args, **kwargs):
        return self.rnn.begin_state(*args, **kwargs)

解码器

解码器的最初时间步输入来自“”符号。对于一个输出中的序列,当解码器在某一时间步搜索出“”符号时,即完成该输出序列。

编码器输出的背景变量 c c 编码了整个输入序列 x 1 , , x T 的信息。给定训练样本中的输出序列 y1,y2,,yT' y 1 , y 2 , … , y T ′ ,对每个时间步 t' t ′ ,解码器输出 yt' y t ′ 的条件概率将基于之前的输出序列 y1,,yt'1 y 1 , … , y t ′ − 1 和背景变量 c c ,即

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值