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

1. 埋め込み層とは [概要]

埋め込み層(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ベクトル表現(語彙の辞書)を,低次元のベクトル表現へと埋め込むのを担当する.

埋め込み層は,word2vec・Gloveなどの,浅いネットワークによる単語埋め込みEncoderから発展したものであるのもあり,Transformer時代でも,シンプルに全結合層1つのみで学習する(※ あまりやらないが,埋め込み層をもっと多層のリッチなEncoderに代えるのもアリである).

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

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

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

元々,単語埋め込みベクトル = (単語)分散表現は,Yoshua Bengio のニューラル確率言語モデルや,その派生によるディープ表現学習研究あたりから登場してきた,単語の低次元ベクトル空間におけるモデリングである.その後,word2vec・GloVe(2.1時代)から, RNN言語モデルやseq2seq内で,単語埋め込み層も統合して使用・あるいはファイン・チューニングするという流れになった.

2.1 Word2vec・GloVe時代

3層MLPのWord2Vec(「単語分散表現」の1種)が提案され,ベクトル表現の強さが認知された.word2vecは,前後n個の単語間の予測関係を教師なし学主した3層MLPによって,大量に学習文章群から,前後の単語コンテキストを獲得した埋め込み表現ベクトルである.また,直後に,SotcherとManningによるGloVeも,その直後によい改善案として提案された.ニューラルネット型の単語分散モデル(word2vec, glove, fastTextなど)が,様々なNLPタスクで使用され,各単語を分散表現ベクトルに埋め込んで使用することが定着していった.

Word2VecやGloVeは,文章モデルであるLSTMなどとは,個別に学習しておき独立したモデルとして使用していた.よって,この頃はタスクに対して言語モデルをファインチューニングすることはなく,一旦word2vecGloVeを学習したら,そのモデルはパラメータを固定して,様々なタスクで使用していた.

2.2 各タスク用に,単語モデルも含めてfine-tuningしはじめるように

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

2013~2014年頃,各種NLPタスク(例:質問回答や機械翻訳)を学習する言語ニューラルネットワークに,LSTM・GRUやRNNLMseq2seqなどの,系列ネットワークを用いるようになってきた.

そして,それらの系列ネットワークへの,各フレームの入力トークン表現を,埋込み層で,word2vecやGloveの重みパラメータを初期値としてファイン・チューニングすることも出てきた.

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

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

また,TTS(Text-to-Speech)や音声認識など,テキスト-音声間のクロスモーダル処理でもseq2seq with attentionがこの時期の標準的モデルとなっていた.また,管理人の慶應時代の担当学生がVision and Language(V&L)の研究をこの時期取り組んでいたが,入力側に言語モーダルが来る動画問題設定のV&L (例: Video Moment Retrieval(Video Grounding) や Video-Text retrievalや,私のチームは研究していなかったがVideo QA)の研究では,言語側をLSTMとアテンションで系列モデリングするゆえ,各単語入力を,この埋め込み層から入力するのがスタンダードとなっていた.それが,このあとTransformer時代へ以降するわけである.

2.3 Transformer登場後

2018, 2019年以降の,TransformerやBERTなどのモダンな自然言語処理モデルでは,「トークン埋め込み層と言語モデルの2つを統合していっぺんに学習するモデル」となった.つまり,ランダム初期値からスクラッチからの学習をして,埋め込み層ごと言語モデル全体をEnd-to-End学習でいっしょくたに学習するようになるのが普通となった.これにより,以前の2.1の時代のような,「単語埋め込みモデルと,タスク言語モデルを完全に2つに分離して個別に学習する」というアプローチは,過去のものとなった.

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

特に,Transformer・BERTでは「コンテキストにより,各トークンの意味が変化する」というモデリングに変更されていることが,大きく従来の埋め込みの概念と異なる.2.1の単語分散表現時代や,2.2の途中くらいまでは,「単語の意味は1ベクトルだけ=1つの意味だけ」というモデリングであった.それに対して,Transformer登場後は「文脈にそって,各トークンの意味(=トークン表現ベクトルの値)が,随時変化する」というトークン表現の非固定化が主流となった.(ただし,学習後も埋め込み層自体は固定で,動的に変化はしない点に注意).

2.3.2 画像入力 Transformerでは埋め込み層は用意できない

ちなみに,ViTやDETRなど,画像認識向けのTransformerでは,各入力は言葉のように離散単語ではないので,あらかじめ辞書化したり,その埋め込みベクトル群のルックアップテーブル(図1)は,用意できない.よって,CNNなどで画像領域を毎回テスト時にEncodingし,毎回トークン表現を用意することになる.

逆に言うと,2.3.1のような言語モデルでは,先にトークン辞書から埋め込みベクトルのルックアップテーブルをつくっておけるので計算効率的には有利である(もちろん,テーブルに語彙内の全埋め込みベクトルを保持しておく分,メモリは多く消費する).

関連記事

関連書籍

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).

参照外部リンク