「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
(Convolutional Neural Network: CNN)
特徴 †
- 一般的な順伝播型ニューラルネットワークとは異なる。
- 1989年に単純な数字画像の認識のために開発されたLeNetが原型
- データの空間的構造を学習する画像分類において、圧倒的な性能を発揮した。
- 視覚神経系を模した畳み込み処理で画像から特徴抽出することで性能が出た。
- 大規模コーパスで学習されたモデルの重みは公開されていて、転移学習で新たなタスク向けに再学習し、新たなタスクのモデルを作成する。
できること †
- R-CNN
- Fast R-CNN
- Faster R-CNN
- FCOS
- YOLO
- SSD
- FCN (Fully Convolutional Network)
詳細 †
ILSVRC †
大規模画像認識競技会(ILSVRC)
内容 †
- ImageNet画像を使った1000分類
- (チーター、ジャガー、ヒョウ、ユキヒョウとか単純でない)
- 256*256カラー画像(訓練 : 検証 : テスト = 120万 : 5万 : 15万)
進展 †
パート †
CNNは大きく分けて2つのパートに分けることができる。
- 識別パート
脳の神経系を模した全結合層と出力層(≒ DNN)
- 全結合層を繰り返すことで最終的な出力を得る
- 得られた特徴量を活性化関数、Softmax関数を用いてアウトプット
畳み込み層 †
- 視神経系(視覚を司る神経系)を模して画像から特徴抽出する。
- 全結合層に入力する特徴を取り出すために自動化された前処理。
- 畳み込み処理
- 画像のフィルタ処理+活性化関数
- 特徴マップを生成(様々な特徴を取り出す)
- 細かい(局所的な)特徴の組み合わせから、
大まかな(大局的、複雑な)特徴を捉えられる。
- 手前の階層 → 波長の光に反応
- 奥の階層に進むにつれ → 線の向き、折れ線の角、直線の交差に反応
- 最奥の階層 → 特定の模様(≒ 特定のカテゴリ)に反応
- ただし、理論的な裏付けは無い。
生体の神経系を見よう見まねで模倣してみたら上手くいっただけで、
CNNが高性能を実現している理由は厳密には分かっていない。
- 1つのカーネル(フィルタ、ウィンドウ)につき1つの特徴マップが生成される。
- カーネルをn個、用意して、特徴マップをn個、生成する。
- 特定のパターンを検出する「カーネルの行列」と「画像中の一部領域」の内積を計算し
て得たスカラを「画像中の一部領域」の中心に置いて、元画像と同じサイズの特徴マップを作る。
- 「画像の一部領域」と「カーネルの行列」のサイズは同じにする。
- 位置を探し少しずつずらしながら(ストライド)内積を計算してスカラにする。
- RGB(複数チャンネル)の場合、チャンネル毎の「カーネルの行列」で得たスカラを足し1つの特徴マップを得る。
- ベクトルの内積と同じ様にパターンが似ている場合、スカラの値は大きくなる。
- 一部領域の中心部分と同じ位置に計算したスカラを置き、元画像と同じサイズの特徴マップを作る。
- パディングとストライド
- パディング(P):入力データの周りを一定の値で埋める操作
- ストライド(S):畳み込み操作において、ウィンドウを移動させるピクセル数
- 式
入力サイズ(H, W)、フィルタ・サイズ(FH, FW)、出力サイズ(OH, OW)
- OH = 1 + (H + 2P - FH) / S
- OW = 1 + (W + 2P - FW) / S
- 4×4のサイズの画像に対して、3×3のカーネルをパディング0、ストライド1で適当した場合の特徴マップのサイズ
= 1 + (4 + 0 - 3) / 1 = 1 + 1/1 = 2 なので 2×2
- 5×5のサイズの画像に対して、3×3のカーネルをパディング1、ストライド1で適当した場合の特徴マップのサイズ
= 1 + (5 + 2 - 3) / 1 = 1 + 4/1 = 5 なので 5×5
- ○の画像を斜線のフィルタを使って特徴マップにした例
プーリング層 †
- 位置ずれや形の歪みに対する頑健性
- 特徴マップから位置のズレに対して頑強な特徴抽出を行う。
- 特徴同士の位置関係で見る(絶対座標ではなく、相対座標で見る)。
- 特徴が特徴マップ中のどの部分に位置するか?
- 出力が縮小され処理の計算量が減る。
- 位置ずれや形の歪みに「頑健になる」(≒同じ値を返す)。
- 最大値
- MaxPooling?:通常
- GlobalMaxPooling?:全結合層へ渡す前、Flatten代替
- 平均値
- AvgPooling?:通常
- GlobalAvgPooling?:全結合層へ渡す前、Flatten代替
- パディングとストライド
- パディング(P):なし
- ストライド(S):
- (以下は)ウィンドウサイズと同じの固定値(の例)
- ウィンドウサイズと同じではない場合もある(略)
- 式
入力サイズ(H, W)、ウィンドウ・サイズ(WH, WW)、出力サイズ(OH, OW)
- 4×4の特徴マップに対して、2×2のウィンドウを適当した場合の出力のサイズ
= 4 / 2 = 2 なので 2×2
- 6×6の特徴マップに対して、3×3のウィンドウを適当した場合の出力のサイズ
= 6 / 3 = 2 なので 2×2
CNNのパラメタ †
畳み込み層 †
- この時点でカーネルは畳み込みのパラメタとして機能する。
- カーネルは重みパラメタとして機能し誤差逆伝播法によって学習できる。
全結合層 †
- 全結合層の重みはDNNの重みと同じ。
- 重みパラメタは誤差逆伝播法によって学習できる。
1*1 Convolution †
概要 †
- 空間グリッド上の1点のみにチャンネル方向に畳み込む
- 点単位畳み込み層 (pointwise convolution)とも呼ばれる。
- Network-in-Networkで提案されたアイデアでGoogLeNetの
Inceptionモジュールで採用されたことをきっかけに広く使われるようになった。
内容 †
- 入力画像のサイズを変えずにチャンネル数(特徴マップ数)を変更する畳み込み操作
- 特徴マップ上の各1グリッドにおいて深さ方向の畳み込みのみを個別実行するという処理
- チャンネル数を減らすことでパラメタ数が減り次元削減の効果が現れる
上記はConvのFN(フィルタ数)で特徴マップ数が変わることから、
あまり、処理内容を詳しくイメージできなくても、「確かに。」となる。
(チャンネル数(CH)は二層目以降ではフィルタ数(FN)に対応した特徴マップ数になる)
用途 †
- 「チャンネル方向の次元削減」としての使用
フィルタ数を少なくしておくと、「チャンネル方向の次元削減」が可能。
Inceptionモジュール †
概要 †
- 省パラメタながらも高い表現力を持ち計算効率性も良い「ブロック」(構造)
並列化 †
- 多様なサイズ経路に4並列化(=ワイド化)
- 多様な畳み込みサイズの特徴マップを合成
パラメタ削減 †
各経路の次元削減による軽量化
- 4並行パス構成だとパラメタ数が多い
- 何個も繋げていくとパラメタが多過ぎて上手く学習できなくなる。
- 1*1 Convを3つの各経路の最初に導入し次元削減後に畳み込み
- 同時期のVGGNetよりも、かなりパラメタ数が少ないながら同等の精度を達成。
Residualブロック †
概要 †
- <ResNet?-152>
TypeA, B, C, D でFN値が異なる。
・1*1 Conv(FN = A:64, B:128, C:256, D:512)
・3*3 Conv(FN = A:64, B:128, C:256, D:512)
・1*1 Conv(FN = A:256, B:512, C:1024, D:2048)
・入力を残差接続で迂回させて足す。
- 処理内容は、単純に、
- 1*1 Conv、n*n Convした後に、
- 入力を残差接続 (residual connection) で迂回させて足す。
- 足す際のサイズ調整には2通りの方法がある。
- (パラメタ節約)単純に画像を圧縮しチャネルは削る方法
- (精度は高い)1*1 Conv(S>1)で画像を圧縮しチャネルを削る方法
劣化問題・残差学習 †
degradation(劣化問題) と residual learning(残差学習)
- degradation(劣化問題)
- 深くしたほうが性能が悪くなる(18層 → 34層)。
- しかも訓練データに対しても性能劣化した(過学習&汎化性能でもない)
- 深くした方が「数学的には」・「表現力が豊か」であるはず。
- 「数学的には」→ 学習の(近似計算の最適化)問題を考慮していない。
- 「表現力が豊か」→ (34が18に劣るというのは)恒等写像の学習が困難と言う仮説
- residual learning(残差学習)
- 通常の学習はy=h(x)のhのパラメタを学習
- 残差学習はy=h(x)=f(x)+xのfのパラメタを学習(xは恒等写像
- パラメタ0で恒等写像を出力(学習?)可能 ≒ 恒等写像との差分を学習するようになる。
- その他にも、勾配消失が起き難いと言うメリットもあるらしい。
パラメタ削減 †
- residual learning(残差学習)ではパラメタが増加しない。
- ResNet?-152のResidualブロックでは3*3 Conv前後で
1*1 Convにより実質パラメタの削減・復元を行っている。
転置畳み込みは(逆畳み込み) †
- 畳み込みの逆プロセスではない。
- 入力データを拡大してから畳み込みを行う処理
- 一度畳み込みで圧縮したデータをもとのサイズに戻す。
- 入力データを完全に復元するものでもない
- セグメンテーションや生成分野などでよく使われる。
https://nisshingeppo.com/ai/whats-deconvolution/
著名なモデル †
LeNet? †
- 論文(89)
Introduction(多変量解析には無かった)
- 誤差逆伝播法
- 訓練&テスト・データ
- 複雑なモデルには大規模なデータ
- 過学習に気を付ける。
- タスク
- 手書き文字認識(MINST未満のマウスdeペイント文字)
- 16 * 16の480枚(訓練 : テスト = 320 : 160)
- アーキテクチャ
- 図がない。
- 構造の説明
・入力 : 16*16
・Conv : FN=2, FHW=3*3, S=2, + tanh → 8*8*2
・Conv : FN=4, FHW=5*5, S=2, + tanh → 4*4*4
・4*4*4 をFlatten → Affine → tanh(≠ Softmax)で10
・損失関数は、Categorical Cross EntropyではなくMSE
- 精度とポイント
- 精度:98.4%
- ポイント
・AffineよりConvでパラメタ数削減
・チャンネルを増やすと良い結果が出る
- LeNet?-5
- 歴史
- 10年後の性能向上版
- (間にLeNet?-1、-4、Boosted -4 とか色々ある)
- 論文(98)
Introduction:(SDGの)局所解だけどOK
- アーキテクチャ
- LeNet-5 図
- 構造の説明
・入力 : 32*32(Padding済みらしい)
・Conv : FN=6, FHW=5*5, S=1, + tanh → 28*28*6
・Avg Pooling : 2*2, S=1, + tanh → 14*14*6
・Conv : FN=16, FHW=5*5, S=1, + tanh → 10*10*16
(フィルタの見る特徴マップがマッピングで指定されているらしい)
・Avg Pooling : 2*2, S=1, + tanh → 5*5*6
・Conv : FN=120, FHW=1*1, S=1, + tanh → 1*1*120(実質Affine)
・1*1*120 をFlatten → Affine + tanhで84 → Affine + ERBF(≠ Softmax)で10
AlexNet? †
- アーキテクチャ
- AlexNet 図
- 特徴の説明
- 構造の説明
- 入力 : 224*224*3ch(256*256をデータ拡張)
- Conv : FN=96, FHW=11*11, S=4, + LRN → 55*55*96 → 55*55*48*2(分割して並列化)
- Max Pooling : 3*3, S=2 → 27*27*48*2(サイズで割るんじゃなくてストライドで割る感じ)
- Conv : FN=128, FHW=5*5, P=2, S=1, + LRN = 27*27*128*2
- Max Pooling : 3*3, S=2 → 13*13*128*2
- Conv : FN=192, FHW=3*3, P=1, S=1, + LRN = 13*13*192*2(入力データを2ノード間で交換するらしい)
- Conv : FN=192, FHW=5*5, P=2, S=1, + LRN = 13*13*192*2
- Conv : FN=128, FHW=5*5, P=2, S=1, + LRN = 13*13*128*2
- Max Pooling : 3*3, S=2 → 6*6*128*2
- 6*6*128*2 をFlatten → Affine で2024*2 → Affine で2024*2 → Affine で2024*2 → Affine + Softmaxで1000
- 精度:
- 誤答率16%と2位が前年度優勝と≒の26%に大差
- ココからの怒涛の精度改善のきっかけになった。
- なお、AlexNet?でのCIFAR-10の精度は89%らしい。
- ポイント
- 非DL時代からDL時代へ。
- 力技のモデル(CNN層をシンプルに積重ね深く、並列計算で大きく出来た)
- LRN(Local Response Normalization、局所応答正規化)はマイナーテク
GoogLeNet? †
- ポイント
- CNNはパラメタ数が増えてもスパースになってしまい無駄が多い。
- スパース(疎)をデンス(密)にする ≒ 人間/犬/猫の目/鼻/口を共通化するみたいな話。
- スパース(疎)をデンス(密)にするには、相関のあるニューロンをまとめる。
・相関のあるニューロンとは特徴マップ上の同じ位置のニューロン
・1*1 Convで次元削減すると相関のあるニューロンをまとめられる。
VGGNet †
このうちの性能が良かった VGG16 または VGG19 が使われている。
- 歴史
- オックスフォード, 2014
- 分類部門で2位
- 多層から成るCNN
- 論文(14)
19層より深いものも試したが、19層がベストだった。
- アーキテクチャ
- VGGNet 図
- 特徴の説明
アーキテクチャがシンプル
- VGG16 は 畳み込み13層と全結合3層の計16
- VGG19 は 畳み込み16層と全結合3層の計19
- 構造の説明
- 入力 : 224*224*3ch(256*256をデータ拡張)
- Conv : FN=64, FHW=3*3, P=1(以下Conv3でFWH, P略)
- Conv3 : FN=64
- Max Pooling : 2*2, S=2(以下略) → 112*112*64
- Conv3 : FN=128
- Conv3 : FN=128
- Max Pooling → 56*56*128
- Conv3 : FN=256(VGG16*3、VGG19*4
- Max Pooling → 28*28*256
- Conv3 : FN=512(VGG16*3、VGG19*4
- Max Pooling → 14*14*512
- Conv3 : FN=512(VGG16*3、VGG19*4
- Max Pooling → 7*7*512
- 7*7*512 をFlatten → Affineで4096 → Affineで4096 → Affine + Softmaxで1000
ResNet? †
Residualブロックにおける残差学習の導入により、152層の深いネットワークの学習を可能にした
- 歴史
- Microsoft Research, 2015
- 初めて人間のエラー率 5% を上回る精度を達成。
- Residualブロックにおける残差学習の導入により、より深いCNNの学習方法を提案
- ある層で求める最適な出力を学習するのではなく層の入力を参照した残差関数を学習。
- 入力層から出力層まで伝播する値と入力層の値を足し合わせたモデルで入力層まで、
勾配値がきちんと伝わり、今では1000層といったかなり深い構造でも学習が可能となった。
- <ResNet?-34>
・入力 : 224*224*3ch(256*256をデータ拡張)
・Conv : FN=64, FHW=7*7, S=2
・Max Pooling : 3*3, S=2
・Residualブロック(全部のConvのFN= 64, 先頭ConvだけS=2)を3層
・Residualブロック(全部のConvのFN=128, 先頭ConvだけS=2)を4層
・Residualブロック(全部のConvのFN=256, 先頭ConvだけS=2)を6層
・Residualブロック(全部のConvのFN=512, 先頭ConvだけS=2)を3層
・Global Average Pooling
・...をFlatten → Affine + Softmaxで1000
- <ResNet?-152>
・入力 : 224*224*3ch(256*256をデータ拡張)
・Conv : FN=256, FHW=7*7, S=2
・Max Pooling : 3*3, S=2
・ResidualブロックA(先頭ConvだけS=2)を3層
・ResidualブロックB(先頭ConvだけS=2)を8層
・ResidualブロックC(先頭ConvだけS=2)を36層
・ResidualブロックD(先頭ConvだけS=2)を3層
・Global Average Pooling
・...をFlatten → Affine + Softmaxで1000
- Residualブロックの改良
表現力を向上させる方法は以下の3つが考えられる。
- ブロックにより多くの畳み込み層を加える
- より多くの特徴平面を加えることで畳み込み層を広げる
- 畳み込み層のフィルターサイズを大きくする。
小さいフィルターの方が効率的と研究では明らかになっている。
- ⅰ、ⅱの検証結果、フィルターサイズを大きくするのが効果的。
- パラメタk:フィルタ数を k 倍する(パラメタ数と計算量は k の 2乗
- シート中のk=1 のとき、元のResNet?と同じで、k>1のときWideResNet?。
HighwayNets?、DenseNet? †
- HighwayNets? (2015
- ただ持ち越すだけで良いか?
- 持ち越す割合を重みとして一緒に学習する。
- f(x)+x → f(x)+wx
- DenseNet? (2016
- 全層間をスキップ接続する
- 複数のスキップが合流する所は足し算じゃないよね?
EfficientNet? †
- Google, 2019
- シンプルな CNN モデルを効率的(Efficient)にスケーリング
- スケーリングとは計算リソースを大きくすることで精度向上を目指す意味
- パラメタは関係しあっているためバランスをとりながらスケーリングする。
- 深さ:層の深さ、α^φ
層を深くすることで
- 複雑な特徴を捉えられる
- その分学習コストがかかる
- 勾配消失問題により精度向上に限界がある
- 幅:フィルタ数、β^φ
広さ(フィルタ数)を広げることで
- 細かい特徴を捉えられる
- 広さに対して深さが浅いと複雑な特徴を捉え辛い
- 解像度:入力画像の大きさ、γ^φ
解像度が高いほうが細かい特徴を捉えられる
- FLOPSは (α*β^2*γ^2)^ϕに従って増えてしまうため
α*β^2*γ^2 ≒ 2に制限することで増え方を 2^ϕ で増えるようにした。
参考 †
YouTube? †
Qiita †