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
サンタコンペで二度全完した話
Search
wata_orz
May 12, 2018
Technology
7
6.8k
サンタコンペで二度全完した話
Kaggle Tokyo Meetup #4での発表資料
wata_orz
May 12, 2018
Tweet
Share
More Decks by wata_orz
See All by wata_orz
Unit propagationと最大流と分枝限定法
wata_orz
2
2k
Other Decks in Technology
See All in Technology
Wantedly での Datadog 活用事例
bgpat
1
530
開発生産性向上! 育成を「改善」と捉えるエンジニア育成戦略
shoota
2
400
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
320
MLOps の現場から
asei
7
650
DevFest 2024 Incheon / Songdo - Compose UI 조합 심화
wisemuji
0
120
Oracle Cloud Infrastructure:2024年12月度サービス・アップデート
oracle4engineer
PRO
0
210
5分でわかるDuckDB
chanyou0311
10
3.2k
宇宙ベンチャーにおける最近の情シス取り組みについて
axelmizu
0
110
サーバーなしでWordPress運用、できますよ。
sogaoh
PRO
0
110
kargoの魅力について伝える
magisystem0408
0
210
サイバー攻撃を想定したセキュリティガイドライン 策定とASM及びCNAPPの活用方法
syoshie
3
1.3k
権威ドキュメントで振り返る2024 #年忘れセキュリティ2024
hirotomotaguchi
2
760
Featured
See All Featured
Unsuck your backbone
ammeep
669
57k
Code Review Best Practice
trishagee
65
17k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Designing Experiences People Love
moore
138
23k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
How to Think Like a Performance Engineer
csswizardry
22
1.2k
Writing Fast Ruby
sferik
628
61k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Testing 201, or: Great Expectations
jmmastey
40
7.1k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Building an army of robots
kneath
302
44k
Transcript
サンタコンペで二度全完した (のに優勝出来なかった)話 Kaggle Tokyo Meetup #4 2018/05/12 岩田 陽一 (wata)
https://github.com/wata-orz/santa17
内容 1. 自己紹介 2. 問題概要 3. 解法概略 4. タイムライン 5.
解法詳細 2
3 自己紹介 東大情報科学科→情報理工(2016年3月博士卒) 国立情報学研究所 助教 離散アルゴリズムの研究をしている
機械学習は初心者 世界 1 位 (2010) 世界 2 位 (2011) 世界 3 位 (2009) 3回優勝 (2013,2015,2016) 競プロ: wata Twitter: @wata_orz ICFPC Masterになりたい…
Kaggle Santa 年末年始に毎年開催されている最適化系コンペ 機械学習要素は(ほぼ)ない 去年に続いて二度目の参加 賞金
1位: $8,000、2位: $6,000、3位: $3,000 一番長い期間トップ賞: $8,000 4
問題概要 5 1,000種類×1,000個 1,000,000人 サンタと子供の幸福度関数, が与えられるので、幸福度の和 σ , + σ
(, ) が出来るだけ大きい割当 : 子供→プレゼント を求めよ。 , ≔ サンタが子供にプレゼントを配る幸福度 , ≔ 子供がプレゼントを貰ったときの幸福度 , はスパースで非零要素がそれぞれ106個、107個 1+1+3+4+1+2=12 1 1 0 0 0 0 1 1 3 0 0 4 1 2 0 2
問題概要 6 ただし、1,000,000人の子供のうち4,000人は双子で、双子には同 じプレゼントを配らないといけない。 1,000種類×1,000個 1,000,000人 1+1+1+1+3+2+2=11 1 1 0
0 0 0 1 1 3 0 0 4 1 2 0 2
解法概略 双子制約がない場合は、最小費用流という有名アル ゴリズムで最適解が求まる。 双子制約があるので最小費用流では解けず、最適 解を求めるのは難しい…? 実はそんなことはない! その前に… 7
私の研究の紹介 2-SATの充足可能性は線形時間で判定できる。 充足不能な場合、出来るだけ沢山の節を充足する問題 (Max 2-SAT)はNP困難なので解くのが難しい…? 1 ∨ 2 ∧
1 ∨ 2 ∧ 1 ∨ 3 ∧ 2 ∨ 3 1 = false, 2 = true, 3 = true で充足可能 8
私の研究の紹介 2-SATの充足可能性は線形時間で判定できる。 充足不能な場合、出来るだけ沢山の節を充足する問 題(Max 2-SAT)はNP困難なので解くのが難しい…? 1 ∨ 2
∧ 1 ∨ 2 ∧ 1 ∨ 3 ∧ 2 ∨ 3 1 = false, 2 = true, 3 = true で4つの節を充足 9 ∧ 1 ∨ 3
私の研究の紹介 2-SATの充足可能性は線形時間で判定できる。 充足不能な場合、出来るだけ沢山の節を充足する問 題(Max 2-SAT)はNP困難なので解くのが難しい…? 簡単 激ムズ? 2-SAT
( = 0) Max 2-SAT ( > 0) 10 充足されない 節の数 ここらへん(小さい)はまだ簡単なのでは? 私の結果 (SODA 2013): 任意の定数に対し、個以外充足可能かは線形時間で解ける アルゴリズム: LP緩和を最大流で解いて分枝限定法
解法概略 双子制約がない場合は、最小費用流という有名アル ゴリズムで最適解が求まる。 双子制約があるので最小費用流では解けず、最適 解を求めるのは難しい…? 私の解法: 緩和問題(双子無視)を最小費用流で解いて分枝限定法 11
双子制約の数 サンタ問題はここらへん(106人のうち双子わずか4,000人)なので簡単なのでは? = 0は簡単 (最小費用流) > 0だと最小費用流で解けないが…
タイムライン 12 Dec13 Jan13 開始 終了 Dec14 最適解を達成し 1位確定 (1位$8,000+最長トップ賞$8,000で$16,000)/2日=日給$8,000
タイムライン 13 Dec13 Jan13 開始 終了 Dec14 最適解を達成し 1位確定 Dec23
最適解が続出したため ルール変更で第二ラウンド 入力が大きくなった:子供の幸福度の非零が107 → 108個に 三つ子が出現:双子4,000人 → 三つ子5,001人、双子40,000人 スコアが単純な線形和から σ , 3 + σ , 3に 賞金が分割:1位賞金$8,000を第一ラウンド$2,000+第二ラウ ンド$6,000に分割、最長トップ賞も持ち越し
タイムライン 14 Dec13 Jan13 開始 終了 Dec14 最適解を達成し 1位確定 Dec23
最適解が続出したため ルール変更で第二ラウンド Dec26 再び最適解を達成 ところが… 僅かな差でKomaki君に先を越されたorz 私:Dec26 01:52:43、 Komaki君:Dec26 01:19:03 まだ終了まで半分以上あるため、最長トップ賞も逃し、 34分差で賞金$9,500を失う 敗因:人間性を捧げなかった 自前の最小費用流実装が遅かった
解法詳細 1. 最小費用流 2. 分枝限定法 3. 三乗和の解き方(第二ラウンド) 4. 高速化 15
最小費用流 入力: 問題: 16 −() +() • 有向グラフ = (,
) • 各辺の容量 (≥ 0)と重み minimize s.t. σ ∈−() − σ ∈+() = 0 (∀ ∈ ) 0 ≤ ≤ ∀ ∈ 入る量=出る量 を通して最大 まで流せる 単位量あたりコスト が かかる < 0な辺もある (流すと得をする)
最小費用流 様々な最適化問題が、最小費用流に帰着して効率 的に解ける(競プロでは頻出) https://www.slideshare.net/wata_orz/ss-91375739 アルゴリズム 最短路反復法
コストスケーリング法 ライブラリ LEMON: http://lemon.cs.elte.hu/trac/lemon Google OR-Tools: https://developers.google.com/optimization/ 私は自前のコストスケーリング法実装を使用した 17
最小費用流への帰着 18 1 1 0 0 0 0 1 1
3 0 0 4 1 2 0 2 容量2 容量1 容量1 コスト = −幸福度 −4 −1 −1 0 −3 −3 −4 0 → → → という閉路が プレゼント を子供 に渡すことに対応
分枝限定法 解ける問題(e.g. 最小費用流)+邪魔な制約(e.g. 双子制約) に対し、邪魔な制約を無視した緩和問題を考える。 緩和問題の解 ≥ 元の問題の解(最大化の場合)が成り立つ
ので、探索の枝刈りに使える。 19 1. 緩和問題を解く 2. if 既に発見した解 ≥ 緩和解 then return 3. if 緩和解が緩和した制約を満たす then 解を更新 4. else 満たされていない制約を一つ選び、満たすよう に再帰的に分岐して探索する
分岐の方法 異なるプレゼント, を受け取った双子を一組選び、プレゼント を渡す場合と、プレゼントを渡さない場合で分岐 20 1 2 −4 −1 −1
0 −3 −3 −4 0 1 2 −4 −1 −1 0 −3 −3 1 2 −1 0 −3 −3 −4 0 1を渡す 1を渡さない 1以外からの辺を消す 1からの辺を消す 双子制約が満たされていない
三乗和の解き方 第二ラウンドでは、目的関数が幸福度の線形でなく、 σ , 3 + σ , 3となった
の非零が106個に対し、の非零が108個もあるの で、σ , の方が圧倒的に大きく出来る → を無視してのみを最大化すれば、ほぼ最適 21 これ以上の最適化はKaggleのスコアボードの有 効桁数を超え、「not an improvement」と言われ るが、ちゃんと最適化しないとダメだった 真の最適解は十分大きい数に対して、 + を最大化すれば得られる
高速化1・2 1. 双子の幸福度は、個別のものでなく、平均を用いる 同じ値にすることで、最小費用流が同じプレゼント を割り当てやすくなる 2. 重み0の辺は除去する プレゼントが余った場合はナップサック問題を解い
て詰め込む 22 4 0 1 4 1 3 0 3 2.5 2 2.5 2 1 3 3
高速化3 3. 分枝限定法において、分岐後の最小費用流の計算 は、増大路計算により( log )時間で出来る 23 1 2 a
b c d −4 −1 −1 0 −3 −3 −4 0 1 2 a b c d 4 −1 1 0 3 −3 4 0 残余グラフ 使った辺の 向きと重みを反転 からへの増大路=残余グラフでのからへのパス
高速化3 3. 分枝限定法において、分岐後の最小費用流の計算 は、増大路計算により( log )時間で出来る 24 1 2 a
b c d −4 −1 −1 0 −3 −3 −4 0 1 2 a b c d −4 −1 −1 0 −3 −3 1以外からの辺を消して 最小費用流を計算 → 1 への最短増大路 ( → 2 → → 1) に沿って押し戻す 1 2 a b c d −4 −1 −1 0 −3 −3 −4 辺1bを使う 1 2 a b c d −4 −1 −1 0 −3 −3 −4 1以外からの使われ ていない辺を消す
高速化4 4. 分岐の方法は、(双子、プレゼント)を全通り試して 緩和解が(ソートして辞書順比較で)一番小さくなる ものを選ぶ。 緩和解が既に見つけた解以下なったら枝刈り出来るので、 探索の出来るだけ浅いところで緩和解を小さくしたい 既にスコア10の解を得ているときに、 双子にプレゼントを渡す→
緩和解9 即座に枝刈りされる 双子にプレゼントを渡さない → 緩和解12 双子にプレゼントを渡す→ 緩和解11 双子にプレゼントを渡さない → 緩和解11 25
高速化5 5. 最適解で絶対に使われる・使われない辺を除去しグ ラフを小さくする = 0 → 1 にした際の緩和解が、既知の解以下に
なったら、 = 0で固定してよい = 1 → 0 も同様 一回の判定に( log )かかるので、全部の辺を調べると 2 log 。 = 108なので無理 26
高速化5 = 0 → 1にすると、最小費用流のコストは からへの最短増大路 + 増加する
= 1 → 0 にすると、最小費用流のコストは からへの最短増大路 − 増加する 1辺ごとに最短増大路を計算すると108回の最短路計算が必 要だが、 (プレゼント)は1000種類しかないので、1000回の最 短路計算で出来る(それでもまだ若干重いが) 27 からへ押し戻す からへ別ルートで流す
高速化5 双対変数(ポテンシャル)を用いると、一気に辺を削除 出来る(Reduced cost fixingと呼ばれるテク) 最小費用流の双対性 最小費用流が最適 ⇔ 残余グラフの全ての辺で ≤
+ を満たすようなポテンシャル: → ℝが存在 からへの最短増大路の長さ ≥ − が成り立つ 先にこの下界で辺を減らしてから最短路計算をした 28 4 −1 1 0 3 −3 4 0 0 3 1 0 0 0 0 0 残余グラフ (使った辺の向き と重みを反転)
実行時間など 全部通して1時間位 殆どの計算時間は一番最初の最小費用流計算 自前実装でなく、OR-Toolsとかの外部ライブラリを使えば、 だいぶ速くなるっぽい あまりに遅いので、コンペ中は計算結果をファイルに保存
して、ソルバ改善→再実行時の再計算を無くした が、のみ最適化から + 最適化に変えた際に計算し 直す必要が…→計算中にKomaki君が最適解達成orz 辺の削減効果 約108辺 → 約50万辺 29
感想 30 全盛期のイチロー伝説: 全完は当たり前。一度のコンテストで二度全完することも。 サンタ以外のKaggleも参戦していきたい。 wata