Re Reference AI

アーキテクチャ

Decoderとは

デコーダ / デコーダオンリー

内部表現から出力系列を生成する側のネットワーク。デコーダのみを積んだ構成が現在のLLMの主流

Transformer系列モデリング

ひとことで言うと

AIモデルの中で「出力の文章を組み立てる」側の部品。GPTなど今の生成AIの多くはこの部品だけを積み重ねて作られている。

概要

Decoderとは、エンコーダ・デコーダ構成において、内部表現から出力系列を生成する側のネットワークを指す。 Transformerのデコーダは、生成済みのトークンだけを参照するマスク付き自己注意を使い、次のトークンを順に予測する。 GPT系のLLMはエンコーダを持たずデコーダのみを積み重ねたデコーダオンリー構成を採用し、これが現在のLLMの主流アーキテクチャになっている。 翻訳のように入力の理解と出力の生成を分けたい場合はエンコーダ・デコーダ構成、テキスト生成中心の用途ではデコーダオンリー構成と使い分けられてきた。

歴史

系列変換モデルの構成要素としては2014年のSeq2Seqで確立し、現在の形は2017年のTransformerの論文に由来する。

アーキテクチャ

Transformerのデコーダブロックは、生成済みのトークンのみを参照できるようにするマスク付き自己注意層と、フィードフォワード層を交互に重ねた構成を取る。エンコーダ・デコーダ構成ではこれに加え、エンコーダの出力を参照するクロスアテンション層を挟む。デコーダオンリー構成ではクロスアテンション層を持たず、マスク付き自己注意とフィードフォワード層のみを積み重ねる。

ワークフロー

これまでに生成したトークン列を入力する → マスク付き自己注意で過去のトークンのみを参照して文脈を集約する → (エンコーダ・デコーダ構成の場合)クロスアテンションでエンコーダの出力を参照する。フィードフォワード層で変換し、次のトークンの確率分布を出力する → 生成したトークンを入力に追加して繰り返す。

コード例

Hugging Face Transformersでのデコーダオンリーモデルによるテキスト生成

from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")

inputs = tokenizer("The future of AI is", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=20)
print(tokenizer.decode(outputs[0]))

利点

  • マスク付き自己注意により、テキスト生成に必要な「次のトークンのみを予測する」制約を自然に組み込める
  • デコーダオンリー構成はエンコーダを省ける分アーキテクチャがシンプルで、大規模化・学習の並列化がしやすい
  • 事前学習した1つのモデルで、翻訳・要約・対話など幅広いタスクをプロンプトの工夫だけで扱える

欠点

  • 生成が1トークンずつの逐次処理になるため、推論時の並列化に制約がある
  • 入力の理解に特化したエンコーダを持たないため、入力全体を双方向に理解したいタスクでは、双方向エンコーダを持つ構成の方が理論上有利な場合もある
  • 長い出力を生成するほど誤りが蓄積しやすく、後戻りしにくい

比較

  • Encoderエンコーダが入力系列を内部表現へ変換する側であるのに対し、デコーダはその表現や生成済みトークンから出力系列を生成する側を指す

関連用語

EncoderTransformerSeq2SeqGPTSelf-Attention

よくある質問

なぜGPT系はデコーダオンリーを採用する?

テキスト生成タスクに特化する場合、双方向のエンコーダを省きデコーダのみを積み重ねた方が、大規模化や学習の並列化をしやすいシンプルな構成になるため。

エンコーダ・デコーダ構成はもう使われない?

翻訳や要約など、入力全体の双方向理解と出力生成を明確に分けたいタスクでは今も使われる。ただし現在のLLMの多くはデコーダオンリー構成を採用している。

関連Zenn記事