# seq2seq

* 标准的RNN**没法处理这种输入序列和输出序列长度不相等的情况**，解决这类问题的一种方法是序列到序列学习技术
* 对有些问题，输入序列的长度和输出序列不一定相等，而且我们事先并不知道输出序列的长度，典型的是语音 识别和**机器翻译**问题
* seq2seq是用循环神经网络构建的一种框架，它能实现从**一个序列到另外一个序列的映射**，两个序列的长度可以不相等

训练样本是成对的序列(A, B)，训练的目标是让序列A编码之后解码得到序列B的概率最大，即最大化如下的 条件对数似然函数

这种结构又叫Encoder-Decoder模型。

**Encoder-Decoder结构先将输入数据编码成一个上下文向量c：**

有1、2、3种方式得到上下文向量

![](/files/-LqGkRnFsnd-GVrGnLIs)

**拿到c之后，就用另一个RNN网络对其进行解码**，这部分RNN网络被称为Decoder。具体做法就是将c当做之前的初始状态h0输入到Decoder中：

![](/files/-LqGkRnHVvru5P3b8tpJ)

还有一种做法是将c当做每一步的输入：

![](/files/-LqGkRnJhdwRTxJqBWJ5)

机器翻译：

![](/files/-LqGkRnLCe9rC7ScVy6c)

以此类推，直到某个时刻预测输出特殊符号  结束。

由于这种Encoder-Decoder结构不限制输入和输出的序列长度，因此应用的范围非常广泛，比如：

**机器翻译。**&#x45;ncoder-Decoder的最经典应用，事实上这一结构就是在机器翻译领域最先提出的

**文本摘要**。输入是一段文本序列，输出是这段文本序列的摘要序列。

**阅读理解。**&#x5C06;输入的文章和问题分别编码，再对其进行解码得到问题的答案。

**语音识别。**&#x8F93;入是语音信号序列，输出是文字序列。

## Attention

```
    encoder-decoder模型虽然非常经典，但是局限性也非常大。最大的局限性就在于编码和解码之间的唯一联系就是一个固定长度的语义向量C。也就是说，编码器要将整个序列的信息压缩进一个固定长度的向量中去。但是这样做有两个弊端，一是语义向量无法完全表示整个序列的信息，二是先输入的内容携带的信息会被后输入的信息稀释掉。输入序列越长，这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息， 那么解码时准确率就要打一定折扣。
    为了解决上述问题，在 Seq2Seq出现一年之后，Attention模型被提出了。该模型在产生输出的时候，会产生一个注意力范围来表示接下来输出的时候要重点关注输入序列的哪些部分，然后根据关注的区域来产生下一个输出，如此反复。attention 和人的一些行为特征有一定相似之处，人在看一段话的时候，通常只会重点注意具有信息量的词，而非全部词，即人会赋予每个词的注意力权重不同。attention 模型虽然增加了模型的训练难度，但提升了文本生成的效果。模型的大概示意图如下。
```

![](/files/-LqGkRnO8mnvU6ko70ow)

**用aij代表注意前面Encoder不同的hi的权重**，得到中间向量ci，然后作为Decoder去解码

![](/files/-LqGkRnQISxvOixLt-QJ)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://im-qianuxn.gitbook.io/pytorch/ji-suan-ji/shen-du-xue-xi-li-lun/rnn/seq2seq.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
