企業が協調フィルタリングを使用して、必要なものを正確に学習する方法

UnsplashのJens Johnssonによる写真

AmazonやNetflixのような企業は、あなたが望むものを正確にどのように知っていますか?目を光らせているのは新しいスピーカーのセットであろうと、次のブラックミラーエピソードであろうと、予測アルゴリズムを使用することで、ものを販売する仕事は途方もなく効率的です。

しかし、私たち全員がジューシーな陰謀理論のように、いや、彼らは超能力者を採用していません。

彼らははるかに魔法のようなものを使います-数学。今日は、協調フィルタリングと呼ばれるアプローチを見ていきます。

協調フィルタリングとは正確には何ですか?

ジェレミーハワードがfast.aiの素晴らしいディープラーニングコースで言及しているように、最近では構造化されたディープラーニングモデルはあまり愛されていません。

おそらく次のようなものを見ることができないからでしょう:

ソース:https://cdn.vox-cdn.com/thumbor/NN7jTnph9VCkyyt2nrTFml3XbYw=/0x0:600x338/1200x800/filters:focal(252x121:348x217):no_upscale()/cdn.vox-cdn.com/uploads/chorus_image/ image / 57380619 / ezgif.com_gif_maker__1_.0.gif

しかし、協調フィルタリングのような構造化アルゴリズムは、現実の世界で最も頻繁に使用されているものです。 Amazonのページの下部に表示されるものは、購入するのに非常に魅力的であるように思われる理由です。

ソース:https://www.highspot.com/wp-content/uploads/Amazon_Recommended_Edit.png

協調フィルタリングは、基本原則に基づいて機能します。つまり、あなたは自分に似た人が好きなものを好む傾向があります。

アルゴリズムの仕事は、あなたと同じような習慣を買ったり見たりしている人を見つけ、その人に高い評価を与えたものを提案することです。

また、他の方法で回避することもできます。

アルゴリズムは、以前に高い評価を与えた別の製品に類似した製品を推奨できます。この類似性のチェックと比較はすべて、かなり単純な線形代数(行列演算)によって行われます。

ソース:https://johnolamendy.files.wordpress.com/2015/10/01.png

本当に簡単ですか?

そんなに早くない。ベクトルとドット積を投げ始める前に、推奨システムアルゴリズムが直面する重大な問題、コールドスタートの問題に対処しましょう。

ソース:https://thermex-systems.com/wp-content/uploads/portathaw-cold-start-system-on-heavy-dump-truck.jpg

協調フィルタリングは、次の2つの場合にうまく機能します。

  • 各顧客が好むものに関する多くのデータ(以前に高評価したものに基づく)
  • 各映画または製品がどのオーディエンスに対応するかについての多くのデータ(それを高く評価した人々のタイプに基づいて)。

しかし、あなたがあまり情報を持っていない新しいユーザーと新しい製品はどうですか?

ソース:https://1843magazine.static-economist.com/sites/default/files/styles/article-main-image-overlay/public/0312ILIN03-web.jpg

これらのシナリオでは協調フィルタリングはうまく機能しないため、他の方法を試してみる必要があります。一般的なソリューションには、メタデータの分析や、新規ユーザーにいくつかの質問に答えて初期設定を学習させることなどがあります。

出典:http://img.techiesparks.com/2015/07/apple-music-artists.png

さあ、クールなものに移りましょう

ほとんどの機械学習の問題と同様、最初にデータを確認することをお勧めします。これからは、映画と評価の例を使用します(主にfast.aiコースで使用されるmovielensデータセットに触発されます)。

ユーザーが映画に与えたスコアに対してユーザーのテーブルを作成することで、それを視覚化します。

各行はユーザーを表し、各列は映画を表します。

相互参照は、ユーザーが映画に割り当てた評価を示します(1〜5のスケールで、0は「見なかった」を意味します)。

ゼロを埋めることができれば、協調フィルタリングモデルを成功と見なします。これは、ユーザーがどのようなものであるか、映画がどのようなものであるかに基づいて、各ユーザーがどのように映画を評価するかを予測できることを意味します。

アルゴリズムについて説明します。ユーザー用と映画用の2つのマトリックスを設定します。これらは、埋め込み行列と呼ばれます。それらをW_u(ユーザー用)およびW_m(映画用)と呼びましょう。

各行列は、e次元のベクトル(基本的にサイズがeの配列)で埋められます。 eとは何ですか?これは、後で説明するマジックナンバーです。今のところ、eをお気に入りの自然数にしてください。

行と列の見出しを削除すると、上の表もマトリックスのように見えることに注意してください。これは偶然ではありません。行列の乗算に精通している場合、2 * 3行列と3 * 2行列を掛けると2 * 2行列になることがわかります。

行列の乗算の詳細については、Khan academyのこのプレイリストをご覧ください。

同じロジックを使用して、ムービーとユーザーの行列を乗算できます。ディメンションは、元のテーブルデータセットのサイズのマトリックスを提供するために正確に機能します(厳密には、そのうちの1つを転置する必要がありますが、実装の詳細は省略します)。

映画のマトリックスとユーザーマトリックスのエントリの値を学習できる場合、理論的には、2つを掛け合わせることで元のテーブルを取得できます。

私たちの根拠は、元のテーブルです。必要なのは、元のテーブルを返すために何らかの方法で乗算する数値(重みとも呼ばれる)を計算することです。

機械学習の神秘的な芸術を入力してください。

以下にその方法を示します。

  • まず、ムービーマトリックスとユーザーマトリックスの完全な乱数から始めます。
  • 次に、2つを乗算して、元のテーブルのように見える別の行列(この時点では完全にランダムです)を取得します。
  • 予測値をテーブルの実際の値と比較することにより、損失関数を定義します。これは基本的に、予測された評価が実際の評価からどれだけ離れているかを示す尺度です。

モデルが誰に対しても0の評価を予測しないようにするため、ゼロもスキップする必要があります。それはかなり役に立たないでしょう。

損失関数に関する詳細が必要な場合は、Siraj Ravalのビデオをお勧めします。

損失を見つけた後、逆伝播と勾配降下を使用して2つの行列を最適化し、適切な値を取得します。

ブーム!もう終わった!

わかりました、簡単な要約:

  • 各ユーザーが各映画に付けた評価の表があります。ユーザーが映画を見なかった場合、表には「0」と表示されます。ゼロを予測したいです。
  • そのために、ユーザー用と映画用の2つのマトリックスを作成しました。各マトリックスは基本的にe次元ベクトルの単なるスタックです。
  • 評価を予測するには、マトリックスを乗算して、テーブルに予測が含まれているのと同じ形状の別のマトリックスを取得します。最初は、テーブルには意味がありません。
  • しかし、損失関数を使用してミスを見つけ、逆伝播と勾配降下の動的なデュオを使用すると、ユーザーが映画に与える評価を正確に予測できるモデルができました。甘い。

わかりました…しかしなぜそれははたらきますか。

あなたが私のようなら、あなたはそれを手に入れます。しかし、あなたは本当にそれを得ません。これらのランダムな乗算はどのように心を読むのですか?元のテーブルを逆プロップしてゼロを埋めることができないのはなぜですか?なぜ2つの別々のマトリックスを調理する精巧なスキームを経てからテーブルを再構築するのですか?どうして?どうして?どうして?忍耐、若いバッタ。すべては力の意のままです。

「e」ミステリーに対処するつもりだと言ったことを覚えていますか?さて、今私は。

ソース:https://i.imgflip.com/1lai6f.jpg

作成した行列は、本質的にベクトルのスタックであったことを思い出してください。ユーザーごとに1つのベクトル、映画ごとに1つのベクトル。これは無意味な決定ではありませんでした。

各ベクトルは、対応するユーザーがどのような人物であるかを表しています。あなたの好き嫌い、あなたの考えと感情、あなたの希望と恐れをnumpy.array []に凝縮します。

これをよりよく理解するために、e = 3であると仮定して、特定のユーザーベクトルにズームインします。

ここで、ベクトルの3つのコンポーネントは[100、0、50]です。各コンポーネントはユーザーの特性を表し、マシンはユーザーの以前の評価を見て学習します。

3つのコンポーネントが次の意味を持つと仮定します(これは実際には正確ではなく、単なるアナロジーです)。

うまくいけば、ベクトルがユーザーの好みのアイデアをどのように表現しているかの感覚をつかむことができます。

したがって、上記の例では、私たちの良き友人uは明らかにアクション映画が好きで、ロマンス映画にはあまり興味がなく、コメディ映画も好きですが、アクション映画ほどではありません。

これが、機械学習モデルが人間の複雑さをどのように理解するかです-それをe次元のベクトル空間に埋め込むことによって。

したがって、eは選択した小さな数にすぎません(ハイパーパラメーターと呼ばれます)。大きければ大きいほど、ユーザーに関するより詳細な情報を取得できます。ただし、サイズを大きくしすぎると、計算に時間がかかりすぎます。

ちょっと待って。かっこよくなります。映画のベクターをご覧ください。

次に、コンポーネントの(人間が解釈した)意味を分析します。

私たちの大ヒット作、mは、主にロマンス映画であり、かなりのコメディが上に散らばっています。そして、映画を見たり、自分でレビューを読んだりすることなく、これらすべてを知っています!

どのタイプのユーザーが映画に高い評価と低い評価を与えたかを調べることで、アルゴリズムは映画の本質を表すベクトルを作成できるようになりました。

グランドフィナーレでは、この情報をどのように使用するかを検討します。ユーザーuと映画mがあります。両方ともベクトルです。 uがmに与える評価をどのように予測しますか?ドット積を使用します。

内積は、あるベクトルの成分と別のベクトルの成分を乗算し、結果を合計したときに得られるものです。結果はスカラーです(通常の、文字列のない、昔ながらのファッションの実数)。

したがって、この場合、uとmの内積は次のようになります。

わずか1350。まあ、すべては相対的です。しかし、2つのコンポーネントに0を掛けていなければ、かなり多くの数になっていたでしょう。

mをuに推薦するのは悪い考えであることは明らかです。実際、ひどい考えです。

モデルをさらに改善できる

実際の評価予測を取得するには、スケーリングされたシグモイド関数を介してスカラー値をスキッシュします。この関数は、結果を0〜5の範囲に制限します。

ソース:https://www.desmos.com/calculator/c4omt4vni3

あなたが私たちが行っているすべての手の波のトリックについて少し心配している場合、コンピュータがそれをすべて把握できるので安心してください。

実際、すべての評価が0より大きく5未満でなければならないことを明示的に伝えるなどのことを行うことで、作業を簡単にしています。

もう1つのトリックです。スカラー値(アクティベーションと呼ばれる)をシグモイド関数に取り込む前に、バイアスと呼ばれる小さな数bを追加できます。ユーザーごとに1つ、映画ごとに1つのバイアスがあります。

これらを積み重ねて、すべてのユーザーのバイアスベクトル(一緒に)、およびすべての映画のバイアスベクトル(一緒に)を取得します。偏見は、一部の映画が普遍的に愛される/嫌われること、および一部のユーザーが映画を愛する/嫌うことを一般的に説明しています。

そしてそれで、私はあなたにあなたの人生(または少なくとも、あなたのオンラインショッピング/視聴習慣)を制御できる方程式を提示します:

これはどういう意味ですか?

私にとって、このすべての最もクレイジーな部分は、私たちが人間の概念について話しているということです。アクション、ロマンス、コメディ、好き、嫌い。それらはすべて人間の考えです。そして、それらすべてを数学的なオブジェクトで伝えることができると考えるのは本当に魅力的です。

今ではすべてが本当に明確に定義されたアルゴリズムと人間のデータであることを知っています。しかし、行列乗算がコンピューターに私たちが個人として誰であるかを教えることができるという事実には、まだ驚くべきことがあると思います。

結局のところ、私たちを違うものにするすべてのもの-私たちが好きなもの、私たちがどのように見えるか、誰と時間を過ごすか、私たちはどこにいるのか、私たちはどう考えるか、私たちはどのように感じるか-を決定するマシンに買うもの、見るもの、話す相手、すること、時間を費やす場所、使わない場所は、すべて同じ線形ベクトル空間の要素です。

その中には美しさがあります。