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
BMS Molecular Translation 3rd place solution
Search
Kazuki Fujikawa
June 16, 2021
Science
0
37
BMS Molecular Translation 3rd place solution
BMS Molecular Translation 3rd place solution
Kazuki Fujikawa
June 16, 2021
Tweet
Share
More Decks by Kazuki Fujikawa
See All by Kazuki Fujikawa
H&M Personalized Fashion Recommendation
kfujikawa
0
250
コミュニティ検出 動向紹介
kfujikawa
1
400
Stable Diffusion - Image to Prompts
kfujikawa
3
2.2k
Stanford Covid Vaccine 2nd place solution
kfujikawa
0
36
ACL2020 best papers
kfujikawa
0
33
Kaggle参加報告: Champs Predicting Molecular Properties
kfujikawa
0
57
NLP@ICLR2019
kfujikawa
0
24
Kaggle参加報告: Quora Insincere Questions Classification
kfujikawa
0
30
Ordered neurons integrating tree structures into recurrent neural networks
kfujikawa
0
30
Other Decks in Science
See All in Science
ultraArmをモニター提供してもらった話
miura55
0
200
生成AI による論文執筆サポートの手引き(ワークショップ) / A guide to supporting dissertation writing with generative AI (workshop)
ks91
PRO
0
320
Inductive-bias Learning: 大規模言語モデルによる予測モデルの生成
fuyu_quant0
0
120
ベイズ最適化をゼロから
brainpadpr
2
900
FOGBoston2024
lcolladotor
0
110
インフラだけではない MLOps の話 @事例でわかるMLOps 機械学習の成果をスケールさせる処方箋 発売記念
icoxfog417
PRO
2
620
Celebrate UTIG: Staff and Student Awards 2024
utig
0
500
Analysis-Ready Cloud-Optimized Data for your community and the entire world with Pangeo-Forge
jbusecke
0
110
MoveItを使った産業用ロボット向け動作作成方法の紹介 / Introduction to creating motion for industrial robots using MoveIt
ry0_ka
0
190
トラブルがあったコンペに学ぶデータ分析
tereka114
2
1.2k
3次元点群を利用した植物の葉の自動セグメンテーションについて
kentaitakura
2
610
非同期コミュニケーションの構造 -チャットツールを用いた組織における情報の流れの設計について-
koisono
0
170
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Visualization
eitanlees
146
15k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
The Pragmatic Product Professional
lauravandoore
32
6.3k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Scaling GitHub
holman
458
140k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
YesSQL, Process and Tooling at Scale
rocio
169
14k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Transcript
2021.06. DS輪講 Kazuki Fujikawa 株式会社ディー・エヌ・エー + 株式会社 Mobility Technologies Kaggle
Competition: Bristol-Myers Squibb Molecular Translation 3rd place solution Team: kyamaro (KF + lyakaap + camaro)
▪ コンペティション概要 ▪ ベースライン ▪ Solution AGENDA
▪ コンペティション概要 ▪ ベースライン ▪ Solution AGENDA
▪ 薬品などに有用な化学構造は論文・特許で公開される ▪ 古い出版物にはInChIなどの機械で読める記述が無く、検索が困難 ▪ 検索が可能になると、車輪の再発明を防げたり、データマイニング で新たな化学構造を見つける助けになる ▪ 既存の構造式OCRツールは性能に課題がある ▪
古い出版物は画像に破損が含まれている場合が多い コンペティション概要: 背景 破損が含まれる画像に対しても適用可能な化合物OCRを作りたい
▪ 与えられた化学構造画像に対するInChIを推定する コンペティション概要: タスク InChI=1S /C13H20OS /c1-9(2)8-15-13-6-5-10(3)7-12(13)11(4)14 /h5-7,9,11,14H,8H2,1-4H3 入力: モノクロ画像
出力: InChIテキスト(改行は不要)
▪ 与えられた化学構造に対するInChIを推定する コンペティション概要: タスク InChI=1S /C13H20OS /c1-9(2)8-15-13-6-5-10(3)7-12(13)11(4)14 /h5-7,9,11,14H,8H2,1-4H3 入力: モノクロ画像
出力: InChIテキスト(改行は不要) InChIの規格を表すレイヤー “1”: version “S”: standard (今回のデータセットは全てInChI=1S)
▪ 与えられた化学構造に対するInChIを推定する コンペティション概要: タスク InChI=1S /C13H20OS /c1-9(2)8-15-13-6-5-10(3)7-12(13)11(4)14 /h5-7,9,11,14H,8H2,1-4H3 入力: モノクロ画像
出力: InChIテキスト(改行は不要) 化学式レイヤー 分子を構成する原子とその個数を記述
▪ 与えられた化学構造に対するInChIを推定する コンペティション概要: タスク InChI=1S /C13H20OS /c1-9(2)8-15-13-6-5-10(3)7-12(13)11(4)14 /h5-7,9,11,14H,8H2,1-4H3 入力: モノクロ画像
出力: InChIテキスト(改行は不要) 原子の結合情報を表すレイヤー 一貫するルールに基づいて原子に番号を振り、 分岐は括弧書きで表しながら1列の文字列で表す e.g. 1番の次は9番、分岐して2番、戻って8番、... 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
▪ 与えられた化学構造に対するInChIを推定する コンペティション概要: タスク InChI=1S /C13H20OS /c1-9(2)8-15-13-6-5-10(3)7-12(13)11(4)14 /h5-7,9,11,14H,8H2,1-4H3 入力: モノクロ画像
出力: InChIテキスト(改行は不要) 各原子が保有する水素の数を表すレイヤー /hは接頭語、5-7, 9, 11, 14番の原子は1個の水素、 8番に2個の水素、1-4番に3個の水素が付いている ことを表す 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
▪ 与えられた化学構造に対するInChIを推定する コンペティション概要: タスク InChI=1S /C13H20OS /c1-9(2)8-15-13-6-5-10(3)7-12(13)11(4)14 /h5-7,9,11,14H,8H2,1-4H3 入力: モノクロ画像
出力: InChIテキスト(改行は不要)
▪ 編集距離(Levenshtein distance)で評価 ▪ 推定InChIからGT InChIへ変換するのに必要な最小の編集回数 ▪ 編集: ”置換”, ”削除”,
“追加” ▪ ex. kitten → sitting: 編集距離3 1. kitten → sitten(replace k → s) 2. sitten → sittin(replace e → i) 3. sittin → sitting(append g) コンペティション概要: 評価
▪ コンペティション概要 ▪ ベースライン ▪ Solution AGENDA
▪ 一般的な Image captioning タスクのフレームワークで、 InChIを単なる文字列と考えて系列生成 ▪ レイヤー毎に意味合いは異なるが、予想以上に上手くいく ▪ EffnetなどのCNNベースよりも、TransformerベースのEncoderの方が
明確に性能が良かった(弊チーム調べ) ▪ 今回のタスクは、”何が” “どこに” 写っているのかを Decoder に伝える 必要があったので、TransformerベースのEncoderの方が有利だった? ベースライン: Image captioning framework Image Encoder Transformer Decoder InChI=1S /C13H20OS ...
▪ Transformer in Transformer (TNT) をEncoderとして利用する ことが有効であることがシェアされていた(by hengck23) ▪ TNT:
通常のViTのフレームワークに加え、ピクセル間の関係性も Transformerでエンコードする(ViTは線形写像) ベースライン: TNT Encoder Patch Transformer Pixel Transformer Pixel Transformer Pixel Transformer ... ... ... ... Decoderから参照
▪ 今回のタスクでは、”何も写っていない領域” を抽出しやすい ▪ 何か写ったパッチに絞ってTNTを適用(by hengck23) ▪ → 計算コスト・GPUメモリ削減に繋がり、解像度拡大を容易にした ベースライン:
TNT Encoder with variable patches(CV:1.30, LB:2.35) Patch Transformer Pixel Transformer Pixel Transformer Pixel Transformer ... ... ... ... Decoderから参照
▪ 生成したInChIをRDKitで標準化(by nofreewill) ▪ MolToInchi(MolFromInchi(inchi)) を実行 ▪ 原子に対する番号振り間違い程度であれば、この処理で標準化が可能 ベースライン: RDKit
normalization(後処理) InChI=1S /C9F5NO /c10-4-5(11)7(13)9(15-2-1-3-16)8(14)6(4)12 InChI=1S /C9F5NO /c10-4-5(11)7(13)9(8(14)6(4)12)15-2-1-3-16
▪ コンペティション概要 ▪ ベースライン ▪ Solution AGENDA
Phase1: Image Captioning学習 • Swin Transformer • Salt & pepper
noise • Focal loss • Train longer Phase2: InChI候補生成 • Beam search • Logit ensemble Phase3: InChI候補リランキング • RDKit標準化の利用 • 複数モデルで再評価 Solution: Overview
Solution: Overview Phase1: Image Captioning学習 • Swin Transformer • Salt
& pepper noise • Focal loss • Train longer Phase2: InChI候補生成 • Beam search • Logit ensemble Phase3: InChI候補リランキング • RDKit標準化の利用 • 複数モデルで再評価
▪ CV-LBギャップが大幅に改善(CV: 1.23, LB: 1.43) ▪ TNT(CV: 1.30, LB: 2.18)と比較すると顕著
▪ ちょうど論文読み会の順番が回ってきたので、Swin Transformerを 勉強してみたが、原因はよくわからず Phase1: Swin Transformer Encoder(LB:2.18→LB:1.43) https://www.slideshare.net/DeepLearningJP2016/dlswin-transformer-hierarchical-vision-transformer-using-shifted-windows
▪ SwinはCV-LBが一貫していたため、Swinの生成結果をGTだと 考えた時の、TNTとのLevenshteinを比較 ▪ Valid: 1.02・Test: 2.16と、2モデル間でもギャップがあることを確認 ▪ Levenshteinが大きい順に、Valid /
Test を見比べた ▪ (当然だが)Valid / Test 共に、サイズの大きい化合物が目立つ ▪ Testの方は、ごま塩ノイズが特に目立っていた Phase1: Swin ⇔ TNT 間の生成結果の比較 Levenshtein最大化合物(valid) Levenshtein最大化合物(test)
▪ 同じ学習済みモデルに対し、testをデノイズして予測させる ▪ ある点を中心とする正方形中に、一つも黒点がなければ白に置き換える ▪ 再訓練していないにも関わらず、CV-LB Gapが激減 ▪ ただし、デノイズで重要な点を削ってしまうこともあり、CVも少し 悪化していた
Phase1: ごま塩をデノイズして予測(LB: 2.18→1.26) ノイズ除去◦ ノイズ除去☓ デノイズフィルタ(k=5)概要 Model CV LB TNT 1.13 2.18 +denoise (k=3) 1.69 1.71 +denoise (k=5) 1.22 1.26 +denoise (k=7) 1.17 1.32
▪ 訓練時、ごま塩をランダムに追加して学習 ▪ (解像度拡大も同時にしたので差分がわかりづらいが) デノイズ無しでも CV-LB Gap が解消された Phase1: 訓練時にごま塩追加(+解像度拡大)(LB:
1.26→1.06)
▪ 今回のタスクでは、大多数のサンプルが完全一致で当てられており、 一部のサンプルで大きなLossが生じる状態になっていた ▪ 参考: Swin Transformer(CV: 0.98, LB: 0.99)
▪ Levenshtein=0: 87% ▪ Levenshtein=1: 7% ▪ … ▪ Focal Lossで、簡単なサンプルに対するLoss の影響を小さくすることで、学習効率が向上 ▪ Phase1: CE Loss → Focal Loss Levenshtein分布(Logスケール)
▪ Camaroさんとチームマージした際、CVの差に衝撃を受けた ▪ Best single (Camaro): CV=0.66, LB=0.87 ▪ Best
single (KF): CV=0.98, LB=0.99 ▪ 主要因はepoch数ではないかと推測 ▪ Camaro: 25-50 epoch (TPU 7days?) ▪ KF: 10 epoch (A100 7days) ▪ Train/Valid lossが共通して単調減少していたので未学習気味とは 思っていたが、他モデルの検証を優先して試せていなかった ▪ 3 epoch追加学習するとCV=0.98 → 0.91に改善 ▪ もっと長くするともっと伸びそう... ▪ とはいえ計算コスト的に辛いので、TPU使っておけばよかったか... Phase1: Train longer
▪ Encoder: ▪ Swin-transformer(size=384x384) ▪ EfficientNet-v2の後段にViTをくっつけたもの(size=448x448) ▪ Patch embeddingにCNNを使うイメージ ▪
Decoder: ▪ 三層のtransformer ▪ これ以上深くすると学習が不安定に ▪ 画像のresizeにPIL.Image.resizeを使う ▪ cv2.resizeなどよりもPILの方が劣化が少ないらしい(参考) ▪ Pseudo labelを使ったfine tuning ▪ CV/LBのギャップを埋めるのに貢献。CV/LBも0.3ほどスコア向上。 ▪ Sequence bucketingによる学習の高速化 Phase1: lyakaap part
Solution: Overview Phase1: Image Captioning学習 • Swin Transformer • Salt
& pepper noise • Focal loss • Train longer Phase2: InChI候補生成 • Beam search • Logit ensemble Phase3: InChI候補リランキング • RDKit標準化の利用 • 複数モデルで再評価
▪ Phase3でリランキングを行うため、Phase2では良質で多様な 候補を生成する必要があった ▪ 一つの手段としてBeam Searchを利用 ▪ 候補が格段に増え、Greedyの生成結果と組み合わせて Phase3 の
ロジックを適用することで、スコアが大きく改善された ▪ 特に難しいサンプルに対してビーム幅を広げて(Beam=32など) 生成することで、効率的に候補追加を行うことができた(by lyakaap) Phase2: Beam Search InChI=1S/C13H20OS… InChI=1S/C13H21OS… InChI=1S/C11H21OS… InChI=1S/C12H20OS... Model CV Swin (beam=1) 0.98 Swin (beam=4) 0.93 Swin (beam=1+4) 0.87
▪ 各トークン予測に使うロジットをアンサンブル ▪ Swin, TNT の2モデルだけでも割と多様性があり、アンサンブル しながら系列生成することで、より正確に予測できるようになった ▪ ただし、全てのモデルが単一のプログラムで動作する必要があり、 チーム内でモデルをシェアするのは難易度が高かった
Phase2: Logit ensemble Model CV Swin (beam=1) 0.98 TNT (beam=1) 1.04 Swin+TNT (beam=1) 0.83 Swin + BERT TNT + BERT logit (vocab≒150) average + InChI=1S/C13H input 20 20?21?19? 20?18?
Solution: Overview Phase1: Image Captioning学習 • Swin Transformer • Salt
& pepper noise • Focal loss • Train longer Phase2: InChI候補生成 • Beam search • Logit ensemble Phase3: InChI候補リランキング • RDKit標準化の利用 • 複数モデルで再評価
▪ RDKit標準化も活用し、結果をリランキングする ▪ InChI生成時、基本的には尤度が大きくなるように生成しているものの、 1文字など些細なミスに対して尤度は甘く出がち ▪ RDKitで標準化すると逆に尤度が低くなるものも存在 ▪ 1文字ミスなどはInChI文法エラーになる場合も多く、RDKitでパース できるかどうか(is_valid={0,
1})も含めた以下ロジックが強力だった ※ score: cross entropy loss or focal loss Phase3: RDKit標準化の利用
▪ 複数モデルの生成結果を相互レビューさせる ▪ 全InChI候補に対して各モデルでlossを計算し、平均値を利用する ▪ loss値のスケールが合わないモデルに対しては、一度値をランク化 した上で平均を取るようにすることで解決 ▪ 各サンプルに対する尤度を各モデルが推定できれば良いので、 実装が異なっていても活用しやすい
Phase3: 複数モデルで再評価 Model (CE) Model (Focal) Average InChI Candidates A B Mean Rank C D Mean Rank Rank InChI=1S/C13H20OS… 0.1 0.9 0.5 3 0.03 0.05 0.04 2 2.5 InChI=1S/C13H21OS… 0.2 0.2 0.2 1 0.02 0.02 0.02 1 1 InChI=1S/C12H20OS... 0.3 0.5 0.4 2 0.01 0.09 0.05 3 2.5 ※ この例では同一のimageに対してRankを取っているが、実際には全imageに対するRankを取っている
最終モデル(一部) Member Model CV LB (greedy) LB (reranked) KF Swin
large (384x384) + PL 0.90 0.89 0.79 TNT (512x1024) + PL 0.97 0.99 0.87 lyakaap Swin base (384x384) + PL 0.92 0.85 0.74 Swin base (384x384) + PL + focal loss 0.87 0.78 0.70 EffNet-v2 >> ViT (448x448) + PL + focal loss 0.86 0.81 0.70 Camaro EffNetB4 Transformer Decoder (416x736) 0.67 0.87 0.67 EffNetB4 Transformer Decoder (416x736) + PL 0.67 0.73 0.62 EffNetB4 Transformer Decoder (416x736) + Noise 0.65 0.84 0.62 EffNetB4 Transformer Decoder (416x736) + Noise/Denoise 0.83 0.77 0.61
▪ Train/Test Gapの発見が一つの鍵だった ▪ 意外と上位でも見抜いているチームは少なかったぽい? ▪ データ規模が大きい場合は特にTPUが有効 ▪ Pytorchで不自由無く使える世の中になってほしい... ▪
多様なモデルで候補生成 + リランキングの形式が上手くいった ▪ 基本的に、候補・モデル共に、足せば足すほど伸びていった。 ▪ 特にcamaroさんと混ぜた時に急激に伸びた。多様性重要。 ▪ ビームサーチで尤度最大になる経路(InChI)を探しているはず だが、別モデルの出力を持ってきた方が尤度的にも優れていた ▪ 枝刈りが強すぎて有望なパスを見落としている可能性? ▪ 計算コスト的に難しいが、MCTS的に探索できるとより良かったかも? まとめ