Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Jubatusにおける機械学習のテスト @Machine Learning Casual Talks
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yuya Unno
June 06, 2014
Technology
16
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Jubatusにおける機械学習のテスト @Machine Learning Casual Talks
Yuya Unno
June 06, 2014
More Decks by Yuya Unno
See All by Yuya Unno
深層学習で切り拓くパーソナルロボットの未来 @東京大学 先端技術セミナー 工学最前線
unnonouno
0
27
深層学習時代の自然言語処理ビジネス @DLLAB 言語・音声ナイト
unnonouno
0
49
ベンチャー企業で言葉を扱うロボットの研究開発をする @東京大学 電子情報学特論I
unnonouno
0
47
PFNにおけるセミナー活動 @NLP2018 言語処理研究者・技術者の育成と未来への連携WS
unnonouno
0
17
進化するChainer @JSAI2017
unnonouno
0
24
予測型戦略を知るための機械学習チュートリアル @BigData Conference 2017 Spring
unnonouno
0
26
深層学習フレームワーク Chainerとその進化
unnonouno
0
24
深層学習による機械とのコミュニケーション @DeNA TechCon 2017
unnonouno
0
42
最先端NLP勉強会 “Learning Language Games through Interaction” @第8回最先端NLP勉強会
unnonouno
0
17
Other Decks in Technology
See All in Technology
LLMにもCAP定理があるという話
harukasakihara
0
160
やさしいA2A入門
minorun365
PRO
7
380
「気づいたら仕事が終わっている」バクラクAIエージェント本番運用の裏側 / layerx-bakuraku-aie2026
yuya4
19
11k
GoとSIMDとWasmの今。
askua
3
520
生成 AI × MCP で切り拓く次世代 SRE!自律型運用への挑戦と開発者体験の進化
_awache
0
170
コードレビューを制するチームがソフトウェアデリバリーのフローを制す / Beyond Code Review: Distributing Its Responsibilities Across the SDLC
mtx2s
4
1.3k
AI駆動開発が変える、大規模開発の前提 ーHuman in the Loop から Human on the Loop へ / AIE2026
visional_engineering_and_design
28
19k
関西に縁あるMicrosoft MVPsが語るCopilotの未来
kasada
0
1.2k
「嘘をつくテスト」の失敗例から学ぶ 良いテストコード #frontend_phpcon_do
asumikam
0
570
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
3.1k
新アーキテクチャ「TiDB X」解説とDedicated比較 TiDB Cloud Premiumのゲーム運用活用を検証
staffrecruiter
0
120
AIを「創る」と「使う」の循環 — HRテックが実践するリアルなAI組織実装
taketo957
0
1.7k
Featured
See All Featured
ラッコキーワード サービス紹介資料
rakko
1
3.6M
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
200
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.9k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
A Modern Web Designer's Workflow
chriscoyier
698
190k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Context Engineering - Making Every Token Count
addyosmani
9
950
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
A Tale of Four Properties
chriscoyier
163
24k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
Transcript
Jubatusにおける機械学習の テスト 株式会社Preferred Infrastructure 海野 裕也 (@unnonouno) 2014/06/06 Machine Learning Casual
Talks@Cookpad
⾃自⼰己紹介 海野 裕也(@unnonouno) l (株) Preferred Infrastructure l Jubatus開発者 l 専⾨門:⾃自然⾔言語処理理、テキストマイニング
l クックパッドプレミアム会員 2
l 今⽇日はJubatusがどのようなテストをしている のかを話します l 別の⾔言い⽅方をすると、今までのJubatusのバグ の歴史を紹介します 3
Jubatus (http://jubat.us/) l 分散オンライン学習のフレームワーク l 分類・回帰・レコメンド・グラフ・近傍探索索・異異常検 知・クラスタリング l 特徴抽出エンジンも備えているので、⽣生データも扱える l
全て分散環境かつオンラインで動く 4
Jubatusサーバーの構成 5 サーバー クライアント (各⾔言語) msgpack-rpc ドライバー コア
各モジュールの役割 l サーバー・クライアント l msgpack-rpcサーバー・クライアントとして振る舞る l だいたい⾃自動⽣生成される l ドライバー l
⽣生データ(⽂文書など)を処理理する層 l 特徴抽出、重み付け、学習を結びつける役割 l コア l ベクトルを受け取る⽣生の学習器 l ベクトルを⽣生成する⽣生の特徴抽出器 l 最近リポジトリを分離離した(jubatus_core) 6
各レイヤーのテスト l サーバー・クライアント l 正しくクライアントのリクエスト受けつけて、処理理をドライ バーに投げられるか l ドライバー l ⽣生データを正しくそれぞれのモジュールに引き渡しているか
l コア l ちゃんと学習するか 7
各レイヤーのテスト l サーバー・クライアント l 正しくクライアントのリクエスト受けつけて、処理理をドライ バーに投げられるか l ドライバー l ⽣生データを正しくそれぞれのモジュールに引き渡しているか
l コア l ちゃんと学習するか 8 割りと一般的なテスト
各レイヤーのテスト l サーバー・クライアント l 正しくクライアントのリクエスト受けつけて、処理理をドライ バーに投げられるか l ドライバー l ⽣生データを正しくそれぞれのモジュールに引き渡しているか
l コア l ちゃんと学習するか 9 今日の話はこっち
「ちゃんと」って? 10
3つの「ちゃんと」の話をします l 「ちゃんと」問題が解けるか l 「ちゃんと」論論⽂文通りか l 「ちゃんと」使えるか 11
「ちゃんと」問題を解けるか どう考えても解けるだろうという擬似問題を解かせる 12 (1, 1)と(-1, -1)を原点、分散1の正規分布からそれ ぞれ正例例と負例例をサンプリングして分類器に投げ て学習する 例:分類器の場合
テストを書いてみた・・ l Perceptron l 正解率率率:95% l Passive Aggressive l 正解率率率:97%
l Confidence Weighted l 正解率率率:98% l AROW l 正解率率率:98% l NHERD l 正解率率率:70% 13
??? 14
何か変だ・・ 15 流流⽯石に精度度低くないですかね? ハイパーパラメータ チューニングしてないし、 不不安定な⼿手法なのかもね ナルホド、タシカニ
落落ち着いて考えよう しかし、2以上も離離れている点を中⼼心にして分散 1ってことは、もうほとんど線形分類可能だろう どんな適当なことしても70%ってことはなくない か・・・??? 16
Crammer系⼿手法のおさらい 17 initialize w, ∑" for (x, y) in data:"
#m = y (x・w)" #if m < e:" # #w := w + αy∑x" # #update ∑" l ベースのアルゴリズムはシンプル l 各⼿手法は、上記のe, α, ∑だけが違う
とはいえ、予想以上にグチャグチャ 式が極めて⻑⾧長いということはないが、正しく写経 できているか確認しづらい 18
雰囲気だけ・・・ 19 void normal_herd::update( const common::sfv_t& sfv, float margin, float
variance, const string& pos_label, const string& neg_label) { for (common::sfv_t::const_iterator it = sfv.begin(); it != sfv.end(); ++it) { // 中略略 storage_->set2(feature, pos_label, storage::val2_t(pos_val.v1 + (1.f - margin) * val_covariance_pos / (val_covariance_pos * val + 1.f / C), 1.f / ((1.f / pos_val.v2) + (2 * C + C * C * variance) * val * val))); if (neg_label != "") { storage_->set2(feature, neg_label, storage::val2_t(neg_val.v1 + (1.f - margin) * val_covariance_neg / (val_covariance_neg * val + 1.f / C), 1.f / ((1.f / neg_val.v2) + (2 * C + C * C * variance) * val * val))); } } } この中に⼀一箇所だけ+と−を間違えています
結局、何が起こっていたか l 1箇所だけ正負を間違えていた l 何度度も何度度も⾒見見返してようやく発⾒見見した l 数式とコードのギャップは深い l 発散するでもなく、完全にランダムでもなく、 妙に精度度が低かった
l 精度度が思ったよりも悪かったら、疑うべき(あ たりまえだけど) 20
「ちゃんと」論論⽂文の書いてある通りに実装されてい るか l 「精度度が出ない」ことがわかるのなら、頑張っ て原因を探せば良良い l 「精度度が出ていた」ら、正しく実装できている のか? 細部が異異なっていても「割と期待通りに」 動いてしまうことは多い
21
あっ、あっ、あっ 22
正直すまんかった @@ -38,7 +38,7 @@ void PA::train(const sfv_t& sfv, const
string& label) {" if (sfv_norm == 0.f) {" return;" }" - update_weight(sfv, loss / sfv_norm, label, incorrect_label);" + update_weight(sfv, loss / (2 * sfv_norm), label, incorrect_label);" }" " string PA::name() const { 23
結局、どうなったのか l そこらにあるテストセット(news20など)を利利 ⽤用して精度度の変化を試したが、ほとんど変わら なかった l 何故か間違った実装のほうが精度度が出た l 意図した実装でないことは事実、しかし発⾒見見は 極めて困難
l テストだけでは発⾒見見出来ない 24
「ちゃんと」利利⽤用者に使い⽅方がわかるか l 実装のテストというか仕様のテスト? l どういう設定をするどどうなるのかが利利⽤用者に とってわかりやすくなっているか l もっと⾔言えば、望まない結果が得られた時にど う対処すればよいかわかるようにできているか 25
みんな⼤大好き-cオプション l 「Cいくつにした?」と聞かれる l 正則化項と損失の⽐比率率率を調整する重みのこと 26 % svm-train" Usage: svm-train
[options] training_set_file [model_file]" options:" ..." -c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)" ...
AROWの論論⽂文より、途中の式変形 27 以降降、この式を解く
λ1 とλ2 どこ⾏行行った? 28
AROWの論論⽂文より 29
AROWの論論⽂文より 30
r、お前誰? 31
よく⾒見見ると・・・ l 本質的には r と λ の役割は同じ l ところが⼤大⼩小関係が逆なので、⼤大きくしたり⼩小 さくした時の挙動が他のアルゴリズムと逆にな
る 32
ハイパーパラメータは所詮ハイパーパラメータ l λ が正しいか 1/r が正しいかの議論論は不不⽑毛 l いずれにせよ、ハイパーパラメータチューニン グで最適化するものであるから、いずれかが間 違いとは⾔言えない
l 利利⽤用者側の観点でみると、考えるべきは論論⽂文と の整合性よりも使い勝⼿手(⼀一貫性) 33
直しました --- a/src/classifier/arow.cpp" +++ b/src/classifier/arow.cpp" @@ -40,7 +40,7 @@ void
AROW::train(const sfv_t& sfv, const string& label){" if (margin >= 1.f) {" return;" }" - float beta = 1.f / (variance + config.C);" + float beta = 1.f / (variance + 1.f / config.C);" float alpha = (1.f - margin) * beta; // max(0, 1- margin) = 1-margin" update(sfv, alpha, beta, label, incorrect_label);" } 34
直しました 35
設定の与え⽅方を気をつける l 式中のハイパーパラメータを外から設定できる ようにしたいが、パラメータに名前をつけるの は難しい l 仮に「元論論⽂文(2)式中のrです」と書いても、適 切切な値は探索索しないとわからない l 上下したときの影響がわかりやすく、⼀一貫性が
取れるようにする 36
ハイパーパラメータが1つだけだと思うなよ l 分類器なら正則化パラメータや学習率率率程度度だっ た l 教師無しになるほど何かしらの過程を置く l ◯◯分布を仮定する l ◯◯個のトピック、クラスタを仮定する
37 ハイパーパラメータの数が爆発
CoreSetクラスタリング l ⼊入⼒力力データ点から⼀一部の点を「うまく」選ぶことで、元 のデータをk-meansした時とだいたい同じセントロイド が得られる l Jubatus内部では、この処理理を段階的に適⽤用して、内部 の使⽤用メモリ量量を⼀一定に抑えている 38 青の点の代わりに
緑の点だけ保存し ておく
お、おう・・・ l クラスタ数K以外に、 ハイパーパラメータ が沢⼭山 39 設定値は6個ある
何でこんなにパラメータが多いのか? l 段階的に圧縮していくため、圧縮の頻度度、1回での圧縮 率率率、2段⽬目以降降の圧縮のタイミング、最⼤大圧縮段数など 調整できるパラメータが増える 40 圧縮のタイ ミング 圧縮後のサ イズ
多段圧縮の タイミング 最⼤大圧縮段数
最近思っていること パラメータによる影響範囲がなるべく限定的にし、 複数の変化が起きにくくするのがよい l メモリ消費量量 l イテレーションの時間 l スループット l
直近のデータへの感度度・過去データの忘却の程 度度 41 1つのパラメータで3つ以上変化 すると制御は難しい
まとめ l 「ちゃんと」問題が解けるか l 解けそうな問題を解けるか l 簡単な問題にヒドイ間違いをしないか l 「ちゃんと」論論⽂文通りか l
数式はちゃんと写しているか l 確認する⽅方法は・・・頑張れ・・・ l 「ちゃんと」使えるか l 設定は⼗十分意味が伝わり、⼀一貫性が有るか l 挙動を制御しやすいか 42
次回 「機械学習のデバック術」 乞うご期待 43
ご静聴ありがとうございました 44