埋め込み層 (Embedding Layer) [自然言語処理の文脈で]

1. 埋め込み層 (Embedding Layer)とは [概要]

埋め込み層(Embedding Layer)とは,入力のトークンone-hotベクトル表現(K次元=数万語の辞書)を,自然言語処理ネットワークが扱いやすい,低次元のトークン(埋め込み)表現ベクトルへと埋め込む全結合層のことを言う.

TransformerやBERTなどのモダンな系列変換モデルや大規模言語モデルでは,埋め込み層をトークン入力部分に配置し,トークンIDをもとに低次元トークン表現を獲得するために使用する.例えば,(典型的な)Transformerの場合,埋め込んだトークン表現ベクトルは,デフォルトで$d_{\text{model}}=512$次元ベクトルである.

埋め込み層(Embedding Layer)
図1 埋め込み層Embedding Layerトークン数 K= 14950の語彙での例

テスト時に,毎回元のone-hotベクトルから全結合層をForwardしていると計算効率化が悪い.ところが,自然言語処理では,語彙内のK個のトークン(のone-hotベクトル)のみを入力対象として限定できる.以上から,埋め込み層は,トークンIDをベクトルK個を保管して,IDですぐそれらを取り出せるようにした「ルックアップテーブル」として実装するのが標準的である(図1 ).

こうして,埋め込み層では,トークンID (= one-hotベクトル表現でもある)を入力として,対応するIDの埋め込み済み$d$次元ベクトルを出力する.例えばPyTorchでは,nn.Embeddingクラスとして提供されている.

※ 実態が「埋め込み担当の全結合層+ルックアップテーブル」という構成になっているので,「埋め込み(Embedding)」という呼び名よりは,「トークン埋め込みベクトルを保管した,ルックアップテーブル」を,簡潔に示した呼び名が欲しかったところではある.

ただしViTやDETRなど,自然言語のようには「入力語彙」を形成できない,連続信号モーダルをTransformerのトークンとして入力としたい場合,あらかじめトークン辞書化・ルックアップテーブル化ができないので,毎回,Forwardしてベクトル変換するしかない(2.3.2で詳しく)

1.1 埋め込み層の現代での使用:Transformerでの埋め込み層

埋込み層の代表例には,Transformerのトークン埋め込み層があげられる.Transformerで言語間変換モデルを学習する際に,各入力トークンのone-hotベクトル表現(語彙の辞書)を,低次元のベクトル表現へと埋め込むのを担当する.

埋め込み層は,過去の「浅い1~2層のニューラルネットワークを用いた,単語/トークン埋め込みEncoder (word2vecGloveなど)」を参考に,seq2seq with attentionの時代になってきて,「単語埋め込み部分も,ネットワーク内に取り込こみ,一緒に学習しょう」という感じで,発展・登場したものである.Transformer時代に入っても,埋め込み層は,シンプルに全結合層1つのみで学習する(※ あまりやらないが,埋め込み層をもっと「多層のリッチなEncoder」に代えるのもアリである).

このあと2節では,従来手法からの変遷をまとめておき,なぜTransformer世代の埋め込み層(2.3節)がこの形におちついたのかを見ておくことで,トークン埋め込み層への理解をもう少し深めてもらいたい.

2.過去の「単語・トークン埋め込み層」の変遷

Transformerが登場する1節の使用方法に到る以前の,自然言語処理における「単語埋め込み」技術の変遷について,簡単にだけまとめておきたい.

元々,単語埋め込みベクトル = (単語)分散表現は,Yoshua Bengio のニューラル確率言語モデルや,その派生によるディープ表現学習研究あたりから登場してきた,単語の低次元ベクトル空間におけるモデリング技術である.

最初は分散表現を計算するネットワークは独立して使用したいが,その後,word2vecGloVe(2.1時代)が登場して以降,途中から「RNNLMseq2seq内の入力層に単語埋め込み層も統合しておき,全体をファイン・チューニングする」という流れになった.

2.1 Word2vec・GloVe時代

3層MLPのWord2Vec (単語分散表現の代表モデル)が提案され,単語ベクトル表現の強さが認知されはじめた.word2vecは,前後N個の単語間の予測関係を,教師なし学習した3層MLPに学習した結果得られる,中間層の埋め込み表現ベクトルである.また,Word2Vecの直後に提案されたSocher・Manning氏らによるGloVeも,良い改善案として広く普及した.これらのニューラルネット型の単語分散モデル(word2vec, GloVe, fastTextなど)が,様々なNLPタスクで使用され定着していった.

Word2VecやGloVeは,RNN言語モデルとは別に学習しておき,独立したモデルとして使用していた.つまりword2vecGloVeは,学習後にタスクごとに精密調整することはなく,パラメータは固定して,様々なタスクで使用していた.また,言語モデルと結合してEnd-to-End学習したりもしなかったのである.

2.2 「単語埋込みも含めたEnd-to-End精密調整」へと変化

2.2.1 言語モデルの状況:seq2seqとアテンション登場した頃

2013~2014年頃,各種NLPタスク(例:質問回答や機械翻訳)を学習する言語ニューラルネットワークに,LSTM・GRUやRNNLMseq2seqなどの,系列ネットワークを用いるようになってきた.そして,それらの系列ネットワークへの,各フレームの入力トークン表現を,埋め込み層として「初期パラメータ値のword2vecGloveの重み」から,ファイン・チューニングする」ことが定番化してきた.

つまりは,単語分散表現(word2vecGloveなど)が,言語モデルの中の部品として,入力部の「埋め込み層」に取り込まれはじめたわけである.これ以降,2.1節の時代のような「単語埋め込みモデルと,個別タスク向け言語モデルを,分離して個別に学習する」という従来のアプローチは「過去のもの」となった.

この時期,系列対系列変換問題では,seq2seq with attentionが定番化していったが,その際Google NMTの例のように「トークナイザ」の提案・登場に伴い,機械翻訳界隈を皮切りに「単語単位の入力」から「(サブ)トークン単位の入力」へと自然言語処理の入力単位が変化していった.

2.2.2 クロスモーダル問題でも,言語モデル側に埋め込み層を使用

また,TTS(Text-to-Speech)や音声認識など,テキスト-音声間のクロスモーダル処理でもseq2seq with attentionがこの時期の標準的モデルとなっていた.

当時,管理人の慶應での研究員時代に,担当学生(2019年~2020頃)が取り組んでいた「入力側に言語モーダルが来る動画問題設定のVision-Language (例: Video Grounding や Video-Text retrieval)」でも,当時の多くの「Video-Langueモデルの言語モデル側」は,LSTMと(モーダル間)アテンションで系列モデリングしていた.つまり,「各単語トークン入力を,埋め込み層から入力する」ことが,Vision-Languageでもその当時は標準的となっていた.

2.3 Transformer登場後

2018, 2019年以降の,TransformerやBERTなどのモダンな自然言語処理モデルでは,「トークン埋め込み層&言語モデルの2つを統合し,いっぺんにスクラッチからの学習を行うモデル」が主流となった.

つまり,ランダム初期値からスクラッチからの学習をして,埋め込み層ごと言語モデル全体をEnd-to-End学習でいっしょくたに学習を行なうのが普通となった.(2.2節の時点では,埋込み層の初期値までは,GloVeの学習済み重みで初期化していた)

2.3.1 Transformer・BERTでのトークン埋め込み表現

特に,Transformer・BERTでは「コンテキスト次第で,各トークンの意味が変化する」というモデリングに変更されていることが,従来の埋め込みの概念と大きく異なる.

2.1の「単語分散表現」時代や,2.2の途中くらいの時代までは「単語の意味は事前に学習済みのベクトル=1つの意味だけ」というモデリングであった.それに対し,Transformer登場後は「文脈にそって,各トークンの意味(=トークン表現ベクトルの値)が随時変化する」という「トークン表現の非固定化」が主流となった(ただし,学習後も,埋め込み層の重みは固定であり,動的に変化はしない点に注意).

2.3.2 画像認識むけ Transformer

ViTやDETRなどの「画像認識むけTransformer」でも,埋め込み層が内部的に入っているところまでは同じである.

ただ,最初の各入力は,言葉のように「離散単語やトークン」ではなく,画像をグリッド分割した「小画像パッチ」である.その画像パッチの「3チャンネルカラー画素値(C×W×H個の値)」をパッチ入力として,埋め込み層(全結合層)でベクトル化し,Encoddingを行なう (位置位置符号化も学習する).

つまり,「画像認識向けけTransformer」だと,予め固定サイズを決めた画像パッチを(トークン単位とみなして)入力し,学習中に画像パッチ入力に対するする.トークン埋め込み層や位置埋め込み層(位置符号化的な層)も学習する,

※ ViTの優しい解説としては,参照リンクにも挙げた,「Qiita 【PyTorch】Vision Transformer (ViT) を自作しながら解説する by @zisui-sukitarou」などが参考になるはず.勿論,指定参考書である,

関連書籍

References

  • [Bengio et al., 2000] Bengio, Yoshua, Réjean Ducharme, and Pascal Vincent. "A neural probabilistic language model." Advances in neural information processing systems 13 (2000).

参照外部リンク