Decoderとは
デコーダ / デコーダオンリー
内部表現から出力系列を生成する側のネットワーク。デコーダのみを積んだ構成が現在のLLMの主流
ひとことで言うと
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]))利点
欠点
比較
- Encoder — エンコーダが入力系列を内部表現へ変換する側であるのに対し、デコーダはその表現や生成済みトークンから出力系列を生成する側を指す
関連用語
よくある質問
なぜGPT系はデコーダオンリーを採用する?
テキスト生成タスクに特化する場合、双方向のエンコーダを省きデコーダのみを積み重ねた方が、大規模化や学習の並列化をしやすいシンプルな構成になるため。
エンコーダ・デコーダ構成はもう使われない?
翻訳や要約など、入力全体の双方向理解と出力生成を明確に分けたいタスクでは今も使われる。ただし現在のLLMの多くはデコーダオンリー構成を採用している。