機械学習ゴリゴリ派のための数学とPython
data analytics showcase Sapporo
2017/7/1
シルバーエッグ・テクノロジー(株)
加藤公一
1
今日の話
• 自己紹介・会社紹介
• 技術的な話(ゴリゴリ派向け)
– 機械学習アルゴリズム実装のためのスキルについて
– 数値計算の知識、Pythonの知識
• まとめ
2
自己紹介
加藤公一(かとうきみかず)
シルバーエッグ・テクノロジー(株)
チーフサイエンティスト
博士(情報理工学)、修士(数理科学)
仕事:
レコメンデーションシステムに関する研究開発
趣味:筋トレ
特技:ベンチプレス
著書(共著)
訳書(共訳)
データサイエンティスト養成読本
機械学習入門編
科学技術計算 ため Python
―確率・統計・機械学習
3
会社紹介
≪書籍≫
『One to Oneマーケティングを超えた
戦略的Webパーソナライゼーション』
(出版社:日経BP社 発売:2002年5月)
弊社代表トーマス・フォーリーの著書です。
≪受賞歴・メディア掲載≫
社名 :
設立 :
代表者 :
資本金 :
事業内容:
所在地 :
シルバーエッグ・テクノロジー株式会社
1998年8月
代表取締役兼CEO トーマス・フォーリー
242百万円 (2016年10月26日現在)
人工知能技術をベースとした、
リアルタイムレコメンドサービスおよび
ターゲティング型広告サービスの提供。
【大阪本社】
〒564-0063 大阪府吹田市江坂町1-23-43
ファサード江坂ビル10F
【東京オフィス】
〒102-0072 東京都千代田区飯田橋2-6-6
ヒューリック飯田橋ビル5F
スマートターゲティング技術で、リアルタイムレコメンドサービス『アイジェント・レコメンダー』、
ダイナミック広告サービス『HotView』を提供しています。
2016年9月 東京証券取引所マザーズ市場上場
4
ベイジアン
協調フィルタリング
閲覧情報
購買情報
アイジェント・レコメンダーの仕組み
最先端テクノロジーとリアルタイム相関生成で、どこよりも質の高いレコメンドを実現します。
また、レコメンドレシピ設定によりサイトに合わせたレコメンドサービスの提供が可能です。
リ
ア
ル
タ
イ
ム
性
ユ
ー
ザ
ー
導
線
分
析
レ
コ
メ
ン
ド
レ
シ
ピ
カーネル法
強化学習
※P7以降に詳細
5
ユーザーのセッション毎に
レコメンドする商品を計算すること
① ユーザーの「今、その時の」関心をすぐにレコメンドに反映することが出来る
② 新着商品に対して新着当日からレコメンドを表示することが出来る
③ 新着当日から、レコメンド枠に新着商品を表示することが出来る
④ 例えば、TVに取り上げられ注目が集まっている「今」を反映することが出来る
リアルタイム =
リアルタイム性
6
商品B 商品C 商品E
商品F
商品G
ドレープ
ワンピース
商品J
商品M
ボーダー
ニット
商品O
Aさんは恐らく
“ワンピース”を
探しているので、
この商品をおすすめ
Bさんは
“ボーダーのアイテム”
に関心がありそう
なのでこの商品を
おすすめ
商品I
ホーダー
ワンピース
ユーザー導線分析(パス・ディペンデンシー)
過去の閲覧経路を考慮し、店頭での接客のようなユーザーの嗜好にあった商品のレコメンドを実現します。
例えば「ボーダーワンピース」という同じ商品を見ている場合でも、そこに至る過程で“ワンピース”を探している人、
“ボーダーのアイテム”を探している人とでは嗜好性が異なります。
弊社のユーザー導線分析を利用することで未購入ユーザーに対してもパーソナルなレコメンドが実現できます。
商品L
商品H
商品D
商品N
ユーザーA
ユーザーB
商品A
水玉
ワンピース
商品K
ボーダー
リブ
セーター
7
事例
詳しく 弊社ホームページ( http://siilveregg.co.jp )から「ケーススタディ」参照
8
製品の特徴
• コミッション制(レコメンド経由売上比例)
• リアルタイムなデータ反映(オンライン学習)
– 新発売の商品の即時反映
9
メカニズム
お客様サイト
「誰が何を買ったか」
「誰が何を見ているか」
AIgentサーバ
「何を推薦すべきか」
特徴:
• リアルタイム レスポンス
• アドオンとして実装(導入コストでメリット)
Aigentに接続するため
コードスニペット(JavaScript)
+
蓄積して分析
リアルタイム処理
ASPサービス
在庫情報 バッチ更新
10
アルゴリズムについて
• ヒット率(precision/recall)大事
• オンライン学習であることを重視
• サーバ運用コストも大事
• それらのトレードオフ
11
私の仕事
• 論文等に書かれた新しいアルゴリズムは片っ端か
ら試す
• 計算時間がどのくらい?運用のコストは?という
ことを含めて総合的に判断しての「よい」アルゴ
リズムを選定
• 個別顧客へのチューニングではなく、全体へのチ
ューニング
12
機械学習の影響で…
• 数学を勉強する大人が増えている
• 数学的な本が人気
– 高校数学や線形代数のやりなおしのための本
– 数学的原理から書いた機械学習実装本
• 空前の数学ブーム?
• しかし「数学の教科書」だけの知識では機械学習
アルゴリズムの実装は難しい
数学 知識 ≠ 数値計算 知識
14
例:線形回帰
モデル:
:データ行列
:目的変数 実測値
とすると、最尤推定
これを実装してみよう!
15
逆行列の計算、本当に必要?
• アルゴリズム上は逆行列が書いてあっても、多く
の場合実際にやりたいことは「線形方程式を解く
」こと
• 「逆行列を求める」と「線形方程式を解く」では
計算コストと誤差が全然違う
を計算する
を計算する
16
ベンチマーク
17
例:微分の計算
とき x=1で 極限を計算してみる
>>> f = lambda x: x**2
>>> df = lambda x,h: (f(x+h) - f(x)) / h
>>> df(1, 0.001)
2.0009999999996975
>>> df(1, 1e-10)
2.000000165480742
>>> df(1, 1e-15)
2.220446049250313
>>> df(1, 1e-20)
0.0
!
18
なぜこうなるか?
差 小さい数 引き算 有効な桁数が失われる
1.000000012
1.000000001-)
0.000000011
有効桁数10ケタ
いわゆる「桁落ち」現象
結果 3ケタしか有効でない
例:
19
解決策
数値微分 しない!(関数 式がわかってるなら)
関数 式 わかってるけど複雑な で微分がめんどくさい場合 ?
→ シンボリックな計算ツール(例え Sympy)を使う
20
例:softplus関数
とき
式通りに実装してf(1000)を求めると…
Warningが出て、計算結果 無限大
21
どうするか?
問題点:
最終的な計算結果 小さい値でも、計算 途中で大きすぎる
数になり、コンピュータ 無限大とみなしてしまう
数学的同値変形:
xが大きいとき こ 方がよい
と定義しなおす
22
数値計算での注意点
• 計算機での内部表現には必ず誤差があり、誤差の
影響が無視できないケースがある
– 差が小さい数の引き算は特に注意
– 回数の多いループの中での誤差の積み上げに注意
• 最終的な計算結果は小さくても、計算途中で巨大
な数になる場合に注意
• 計算手法によって、速度や安定性が違う
– 問題に摂動を与えたときの解の振る舞いに注意
23
つまり…
「機械学習に興味を持った で、
まず 数学から勉強し直したいです」
「す らしい!ぜひやってください!」
「線形代数まで勉強した で、これで っちり
実装できます ?」
「ちょっと待って。数値計算 基本を抑えて
おいた方がいいかもです。」
24
Pythonの計算速度
• 機械学習の世界ではPythonがよく使われている
• 速くて便利なライブラリが充実しているのがその
理由
• でも、自分でアルゴリズムを実装すると遅いんじ
ゃないの?
25
やってはいけない
s = 0
for i in range(1, 100000001):
s += i
print(s)
1から1億まで 和を計算する
これ Python的な書き方で ない
26
ちょっとましな実装
s = sum(range(1, 100000001))
print(s)
1から1億を返すイテレータを用意し、そ 和を計算する
27
一番速い実装
import numpy as np
a = np.arange(1, 100000001, dtype=np.int64)
print(a.sum())
1から1億が入った配列を用意し、そ 和を計算する
28
ベンチマーク
s = 0
for i in range(1, 100000001):
s += i
print(s)
s = sum(range(1, 100000001))
print(s)
30.21秒
12.33秒
0.38秒
import numpy as np
a = np.arange(1, 100000001, dtype=np.int64)
print(a.sum())
29
ベンチマーク
s = 0
for i in range(1, 100000001):
s += i
print(s)
s = sum(range(1, 100000001))
print(s)
30.21秒
12.33秒
0.38秒
import numpy as np
a = np.arange(1, 100000001, dtype=np.int64)
print(a.sum())
30
もっと実用的な例
が与えられたときに
を計算したい
(実際なにか 論文でこういう計算があった…)
どうするか?
(もちろんfor文を使う 論外)
31
計算例1:数学的同値変形
とすれ
32
計算例2:Numpyの機能を利用
とき
を利用すると
Numpy ブロードキャスト機能:
R = np.dot(B * a, C)
33
まとめ
• 数学の知識は大事
• 数値計算の知識も大事
– 数学ができれば学習コストは低い
• Pythonの気持ちになってコードを書こう

機械学習ゴリゴリ派のための数学とPython