What is CNN?
畳み込みニューラルネットワークの構造と数式
CNNは画像や音声などのグリッド構造データの自動特徴抽出を得意とするニューラルネットワーク。畳み込みという画像処理の基本演算を実行する畳み込み層を持つのが特徴で、空間的な情報を維持しながら画像を処理するための特別な構造になっている。
CNNの主要な特徴は3つ。局所受容野(各ニューロンは入力画像の小さな領域のみを見る)、重みの共有(同じフィルタが画像全体に適用される)、多数の層(複雑な特徴を階層的に学習できる)。
1. 畳み込みレイヤ
畳み込みレイヤはCNNの核心。入力データに対してフィルタ(カーネル)をスライドさせて畳み込みを行うことで、ローカルな情報をキャッチする。
数式
畳み込み操作は画像とフィルタ間の積和演算で定義される。
フィルタを上下・左右反転させると次の式になる。こっちのほうが実装では一般的(相互相関)。
は出力のピクセル、 は入力のピクセル、 はフィルタの画素値。フィルタのインデックスは (、)。
バイアス項を含めると、
全結合ネットワークの と同じで、重みパラメータの他にバイアスも存在する。
パディング
畳み込み操作を行う際に、入力データの周辺に仮のデータ(通常0)を追加すること。出力データのサイズの縮小を防ぐか、または調整できる。padding = 1 なら入力の周囲に1ピクセルぶんのゼロを追加するから、本来の入力データと同じ大きさの出力が得られる。
ストライド
フィルタをスライドさせる際のステップサイズ。ストライドが1なら1ピクセルずつスライド、2なら2ピクセルずつ。ストライドを大きくすると出力サイズは小さくなる。パディングを大きくすると出力サイズは大きくなる。
出力サイズの計算
入力サイズ 、フィルタサイズ 、ストライド 、パディング とすると、
これはめちゃくちゃよく使う。たとえば入力4、パディング0、ストライド1、カーネル3なら 。入力6、パディング1、ストライド2、カーネル3なら 。
3階テンソルとしての畳み込み
CNNでは画像データを3階テンソル(高さ 、幅 、チャンネル数 )として扱う。カラー画像ならRGBの3チャンネル。フィルタも同じチャンネル数を持っていて、全チャンネルの積和を合計して1つの出力ピクセルを作る。複数のフィルタを適用すれば、出力のチャンネル数はフィルタの枚数になる。
2. プーリングレイヤ
プーリングレイヤは畳み込みによって抽出された特徴のサイズを縮小することで、計算量を減らし、特徴の位置感度を低くする。主なプーリング操作にはMax PoolingとAverage Poolingがある。
Max Poolingは指定サイズの領域内の最大値を取る。2×2 Max Poolingなら、2×2の領域の中の最大値がその領域の出力になる。入力が なら出力は 。
Average Poolingは領域内の平均値を取る。Max Poolingより滑らかな出力になるけど、現代のCNNではMax Poolingのほうが多い。強い特徴を保持する効果があるから。
3. 活性化関数
活性化関数はニューラルネットワークの各ニューロンの出力を決定するための関数。ネットワークに非線形性を導入して、複雑な関数やパターンを学習する能力を持たせる。非線形性がないと、深いネットワークの多くの層は単一の層に集約できてしまって、多層の意味がなくなる。
ReLU
負の入力値に対しては0を、正の入力値に対してはそのままの値を出力する。計算が軽くて勾配消失が起きにくいから、現代の深いネットワークで最も広く使われている。ただし のとき勾配が完全にゼロになるから、一度死んだニューロンが復活しない「Dying ReLU」問題がある。対策としてLeaky ReLU(、)やParametric ReLUが提案されている。
Sigmoid
出力が0から1の範囲。確率や二項分類の出力として使われる。微分は で、 が0か1に近いと勾配がほぼゼロになる(勾配消失問題)。深い層で使うとまともに学習しないから、隠れ層にはReLUが推奨される。
Tanh
出力が-1から1の範囲。Sigmoidと似てるけど、出力がゼロ中心なぶん学習が安定しやすい。 の関係でSigmoidと繋がっている。やっぱり両端で勾配消失するけど、Sigmoidよりはマシ。
4. 正規化
正規化はニューラルネットワークの学習を助けるために入力データや層の出力を特定の範囲や分布に変換する手法。正規化がないと学習が不安定になったり、収束が遅くなる。
個のサンプルから構成されるミニバッチと、出力サイズが の畳み込み層を考える。インデックスは の順に割り当てられる。正規化手法の違いは、このインデックスのどの範囲で統計量を計算するかで決まる。
- バッチ正規化 — 。チャンネルごとに統計量を計算するが、ミニバッチ全体での平均と分散を使用する
- レイヤー正規化 — 。各サンプルごとに全チャンネルと空間位置で統計量を計算する
- インスタンス正規化 — 。各サンプルとチャンネルごとに空間位置で統計量を計算する
バッチ正規化
ミニバッチごとの入力分布を正規化することで、学習を安定化させ高速化する。チャンネル の平均と分散は、
正規化の式は、
と は学習可能なパラメータ(スケールとシフト)。 はゼロ除算を防ぐための微小な正の値。推論時にはミニバッチの統計量ではなく、学習中に蓄積した移動平均を使う。
局所コントラスト正規化
局所コントラスト正規化(LCN)は特定の位置に焦点を当て、その位置のコントラストを強調または正規化する手法。バッチ正規化と異なり、各位置での値をその周辺の情報を基に独立して正規化する。
と は位置 の周囲のピクセルの局所的な平均と分散。
5. 全結合層
全結合層(FC layer)は各入力ノードが全ての出力ノードと結合している層。CNNの末端で、特徴マップを1Dのベクトルに変換して、最終的な分類や予測を行うために用いられる。
は入力ベクトル、 は重み行列、 はバイアスベクトル、 は活性化関数。
分類タスクではSoftmax関数をアクティベーションとして使い、確率分布を出力する。回帰タスクでは線形関数を使うことが多い。
6. 損失関数
損失関数はモデルの予測と実際の目標値の間の差異を数値として表現して、その差異を最小化する方向にパラメータを更新するための基準。
平均二乗誤差(MSE)
回帰タスクで広く使用される。
外れ値に敏感(二乗だから大きな誤差がさらに大きくなる)。ロバスト性が欲しいならMAE( 損失)やHuber損失を使う。
ソフトマックス交差エントロピー
多クラス分類タスクで使用される。ソフトマックス関数でクラスの確率分布を生成して、交差エントロピー損失を計算する。
はone-hotエンコードされた正解ラベル、 はソフトマックスの出力。 はクラス数。正解クラス以外の はゼロだから、実質的には ( は正解クラス)に簡略化できる。
シグモイド交差エントロピー / 二値交差エントロピー
二値分類タスクのための損失関数。シグモイド関数で出力を に変換した後、交差エントロピー損失を計算する。
が正解、 がモデルの予測確率。マルチラベル分類(1つのサンプルが複数のラベルを持つ)でも使える。
7. 最適化手法
CNNの学習はバックプロパゲーションで損失関数の勾配を計算して、その勾配情報を使ってパラメータを更新する。最適化手法はこの更新ルールを定めるもの。
SGD
一番基本的。各更新時にミニバッチから損失関数の勾配を計算して、その勾配方向にパラメータを更新する。
は学習率。シンプルだけど、損失面の形状によっては振動したり収束が遅かったりする。
Momentum
SGDに慣性を加えた手法。過去の勾配の情報を考慮してパラメータを更新する。
はモメンタム係数(通常0.9)。更新の方向性が安定して、局所的な最適点に収束するリスクを低減する効果がある。谷底を転がるボールのイメージ。
AdaGrad
各パラメータに対して学習率を動的に調整する。頻繁に更新されるパラメータは学習率が緩やかに低下して、逆に更新されにくいパラメータは学習率が上昇する。
は勾配の二乗の累積和。問題は が単調増加するから、学習が進むと学習率が急激にゼロに近づいて学習が止まること。
RMSprop
AdaGradの学習率低下が急激になる問題を緩和した手法。過去の勾配の2乗の移動平均を用いて学習率を調整する。
は減衰率(通常0.9か0.99)。指数移動平均だから古い勾配の影響が薄れていって、AdaGradのように学習が止まることがない。
Adam
MomentumとRMSpropを組み合わせた最適化手法。勾配の1次モーメント(平均)と2次モーメント(分散)を利用してパラメータを更新する。
バイアス補正を行って、
デフォルトのハイパーパラメータは 、、。とりあえずAdamで始めるのが現代のデファクト。収束が速くてハイパーパラメータに対してロバスト。ただし汎化性能ではSGD + Momentumに負けることもあるから、最終的にはSGDに切り替えるテクニックも使われる。
参考文献
- 深層学習 改訂第2版(岡谷貴之)
- 連載解説「Deep Learning(深層学習)」第4回, JSAI, 28(6)
- CNN Explainer (poloclub.github.io/cnn-explainer/)
- Vincent Dumoulin & Francesco Visin, "A guide to convolution arithmetic for deep learning"