Resnet-50の精度を高める方法について（Bag of Tricks論文解説）

# 0.参考にした論文
Bag of Tricks for Image Classification with Convolutional Neural Networks

https://arxiv.org/pdf/1812.01187.pdf

画像分類において、深層学習を用いているのですが、なかなか局所最適に陥ったり
なんか精度が上がる手法って何があるんだろうと思い、
chat-GPT様に「なんかいい論文はないのか」と聞いたところ
なんか良さそうな論文があった。

さまざまな手法が載っており、自分の持っているモデルに活用できそうなtickがたくさんあった。

## 0.1 簡潔にこの論文でやっていること

BaseはRes-net50を扱っています
大変有名な論文なので、一応載せます。

https://arxiv.org/pdf/1512.03385.pdf

冒頭では、大まかに「trick」と言っているのですが、さまざまな試行錯誤の組み合わせを総称してtrickと呼んでいます。

Res-netにはさまざまな派生系がありますが、
初学者（自分）にとっては、新しいモデルも学習することも大事ですが
それよりもさまざまなtrickを知っておくことかと思います。

# 1. 最終的な結果
Base-lineのResnet-50の75.3%の正解率から
79.29%にしております！

![スクリーンショット 2023-04-30 18.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/cd61e91b-80d9-2ab1-f170-d4e1ea2beaf4.png)

##  2.ベースラインの最適化手法

ミニバッチ確率的勾配降下法を行っている

## 2.1 ベースラインの前処理手法

1.画像をランダムにサンプリングし、[0, 255]の32ビット浮動小数点生の画素値にデコードする。
2.縦横比が[3/4, 4/3]、面積が[8%, 100%]の矩形領域をランダムに切り出し、224×224の正方形画像にリサイズする。
3.0.5%の確率で水平方向に反転させる。
4.色相，彩度，明度を[0.6, 1.4]から一様に抽出した係数でスケーリングする。
5.正規分布N(0, 0.1)からサンプリングされた係数を持つPCAノイズを追加する。
6. 123.68を減算してRGBチャンネルを正規化する
116.779、103.939、58.393で割ると57.12となる、
それぞれ57.375である。

⇨ここに関しては、理解できていない部分あり。

入力画像自体は、299*299に変換
データセットは130万枚、1000分類となっています。

結果、元論文よりもResNet-50に関しては、精度が向上した。
![スクリーンショット 2023-05-01 14.09.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/3a388922-36a2-be59-1743-438d339ba8bd.png)

# 3.大きなバッチサイズを使うことのデメリットについて

要約すると、セクション3.1では、ニューラルネットワークのトレーニングで大きなバッチサイズを使用すると、モデルの精度と収束率に悪影響を及ぼす可能性があることを述べています。著者らは、これらの影響を緩和し、大きなバッチサイズを使用する際に精度とトレーニング速度の両方を改善するために使用できるいくつかのテクニックを提案しています。

バッチサイズとは、確率的勾配降下法（SGD）の各反復でまとめて処理される訓練例の数のことである。ミニバッチSGDは、ニューラルネットワークの学習によく使われる最適化アルゴリズムで、複数のサンプルをミニバッチにまとめています。

大きなバッチサイズを使用すると、解に収束するのに必要な反復回数を減らすことができるため、学習プロセスを高速化することができます。しかし、モデルの精度や収束率に悪影響を及ぼすこともある。最適化問題では、バッチサイズが大きくなるにつれて収束率が低下する。同様の経験的な結果は、
さまざまな場所で報告されています。

大きなバッチサイズを使用することで、各反復においてモデルがパラメータ空間のより大きな部分を探索することができ、局所最適を回避できる場合がある。しかし、これはオーバーフィッティングによる汎化性能の低下という代償を払うことになる。

著者らは、大きなバッチサイズを使用する際に、これらの悪影響を軽減し、精度と学習速度の両方を改善するために使用できるいくつかのテクニックを提案している。これらは以下の通りである：

1. 学習率のウォームアップ：トレーニングの最初に学習率を徐々に上げることで、大きなバッチサイズを使用する際に発散や振動を防ぐことができる。
2. Layer-wise adaptive rate scaling (LARS)：層別統計量に基づいて学習率を変化させることで、バッチサイズが大きい場合の収束性と汎化性を向上させることができる。
3. 重み減衰：損失関数にL2正則化を加えることで、大きなバッチサイズを使用する際のオーバーフィッティングを防止することができます。
4. 勾配累積：モデルパラメータを更新する前に、複数のミニバッチの勾配を累積することで、非常に大きなバッチサイズを使用する際に、メモリ要件を減らし、安定性を向上させることができます。

要約すると、セクション3.1では、ニューラルネットワークのトレーニングで大きなバッチサイズを使用すると、モデルの精度と収束率に悪影響を及ぼす可能性があることを述べています。著者らは、これらの影響を緩和し、大きなバッチサイズを使用する際に精度とトレーニング速度の両方を改善するために使用できるいくつかのテクニックを提案しています。

４つの事例については、この後詳しく説明します。


### 3.1 学習率のウォームアップ

https://arxiv.org/pdf/1706.02677.pdf

この論文によると、

ミニバッチサイズに比例して学習率を上げることで、画像1枚あたりの有効学習率を一定に保つという考え方です。これにより、異なるミニバッチサイズでも同様の収束挙動と精度を維持することができる。本論文で著者らは、学習率の線形スケーリングを最適化手法の1つとして用い、大きなミニバッチを使用する際に生じる困難に対処している。この手法により、小さなミニバッチと大きなミニバッチの使用時の精度を一致させることができ、また、学習曲線をほぼ一致させることができるため、収束前の実験の迅速なデバッグと比較を可能にすることを示す。

バッチサイズ256の初期学習率として0.1を選択し、より大きなバッチサイズに変更する場合は、0.1を選択します。
バッチサイズbの場合、初期学習率を
0.1 × b/256とする。

## 3.2 Learning rate warmup.

トレーニングの初めに全てのパラメーターは一般的にランダムな値であるため、はるかに最適解から離れる。⇦当たり前

大きすぎる学習率を使用するのは、数値的な不安定さをもたらす可能性がある。

発見的手法では、

最初に小さな学習率を行い、その後、学習率を切り替えていきます。

[7]では、緩やかなウォームアップを提案している。

最初のバッチm（epoch は5）

初期学習率をηとすると、バッチiで、1 ≤i≤m とすると、

学習率をi*η/mとする

## 3.3 Zero γ

ResNetネットワークは複数の残差ブロ

ックから構成され、各ブロックは複数の畳み込み層から構成される。
入力xが与えられたとき、block(x)がブロックの最後の層の出力だとすると、この残差ブロックはx + block(x)を出力します。
ブロックの最後の層は、バッチ正規化（BN）層である可能性があることに注意してください。

BN層は、まずxˆで示される入力を標準化し、次にスケール変換γxˆ + βを行う。
パラメータがあり、その要素はそれぞれ1sと0sに初期化される。
ゼロγ初期化ヒューリスティックでは、以下のように初期化する。残差ブロックの末尾に位置するすべてのBN層に対してγ＝0とする。
したがって、すべての残差ブロックは入力を返すだけで、層数が少なく、より簡単なネットワークを模倣している。を初期段階でトレーニングする。

### 自分が混乱している部分

⇨γを0にしてしまったら、βしか残らないのでは？

バッチノーマライゼーションの意味がなくなってしまう？？？


# 4.ResNet-50の変更点
![スクリーンショット 2023-04-29 15.17.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/53cd5b42-d850-213f-dffe-8075afbbb1d9.png)

一番左の図が現論文となっており、

PathBを見てみると、PathAに合わせるためにに、1*1の畳み込み層チャネル数の変更、srideを2にしている。

PathAを見てみると、1*1のstride=2の畳み込み層が入っている。

これをすることで前回の情報が失われている。

また、PathBの接続ブロックでも、PathAのサイズに合わせるために、strideを2にしている。pathbでも情報が落ちてしまっている。

Resnet-Bでは、最初の畳み込み層の1*1をストライドを1にし、その後に3*3の畳み込み層でstrideを2にすることで情報を落とさないようにしている。

ただし、Resnet-のB懸念としては、結局pathAの二回目のconv層でstride=2にしている影響でPathBでstrideを2にしている。

これでは完全に情報を失っていないとは言えない。

これを克服するために、Resnet-DではPathBでAvgPoolをすることで前回の情報を落とさずにダウンサンプリングされている！

計算コストについても、ほとんど影響を与えないことが記載されている！！

実際に観察してみると ResNet-50-DはResNet-50と比較して、学習スループットが3%しか低下していません。

# 5.学習率の更新

## 5.1 コサイン学習率減衰

ηt=1/2(1 +cos(tπ/T))*η

η：初期学習率

T：総合バッチ数

t:現在のバッチ番号

バッチサイズが32の場合、32個のトレーニングデータを１つのバッチとしてモデルに与えます

エポックが10でトレーニングデータの総数が1000でバッチサイズが32の場合、総合バッチ数は1000/32 = 31.25 * 10 = 320となる。

![スクリーンショット 2023-04-29 20.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/9b104298-f86c-2186-a931-8ce8ed81d797.png)


ステップ減衰とコサイン減衰の比較
見てわかるように、コサイン減衰
は、最初はゆっくりと学習速度を低下させ、次に
中盤からほぼ直線的に減少し、後半は減速します。
は、最後に再びダウンします。Step Decayと比較すると
コサイン減衰が始まり、最初からの学習が減衰していく
が、ステップ減衰で学習率が低下するまで大きなままである。
を10倍にして、トレーニングの進捗を向上させる可能性があります。

## 5.2 Label Smoothing


### label smoosingの有効性
ラベルスムージングは、画像分類ネットワークの性能を向上させるために用いられる技術である。画像分類ネットワークの最後の層は、多くの場合、可能性のあるラベルごとに予測された信頼度スコアを出力する完全連結層です。これらのスコアは、ソフトマックス演算子を使って正規化され、予測される確率を得ることができます。

ラベルスムージングは、真のラベルを真のラベルと他のラベルの混合物に置き換えることで、予測される確率に少量の不確実性を追加します。これにより、オーバーフィッティングを防ぎ、モデルが予測に自信を持つようになります。

![スクリーンショット 2023-04-29 20.31.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/7aff7e24-c0ea-99f5-b65f-64457e9898cb.png)
つまり、ラベルスムージングは、真のラベルに1の確率を、それ以外のラベルに0の確率を割り当てるのではなく、真のラベルに少し低い確率を割り当て、残りの確率の塊を他のラベルに分散させます。これにより、モデルの汎化能力を向上させ、データ中のノイズに対してより頑健にすることができます。

下の図は、大規模画像分類ベンチマークであるImageNetデータセットにおけるラベルスムージングの有効性を示したものである。この図は、(a)Theoretical gapと(b)Empirical gapの2つのサブプロットから構成されています。

![スクリーンショット 2023-04-30 17.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/6f4ebab0-281e-203c-1416-f9d364eb63d6.png)

epsはsmoosingの有効を決めるハイパーパラメーターである。

Gapは最大予測確率とその他の予測値とのギャップを示している。

epsが大きくなればなるほど、ギャップは小さくなる。

### Densityとは？

ある画像について、最大予測確率とその他の全ての確率間の経験的ギャップを視覚化する方法。

### 経験的ギャップとは？

経験的ギャップとは、与えられた画像に対する最大予測確率と他のすべての予測確率の平均との間の差のことを指します。

bについてのまとめ：経験的ギャップの特定の値で密度が高くなることは、経験的ギャップがその範囲に収まる画像が多いことを示す。

### label_smoosingの式解説
p_i = (1 - epsilon) * q_i + epsilon / K
ここで
q_i:加工前のソフトマックス関数
epsilon:どれだけ正解を曖昧にさせるか⇨label_smoosingをより表現するか？
K:クラスの総和

## 5.3  Knowledge Distillation

Knowledge Distillationの基本的な考え方は、より精度の高い事前学習済みモデル（教師モデルと呼ばれる）を使用して、より小さなモデル（生徒モデルと呼ばれる）の学習を誘導することである。教師モデルは、ハードターゲット（一発符号化されたベクトル）の代わりに、ソフトターゲット（クラスに対する確率分布）を生徒モデルに提供し、そこから学習させる。

model distillationはKnowledge Distillationの一種で、事前に訓練されたモデルを教師として使用し、より小さなモデルの訓練を指導する。この場合、教師モデルは生徒モデルよりも精度が高く、より大きく複雑なニューラルネットワークになることが多い。

学習時には、教師モデルと生徒モデルのソフトマックス出力の差にペナルティを与える蒸留損失が追加される。その目的は、生徒モデルが教師の知識から学び、複雑さを抑えながら自身の精度を向上させることである。

model distillationを利用した例として、ResNet-50の学習に役立つ教師モデルとしてResNet-152を利用することが挙げられる。ResNet-152はResNet-50よりも精度が高いが、パラメータが多く、訓練に必要な計算資源も多い。ResNet-152を教師として使うことで、その知識をResNet-50に伝え、より少ないパラメータと少ない計算量で、同等以上の性能を達成することができるのです。

著者らは、画像分類タスクのいくつかのベンチマークデータセットにおいて、model distillationを用いることで精度を大幅に向上させることができることを示す。

## 5.4 Mixup Training

学習時には、mixupを使用して新しい学習例をその場で生成し、この拡張されたデータセットでモデルを学習させます。これにより、新しいデータへの汎化を促進し、オーバーフィッティングを減らすことで、モデルの性能を向上させることができます。

![スクリーンショット 2023-05-01 15.57.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/9c62c3a7-a384-9b62-0de9-7d611c6493d5.png)

ここで、λ∈[0, 1]は
Beta(α,α)分布です

λを0.5にすることで、2つの特徴量を完全に半分に混ぜ合わせたようになります。

## 5.5　実験結果

画像分類タスクにおけるResNetニューラルネットワークの性能向上について、4つのトレーニングの改良の有効性を評価した複数の実験結果を紹介しています。

この実験で評価されたのは、4つのトレーニングリファインメントです：

1.ラベルスムージング：対象分布に一様なノイズを加え、より良い汎化を促す。
2.学習済みのResNet-152-Dモデルを教師として使用し、より小さなResNet-50モデルの学習を誘導する。
3.mixupの活用
4.mixupとdistillationの組み合わせ

著者らは、CIFAR-10、CIFAR-100、ImageNetなど、画像分類タスクの複数のベンチマークデータセットでこれらの技術を評価する。

その結果、4つのトレーニングの改良はすべて、これらの技術を使わずにトレーニングしたベースラインResNetモデルと比較して、精度の大幅な向上につながることが示された。特に、mixup with distillationは、いくつかのデータセットで最先端の性能を達成し、以前の方法を大きく上回る。

また、ラベル平滑化係数やミックスアップパラメータなどのハイパーパラメータがモデルの性能に与える影響を分析し、経験則に基づく適切な値の選択に関する推奨事項を示しています。
![スクリーンショット 2023-05-01 16.15.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/4bbff2d6-ae0d-3482-4745-8487104d81c7.png)


# 6.まとめ

以上がResNet-50における有効なファインチューニング手法でした。
一部理解ができなかった部分もありましたが、
自分自身学ぶことがかなり多かった論文だったので、また忘れないように復習していきます。
それではまた。