Fringe81 Advent Calendar 19日目です。
本記事は、Wide & Deep Learningの基本的な概念の理解をゴールにしており、実装の細かい話については触れません。
Wide & Deep Learningの詳細を知りたい方は以下のページを参照下さい。
- TensorFlow Wide & Deep Learning Tutorial
- Research Blog: Wide & Deep Learning: Better Together with TensorFlow
対象読者
- Python/TensorFlowで機械学習のモデリングをしている
- 高次元スパースなデータを扱っている
- 線形モデルとDeepLearningの良いところ取りをしたい
TensorFlowとは
以下の記事を参照下さい。
Wide & Deep Learningとは
端的に言うと、線形モデルとDNNをハイブリッドしたモデルです。
特に重要となってくる概念は、カテゴリ変数の疎表現(one-hotベクトル)と密表現(embedding)を同時に利用することができるということです。
スパース表現はカテゴリの記憶ベースな特徴量、密表現はカテゴリを一般化した特徴量としてそれぞれ異なる働きをするため、それらを合わせることでよりリッチな情報が出来上がります。
もちろん、カテゴリ特徴量だけでなく、普通の数値特徴量も合わせて扱うことが可能です。
適したタスク
カテゴリ変数が多く疎な入力データを扱うタスクで有効で、例としては以下のようなタスクが挙げられます。
- レコメンドシステム
- 検索
- ランキング学習
線形モデルx疎表現
食べ物の検索エンジンで「クエリ」と「食べ物」の関連度(-1<=y<=1
)を予測するモデルを例にして考えてみます。
線形モデルでこれを実現するには、クエリと食べ物のペアを交差カテゴリとしてone-hotベクトルを入力とします。
one-hotベクトルは、該当するカテゴリの次元に1が立って、それ以外の次元はすべて0になるので、非常にスパースなベクトルとなります。
この方法では、クエリと食べ物のペアの関連度を個々に記憶しているだけなので、前例の無いデータが対して予測ができないという問題があります。
Deepモデルx密表現
Deep Neural Networkでは、入力となるカテゴリを低次元の密表現(embedding vector)として扱い、カテゴリの潜在的な類似性を考慮することができます。
食べ物の検索エンジンの例において、クエリと食べ物を同じ低次元空間のベクトルを割り当てるモデルを考えてみます。
各クエリ・食べ物のEmbeddingは、以下の図のように潜在的に近しいカテゴリが類似したベクトル表現となるように学習されます。
このようにカテゴリを一般化することによって、初見のクエリx食べ物のペアについても関連度を計算できるようになり、より高度な予測が可能となります。
ただ、一般化はいつでも有効というわけではなく、例えば上の例において「豚骨 こってり ラーメン」のような具体的なクエリは明らかに「豚骨ラーメン」を指しているとわかるので、このような場合には一般化よりも記憶ベースの予測が確実になります。
Wide & Deep Learning
線形モデルとDeepモデルはそれぞれ一長一短があるので、線形モデルとDeepモデルを融合してしまえという発想で作られたのがWide & Deep Learningです。
Wide&Deepモデルでは、線形モデルの重みと、Deepモデルの重みを誤差伝搬法で同時に学習していきます。
これを自前で一から実装するとなると複雑で大変ですが、TensorFlowが提供するAPIを利用することで、簡単にWide&Deepモデルを組むことができます。
具体的な実装については別記事で書いていきたいと思います。