← 返回题目列表

RNN 有哪些输入输出类型?one-to-many、many-to-one 分别对应什么任务?

高频 简单 第 1 / 25 题 更新于 2026/08/02
循环神经网络RNN序列seq2seq

简化版

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解码到 EOSteacher 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 取决于对齐与任务。