DSP開発におけるSpark MLlibの活用

28
DSP開発におけるSpark MLlibの活用 棚橋 耕太郎 2015.11.27

Transcript of DSP開発におけるSpark MLlibの活用

Page 1: DSP開発におけるSpark MLlibの活用

DSP開発におけるSpark MLlibの活用

棚橋 耕太郎

2015.11.27

Page 2: DSP開発におけるSpark MLlibの活用

自己紹介棚橋耕太郎 新卒1年目エンジニア

バックグラウンド: 高分子物性(統計力学理論, 計算機シミュレーション)

現在の業務: DSPなど, アドテクまわりの機械学習バッチの開発, 量子アニーリングを用いた機械学習アルゴリズムの研究開発(共同研究)

Page 3: DSP開発におけるSpark MLlibの活用

発表の概要

• DIMSUM - 類似商品の高速な近似計算

• word2vec - 単語の特徴ベクトル作成

• Splash - 分散word2vecの学習の高速化

Page 4: DSP開発におけるSpark MLlibの活用

発表の概要

• DIMSUM - 類似商品の高速な近似計算

• word2vec - 単語の特徴ベクトル作成

• Splash - 分散word2vecの学習の高速化

Page 5: DSP開発におけるSpark MLlibの活用

広告アイテムの推薦

item-itemのcos類似度 を分散処理で計算

e.g. レコメンドバナー

A B C

B C

A C

A D

useritem

user1

user2

user3

user4

A B C D

1 1 1 0

0 1 1 0

1 0 0 1

1 0 1 0item

item

A

B

C

D

A B C D

1 0.16 0.22 0.33

0.16 1 0.33 0

0.22 0.33 1 0

0.33 0 0 1

item × itemsimilarity matrix

recommend items

user× itempage view matrix

列ベクトルとみなして cos類似度を計算

Page 6: DSP開発におけるSpark MLlibの活用

ナイーブにMapReduceで内積を求める

Zadeh, Reza Bosagh, and Gunnar Carlsson. (2013).

シャッフルサイズ=>

m:行数, L:行あたりの非ゼロ要素の個数

行数mの増大で計算不可能に

#users = m, #items = n

useritem

user1

user2

user i

user i+1

A B C D

1 1 1 0

0 1 1 0

1 0 0 1

1 0 1 0

partition 1

partition p

j

i

k

emit

map reduce

データは行方向に分散

Page 7: DSP開発におけるSpark MLlibの活用

useritem

user1

user2

user i

user i+1

A B C D

1 1 1 0

0 1 1 0

1 0 0 1

1 0 1 0

partition 1

partition p

j

i

k

emit

map reduce

emit with prob.

ナイーブではないMapReduceで内積を求める DIMSUM

mに依存しない!シャッフルサイズ=>

oversampling parameter

Zadeh, Reza Bosagh, and Gunnar Carlsson. (2013).

戦略: ノルムが大きいベクトルの要素はサンプルせずにスキップする

Page 8: DSP開発におけるSpark MLlibの活用

DIMSUMの証明

証明にはChernoff boundを利用

Zadeh, Reza Bosagh, and Gunnar Carlsson. (2013).

Page 9: DSP開発におけるSpark MLlibの活用

vs error, shuffle size

Zadeh, Reza Bosagh, and Gunnar Carlsson. (2013).

Twitterでの実データを用いた実験でIO負荷が40%になった

Page 10: DSP開発におけるSpark MLlibの活用

MLlibにおけるDIMSUM

val rows: RDD[Vector] = ... // an RDD of local vectors val mat: RowMatrix = new RowMatrix(rows) val sim= mat.columnSimilarities(1000)

MLlibだと、たったこれだけ!

γ: oversampling parameter

Page 11: DSP開発におけるSpark MLlibの活用

発表の概要

• DIMSUM - 類似商品の高速な近似計算

• word2vec - 単語の特徴ベクトル作成

• Splash - 分散word2vecの学習の高速化

Page 12: DSP開発におけるSpark MLlibの活用

word2vec• 単語を低次元の特徴ベクトルとして表現 • GoogleのMikolovらによるオープンソースの実装 • 2つのモデル(CBOW,Skip gram) • 2つの学習法(階層的ソフトマックス, ネガティブサンプリング)

T. Mikolov et al. (2013)

Page 13: DSP開発におけるSpark MLlibの活用

アイテム特徴量の作成

アイテムのwebページに含まれる単語の特徴ベクトルを使ってアイテムの特徴量を作成

itemのwebページ

ばなな、食品、安売り、無添加

Page 14: DSP開発におけるSpark MLlibの活用

ユーザ特徴量の作成

ユーザのアイテムの閲覧履歴を用いてユーザの特徴量を作成

A B Citems

page view

ユーザの特徴量

Page 15: DSP開発におけるSpark MLlibの活用

コンバージョン(CV)の予測

label: 0 or 1

conversion

regression by ML

ユーザの特徴量とCVの関係を回帰学習することでCVしそうなユーザを予測

Page 16: DSP開発におけるSpark MLlibの活用

webページに対して行う

ページ数 3000万 ユーザ数 7~8000万 Page View 1.6億/1日

A B C

B C

A C

A D

page views

分散してスケールさせないと実行不可能→Sparkを利用

Page 17: DSP開発におけるSpark MLlibの活用

MLlibのword2vec• オリジナルのC実装からの移植 • Skip gramの階層的ソフトマックスしか実装されていない

• ネガティブサンプリングを追加で実装して利用した学習が速く、頻出単語に強い

Page 18: DSP開発におけるSpark MLlibの活用

ネガティブサンプリング var f = blas.sdot(vectorSize, syn0, l1, 1, syn1neg, l2, 1) var g = 0.0 if (f > MAX_EXP) { g = (label - 1) * alpha } else if (f < -MAX_EXP) { g = (label - 0) * alpha } else { val ind = ((f + MAX_EXP) * (EXP_TABLE_SIZE / MAX_EXP / 2.0)).toInt f = expTable.value(ind) g = ((label - f) * alpha).toFloat } blas.saxpy(vectorSize, g.toFloat, syn1neg, l2, 1, neu1e, 0, 1) blas.saxpy(vectorSize, g.toFloat, syn0, l1, 1, syn1neg, l2, 1) syn1negModify(target) += 1

Page 19: DSP開発におけるSpark MLlibの活用

MLlibのword2vec cont’d• 複数のpartitionで実行すると単語ベクトルが収束しない実際に使ってわかった問題点

原因

data

data shard

data shard

data shard

worker 1

worker 2

worker 3

driver

1

2

3 original implementation revised implementation

⭕パラメータ更新を単純平均にすることで単語ベクトルは収束し、質が劇的に向上

単純平均

Page 20: DSP開発におけるSpark MLlibの活用

MLlibのword2vec cont’d• 学習速度が低いさらなる問題点

原因

• データの凸性が低い場合、並列化による高速化は望めない学習中にpartition間でパラメータの同期ができないか?

鈴木大慈, 講談社, 確率的最適化, 2015, p164

T:iteration数, C: const., λ:強凸定数

Page 21: DSP開発におけるSpark MLlibの活用

parameter server型モデル

J. Dean et al.(2012)

⭕パラメータの次元が非常に大きくても分散して保持できる ⭕収束速度の向上

❌sparkはparameter serverに対応していない ❌通信コストが大きい

sparkでparameter serverを使えるパッケージ: Dist-ML(intel)

Page 22: DSP開発におけるSpark MLlibの活用

発表の概要

• DIMSUM - 類似商品の高速な近似計算

• word2vec - 単語の特徴ベクトル作成

• Splash - 分散word2vecの学習の高速化

Page 23: DSP開発におけるSpark MLlibの活用

Splash• パラメータをノードで個別に学習、重みづけすることにより、高い学習効率を得ることができる

• UC Berkeley amplabのオープンソースライブラリ • 既存のSpark MLlibと簡単に組み合わせて使える • ノード間通信は1回/iteration • LDA, 協調フィルタリング,SGD,Logistic回帰の実装あり

Page 24: DSP開発におけるSpark MLlibの活用

Splashの戦略:partition数 :partition i のデータ

を全体のデータの近似とする

local update

global update誤差

Y. Zhang and M. I. Jordan (2015)

n:localのデータ数, T: iteration数

Page 25: DSP開発におけるSpark MLlibの活用

toy problem 結果

✳: 最適解 ⚫: Splashの解 ▲:単純平均の解

単純加算の解

Y. Zhang and M. I. Jordan (2015)

Page 26: DSP開発におけるSpark MLlibの活用

Splash Example

共有変数の加算更新

Page 27: DSP開発におけるSpark MLlibの活用

Splashの収束性能Y. Zhang and M. I. Jordan (2015)

MNIST 8M

ref: https://amplab.cs.berkeley.edu/projects/splash/

Page 28: DSP開発におけるSpark MLlibの活用

まとめ• DIMSUMなど分散処理向けのアルゴリズムをうまく使いこなしたい • MLlibは便利なライブラリだが、注意深く扱わないと性能が発揮できない • MLlib以外の選択肢も考慮に入れるといいかも