深さ学習テクニック(二):モデルの微調整


論文「Bag of Tricks for Image Classification with Convolutional Neural Networks(2018)」を引き続き解読し、ResNetを例に簡単な微調整技術を提案し、一定の成果を収めた.正確率はともかく、論文の中で分析精度がどのように向上しているかに加えて、余分なオーバーヘッドが発生し、分析、実験を通じてこれらのオーバーヘッドを量子化したことにも注目している.これは肯定的だ(オーバーヘッドを考慮せず、盲目的に微調整し、犠牲になった多くの速度でそのわずかな正確率を向上させた論文より、どこまで高いか分からない!)
ResNetを例に
元のResNetモデルは『古典的なCNN分類アーキテクチャ-ResNet|Hey~YaHei!』を参照できます.その核心はshortcut(原文ではskip connectionと呼ぶ)技術を応用して深層ネットワークも効果的に訓練できるようにすることであり、具体的な詳細はここでは後述しない.
改善1:サンプリングを遅らせる
この改良法は最初にTorchで提案されたが,現在ではこの改良も広く応用されている.まず、元のモデルのサンプリングモジュールを観察します.
そのPathAは順次1を通過する.1 x 1のコンボリューションは、チャネルの収縮を完了する、ステップ2は、ダウンサンプリング2を実現する.3 x 3のボリュームは、チャネル数が変わらず、主に特徴を抽出するために用いられる.1 x 1のボリュームは、チャネルの拡張を完了し、最初のボリュームは下サンプルとして使用されるため、ステップ長は1に設定されています.よく考えてみると、コアサイズ1 x 1、ステップ長2のボリュームは3/4の情報を失うことがわかります.6 x 6の特徴図を例にとると、下図に示すように、赤色部分の情報のみが次の層に伝達され、非赤色部分はいずれもボリューム計算に関与しない.
このことから、1 x 1のボリューム層でダウンサンプリングを行うのは賢明ではなく、より良い方法は、ダウンサンプリングプロセスを3 x 3のボリュームに移すことであり、下図に示すように、ボリュームコアの幅がステップ長より大きいため、ボリュームコアは移動中に特徴図上のすべての情報を入力することができる(さらにオーバーラップすることもある):
サンプリングモジュールは次のようになります.
改良2:大核ボリュームの分解
『コンボニューラルネットワークCNN-コンボ層(Conv)|Hey~YaHei!』前述したように、大きなコア・ボリューム層は、パラメータを低減するだけでなく、ネットワークの容量および複雑さを増大させるためにネットワークの深さを深めるために、多層の小さなコア・ボリュームの代替によって実現することができる.Inceptionも『Rethinking the Inception Architecture for Computer Vision(2015)』でInceptionv 1を改良し、7 x 7と5 x 5のボリュームの代わりに3つと2つの3 x 3ボリュームのカスケードで置き換えた.このテクニックはResNetにも適用されます.
改善3:1 x 1のボリュームの代わりに平均プール化でサンプリング
ダウンサンプリングモデルのPathAとPathBは、正確に加算するためにダウンサンプリングを行う必要があり、改善1はPathAのみを改善し、実際にはPathBも1 x 1のボリュームでダウンサンプリングを行う.このため、論文「Bag of Tricks for Image Classification with Convolutional Neural Networks(2018)」は、PathBのダウンサンプリング作業を平均プール化で引き継いだ.
じっけんけっか
 
ここで、A、B、C、Dは、それぞれオリジナル、改良1、改良2、改良3のモデルを表す.
 
改良後,最終ResNet−50−D精度は0.95%向上した.しかし,以上の改良はモデルの演算複雑度を増加させ,FLOPsは約13%増加したが,実測速度は3%減少しただけであることも認めざるを得なかった.
FLOPsと実測速度について
意外なことに、なぜ演算量が13%増えたのに、実測速度が3%しか下がっていないのでしょうか.
マルチブランチネットワーク
まず、ResNetはshortcut技術を適用しているため、従来の直筒式ネットワークに比べて分岐が増加し、異なる分岐は並列に計算できるが、FLOPsを計算する際には異なる分岐の演算量を順次加算することに注意しなければならない.
効率的な1 x 1ボリューム
『MobileNets v 1モデル解析|Hey~YaHei!』1つの文で言及されています
深さ方向分解のボリュームのほとんどのパラメータと演算は1に集中している.×1のpointwise畳み込み演算では,この演算はちょうどGEneral Matrix Multiply(GEMM)関数によって高度に最適化できる.
なぜ1 x 1のボリュームが高度に最適化されるのですか?まず、ボリューム計算の実現から始めましょう.
コンボリューションの原理
詳細な原理については、『コンボニューラルネットワークCNN-コンボ層(Conv)|Hey~YaHei!』を参照してください.と『5.1二次元ボリューム層|手作業で深く学ぶ』.
まず3 x 3の単一チャネル特徴図とk 2 s 1のボリュームコアを考慮する.
ボリュームに基づいて計算すると、
 
y11=w11x11+w12x12+w21x21+w22x22
 
y12=w11x12+w12x13+w21x22+w22x23
 
y21=w11x21+w12x22+w21x31+w22x32
 
y22=w11x22+w12x23+w21x32+w22x33
 
「行順」に従って、フィーチャーマップとボリュームコアはメモリにこのように配置されます.
ボリューム計算におけるアクセス・プロシージャ(同じ色のデータを乗算)を異なる色で表示します.
よく知られているように、プログラムの局所的な原理(通常、隣接するコードセグメントは隣接するメモリブロックにアクセスする)のため、現代のプロセッサは通常、メモリからキャッシュにデータをブロックごとに読み出し、アクセス速度と計算速度の大きな違いによるメモリ壁の問題を緩和します.言い換えれば、x12のデータをメモリから読み出す必要がある場合、隣接するx11x13などのデータも一緒にキャッシュに読み込まれることが多く、次回の計算でx11またはx13を使用する必要がある場合、プロセッサはメモリから呼び出さずに高速バッファからデータを迅速に取り出すことができ、プログラムの速度を大幅に向上させることができる.メモ:L 1キャッシュの読み込み速度はRAMの50~100倍!(データソース:『コンピュータアーキテクチャ:量子化研究方法』)
上に示した訪問保存過程から,直接的に特徴図データに対するアクセス過程は非常に乱れており,行先順に格納された特徴図を直接計算に参加することは非常に愚かな選択であることがわかる.したがって,深さ学習フレームワークは空間を犠牲にする手段(約K拡張)によって×K
倍)は,特徴図を膨大な行列に変換してボリューム計算を行い,これが一般的なim 2 col動作である.
im2col
参考:「im 2 colの原理と実現|CSDN,dwyane 12138」「Caffeでどのようにボリュームを計算しますか?|知っています、賈揚清」
 
実際の考え方は非常に簡単です.サイクルごとに必要なデータを列ベクトルに並べ、一つ一つ積み重ねてマトリクスを形成します(チャネル順に列方向にマトリクスを接合します).例えばCi×Wi×Hiサイズの入力特徴図,K×Kサイズのコンボリューションコア、出力サイズCo×Wo×Ho,入力特徴図は需要に応じて(K∗K)に変換される×(Ci∗Wo∗Ho)の行列は,コアドリル核がCoに変換される×(K∗K)の行列は,GEMMライブラリを呼び出す2つの行列を乗算していわゆるボリューム計算を完了する.計算需要に従ってデータの順序を並べたため、計算過程のたびに特徴図データに順次アクセスすることができ、局所的な原理に迎合し、計算ボリュームの速度を極めて向上させた.
 
特別な1 x 1
1 x 1のボリュームに戻ると、そのim 2 colは非常に特殊です.その元の記憶構造はim 2 colの再配列行列と全く同じです!!すなわち、1 x 1のボリュームはim 2 colのプロセスさえ必要とせず、持ち上げると直接計算でき、データの並べ替えの時間と空間を節約できるので、同じFLOPsを前提にしても、1 x 1のボリュームは3 x 3のボリュームよりも速く、効率的である.もちろん,これは局所的原理とフォンノイマン構造の基礎の上に確立されており,非フォン構造の計算体系には適用されない可能性がある.
これもなぜMobileNetが論文の最後に94.86%の演算量が1 x 1のボリューム演算に集中していると大々的に吹聴しているのか、その高速さは「パラメータが少なく、演算量が少ない」だけではない.
同様に、前述の改善1と改善3は多くの演算量を増加させたように見えるが、これらの演算量はいずれも1 x 1のボリュームに負担されており、実測速度の低下は演算量の増加ほど明らかではない.