ニューラルネットワークの埋め込みを理解する
ニューラルネットワークの埋め込みを理解する
ベクターデータベース](https://frankzliu.com/blog/a-gentle-introduction-to-vector-databases)やMLアプリケーション開発に関する以前のブログ記事で、エンベッディング/エンベッディングベクターについて触れましたが、エンベッディングや、エンベッディングモデルがどのように機能するかの背景にある理論については、まだ深く掘り下げていませんでした。そのため、この記事では、エンベッディング/エンベッディングベクターについて、最新のMLアルゴリズムやパイプラインでどのように使われているのか、もう少し掘り下げて解説します。
この記事には、ディープラーニングとニューラルネットワークの中級知識が必要です。まだそこまで達していないのであれば、まずGoogle's ML Crash Courseを見てみることをお勧めする。このコースの内容は、CVやNLPのためのニューラルネットワークの基礎を理解するのに最適です。
簡単なまとめ
埋め込みによるデータのベクトル化[1]は、要は次元削減の手法である。伝統的な次元削減法 - PCA, LDA など。- 線形代数、カーネルトリック、その他の統計的手法を組み合わせてデータを「圧縮」する。一方、最新のディープラーニング・モデルは、入力データを潜在空間、つまり近傍の点が意味的に類似したデータ点に対応する入力データの表現にマッピングすることで次元削減を行う。例えば、以前は1つの単語やフレーズを表す1ホットのベクトルであったものが、今ではかなり次元の低い密なベクトルとして表現できる。Towheeライブラリ](https://github.com/towhee-io/towhee)を使えば、このことを実際に見ることができる:
pip install towhee # pip3
python # python3
>>> import towhee
>>> text_embedding = towhee.dc(['Hello, world!']) \....
... .text_embedding.transformers(model_name='distilbert-base-cased') \... .to_list([0])
... .to_list()[0].
...
>> 埋め込み #句読点と開始・終了トークンを含む
array([[ 0.30296388, 0.19200979, 0.10141158, ..., -0.07752968, 0.28487974, -0.06456392]、
[ 0.03644813, 0.03014304, 0.33564508, ..., 0.11048479, 0.51030815, -0.05664057],
[ 0.29160976, 0.43050566, 0.46974635, ..., 0.22705288, -0.0923526 , -0.04366254],
[ 0.14108554, -0.00599108, 0.34098792, ..., 0.16725197, 0.10088076, -0.06183652],
[ 0.35695776, 0.30499873, 0.400652 , ..., 0.20334958, 0.37474275, -0.19292705],
[0.6206475 , 0.50192136, 0.602711 , ..., -0.03119299, 1.1860386 , -0.6167787 ]], dtype=float32)
ディープニューラルネットワークに基づく埋め込みアルゴリズムは、伝統的な次元削減手法よりも強いと考えられています。これらのエンベッディングは、コンテンツ推薦、質問応答、チャットボットなど、様々なアプリケーションで業界でますます頻繁に使用されています。後述するように、ニューラル・ネットワーク内で画像やテキストを表現するためにエンベッディングを使用することも、近年ますます一般的になってきています。
DistilBERTによって生成された埋め込みテキストの可視化。"foot "はどちらの単語にも共通するにもかかわらず、"football "が "footwear "よりも "soccer "にかなり近いことに注目](https://assets.zilliz.com/2022_05_09_11_54_54_bb76a19677.png)
教師あり埋め込み
これまでの私の記事では、教師あり学習で学習されたモデル、つまり、ラベル付き/注釈付きデータセットから学習されたニューラルネットワークモデルからの埋め込みを使ってきました。例えば、ImageNetデータセットは、画像からクラスへのマッピングのキュレーションセットを含んでいます。一方、SQuADのような質問応答データセットは、異なる言語における1:1の文のマッピングを提供します。
ラベル付きデータで訓練された多くの有名なモデルは、cross-entropy lossや平均二乗誤差を使用する。教師あり学習の最終目標は、入力データとアノテーション間の1:1マッピングを多かれ少なかれ再現すること(例えば、入力画像が与えられた場合のクラストークンの確率を出力する)であるため、教師ありモデルから生成された埋め込みは出力層をほとんど使用しません。例えば、ImageNet-1kで学習された標準的なResNet50モデルは、入力画像がN番目のクラスラベルのインスタンスである確率に対応する1000次元のベクトルを出力します。
LeNet-5は、コンピュータビジョンのための最も初期のニューラルネットワークアーキテクチャの1つである。Image by D2L.ai, CC BY-SA 4.0.](https://assets.zilliz.com/lenet_vert_f78240b6f3.svg)
その代わりに、最新のアプリケーションのほとんどは、埋め込みとして活性化の最上位レイヤーを使用します。上の画像(LeNet-5)では、「FC (10)」(10次元出力層)と「FC (84)」と書かれた層の間の活性度に相当します。この層は入力データのセマンティクスを正確に表現するのに十分なほど出力に近く、また適度に低次元である。私は、モデルのもっと前の層からプールされた活性化を使っているコンピュータ・ビジョン・アプリケーションも見たことがある。これらの活性化は、入力画像の低レベルの特徴(コーナー、エッジ、ブログなど)をキャプチャし、ロゴ認識などのタスクのパフォーマンスを向上させます。
エンコーダと自己監視
注釈付きデータセットを使うことの大きな欠点は、注釈を必要とすることである(これは少し馬鹿馬鹿しく聞こえるが、ここで我慢してほしい)。特定の入力データセットに対して高品質なアノテーションを作成するには、1人または多くの人間による数千時間とは言わないまでも、数百時間のキュレーションが必要である。例えば、ImageNetの全データセットには約22,000のカテゴリーが含まれており、キュレーションには25,000人の人間が必要だった。さらに問題を複雑にしているのは、多くのラベリングされたデータセットには、キュレーションされた結果に意図しない不正確さ、完全なエラー、またはNSFWコンテンツが含まれていることがよくあることだ。このようなインスタンスの数が増えるにつれて、教師あり学習で訓練された埋め込みモデルによって生成される埋め込みの品質は著しく低下します。
Unsplashデータセットから "Hope "とタグ付けされた画像。人間にとって、これは非常に理にかなった記述だが、学習中にモデルが間違った種類の特徴を学習してしまう可能性がある。写真:Lukas L. ](https://assets.zilliz.com/photo_1511519991062_53acadf7be18_215beb82dc.jpeg)
一方、教師なし方式で学習されたモデルは、ラベルを必要としない。日常的に生成される膨大な量のテキスト、画像、音声、動画を考えると、この方法で学習されたモデルは、基本的に無限の学習データにアクセスできる。ここでのコツは、このデータを活用するための適切なタイプのモデルとトレーニング手法を開発することである。これを行うための非常に強力で一般的になりつつある方法は、オートエンコーダ(または一般的なエンコーダ/デコーダ・アーキテクチャ)である。
オートエンコーダーには一般的に2つの主要コンポーネントがある。最初のコンポーネントはエンコーダーで、あるデータを入力とし、それを固定長のベクトルに変換する。2つ目のコンポーネントはデコーダで、ベクトルを元のデータにマップする。これはエンコーダー・デコーダー・アーキテクチャーとして知られている[1]:
エンコーダー・デコーダー・アーキテクチャーの図。Image by D2L.ai, CC BY-SA 4.0.](https://assets.zilliz.com/encoder_decoder_1a8a0477a5.svg)
EncoderとDecoderに対応する青いボックスはどちらもフィードフォワード・ニューラルネットワークであり、State`は埋め込みたいデータです。多くの画像オートエンコーダーは、エンコーダーネットワークに標準的なResNet50やViTを使い、デコーダーにも同様に大きなネットワークを使います。
オートエンコーダは、入力を潜在状態にマッピングし、その後元のデータに戻すように学習されるため、教師なしまたは自己教師ありの埋め込みは、完全な教師ありで学習されたモデルの中間層とは対照的に、エンコーダの出力層から直接取得されます。そのため、自己エンコーダの埋め込みは、再構成 [2]にのみ使用されます。言い換えれば、それらは入力データを表現するために使用することができますが、一般的に、猫の写真と犬の写真を区別するものなどのセマンティクスを表現するのに十分強力ではありません。
近年、伝統的なオートエンコーダを超える、自己教師に対する数多くの改良が行われている[3]。NLPの場合、文脈、すなわち単語や文字が同じ文やフレーズ内の他のものと比較してどこに現れるかを使ってモデルを事前学習することは一般的であり、現在では最先端のテキスト埋め込みモデルを学習するための事実上の手法と考えられている[3]。データ増強に依存する対照的な学習技術は、一般的なコンピュータビジョンタスクに適用された場合、素晴らしい結果を示している。SimCLRとdata2vecは、自己教師あり学習のためにマスキングや他の補強を利用するニューラルネットワークの2つの例です。
SimCLRの図解。上の図の「表現」層は、畳み込みニューラルネットワークによって生成された埋め込み、つまり中間状態に対応する。画像はGoogle Researchによる](https://assets.zilliz.com/image4_fba49fee9c.gif)
他のモデルへの入力としての埋め込み
エンベッディング・モデルは非常にユニークで、汎用的なアプリケーション開発にとって価値があるだけでなく、その出力が他の機械学習モデルで使われることも多い。ビジョン・トランスフォーマーはその好例です。その人気は、強力な性能と従来の畳み込みニューラルネットワークでは利用できなかった大きな受容野に助けられ、ここ2年で爆発的に高まっている。ビジョン変換器の核となる前提は、画像を正方形のパッチに分割し、各パッチの埋め込みを生成し、その埋め込みを標準的な変換器の入力として使用することである。これは驚くことに、画像認識に非常に有効である。
もう一つの素晴らしい例は、OpenAIのCLIPで、画像と自然言語をマッチングするように訓練された大規模なニューラルネットワークモデルです。CLIPは、例えばFlickrの写真とそれに対応する写真のタイトルなど、インターネットからの基本的に無限のデータで訓練されている。
エンコーダーとそれに対応する埋め込みは、OpenAIのCLIPモデルで効果的に使用されている。画像:OpenAI、CC BY-SA 4.0.](https://assets.zilliz.com/CLIP_c48a7be6e9.png)
CLIPの背後にある方法論は、実際にはかなり単純です。まず、CLIPは画像とテキストを潜在的な状態(つまり埋め込み)にマッピングします。これらの潜在的な状態は、同じ空間*にマッピングされるように学習されます。MLに関して言えば、悪魔は細部に宿るものであり、CLIPを実際に実装するのは、大規模なデータセットといくつかのハイパーパラメータのチューニングなしではかなり困難です。
CLIPは、OpenAIのテキスト画像生成エンジンであるDALLE(およびDALLE-2)のコアコンポーネントとして使用されている。最近、DALLE-2が話題になっているが、CLIPの表現力なしには実現できなかっただろう。CLIPとDALLEの成果は印象的ですが、画像埋め込みにはまだ大きな成長の余地があります。オブジェクト数や数学演算など、より高度なセマンティクスを画像埋め込みで表現することはまだ困難です。
エンベッディングの生成
Towhee](https://github.com/towhee-io/towhee)オープンソースプロジェクトは、エンベッディングの生成や、エンベッディングを必要とするアプリケーションの開発に利用できます。Towheeは、様々なソース(timm, torchvision, etc...)から、様々な異なる手法で学習された、何百もの画像埋め込みと分類モデルをラップしています。Towheeはまた、🤗のTransformersライブラリのおかげで、多くのNLPモデルも持っています。
Towheeがこれらの埋め込みをどのように生成しているのか、一歩下がって覗いてみましょう。
>>> from towhee import pipeline
>> p = pipeline('image-embedding')
>> embedding = p('towhee.jpg')
Towhee](https://github.com/towhee-io/towhee)では、教師ありモデルから埋め込みを生成するデフォルトの方法は、単純に最後の分類または回帰レイヤーを削除することです。PyTorchモデルの場合、以下のコード例でそれを行うことができます:
>> import torch.nn as nn
>> import torchvision
>> resnet50 = torchvision.models.resnet50(pretrained=True)
>> resnet50_emb = nn.Sequential(*(list(resnet50.children())[:-1]))
上記のコードスニペットの最後の行は、最終層([:-1])を除く、resnet50の全層(resnet50.children())から構成されるフィードフォワードネットワーク(nn.Sequential)を再作成しています。中間埋め込みも、同じレイヤ除去方法で生成することができる。このステップは、contrastive/triplet lossやautoencoderとして学習したモデルでは不要である。
timm(CV用) やtransformers` (NLP用) に基づくモデルも、特徴抽出を簡単にする独自のメソッドを保持している:
>>> np として numpy をインポートする。
>> import numpy as np >> from PIL import Image
>>> import timm
>> image = numpy.array(Image.open('towhee.jpg'))
>> model = timm.models.resnet50(pretrained=True)
>> embedding = model.forward_features(img)
>> from transformers import AutoTokenizer, AutoModel.
>> tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
>> model = AutoModel.from_pretrained('bert-base-uncased')
>> inputs = tokenizer('Hello, world!', return_tensors='pt')
>> outputs = model(**inputs)
>> embedding = outputs.last_hidden_state()
Towhee は timm と transformers のラッパーを保持している:
>>> import towhee
>> text_embedding = towhee.dc(['Hello, world!']) \.
... .text_embedding.transformers(model_name='distilbert-base-cased') ୧...
... .to_list()[0] # イントロの例と同じ
...
>>> img_embedding = towhee.glob('towhee.jpg') \.
... .image_decode()
... .image_embedding.timm(model_name='resnet50') \... .to_list()
... .to_list()[0].
...
その他のリソース
エンベッディングに関する他の素晴らしいリソースを短く、そして非常に不完全なリストとしてまとめました:
1.1.Milvusドキュメントは、埋め込みベクトル(ストレージとベクトルデータベースに関連して)の概要を提供しています。
2.OpenAIがtext embeddingsのページを公開しているので、チェックしてみてください。
3.Will Koehrsenは、エンベッディングの素晴らしい概要を提供しています。少し古い(2018年)ですが、それでも素晴らしいリソースです。
4.エンベッディングがどのように使われているかは、Twitterを参照してください。
5.逆画像検索は、埋め込みベクトルの多くの応用例の一つです。
この投稿があなたのお役に立ちましたら、Twitterでのフォローをご検討ください。次回の投稿では、類似検索とベクトルインデキシングアルゴリズムの概要を説明します。ご期待ください!
脚注
1.D2L.ai](https://github.com/d2l-ai/d2l-en)からの引用。CC BY-SA 4.0ライセンス。
2.入力再構成はかなり複雑な問題である。例えば、入力写真の顔のディテールを保持する埋め込みを生成することは望ましい機能ですが、「一般的な」オートエンコーダはそれを行うことが困難です。
3.画像全体のパッチやクロップも、技術的にはコンテキストを持っています。コンテキストを理解するアルゴリズムとモデルは、インペインティングとして知られるコンピュータビジョン/グラフィックスのサブフィールドにとって極めて重要です。コンピュータ・ビジョンのアプリケーションのための事前学習技術は、まだそれほど成功していませんが、近い将来、より現実的なものになるでしょう。この2021年の論文は、オートエンコーダのマスキング・パッチがどのようにビジョン変換器の事前学習に使用できるかを示している。
Frank LiuDirector of Operations & ML Architect at ZillizFrank Liu is the Director of Operations & ML Architect at Zilliz, where he serves as a maintainer for the Towhee open-source project. Prior to Zilliz, Frank co-founded Orion Innovations, an ML-powered indoor positioning startup based in Shanghai and worked as an ML engineer at Yahoo in San Francisco. In his free time, Frank enjoys playing chess, swimming, and powerlifting. Frank holds MS and BS degrees in Electrical Engineering from Stanford University.





