Python
機械学習
MachineLearning
DeepLearning
TensorFlow
OriginalFringe81Day 19

TensorFlowのWide & Deep Learningを直感的に理解する

Fringe81 Advent Calendar 19日目です。

本記事は、Wide & Deep Learningの基本的な概念の理解をゴールにしており、実装の細かい話については触れません。

Wide & Deep Learningの詳細を知りたい方は以下のページを参照下さい。

対象読者

  • Python/TensorFlowで機械学習のモデリングをしている
  • 高次元スパースなデータを扱っている
  • 線形モデルとDeepLearningの良いところ取りをしたい

TensorFlowとは

以下の記事を参照下さい。

Wide & Deep Learningとは

端的に言うと、線形モデルとDNNをハイブリッドしたモデルです。
特に重要となってくる概念は、カテゴリ変数の疎表現(one-hotベクトル)と密表現(embedding)を同時に利用することができるということです。
スパース表現はカテゴリの記憶ベースな特徴量、密表現はカテゴリを一般化した特徴量としてそれぞれ異なる働きをするため、それらを合わせることでよりリッチな情報が出来上がります。
もちろん、カテゴリ特徴量だけでなく、普通の数値特徴量も合わせて扱うことが可能です。

適したタスク

カテゴリ変数が多く疎な入力データを扱うタスクで有効で、例としては以下のようなタスクが挙げられます。

  • レコメンドシステム
  • 検索
  • ランキング学習

線形モデルx疎表現

食べ物の検索エンジンで「クエリ」と「食べ物」の関連度(-1<=y<=1)を予測するモデルを例にして考えてみます。
線形モデルでこれを実現するには、クエリと食べ物のペアを交差カテゴリとしてone-hotベクトルを入力とします。
one-hotベクトルは、該当するカテゴリの次元に1が立って、それ以外の次元はすべて0になるので、非常にスパースなベクトルとなります。

スクリーンショット 2017-12-19 18.00.45.png

この方法では、クエリと食べ物のペアの関連度を個々に記憶しているだけなので、前例の無いデータが対して予測ができないという問題があります。

Deepモデルx密表現

Deep Neural Networkでは、入力となるカテゴリを低次元の密表現(embedding vector)として扱い、カテゴリの潜在的な類似性を考慮することができます。
食べ物の検索エンジンの例において、クエリと食べ物を同じ低次元空間のベクトルを割り当てるモデルを考えてみます。

スクリーンショット 2017-12-19 18.21.35.png

各クエリ・食べ物のEmbeddingは、以下の図のように潜在的に近しいカテゴリが類似したベクトル表現となるように学習されます。

スクリーンショット 2017-12-19 18.50.26.png

このようにカテゴリを一般化することによって、初見のクエリx食べ物のペアについても関連度を計算できるようになり、より高度な予測が可能となります。
ただ、一般化はいつでも有効というわけではなく、例えば上の例において「豚骨 こってり ラーメン」のような具体的なクエリは明らかに「豚骨ラーメン」を指しているとわかるので、このような場合には一般化よりも記憶ベースの予測が確実になります。

Wide & Deep Learning

線形モデルとDeepモデルはそれぞれ一長一短があるので、線形モデルとDeepモデルを融合してしまえという発想で作られたのがWide & Deep Learningです。

スクリーンショット 2017-12-19 18.58.05.png

Wide&Deepモデルでは、線形モデルの重みと、Deepモデルの重みを誤差伝搬法で同時に学習していきます。
これを自前で一から実装するとなると複雑で大変ですが、TensorFlowが提供するAPIを利用することで、簡単にWide&Deepモデルを組むことができます。

具体的な実装については別記事で書いていきたいと思います。