ユーザーが自分の好きなメニューを入力すると、好みに合いそうな類似メニューを提案してくれる、おすすめ料理アプリを開発しているとします。あなたは、料理の類似性を予測できる機械学習(ML)モデルを開発し、質の高いおすすめができるアプリにしたいと考えています(例: 「パンケーキがお好きでしたら、クレープをおすすめします」)。
モデルをトレーニングするために、ボルシチ、ホットドッグ、サラダ、ピザ、シャワルマなど、人気のあるメニュー 5,000 品目を集めたデータセットを作成します。

データセット内の各メニュー項目をワンホット エンコーディングで表現する meal
の特徴量を作成します。エンコードとは、モデルをトレーニングするために、データの初期の数値表現を選択するプロセスを指します。
![図 2. 上: ボルシチのワンホット エンコーディングの可視化。
ベクトル [1, 0, 0, 0, ..., 0] が、左から右へと並ぶ 6 個のボックスの上に表示されており、それぞれのボックスがベクトル内の数値と対応しています。ボックスには左から順に、ボルシチ、ホットドッグ、サラダ、ピザ、[空]、シャワルマの画像が表示されています。中央: ホットドッグのワンホット エンコーディングの可視化。
ベクトル [0, 1, 0, 0, ..., 0] が、左から右へと並ぶ 6 個のボックスの上に表示されており、それぞれのボックスがベクトル内の数値と対応しています。ボックスには、上のボルシチの可視化と同じ順番で、左から右へと同じ画像が並んでいます。下: シャワルマのワンホット エンコーディングの可視化。ベクトル [0, 0, 0, 0, ..., 1] が、左から右へと並ぶ 6 個のボックスの上に表示されており、それぞれのボックスがベクトル内の数値と対応しています。ボックスには、ボルシチとホットドッグの可視化と同じ順番で、左から右へと同じ画像が並んでいます。](https://developers.google.cn/static/machine-learning/crash-course/embeddings/images/food_images_one_hot_encodings.png?authuser=0&hl=ja)
スパースデータ表現の注意点
これらのワンホット エンコーディングを確認すると、このデータ表現にはいくつかの問題があることがわかります。
- 重みの数。入力ベクトルが大きいと、ニューラル ネットワークにとって膨大な数の重みが必要になります。ワンホット エンコーディングに M 個のエントリがあり、入力後のネットワークの最初のレイヤに N 個のノードがある場合、モデルはそのレイヤに対して MxN 個の重みをトレーニングしなければなりません。
- データポイントの数。モデルの重みが多いほど、効果的なトレーニングを行うためには、より多くのデータが必要になります。
- 計算量。重みが多いほど、モデルをトレーニングし、使用するために必要な計算量も増加します。ハードウェアの能力を超えてしまう可能性も高くなります。
- メモリの量。モデルの重みが多いほど、それをトレーニングして提供するアクセラレータに必要なメモリも増加します。これを効率よくスケーリングするのは非常に困難です。
- オンデバイス機械学習(ODML)の対応の難しさ。ML モデルをサーバーなどで提供するのではなく、ローカル デバイス上で実行したいと考えている場合は、モデルを小さくすることに重点を置き、重みの数を減らす必要があります。
このモジュールでは、このような問題に対処するために、スパースデータの低次元表現であるエンベディングを作成する方法を学びます。