くずし字3位解法
試したこと:
Model:
Data Augmentation:
その他
効いたこと:
- ShakeShake
- Label smoothing
- Random Cropping
- Cutout
- Ensemble
- Pseudo-Labeling
実験:
いろいろと実験をしたのだが,嫌になってデータをすべて消したので以下はうろ覚え.
予備実験
Random Cropping (ResNetは128x128を入力とした)とmean subtractionのみを前処理とし,batchsize=128, lr=0.2, Momentum SGD, cosine annealingによって30 epoch学習した結果,5-fold CVにおいて,validation accuracyが
SE-ResNeXt: 0.96
Shallow ResNet: 0.95
Narrow ResNet: 0.93
ShakeShake: 0.99
ShakeDrop: 0.95
となった.ろくにハイパーパラメーターチューニングをしていないので,不公平な実験であることは明らかにしておく.この結果を受けてShakeShakeを使うことにした. ShakeShakeとShakeDropはchainercv2の実装を使った.ShakeDropはdtypeのcastにバグがあったので修正しないと実行できなかった(どこかは忘れた).
本番
Label Smoothing, 回転,Cutoutを適用し,5-fold CVで得られたモデルをaverage ensembleすることで,test setにおけるスコア0.992を得られた.
Test setに対する推測をPseudo-Labelingし,同じくShakeShakeをrandom initilizationから学習した.
このとき,pseudo-labelingはモデルたちの推測結果の平均をラベルとし,label smoothingとの兼ね合いで0.9を上限にクリップした.
異なったランダムシードによって異なったtraining/validation splitを作成し,合計で30のモデルを学習し,validaition errorの低いモデルを10個選んで同じくaverage ensembleを行い,最終的にスコア0.994を得られた(実用性?知らない子ですね・・・).
感想
ak1100氏の二位解法をみると,300 epochと私の設定の10倍で,さらには"300epochしか回さなかったのは足りてなかったかもしれません"と述べている. Cosine annealingもShakeShakeもエポックを多くすることがキモだが,shakeshakeの効率が悪すぎて(volatile gpu-utilが20%を超えない)あまりにまだるっこしいし学習曲線がサチって見えたので短縮してしまった. 短気は損気(確信).
今回のコンペではわりとオーソドックスな手法を様々試し,組み合わせることで3位に入賞することができた.もっと参加者が多かったり難しい課題だったりするコンペも基本を抑えれば結構戦えるのではないだろうか.夢が広がる.