DSP開発におけるSpark MLlibの活用
-
Upload
kotaro-tanahashi -
Category
Science
-
view
1.536 -
download
1
Transcript of DSP開発におけるSpark MLlibの活用
DSP開発におけるSpark MLlibの活用
棚橋 耕太郎
2015.11.27
自己紹介棚橋耕太郎 新卒1年目エンジニア
バックグラウンド: 高分子物性(統計力学理論, 計算機シミュレーション)
現在の業務: DSPなど, アドテクまわりの機械学習バッチの開発, 量子アニーリングを用いた機械学習アルゴリズムの研究開発(共同研究)
発表の概要
• DIMSUM - 類似商品の高速な近似計算
• word2vec - 単語の特徴ベクトル作成
• Splash - 分散word2vecの学習の高速化
発表の概要
• DIMSUM - 類似商品の高速な近似計算
• word2vec - 単語の特徴ベクトル作成
• Splash - 分散word2vecの学習の高速化
広告アイテムの推薦
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類似度を計算
ナイーブに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
データは行方向に分散
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).
戦略: ノルムが大きいベクトルの要素はサンプルせずにスキップする
DIMSUMの証明
証明にはChernoff boundを利用
Zadeh, Reza Bosagh, and Gunnar Carlsson. (2013).
vs error, shuffle size
Zadeh, Reza Bosagh, and Gunnar Carlsson. (2013).
Twitterでの実データを用いた実験でIO負荷が40%になった
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
発表の概要
• DIMSUM - 類似商品の高速な近似計算
• word2vec - 単語の特徴ベクトル作成
• Splash - 分散word2vecの学習の高速化
word2vec• 単語を低次元の特徴ベクトルとして表現 • GoogleのMikolovらによるオープンソースの実装 • 2つのモデル(CBOW,Skip gram) • 2つの学習法(階層的ソフトマックス, ネガティブサンプリング)
T. Mikolov et al. (2013)
アイテム特徴量の作成
アイテムのwebページに含まれる単語の特徴ベクトルを使ってアイテムの特徴量を作成
itemのwebページ
ばなな、食品、安売り、無添加
ユーザ特徴量の作成
ユーザのアイテムの閲覧履歴を用いてユーザの特徴量を作成
A B Citems
page view
ユーザの特徴量
コンバージョン(CV)の予測
label: 0 or 1
conversion
regression by ML
ユーザの特徴量とCVの関係を回帰学習することでCVしそうなユーザを予測
webページに対して行う
ページ数 3000万 ユーザ数 7~8000万 Page View 1.6億/1日
A B C
B C
A C
A D
page views
分散してスケールさせないと実行不可能→Sparkを利用
MLlibのword2vec• オリジナルのC実装からの移植 • Skip gramの階層的ソフトマックスしか実装されていない
• ネガティブサンプリングを追加で実装して利用した学習が速く、頻出単語に強い
ネガティブサンプリング 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
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
⭕パラメータ更新を単純平均にすることで単語ベクトルは収束し、質が劇的に向上
単純平均
MLlibのword2vec cont’d• 学習速度が低いさらなる問題点
原因
• データの凸性が低い場合、並列化による高速化は望めない学習中にpartition間でパラメータの同期ができないか?
鈴木大慈, 講談社, 確率的最適化, 2015, p164
T:iteration数, C: const., λ:強凸定数
parameter server型モデル
J. Dean et al.(2012)
⭕パラメータの次元が非常に大きくても分散して保持できる ⭕収束速度の向上
❌sparkはparameter serverに対応していない ❌通信コストが大きい
sparkでparameter serverを使えるパッケージ: Dist-ML(intel)
発表の概要
• DIMSUM - 類似商品の高速な近似計算
• word2vec - 単語の特徴ベクトル作成
• Splash - 分散word2vecの学習の高速化
Splash• パラメータをノードで個別に学習、重みづけすることにより、高い学習効率を得ることができる
• UC Berkeley amplabのオープンソースライブラリ • 既存のSpark MLlibと簡単に組み合わせて使える • ノード間通信は1回/iteration • LDA, 協調フィルタリング,SGD,Logistic回帰の実装あり
Splashの戦略:partition数 :partition i のデータ
を全体のデータの近似とする
local update
global update誤差
Y. Zhang and M. I. Jordan (2015)
n:localのデータ数, T: iteration数
toy problem 結果
✳: 最適解 ⚫: Splashの解 ▲:単純平均の解
単純加算の解
Y. Zhang and M. I. Jordan (2015)
Splash Example
共有変数の加算更新
Splashの収束性能Y. Zhang and M. I. Jordan (2015)
MNIST 8M
ref: https://amplab.cs.berkeley.edu/projects/splash/
まとめ• DIMSUMなど分散処理向けのアルゴリズムをうまく使いこなしたい • MLlibは便利なライブラリだが、注意深く扱わないと性能が発揮できない • MLlib以外の選択肢も考慮に入れるといいかも