RNN 有哪些输入输出类型?one-to-many、many-to-one 分别对应什么任务?
简化版
RNN 按输入和输出序列的长度关系分成几种类型:① one-to-one(一对一)——单输入单输出,其实就是普通网络(如图像分类);② one-to-many(一对多)——一个输入生成一个序列,如看图说话(图像→描述句子)、音乐生成;③ many-to-one(多对一)——一个序列输出一个结果,如情感分类(文本→正/负)、文本分类;④ many-to-many(多对多)——序列输入序列输出,又分等长(如逐词词性标注,输入输出一一对应)和不等长(如机器翻译,输入输出长度不同,用编码器-解码器 Seq2Seq 结构)。理解这个分类,就知道 RNN 能覆盖哪些序列任务。
详细版
五种类型:
| 类型 | 输入→输出 | 典型任务 |
|---|---|---|
| one-to-one | 单个→单个 | 普通分类(非序列,退化情形) |
| one-to-many | 单个→序列 | 看图说话、音乐/文本生成 |
| many-to-one | 序列→单个 | 情感分析、文本分类、序列打分 |
| many-to-many(等长) | 序列→等长序列 | 词性标注、命名实体识别、逐帧标注 |
| many-to-many(不等长) | 序列→不等长序列 | 机器翻译、语音识别、摘要(Seq2Seq) |
关键区分:
- many-to-one:通常在每个样本的最后一个有效时间步取状态输出,也可用池化或注意力聚合(用最终隐藏状态做决策)。
- many-to-many 等长:每个时间步都输出(输入输出一一对应)。
- many-to-many 不等长:用编码器-解码器(Seq2Seq)——编码器读完整个输入压成向量,解码器再生成输出序列(详见 Seq2Seq 专题)。
完整版教学
一、按什么分类——输入输出的长度关系
RNN 的强大在于能灵活处理输入、输出都可以是序列的各种任务。按「输入是单个还是序列、输出是单个还是序列、以及长度是否相等」,可以把 RNN 的应用模式分成几类。理解这个分类,能帮你快速判断「某个任务该用哪种 RNN 结构」。
二、one-to-one:一对一(退化情形)
- 单个输入 → 单个输出,中间没有序列。
- 这其实就是普通的前馈神经网络(没用到 RNN 的循环特性),是 RNN 分类里的「退化情形」。
- 例:普通的图像分类(一张图 → 一个类别)。
列出它主要是为了框架完整,实际用 RNN 是从下面几种开始。
三、one-to-many:一对多(序列生成)
- 单个输入 → 序列输出。
- 一个固定输入,RNN 逐步生成一个序列,每步的输出还会作为下一步的输入。
- 典型任务:
- 看图说话(Image Captioning):输入一张图像,输出一句描述文字。
- 音乐生成、文本生成:给一个起始信息,生成一段序列。
四、many-to-one:多对一(序列分类/打分)
- 序列输入 → 单个输出。
- RNN 逐个读完整个输入序列,只在最后一个时间步用最终隐藏状态(它浓缩了整个序列的信息)输出一个结果。
- 典型任务:
- 情感分析:读完一段文本/一段评论,输出正面/负面。
- 文本分类:一篇文档 → 一个类别。
- 序列打分:一段序列 → 一个分数。
关键:常在最后有效位置输出一次,也可换成池化/注意力聚合(拿全序列读完后的隐藏状态做决策)。
五、many-to-many:多对多(序列到序列)
这是最丰富的一类,又分两种情况:
(1)等长 many-to-many(输入输出一一对应)
- 输入序列和输出序列长度相同,每个时间步都产生一个输出,输入输出位置一一对应。
- 典型任务:
- 词性标注(POS):每个词 → 它的词性。
- 命名实体识别(NER):每个词 → 它的实体标签。
- 视频逐帧分类。
- 结构:RNN 每读一个输入就输出一个结果,输入输出同步、等长。
(2)不等长 many-to-many(Seq2Seq)
- 输入序列和输出序列长度不同,不能一一对应。
- 典型任务:
- 机器翻译:源语言句子 → 目标语言句子(长度通常不同)。
- 语音识别:语音帧序列 → 文字序列。
- 文本摘要:长文 → 短摘要。
- 结构:用编码器-解码器(Seq2Seq)——编码器先读完整个输入序列、压缩成一个上下文向量,解码器再基于它逐步生成输出序列(详见 Seq2Seq 专题)。这解决了「输入输出长度不一致」的问题。
六、怎么用这个分类
拿到一个序列任务,先问:
- 输入是单个还是序列?输出是单个还是序列?
- 如果都是序列,长度相不相等?
据此对号入座:
序列→单值(分类/打分) → many-to-one(末尾输出)
序列→等长序列(逐元素标注) → many-to-many 等长(每步输出)
序列→不等长序列(翻译/摘要) → many-to-many 不等长(Seq2Seq 编码器-解码器)
单值→序列(生成) → one-to-many
七、变长 batch 中如何找到真正的最后一步
假设一个 batch 有两条序列,真实长度分别为 5 和 3,padding 后都变成 T=5。many-to-one 若机械取张量第 5 步,第二条样本拿到的是 padding 位置;正确做法是按长度取第 5 步和第 3 步,或使用 packed sequence、mask 后的池化。这个边界在面试代码题里比背类型名称更容易出错。
样本A: x x x x x length=5 -> 取位置5
样本B: x x x PAD PAD length=3 -> 取位置3
mask : 1 1 1 0 0
| 任务接口 | 常见输出位置 | 仍需决定的问题 |
|---|---|---|
| many-to-one | 最后有效状态/池化 | padding mask、聚合方式 |
| 等长 many-to-many | 每个有效位置 | 标签 mask、对齐 |
| 不等长 seq2seq | 解码到 EOS | teacher forcing、搜索 |
输入输出类型只描述任务接口,不唯一决定内部架构。语音识别既可用 encoder-decoder,也可用 CTC;图像描述也可能用 CNN/ViT 编码器加 Transformer 解码器。
易错点:最后时间步不等于最后有效时间步;出现 padding 时必须结合 length 或 mask。
八、常见误区与追问
- 误区:many-to-one 必须且只能使用最后张量位置。 padding 后应取最后有效位置,也可以用池化或注意力汇总。
- 误区:输入输出不等长就只能使用 RNN Seq2Seq。 Transformer encoder-decoder、CTC 等也可处理,取决于任务假设。
- 追问:等长标注为什么需要 mask? padding 位置没有真实标签,不应计入损失和指标。
- 追问:one-to-many 解码第一步输入什么? 常用 BOS 起始符或由条件向量初始化状态,具体看模型设计。
- 追问:文本分类一定属于 many-to-one 吗? 从接口看是,但内部可用双向编码、池化或注意力,不一定只取末状态。
九、加强记忆
RNN 按输入输出长度关系分类:one-to-one(单→单,退化成普通网络,如图像分类);one-to-many(单→序列,生成类,如看图说话、音乐生成);many-to-one(序列→单值,只在末尾输出,如情感分析、文本分类);many-to-many 等长(序列→等长序列,每步输出、一一对应,如词性标注、NER);many-to-many 不等长(序列→不等长序列,用编码器-解码器 Seq2Seq,如机器翻译、语音识别、摘要)。判断口诀:看输入输出各是单个还是序列、序列时长度等不等——不等长输出常用编码器-解码器;是否采用 RNN、Transformer 或 CTC 取决于对齐与任务。