Encoderとは
エンコーダ
入力系列を、意味を圧縮した内部表現(コンテキストベクトル)へ変換するニューラルネットワークの構成要素
ひとことで言うと
入力された文章を、意味を圧縮した内部データに変換するAIの部品。
概要
Encoder(エンコーダ)とは、入力系列(文章・音声等)を受け取り、その意味や特徴を圧縮した内部表現(コンテキストベクトル、または隠れ状態の系列)へ変換するニューラルネットワークの構成要素。 Seq2SeqモデルではEncoderが生成した内部表現をDecoderが受け取り、別の系列(翻訳文等)を生成する。 Transformerにおいても、Encoder-Decoder構成を用いる場合と、BERTのようにEncoder部分のみを取り出し文章の意味理解タスクに特化させる場合がある。
背景
系列データを別の系列やラベルへ変換するタスクでは、入力の意味や文脈をいったん要約し、後続の処理へ橋渡しする仕組みが必要だった。 Encoderは、この入力側の情報を圧縮・要約する役割を担う構成要素として、Seq2Seqアーキテクチャの一部に位置づけられた。
歴史
2014年: ChoらとSutskeverらが、それぞれRNNベースのEncoder-Decoderモデルを提案し、機械翻訳タスクにおけるEncoderの役割を確立。 2017年: VaswaniらがTransformerにおいて、自己注意機構に基づくEncoder構造を提案。 2018年: DevlinらがTransformerのEncoder部分のみを積み重ねたBERTを発表し、文章理解タスクに特化したEncoderモデルの活用が広がった。
アーキテクチャ
RNNベースのEncoderは、入力系列を1要素ずつ読み込みながら隠れ状態を更新し、最終的な隠れ状態(またはその系列全体)を内部表現として出力する。 TransformerベースのEncoderは、Self-Attention層とFeed Forward層を1ブロックとして複数積み重ねた構造を持ち、系列全体を並列に処理しながら各位置の表現を更新する。 入力系列と同じ長さの出力系列(各トークンに対応する文脈化された表現)を生成する点が、単一のベクトルに圧縮するタイプのEncoderとの違いになる。
ワークフロー
入力系列をトークン化・埋め込みベクトル化 → (Transformerの場合)位置エンコーディングを加算 → Self-Attention・Feed Forward等の層を複数回適用 → 各トークンに対応する文脈化された内部表現を出力する。
コード例
PyTorchでのTransformer Encoder層
import torch.nn as nn
encoder_layer = nn.TransformerEncoderLayer(d_model=512, nhead=8)
encoder = nn.TransformerEncoder(encoder_layer, num_layers=6)
output = encoder(src) # src: (系列長, バッチサイズ, 次元数)利点
- 入力の意味や文脈を圧縮した内部表現として、後続のタスク(分類・生成等)へ柔軟に受け渡せる
- Transformerベースであれば、系列内の要素を並列に処理でき学習を高速化しやすい
- BERTのようにEncoder部分のみを事前学習し、様々な下流タスクへ転移学習できる
欠点
- RNNベースのEncoderは、長い入力系列を固定長のベクトルへ圧縮する過程で情報が失われやすい
- Transformerベースの場合、系列長の2乗に比例して計算量・メモリ使用量が増加する
- Encoder単体では新しい系列を生成できず、生成タスクには別途Decoderが必要になる
比較
関連用語
よくある質問
EncoderとDecoderの違いは?
Encoderは入力系列を内部表現へ変換する役割を担い、Decoderはその内部表現をもとに出力系列を生成する役割を担う。
BERTはEncoderだけで構成されている?
その通りで、BERTはTransformerのEncoder部分のみを積み重ねた構造を持ち、文章生成ではなく文章の意味理解に特化したタスクで使われる。
参考文献
- DocumentationPyTorch: torch.nn.TransformerEncoder