きゃねろぐ

とある「おひさま」の徒然日記

機械学習の勉強メモ

Model Architecture

PreAct-ResNet

 オリジナルのResNetは以下のような構造を持つ.

Conv. -> BN -> ReLU -> Conv. -> BN -> Add -> ReLU

ここで,Conv.は畳み込み層,BNはbatch normalization,ReLUは活性化関数,Addはshortcut connectionの加算を表す. これを以下のように修正することで精度の改善が見られた.

BN -> ReLU -> Conv. -> BN -> ReLU -> Conv. -> Add

なお.論文中ではshortcut connectionについても議論がされている(e.g. 加算時に重み付けを行う,dropoutを追加する)が, オリジナルのshortcut connectionが最も良かった.

arxiv.org

EfficientNet

 2019年に発表.CNNの性能を上げるには,

  • 層数  \alpha(深さ)
  • チャンネル数  \beta(広さ)
  • 入力画像のサイズ  \gamma(解像度)

を大きくするのが一般的だが,適切にパラメータを調整しないと,計算コストの割に性能が向上しないなんてことになる. これら3つのパラメータの関係を解析することで, 2^N 倍の計算資源が使える場合には,  \alpha, \beta, \gamma をそれぞれ  \alpha^N, \beta^N, \gamma^N に置き換えればいいことが分かった. なお, \alpha, \beta, \gamma の初期値についてはgrid searchを行う.

Squeeze-and-Excitation

 簡単に言うと,各チャンネルに対して重み付けを行う.

def SE_block(input, channels, r):
    x = GlobalAveragePooling2D()(input)
    x = Dense(channels//r, activation="relu")(x)
    x = Dense(channels, activation="sigmoid")(x)
    return Multiply()([input, x])

各チャンネルの代表値をGlobalAveragePooling2Dで抽出(Squeeze)し, 一旦チャンネル数を1/rに減らした全結合層に結合した後,元のチャンネル数と同じ全結合層から得られる値で重み付け(Excitation)する. ResNetのresidual block内に組み込むことも可能.

arxiv.org

Learning Method

Knowledge Distillation

 モデルを学習させる際,真のラベルを真値とするのではなく,学習済みモデルの出力する予測値を真値として扱う. これにより,「正解が何か」という真のラベルから得られる情報だけでなく,「どれくらい予測に自信があるか」, 「他のラベルの中に正解に似ているものはあるか」などの情報も,今から学習させようとしているモデルに引き継ぐことができる. これを知識の蒸留(knowledge distillation)という.

codecrafthouse.jp

 本来は,高性能なモデルを訓練された教師モデルとして,計算資源が限られた環境で用いられることを想定した低性能なモデルに情報を受け継がせる手法である. しかし,同程度の性能を持つモデル同士で知識の蒸留を行ったり,入力に複数通りの前処理を行ったものそれぞれから教師モデルの出力を得て, 出力のアンサンブルを知識の蒸留に用いたりすることで,モデルの性能の向上が確認されている.

arxiv.org arxiv.org

Data Augmentation

CutMix

 2019年に発表された画像専用のデータ拡張手法. 異なるラベルの画像を切り貼りして1枚の新たな画像を作り,画像の面積比に応じてラベルをミックスさせる. 従来のMixup(異なるラベルの画像を重ね,透明度に応じてラベルをミックスさせる)や Cutout(画像の一部を真っ黒にする)などの手法を上回った.

arxiv.org

Activation Function

Swish

 2016年に発表.様々な関数をユニットとして,どの関数の組み合わせが最適かを探索することにより得られた活性化関数.


f(x) = x\cdot sigmoid(\beta x) = \frac{x}{1+e^{-\beta x}}

ここで, \beta は定数( \beta = 1 が良さげ)またはtrainable parameterである.  \beta\to\infty とすると,SwishはReLUに一致する.

arxiv.org

Mish

 2019年に発表.Swishよりも高い性能を示した.


f(x) = x\cdot\tanh(softplus(x)) = x\cdot\tanh(\ln(1+e^x))

Swish ( \beta = 1) に似た形のグラフになる.

arxiv.org

Snake

 2020年に発表.活性化関数に周期性を持たせることにより外挿(観測値が得られた範囲外の予測)も可能になった.


f(x) = x + \sin^2 x

気温の変化,株の値動きなど,周期的な数値を予測したいときに適している.

arxiv.org

Optimization Algorithm

 Adamまでの最適化アルゴリズムについては以下の記事がめちゃくちゃ分かりやすい. 簡単にまとめると,

Adam = RMSProp(学習率の調整)× momentum SGD(更新方向の調整)

ということらしい.

qiita.com

RAdam

 学習が進むにつれ学習率を徐々に小さくしていくというテクニックは一般的である. しかし,学習をランダムな初期点から始める場合,学習の初期における挙動の良し悪しは分からないという問題がある. そこで,最初の数ステップでは学習率を増加させ,一定数のステップ後は学習率を減少させるというテクニックがある. これはwarmupと呼ばれ,様々な最適化手法に対し性能を向上させている.

 2019年に発表されたRAdamは,Adamをベースに学習率を特定のルールに従ってadaptiveに調整する手法である. 学習率が安定しない内はmomentum SGDで更新を行い,安定後は(補正を施した)Adamで更新する. warmupのルールを自分で決定する必要がないという利点がある.

arxiv.org

AdaBelief

 Adamのようなadaptive methodは収束が早いのに対し,SGDと比べると精度が低下する傾向にある.

arxiv.org

 2020年に発表されたAdaBeliefは,以下の3つの性質を兼ね備えている.

  1. Adamのような収束の速さ
  2. SGDのような精度の良さ
  3. GANなどの複雑な設定下での安定性

学習率を調整したりSGDと切り替えたりすることなく,Adamのアルゴリズムの一部を変えているだけなので,非常に理解しやすい.

arxiv.org

Other Technique

Label Smoothing

 分類問題では損失関数にcross-entropy,真値にone-hotベクトルを用いるのが一般的.


f(y, \hat{y}) = \sum_{i} y_{i}\log\hat{y}_{i},\quad
y=(0,\dots,1,\dots,0)

label smoothingでは,真のラベル以外に対しても正の予測値を持たせたベクトルを真値とする.


y^{LS}_{i} = (1-\alpha)y_{i} + \frac{\alpha}{K}

ここで, K はラベルの種類数, \alpha はハイパーパラメータである. 例えば,3クラス分類問題において  \alpha=0.15 とすれば,  y=(1, 0, 0) y^{LS}=(0.9, 0.05, 0.05) のようになる.

 下記の論文によると,label smoothingには以下の特徴がある.

  • 出力がラベルごとにきれいなクラスターを作るようになる.
  • calibration効果:「自信満々のハズレ」が少なくなる.
  • 知識の蒸留には適していない.

arxiv.org