こんにちは、技術開発ユニットの矢澤です。
私が個人的に興味を持っている分野として、データ間の類似度の分析というものがあります。 例えば、Aさんと趣味嗜好が似ているBさんの購買履歴がわかった場合、Aさんにも同じような商品をレコメンドすれば買ってもらえる可能性が高いと考えられます。 また他にも、ある商品のパッケージ画像に似ている別の商品を見つけたり、顔画像を比較して似ている芸能人を調べたり、個人の好みに合う動画や音楽を簡単に見つけたり、行動履歴から人同士の相性を調べたり、・・・と様々な応用の可能性があります。
データの類似度に基づくマーケティングは、協調フィルタリングなどのように昔から研究されてきた分野ではありますが、最近このような類似度モデルを簡単に作成できるパッケージとしてTensorFlow Similatiy(以下「TF Similarity」)というものが公開されました。 TF Similarityは、TensorFlowを使用した対照学習モデルの一つで、TensorFlowの詳細や深層学習にあまり詳しくなくても、数行のソースコードでモデルの学習・推論を行うことができます。
そこで今回は、このTF Similarityについて、リリース記事を参考に概要をまとめてみたいと思います。
※ 既にQiitaの記事を投稿されている方がいらっしゃるようでしたが、自学のために改めて内容を翻訳しました。
TF Similarityとは
TF Similarityは、類似性モデルを簡単かつ高速に学習するためのPythonパッケージであり、2021/9にGoogleから初版がリリースされました。
関連項目を検索できることによって、様々な活用が考えられます。
実世界でのアプリケーション
- 似ているファッションの検索
- 再生中の曲の特定
- 迷子のペットの救出
一般的な情報システムのコア技術
- マルチディア検索
- レコメンド
- クラスタリング処理
実現方法
上記のようなシステムの多くは、対照学習を使った深層学習モデルによって実現されています。 対照学習では、似ているデータ(記事の例では同じ品種の動物画像)同士が近くに、似ていないデータ(異なる品種の動物画像)が遠くになるような埋め込み空間が作成されます。
データセットが与えられると、モデルは対照損失(contrasive loss)によって埋め込み空間への投影方法を学習し、データ間の距離が類似度を表すようなクラスタリング空間が最終的に得られます。 Oxford- IIIT Petデータセットで学習されたモデルでは、上述の通り見た目が似ている品種が近く、猫と犬のように異なる動物がはっきりと分かれているようなクラスタができます。
利点
TF Similarityでは、検索対象となる埋め込みデータのインデックスを構築することで、高速近似最近傍探索法(ANN)によって劣線形時間で最近傍のデータを検索できるようになります。 このような高速な検索が可能なのは、学習した埋め込み空間内での距離が有効な距離尺度の関数となっているためで、これらの距離尺度は三角不等式を満たすため、高い精度で検索を行えます。
類似データ検索の別のアプローチとしてモデルによる特徴量抽出などが考えられますが、 正確な近傍探索手法を使わないと類似性モデルよりも精度が低くなってしまったり、正確な検索を行うためにはデータ数の二乗の時間 O(N**2) が必要になったりするなどのデメリットがあります。 それに対して、TF SImilarityのANN法はNMSLIBに基づいており、数百万のデータから似ているデータを一瞬で検索できます。
精度と速度以外の類似性モデルのメリットとして、新しいクラスを追加する際に再学習の必要がなく、代表的なデータの埋め込みを計算してインデックスに追加するだけで良いという点があります。 クラスを動的に追加できることは、特にデータのクラス数が事前に分かっていなかったり、常に変化していたり、非常に膨大な場合に役立ちます(例:過去に好きだった曲に似ている新しい音楽を探したい)。
※ 劣線形時間アルゴリズムとは:全データを探索せずに一部のデータのみを見て処理できる O(n) のアルゴリズム(ここでnは全データ数Nではない一部のデータ数を表す)。計算時間がデータ量によらず一定の場合(O(1))を特に「定数時間」という。
※ 三角不等式とは:空間上の任意の3点について、二点間の距離の内、任意の二つの和が残りの一つよりも大きくなっていること(AB + AC ≧ BC, AB + BC ≧ AC, AC + BC ≧ AB) 。
※ NMSLIB(非距離空間ライブラリ)とは:類似検索手法の評価のためのライブラリおよびツールキット。Amazon Elastic Serviceでも使用されている。
実装
TF Similarityは、類似性モデルの評価や検索を簡単に行うためのインタフェースを、SimilarityModelというKerasモデルによって提供しています。 これによって、モデルの学習やインデックスの作成、検索の処理を効率的に書くことができます。
# MNISTデータのサンプリング sampler = TFDatasetMultiShotMemorySampler(dataset_name='mnist', classes_per_batch=10) # 類似性モデルの構築 inputs = layers.Input(shape=(28, 28, 1)) x = layers.Rescaling(1/255)(inputs) x = layers.Conv2D(64, 3, activation='relu')(x) x = layers.Flatten()(x) x = layers.Dense(64, activation='relu')(x) outputs = MetricEmbedding(64)(x) model = SimilarityModel(inputs, outputs) # 対象損失を使った学習 model.compile('adam', loss=MultiSimilarityLoss()) model.fit(sampler, epochs=5) # 検索のためのインデックス作成 sx, sy = sampler.get_slice(0,100) model.index(x=sx, y=sy, data=sx) # 類似データの検索 qx, qy = sampler.get_slice(3713, 1) nns = model.single_lookup(qx[0]) # クエリ画像と類似画像の可視化 viz_neigbors_imgs(qx[0], qy[0], nns)
上記のコードは十分に最適化されたモデルではないですが、それでもクエリと同じ数字画像を取得できます。
まとめ
TF Similariyの初版では、対照学習の類似モデルを構築するために必要な以下のような要素を全て提供することや、Keras APIの活用や既存のKerasアーキテクチャとの併用を簡単に行うことに注力しています。
- 損失
- インデックスの作成
- バッチサンプリング
- 距離尺度
- チュートリアル
将来的には、半教師学習や自己教師あり学習(BYOL, SWAV, SimCLRなど)のサポートも予定しているようです。
おわりに
今回はTF Similarityの紹介記事を基に、類似性モデルの概要や実装方法を説明しました。 次はチュートリアルやGitHubのREADMEを参考にして実装の詳細についてまとめたり、MNIST以外のデータでの活用を試してみたいと思います。