エンベディング

ユーザーが自分の好きなメニューを入力すると、好みに合いそうな類似メニューを提案してくれる、おすすめ料理アプリを開発しているとします。あなたは、料理の類似性を予測できる機械学習(ML)モデルを開発し、質の高いおすすめができるアプリにしたいと考えています(例: 「パンケーキがお好きでしたら、クレープをおすすめします」)。

モデルをトレーニングするために、ボルシチホットドッグサラダピザシャワルマなど、人気のあるメニュー 5,000 品目を集めたデータセットを作成します。

図 1. 5 種類の料理のイラストセット。左上から時計回りに、ボルシチ、ホットドッグ、サラダ、ピザ、シャワルマ。
図 1. 料理のデータセットに含まれるメニュー項目のサンプル。

データセット内の各メニュー項目をワンホット エンコーディングで表現する meal の特徴量を作成します。エンコードとは、モデルをトレーニングするために、データの初期の数値表現を選択するプロセスを指します。

図 2. 上: ボルシチのワンホット エンコーディングの可視化。
       ベクトル [1, 0, 0, 0, ..., 0] が、左から右へと並ぶ 6 個のボックスの上に表示されており、それぞれのボックスがベクトル内の数値と対応しています。ボックスには左から順に、ボルシチ、ホットドッグ、サラダ、ピザ、[空]、シャワルマの画像が表示されています。中央: ホットドッグのワンホット エンコーディングの可視化。
       ベクトル [0, 1, 0, 0, ..., 0] が、左から右へと並ぶ 6 個のボックスの上に表示されており、それぞれのボックスがベクトル内の数値と対応しています。ボックスには、上のボルシチの可視化と同じ順番で、左から右へと同じ画像が並んでいます。下: シャワルマのワンホット エンコーディングの可視化。ベクトル [0, 0, 0, 0, ..., 1] が、左から右へと並ぶ 6 個のボックスの上に表示されており、それぞれのボックスがベクトル内の数値と対応しています。ボックスには、ボルシチとホットドッグの可視化と同じ順番で、左から右へと同じ画像が並んでいます。
図 2. ボルシチ、ホットドッグ、シャワルマのワンホット エンコーディング。 各ワンホット エンコーディングのベクトルは長さ 5,000 で、データセット内の各メニュー項目に対応する 1 つのエントリを含みます。図中の省略記号は、表示されていない 4,995 のエントリを示しています。

スパースデータ表現の注意点

これらのワンホット エンコーディングを確認すると、このデータ表現にはいくつかの問題があることがわかります。

  • 重みの数。入力ベクトルが大きいと、ニューラル ネットワークにとって膨大な数の重みが必要になります。ワンホット エンコーディングに M 個のエントリがあり、入力後のネットワークの最初のレイヤに N 個のノードがある場合、モデルはそのレイヤに対して MxN 個の重みをトレーニングしなければなりません。
  • データポイントの数。モデルの重みが多いほど、効果的なトレーニングを行うためには、より多くのデータが必要になります。
  • 計算量。重みが多いほど、モデルをトレーニングし、使用するために必要な計算量も増加します。ハードウェアの能力を超えてしまう可能性も高くなります。
  • メモリの量。モデルの重みが多いほど、それをトレーニングして提供するアクセラレータに必要なメモリも増加します。これを効率よくスケーリングするのは非常に困難です。
  • オンデバイス機械学習(ODML)の対応の難しさ。ML モデルをサーバーなどで提供するのではなく、ローカル デバイス上で実行したいと考えている場合は、モデルを小さくすることに重点を置き、重みの数を減らす必要があります。

このモジュールでは、このような問題に対処するために、スパースデータの低次元表現であるエンベディングを作成する方法を学びます。