RNN Encoder-Decoderとは?やさしく解説

AI用語

機械翻訳・要約・対話のように「入力系列と出力系列の長さが異なるタスク」は、従来のRNNでは扱いが難しいものでした。この課題を解決するために登場したのがRNN Encoder-Decoder(Seq2Seq)です。この構造は“入力を1つの意味ベクトルに圧縮し、そこから別の系列を生成する”という明快な発想で、自然言語処理の流れを大きく変えました。

📖この記事のポイント

  • 可変長入力と可変長出力を扱うための基本構造がRNN Encoder-Decoder(Seq2Seq)である!
  • Encoderは入力文を意味ベクトルに圧縮し、Decoderが1語ずつ生成する!
  • 固定長ベクトルによる情報圧縮の限界が“ボトルネック問題”となった!
  • Attentionはこの課題を解決し、長文翻訳の精度を大幅に改善した!
  • 構造はTransformerに受け継がれ、今も自然言語処理の基礎となっている!
  • 軽量性からオンデバイス用途ではRNN系が現役で使われている!
  • たった2時間の無料セミナー会社に依存しない働き方&AIスキルを身につけられる!
  • 今すぐ申し込めば、すぐに月収10万円UPを目指すための超有料級の12大特典も無料でもらえる!

\ 累計受講者10万人突破 /

無料特典を今すぐ受け取る
監修者プロフィール
森下浩志
日本最大級のAI情報プラットフォーム「romptn ai」編集長。著書に「0からはじめるStable Diffusion」「0からはじめるStable Diffusion モデル・拡張機能集編」など、AmazonベストセラーのAI関連書籍を多数執筆。AIにおける情報の非対称性を解消するための社内研修や出張講義も行う。

RNN Encoder-Decoderとは

何を解決するモデルなのか:可変長 → 可変長の壁

機械翻訳のように、入力文と出力文の長さが必ずしも一致しない状況では、従来のRNNは1つの系列として処理しなければならず、「入力の終わり」「出力の始まり」を区別するのが困難でした。RNN Encoder-Decoderは、EncoderとDecoderという“2本のRNN”を独立させることで、この構造上の制約を解消しました。

その結果、以下のメリットが生まれています。

  • 入力文をそのままの形で読み切れる(前処理が単純)
  • 出力文の長さを柔軟に決められる(止めるタイミングも自由)
  • 翻訳・要約・対話など、生成タスクを統一的に扱える

特に「入力→圧縮→出力」という明快な流れは、後のTransformerにもそのまま受け継がれています。

EncoderとDecoderの役割を整理する

Encoderは入力文(例:[I, love, NLP])を単語順に読み込み、隠れ状態を更新していき、最後に得られる h_T を“入力全体の意味を表すベクトル”として出力します。これがContext Vectorです。

DecoderはこのContext Vectorを初期状態とし、1語ずつ出力文を生成します。たとえば翻訳では、<sos>(文章の開始)を入力し、「私 → は → NLP → が → 好き → <eos>」のように順に生成します。

EncoderとDecoderの役割分担は次のように明確です。

  • Encoder:入力を統合して意味を1つのベクトルにする
  • Decoder:その意味をもとに新しい文を組み立てる

この分業構造が登場したことで、RNNの表現力が飛躍的に向上しました。

仕組み:Encoder → Context Vector → Decoder の流れ

確率モデルとしての理解(やさしい数式)

RNN Encoder-Decoderは「入力 x に対して出力 y が生成される確率 p(y|x) を最大化」するモデルです。このときDecoderは以下のように、次の単語の確率を逐次算出します。

p(y_t | y_{<t}, c)

ここで c はEncoderの最終隠れ状態(Context Vector)であり、入力文全体の情報を集約しています。モデルは学習を通して「適切な圧縮表現 c を作り」「適切な系列 y を展開する」能力を習得します。

難しい数式を使わなくても、“確率を逐次予測する仕組み”であると理解しておくと後のAttention・Transformerが理解しやすくなります。

Encoderがやっていること

Encoderは、入力文を最初から最後まで読み込み、単語ごとに隠れ状態を更新します。RNN・GRU・LSTMなどのバリエーションが使われますが、基本は以下の流れです。

  • 単語を埋め込みベクトルに変換する
  • RNN(またはGRU/LSTM)に通し、隠れ状態を更新
  • 最後の隠れ状態だけを取り出し、文脈ベクトル cとして保持

重要なのは「最終隠れ状態だけにすべての情報が詰め込まれる」という点です。これが後述の“ボトルネック問題”につながります。

Decoderがやっていること

Decoderは「文章を左から右に生成するモデル」です。最初の入力は通常 <sos>、終了は <eos> です。

  • 初期状態に Context Vector をセットする
  • 1ステップごとに次の単語の確率分布を出力する
  • 最も確率が高い単語を選び、次の入力として再びDecoderに与える

トークンを1つずつ生成する“作り込みのプロセス”という理解が大事で、Transformerでも概念は同じです。

Teacher Forcing(学習時と推論時の違い)

学習時と推論時の動作は大きく異なります。

  • 学習時:正解の次単語をDecoderに入力する → 学習が安定する
  • 推論時:モデル自身が選んだ単語を次の入力に使う → 誤差が蓄積しやすい

このギャップは「Exposure Bias」と呼ばれ、生成タスクの難しさの本質でもあります。Teacher Forcing の有無による挙動の違いは、Seq2Seq理解の重要ポイントです。

なぜ限界があるのか:固定長ベクトルのボトルネック問題

長文を1つのベクトルに圧縮する無理

RNN Encoder-Decoderの核心的な問題は、どんなに長い文章であっても「最終隠れ状態1つにすべて押し込む」点です。これは短文には有効ですが、文章が長くなるほど不利になります。

固有名詞、時制、場所情報などが大量に含まれていても、これらが最後の隠れ状態1つに押し込まれると、重要な前半の情報が後半に押し流される危険があります。

Attentionが必要になる理由

この“情報圧縮の限界”を突破したのがAttentionです。

  • Decoderが、必要なときに Encoder の全隠れ状態を参照できる
  • どの単語が重要かを動的に計算する(重み付け)
  • 固定長ベクトルが不要になる

特に長文翻訳の精度はAttention導入後に大幅に改善し、以降は「Seq2Seq+Attention」が標準となりました。Transformerはこの考え方をさらに拡張したものです。

主要タスク:どこで使われてきたのか

機械翻訳(本来の用途)

Seq2Seqが最初に大きな成功を収めたのは英→仏翻訳でした。従来のフレーズベース翻訳と比べ、文脈を一度ベクトルとして捉えることで「語順の差が大きい言語」同士でも自然な訳文を生成できるようになりました。

現在でもTransformerモデルの多くがEncoder-Decoder構造を採用していることからも、元祖としてのSeq2Seqの重要性は揺らいでいません。

要約生成

長い文章を短く“縮約”する要約タスクは、まさにEncoder-Decoder構造と相性が良い代表例です。入力文を圧縮し、本質的な情報だけを展開するという構造は、「どの情報を残すか」を学習しやすいという利点を持ちます。

また、入力→出力で文の長さが大きく異なるため、Seq2Seqの可変長生成能力が活きる分野です。

対話システム(チャットボット)

初期のチャットボットでは、ユーザーの入力文をEncoderで意味表現に変換し、Decoderが自然な返答を生成する仕組みが採用されていました。「Q→A」の形式がそのままSeq2Seqの動作と一致していたためです。

Transformer時代の現在でも、基本構造としての重要性は置き換えられていません。

最小コードで雰囲気をつかむ(PyTorch)

Encoderの最小構造例

以下はGRUベースのシンプルなEncoder例です。構造は最小ですが「埋め込み→RNN→最終隠れ状態」というEncoderの本質が理解できます。


class Encoder(nn.Module):
    def __init__(self, vocab_size, embed_dim, hidden_dim):
        super().__init__()
        self.embed = nn.Embedding(vocab_size, embed_dim)
        self.rnn = nn.GRU(embed_dim, hidden_dim)

    def forward(self, x):
        embedded = self.embed(x)
        outputs, hidden = self.rnn(embedded)
        return hidden

Decoderの最小構造例

Decoderは1単語ずつ出力を生成するため、隠れ状態を継続的に受け渡す必要があります。以下のミニマルコードでは「隠れ状態→RNN→線形層→確率分布」という流れを実装しています。


class Decoder(nn.Module):
    def __init__(self, vocab_size, embed_dim, hidden_dim):
        super().__init__()
        self.embed = nn.Embedding(vocab_size, embed_dim)
        self.rnn = nn.GRU(embed_dim, hidden_dim)
        self.out = nn.Linear(hidden_dim, vocab_size)

    def forward(self, x, hidden):
        embedded = self.embed(x)
        output, hidden = self.rnn(embedded, hidden)
        pred = self.out(output)
        return pred, hidden

学習ループ(Teacher Forcingあり)

Seq2Seqの理解で最も誤解されやすいのが“学習時と推論時の違い”です。以下のコードはTeacher Forcingの有無が分かる最低限の構造です。


encoder_hidden = encoder(src)
decoder_input = torch.tensor([sos_token])
decoder_hidden = encoder_hidden

for t in range(target_len):
    output, decoder_hidden = decoder(decoder_input, decoder_hidden)
    loss += criterion(output, target[t])

    # teacher forcing
    use_tf = random.random() < teacher_forcing_ratio
    decoder_input = target[t] if use_tf else output.argmax(1)

Teacher Forcing が強いほど学習は安定しますが、推論との乖離が大きくなるため注意が必要です。

Transformer時代でも学ぶ価値がある理由

構造理解の土台として不可欠

Transformerは「Encoder-Decoder構造を受け継ぎつつ、RNNをAttentionに置き換えたモデル」です。つまり、Seq2Seqを理解していれば、Transformerを“改良版”として自然に理解できます。

特に以下の概念はSeq2Seqを理解していないと理解しづらいものです。

  • なぜAttentionが必要だったのか
  • なぜDecoderは逐次生成なのか
  • EncoderとDecoderが別れている必然性

軽量用途・オンデバイス用途で現役

RNNベースモデルはTransformerに比べて軽量で、計算資源の少ない環境でも動作します。たとえば以下のような用途では今でも採用されています。

  • スマホや小型デバイス上で動作する簡易チャットボット
  • 数万件レベルの小規模データで学習する専用モデル
  • 反応速度が重要なリアルタイムシステム

“Transformerより弱いが軽い”という利点は依然として重要です。

よくある質問(FAQ)

RNN Encoder-DecoderとSeq2Seqは同じですか?

ほぼ同じです。初期のSeq2Seqの実装はRNN Encoder-Decoderであり、両者を区別せず使うケースも多いです。

Transformerとの違いは?

TransformerはRNNの逐次計算を避け、Attentionによって全単語を並列処理できます。構造は似ていても計算方式が根本的に異なります。

BERTやGPTはEncoder-Decoderですか?

BERT=Encoderのみ、GPT=Decoderのみ、という構成です。Encoder-Decoder型ではありません。

AttentionなしのSeq2Seqは今も使われますか?

大規模モデルの主流ではありませんが、軽量モデルや小規模データセットでは今も採用されています。

まとめ

  • RNN Encoder-Decoder(Seq2Seq)は「可変長入力→可変長出力」を扱うために生まれた構造で、生成タスクの基礎となった。
  • Encoderは入力を“意味ベクトル”に圧縮し、Decoderがその意味をもとに1トークンずつ文章を生成する。
  • 固定長ベクトルの限界(ボトルネック問題)をきっかけにAttentionが登場し、長文処理の精度が大幅に向上した。
  • Seq2Seqは翻訳・要約・対話など多くのNLPタスクで使われ、現在のTransformerにも構造が受け継がれている。
  • 軽量性から、小規模・オンデバイス用途ではRNN系モデルが今も利用されている。

RNN Encoder-Decoderは、現代NLPの“出発点”ともいえるモデルです。この構造を理解しておくと、AttentionやTransformerの仕組みが格段に理解しやすくなります。生成モデルの学習を本質から掴むための大切な基盤になります。

romptn ai厳選のおすすめ無料AIセミナーでは、AIの勉強法に不安を感じている方に向けた内容でオンラインセミナーを開催しています。

AIを使った副業の始め方や、収入を得るまでのロードマップについて解説しているほか、受講者の方には、ここでしか手に入らないおすすめのプロンプト集などの特典もプレゼント中です。

AIについて効率的に学ぶ方法や、業務での活用に関心がある方は、ぜひご参加ください。

\累計受講者10万人突破/