one-hot ベクトル [ディープラーニングの文脈で]

記事を共有する:

1. one-hot ベクトルとは [概要]

one-hot ベクトル とは,K次元ベクトルのうち1つの次元だけが1であり,他の次元の値は全て0であるベクトル表現である.ベクトルは略して,one-hot 表現 (one-hot representation)とも呼ぶ.コンピュータビジョン物体認識物体検出などでは,クラス識別の出力の「Kクラス分類の正解ベクトル」として,機械学習モデルにおいてsoftmax出力時によく用いる表現(ベクトル)のEncoding手法である.自然言語処理においても,ある言語の語彙K個 (※ K= 数千〜数万)のうち,どの1つの単語・トークンに相当するかを示す際にも,one-hotベクトルはよく用いられる.

この記事では,ディープラーニングにおいて,「どのMLモデルのどこの入出力において,one-hotベクトルを用いるか」を,簡潔に整理することを目的としたい.コンピュータビジョン(3.1節)とNLP(3.2節)の使用を,「いっしょくたに整理する」かたちで示す.2分野横断的にまとめるのは,Transformerモデルが,ビジョンとNLPの双方で頻繁に研究されるようになており,なおかつVision-Languageなどのマルチモーダルモデルでも多用されているからである.Transformerは,入力でもSoftmax出力でも,Kクラスのトークン表現を使用する.

2節では,「one-hotベクトル と Kクラス-ラベル間の変換」を,基本事項としてまず説明する.それを踏まえて3節では,one-hotベクトルの入力から,低次元表現へ「埋込み」or 「符号化」する様子や,逆に識別器出力でone-hotベクトルを出力する様子を,コンピュータビジョン(3.1節)・NLP(3.2節)の例を通して,統合的に整理したい.

one-hotベクトルは,以下のように「K次元のベクトル$\bm{y}$のうち,ある次元の値のみ1で,それ以外の次元の要素は全て0である」ベクトルとして表現される(※2番目の要素のみ1の例):

\[ \bm{y} = (0,1,0, \ldots, 0)^{T} \]

このように,人間がわかりやすい,K個の意味的クラスからなる「クラスラベル表現」を,機械(ここでは機械学習モデル)が解読しやすい,「2値のK次元ベクトル」である$\bm{y}$へと変換することがone-hotベクトルの目的である.

1.1 入力で用いる場合:低次元表現へ符号化・埋込みを行う.

one-hotベクトルへの符号化
図1. one-hotベクトルへの符号化

図1 は,K=6単語の辞書中の各単語をone-hotベクトルへと符号化しておき,例文の各単語を,辞書中の各単語のone-hot-ベクトルで表現する例である.この図1の例では,図示しやすいようにK=6としているが,通常の自然言語処理や,ImageNetでの物体認識では,K=1000クラス~ 数万単語のオーダーであり,各one-hotベクトルは非常に高次元のベクトルとなる.

NLPの場合だと,高次元のone-hotベクトル入力は,埋め込み層位置符号化などを用いて,低次元表現ベクトル(100次元~多くとも1000次元ベクトル程度)に変換しておく.その後,マルチモーダルCNN終盤の識別層や,RNN (LSTM, RNNLMなど)や,seq2seq with attention, Transformerなどの系列系モデルへと入力する処理パイプラインを使用することが標準的である.

クラス数Kの値が,数千~数万語彙のオーダーである「NLPのone-hotベクトル」や,画像入力CNNの順伝搬終盤で得られる特徴(例:終盤ヘッド層手前の,4096次元ベクトル)を,そのあとの識別や予測を行うニューラルネット層や,機械学習モデルへ入力する時を考える.

この「4000~数万次元」もの高次元ベクトルを,そのまま予測するのは計算負荷的にもモデル的にも厳しい.よって,識別性能が高い「低次元埋込み表現」へ,あらかじめ次元削減や単語埋込み・埋込み層などで変換しておくことが欠かせない.

※ one-hotベクトルを入力とした話ではないが,1 x 1 畳み込み層や,ネットワークのボトルネック設計といった話も動機はこれと同じであり,「低次元化」とそれによる「計算負荷削減および識別性能のよい表現の学習」である.

2. クラスラベルとone-hotベクトルの間の変換

one-hot符号化は,one-hot ベクトル$\bm{y} \in \mathbb{R}^K$ と,それに対応するクラスラベル$y$の間で,以下の,「one-hot エンコーディング」と「one-hot デコーディング」による相互変換を行う:

one-hot エンコーディングone-hot デコーディング
処理内容元のKクラスのラベル表現をもとに,$i=K$次元目の要素だけを1にした,K次元のone-hotベクトルを作成.モデルが推定したK次元 one-hot ベクトルをargmaxすることで,クラス番号$i$を確定.
目的Kクラス表現(ベクトル)のone-hot表現化one-hot表現から,推定クラスを確定

この2つの操作を用いることで,各種のMLモデルや,DNNにおいて,K-クラス入力・出力の双方に取り扱いやすい「one-hotベクトル表現」を,データセットの入力と出力から得ることができる.

3. ビジョンとNLPでのone-hot表現の使用

ここまでは,既刊の機械学習むけ参考書や授業で学べる一般的な話であった.それを踏まえて,この節では,「one-hotベクトル表現」のどのネットワークの入出力で,どのように用いられるかについて,ビジョンの例(3.1節)とNLPの例(3.2節)の双方での,基本的な使用どころについて整理したい.

とりわけ両分野で用いるTransformerでの入出力(トークン)に,one-hot表現がどのように組み込まれているかを理解することを,3節の最終目的としたい.

3.1 CNN画像分類モデルの出力

画像認識CNNの出力では,(ImageNet-1Kの)1000クラス識別や,物体検出ネットワークのクラス識別ヘッドでは,softmax関数を用いて,one-hot ベクトル(K=20~50クラス程度)を予測する.

ImageNet データセットを用いて,1000クラス物体画像分類を行うCNNを学習することを考える.学習の際は,ImageNetのクラスラベルから,one-hotベクトルによりK次元のone-hotベクトルを出力する.

一方,学習済みのCNNで予測をおこなうと,出力のsoftmax層では,K=1000次元の確率ベクトルを出力する.この出力ベクトルは,one-hotベクトル的な,確率ベクトル表現となっている(※ 予測した1000次元出力ベクトルは,様々なクラスに0以上の確率値が予測されており,正確にはone-hot表現になりきっていないことには注意).

この出力ベクトルをargmaxすると,最も高いクラス確率として「i 次元目の値 = クラス i」を確定でき,最終的なクラス予測結果を出力することができる(※ ここも,argmaxを適用して最大確率クラスを抽出しているのであって,ベクトル全体をone-hot表現に変換するわけではないことに注意).

3.2 NLPモデルの入力と出力

NLP向けの,主な深層学習系ネットワーク(例:双方向LSTM, RNNLM, seq2seq with attention, Transformerなど)の出力では,各フレーム(t)は,Kクラスの単語・トークンを,出力softmax層により,K次元one-hot表現の確率ベクトルを予測する.

一方,これらのモデルの入力においては,単語(or トークン)のK次元one-hot表現を使うが,こちらは埋込み層 or 位置符号化(Transformer)を用いて,低次元ベクトルへと変換(埋込み)を行ったのち,その低次元埋込み単語orトークンのベクトルをもとに,LSTMやTransformerでの毎フレームの処理を行う.

自然言語処理では,Bag-of-featuresや,単語分散表現ベクトル(word2vec, Glove)・などが登場する以前は,入力や出力の単語表現には,生のK次元 one-hotベクトルを用いていた.Kの数が数万以上の辞書だと,語彙数爆発してしまい計算・記憶量的負荷も高くて予測モデルを組むのが厳しくなる.そこで,K=1000程度以下に圧縮できる,(疎な)Bag-of-Features 表現や,それよりも更に次元数が低くできて,なおかつベクトルも密な(Bengio以降の)単語分散表現やword2vecへと,移行していった.

コンピュータビジョンでも,AlexNet登場以前の画像物体認識では,画像認識特徴をBag-of-Visual-Wordsで符号化していた時代は,上記のNLPと方向性がほぼ同じである.SVMへの入力ベクトルを,先に識別性能の良い低次元ベクトルへ変換しておきたいので,「k-mensによるコードブック化を用いたBag-of-Visual-Wordsベクトルへの変換」や,「多様体埋込みと連携した画像ベクトル符号化(FisherベクトルやSuperベクトル)」が,よく用いられていた

※ この時代について詳しくは,原田先生の「画像認識」の4章『コーディングとプーリング』などを参照.

3.2.1 NLPモデルの出力:one-hot表現 (softmax確率ベクトル)

NLPで用いる予測モデルにおいて,LSTMのRNNLMでは,Kクラスの単語・トークン分類の結果としてOne-hotベクトル表現をsoftmax層で出力する.

seq2seq登場以降,LSTMを2個つないだ系列対系列変換モデル を,機械翻訳などで用いるようになって以降も,Decoder側において各フレームで出力するのは,Kクラスsoftmax出力のままである.系列対系列変換モデルの主役がTransformerになって以降も,Transformer-Decoderの各フレームにおける出力は,相変わらず(語彙中トークンの)Kクラス識別softmax出力である.

3.2.2 NLPモデルの入力:one-hot表現→低次元ベクトルへの埋込み

また,seq2seq with attention でも,埋め込み自体も埋め込み層として学習する.また,Transformerだと埋め込み層ではなく,決め打ちのサイン関数による位置符号化を用いる(※ ただしNLP以外でのTransformer応用では,トークン埋め込み層を学習するケースも多い).

ちなみに,(2015年以降の)現代では,seq2seq with attentionの「埋め込み層」や,Transformerの「位置符号化(サイン関数)」が,元トークンIDから表現ベクトルへの入力埋め込みを担当している.もっと言えば,『(言語)変換モデル全体とともに,単語表現も同時に学習する時代』になっている.ただし,同じ単語はいつも同じベクトル値で固定あった,コンテキストフリー(context free)word2vecGloVe時代の単語モデルと異なり,近年の事前学習する「大規模言語モデル(BERT,GPTなど)」では,周辺のトークン群のコンテキストに沿って各トークンのベクトル値が変化するコンテキスト(contextual)単語表現であることには注意である.

※ この記事はone-hot表現の記事なので,この話はこれ以上論じない

4. まとめ

one-hotベクトル表現について,ディープニューラルネットワークの始点で紹介した.3節でビジョンの視点とNLPの始点で,それぞれモデル入出力のどこでどの場合にone-hot表現を用いるかを整理した.

モデル出力としては,特に「softmax出力」として,CNNRNNTransformerなどで用いられる.要は「クラス識別のsoftmax層で,one-hot表現を用いる」ということである.

モデル入力としては,かつてNLPのディープラーニングにおいて,単語埋込み(word2vec系)でone-hot表現が用いられていた.その近年の発展型である「Transformerによる系列変換」や,「BERT/GPTなどの(事前学習)言語モデル」においても,入力トークンにOne-hotベクトル表現が用いられ,埋め込み層もしくは位置符号化で,低次元のトークン表現へと写像するという点を整理した.

逆に言うと,コンピュータビジョンでは,(NLP発の)Transformer隆盛になってきたことで,またBag-of-wordsでSIFT局所特徴をコードブック化した時と同じく,またもや「Region 入力や局所パッチ入力を,トークン化 = code book化する」というNLPの後追い展開になっっているとも取れよう.まさに「歴史は繰り返す」である.

関連書籍

References

参照外部リンク