##概要 Jubatus 0.5.0から0.5.1のアップデートで、MIXで交換する学習モデルにバージョン情報を持たせる変更を行った。 これによりモデル更新失敗時の耐用性(?)や新規プロセス追加時の運用性が向上する。 ここでは、これまでのMIXアルゴリズムの挙動とその問題点をまとめ、それらに対する今回のアップデートによる解決法を記述する。 また、この変更によりユーザーに留意していただきたい点についてまとめる。
###1. Jubatus 0.5.0 までのMIXアルゴリズム
- MIXのシーケンス図?
###2. Jubatus 0.5.0 までのMIXアルゴリズムが抱えていた問題
-
put_diffを取り漏らした時などに学習モデルがズレる
JubatusのMIXアルゴリズムでは、最後にMIXが行われた学習モデルからの差分のみをサーバープロセス間で交換する。ここには、「MIXが行われた直後はすべてのサーバープロセスが同一の学習モデルを有している」という仮定がおかれている。しかし、なんらかのエラーが生じて学習モデルの更新に失敗したサーバープロセスが生じた場合、そのサーバープロセスは他のプロセスと異なる学習モデルを有することになってしまう。このようなプロセスが生じた場合、差分のみを交換するMIXのアルゴリズムでは全てのサーバーが同一の学習モデルを再び持つようになることは事実上起こりえない。更には、異なる学習モデルを有するサーバープロセスも学習モデルの差分情報を送り続けるため、学習が機能しなくなってしまう。
-
新規マシンを追加する機能がない
上述のとおり、Jubatusのプロセス間の同期は差分情報のみの交換である。したがって、稼働中のシステムに新規にJubatusサーバープロセスが追加された場合でも、そのプロセスには学習モデルの差分情報のみしか送られてこない。このサーバープロセスが全体の学習モデルに追いつくことはできない。それどころか、異なる学習モデルを持つプロセスがMIXに参加するため、全体の学習に影響を与えてしまう。
###3. MIXアルゴリズムの改善方法と改善後のアルゴリズム
- 改善方法
- モデルにバージョン番号を埋め込む事で一番多くmixを受け取ったモデルを識別可能にする
- get_diff時にバージョン番号を埋め込む事でそのdiffをmixに利用するかを判断する
- put_diff時にバージョン番号を埋め込む事で受け取った側が今持っているモデルが最新かどうかを判断する
- 今持っているモデルが最新でないと判断したら他のプロセスからモデルを受け取る
- 改善後のアルゴリズムまとめ
###4. 改善による効果
- 精度を示す結果
###5. 改善に伴い生じる内部/外部IFの変更
- Znodeに/jubatus/actors/classifier/[NAME]/activeを追加
- save/load で扱うモデルデータの下位互換性がない
- put_diffの戻り値をvoidからboolへ変更
###6. 今回の改善で既存ユーザーが留意すること
- Jubatusを使ううえで今までと違うことをする必要はあるか
- 今まで使っていたプログラムは問題なく動く
- 過去のバージョンでsaveした学習モデルを新しいバージョンで読み込むにはパッチによる対応を待つ。逆もまた然り。
- プロセスの追加・削除で精度が変動した場合、開発陣に報告をお願いします
###7. 各アルゴリズムへの適用状況と今後の展望
- classifier (0.5.1で適用)
- recommender
- regression
- ....