機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

Fast AutoAugmentを読んだのでメモ

はじめに

Fast AutoAugmentを読んだのでメモ. とにかく計算時間のかかるAutoAugmentを高速(CIFAR-10:5000->3.5, SVHN:1000->1.5, ImageNet:15000->450 GPU hours)にした論文.

Fast AutoAugment

Search Space

まず\mathbb{O}を入力空間\mathcal{X}上のaugmentation operations \mathcal{O}:\mathcal{X}\rightarrow\mathcal{X}の集合とする.各operation \mathcal{O}は確率pと強度\lambdaを持つ.\mathcal{S}をsub-policyの集合とし,sub-policy \tau\in\mathcal{S}N_\tau個のoperationの集合\{\bar{\mathcal{O}}^{(\tau)}_n(x;p_n^{(\tau)},\lambda_n^{(\tau)}):n=1,\dots,N_\tau\}として定義される.各operationは入力画像に対してn=1から順番に確率pに従って次のように適用される.

\displaystyle
\bar{\mathcal{O}}(x;p,\lambda):=
\begin{cases}
\mathcal{O}(x;\lambda)\ \ :\text{with probability }p\\
x\ \ \ \ :\text{with probability }1-p
\end{cases}

よってsub-policy \tau(x)の出力は

\displaystyle
\tilde{x}_{(n)}=\bar{\mathcal{O}}_n^{(\tau)}(\tilde{x}_{(n-1)},\ n=1,\dots,N_\tau

として定義される.N_\tau=2の場合にはAutoAugmentと同じで,探索空間はp\lambda区間[0,1]の連続値として扱うことを除いて等しい.

Search Strategy

まず\mathcal{D}\mathcal{X}\times\mathcal{Y}上の確率分布とし,D\in\mathcal{D}をデータセットとする.パラメータ\thetaを持つ分類モデル\mathcal{M}(\cdot|\theta):\mathcal{X}\rightarrow\mathcal{Y}が与えられた際,データセットD上での\mathcal{M}(\cdot|\theta)の期待される精度と損失は\mathcal{R}(\theta|D),\mathcal{L}(\theta|D)で定義される.

任意のペアD_\text{train}D_\text{valid}が与えられた際,目標はモデルの汎化性能を向上させる事となる.ここでの考え方はD_\text{train}D_\text{valid}の分布を一致させるようなaugmentationのpolicyを見つける事で汎化性を向上させる. ただ,当然二つの分布の密度関数をすべてのpolicyの候補において比較することは不可能なので,ここではあるデータセットがもう一方のデータセットのパターンにどれほど従うかを,両方のデータセットに対するモデルの予測を使って測る. 具体的にはD_\text{train}D_\mathcal{M}D_\mathcal{A}の二つに分け,\thetaの学習と\mathcal{T}の探索に利用する.policyの探索のため,下記の目的関数を定義する.

\displaystyle
\mathcal{T}_\ast=\underset{\mathcal{T}}{\mathrm{arg}\max}\mathcal{R}(\theta^\ast|\mathcal{T}(D_\mathcal{A}))

ただし,モデルのパラメータ\theta^\astD_\mathcal{M}上で学習した結果とする.この目的関数は近似的にD_\mathcal{M}\mathcal{T}(D_\mathcal{A})間の分布の距離を,モデルのパフォーマンスの最大化という観点で最小化している.

上記の目的関数はK-fold stratified shufflingとBayesian optimization methodを利用する.

  • まずK-fold stratified shufflingによりD_\text{train}D_\text{train}^{(1)},\dots,D_\text{train}^{(K)}のK個に分割する.各D_\text{train}^{(k)}は二つのデータセットD_\mathcal{M}^{(k)}D_\mathcal{A}^{(k)}から成る.以下,表記の簡略化のためkを省略する.
  • 次に,D_\mathcal{M}を使い,data augmentation等は使わずモデルを学習する.
  • 学習後,1\leq t\leq Tの間B個のpolicyの候補\mathcal{B}=\{\mathcal{T}_1,\dots,\mathcal{T}_B\}をbaysesian optimizationにより探索空間\mathcal{S}から探索する.より具体的には\mathcal{T}(D_\mathcal{A})での\mathcal{L}(\theta|\cdot)を最小化するように買う率\{p_1,\dots,p_{N_\tau}\}と強度\{\lambda_1,\dots,\lambda_{N_\tau}\}を持つpolicy \mathcal{T}=\{\tau_1,\dots,\tau_{N_\tau}\}を探索する.

肝としては,policyの探索の間モデルのパラメータを学習する必要は一切なく,これにより実行速度を大幅に改善している.また,それと同時にAutoAugmentのchild modelの概念をなくし,実際に学習したいネットワークに対して直接policyを探索する事を可能にしている.

探索終了後は\mathcal{B}の中から上位N個のpolicyを選び,それらを\mathcal{T}_tとする.その後\mathcal{T}_t\mathcal{T}_\astにmargeし,\mathcal{T}_\astを得る.最終的には\mathcal{T}_\astD_\text{train}全体に適用してモデルを学習する.

policyは学習済みモデルに対してモデルの損失を下げる(精度を上げる)ように探索されているため,次の関係を満たすことが期待される.

\displaystyle
\mathcal{R}(\theta|\mathcal{T}_\ast(D_\mathcal{A}))\geq\mathcal{R}(\theta|D_\mathcal{A})

この辺りイマイチ理解ができていないのが,policyは学習されたモデルに対して損失\mathcal{L}(\theta|\mathcal{T}(D_\mathcal{A}))が最小となるように学習するため,テストデータの分布を学習データに近づけるようなdata augmentationを選ぶようになっているというのが直感的なところで,その場合に得られたpolicyを使って学習することがなぜ改善をもたらすかよくわからない.勘違いしているのか理由があるのか.

Policy Exploration via Bayesian Optimization

policyの探索で全policy候補の精度評価をすることは不可能なので次のExpected Improvement (EI) criterionを利用する.

\displaystyle
\mathrm{EI}(\mathcal{T})=\mathbb{E}[\min(\mathcal{L}(\theta|\mathcal{T}(D_\mathcal{A}))-\mathcal{L}^\dagger,0)]

\mathcal{L}^\daggerは過去に探索されたpolicyのquantileによって決められる閾値.この辺りは詳しくないので詳細は省くが,最適化にはHyperOptを使って並列化してやったとのこと.

まとめ

上でも述べたように,最適化しているpolicyの意味がイマイチピンとこない(学習と評価時の分布を近づけるようなaugmentationという気持ちはわかるがその方向が評価データ->学習データとなっているので).また,AutoAugmentと違いtransferabilityに関する評価がなかったのでその辺の挙動も気になる.ただ実装が公開されていて計算時間も現実的なので色々と試すことはできそう.