Deep Residual Learning for Image Recognition(He, Zhang, Ren, Sun / Microsoft Research)の解説です。
前提として、線形代数(行列とベクトルの積)と微分(合成関数の微分)を知っていれば読めるようにまとめています。1章は前提知識、2章以降が論文の中身です。
最初に「全体像」の節で話の筋をつかんでから、各章を読んでください。図には「図の見方」、式には記号の表と「この式が言っていること」を付けています。
目次
.0 論文の基本情報
全体像
- 前提知識
- 論文が扱う問題(劣化問題)
- 提案手法(残差学習)
- ネットワークの構造
- 実験
- 考察とその後の研究
- 想定質問と答え
- 用語集
0. 論文の基本情報
| 項目 | 内容 |
|---|---|
| タイトル | Deep Residual Learning for Image Recognition |
| 著者 | Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun(Microsoft Research) |
| 公開 | arXiv 2015年12月(1512.03385)、CVPR 2016 で発表(Best Paper Award) |
| 分量 | 本文8ページ + 付録(物体検出の詳細) |
| ひとことで | 層の出力を「入力 + 差分」の形にすると、100層を超える深いネットワークでも学習が進むことを示した |
この論文で提案された ResNet は、ILSVRC 2015(ImageNet を使った画像認識コンペ)の分類部門で1位になりました。ただしここでは順位よりも、次の3つの問いに答えることを目標にします。
- 層を深くすると、なぜ学習がうまくいかなくなるのか
- ResNet は何を変えたのか
- その変更に効果があったと言える根拠は何か
全体像
細かい説明に入る前に、話の筋を5つの段階で先に示します。後の章は、この流れのどこかを詳しく説明しているだけです。
| 段階 | 内容 | 詳しく扱う章 |
|---|---|---|
| 1. 背景 | 層を深くするほど、画像認識の精度が上がってきた | 1章(1.8) |
| 2. 問題 | ある深さを超えると、訓練誤差まで悪くなる(劣化問題) | 2章 |
| 3. 原因の仮説 | 層を重ねて「何もしない層(恒等写像)」を作ることが、学習では難しい | 2章 |
| 4. 解決 | 入力 $\mathbf{x}$ を出口に足し、重み層には差分 $\mathcal{F}(\mathbf{x})$ だけを学ばせる | 3章、4章 |
| 5. 結果 | 152層まで深くするほど精度が上がり、ILSVRC 2015 で1位 | 5章 |
この論文でいちばん大事な式は次の1行です。
$$
\mathbf{y} = \mathcal{F}(\mathbf{x}) + \mathbf{x}
$$
| 記号 | 意味 |
|---|---|
| $\mathbf{x}$ | ブロックへの入力。重み層を飛ばして、そのまま出口で足す |
| $\mathcal{F}(\mathbf{x})$ | 重み層が計算する「差分」。何もしなくてよいなら 0 になればよい |
| $\mathbf{y}$ | ブロックの出力 |
1章の前提知識は、後の章で次のように使います。どこかで分からなくなったら、対応する節に戻ってください。
| 前提知識 | 何のために必要か | 使う章 |
|---|---|---|
| 1.1 画像分類と誤り率 | 実験結果の数字を読むため | 5章 |
| 1.2 ニューラルネットの1層と ReLU | 恒等写像を作りにくい理由、ブロックに層が2つ要る理由 | 2章、3章 |
| 1.3 学習(勾配降下法) | 「学習で解にたどり着けない」の意味 | 2章 |
| 1.4 誤差逆伝播と勾配消失 | 劣化問題の原因から外すため、残差接続の性質を見るため | 2章、3章 |
| 1.5 畳み込みとチャネル | ネットワークの構造を読むため | 4章 |
| 1.6 Batch Normalization | 勾配消失が原因ではない根拠 | 2章 |
| 1.7 訓練誤差・テスト誤差・過学習 | 劣化問題と過学習を区別するため | 2章、5章 |
1. 前提知識
1.1 画像分類というタスク
画像分類は、画像を1枚入力して、それが何の画像かをあらかじめ決めたクラスの中から答えるタスクです。モデルの出力は各クラスの確率で、最も確率の高いクラスを答えとします。
論文で使うデータセットは2つです。
| データセット | 画像の大きさ | クラス数 | 枚数 |
|---|---|---|---|
| ImageNet(ILSVRC 2012 の分類用) | さまざま(学習時は 224×224 に切り出す) | 1000 | 訓練 128万枚、検証 5万枚、テスト 10万枚 |
| CIFAR-10 | 32×32 | 10 | 訓練 5万枚、テスト 1万枚 |
成績は誤り率(間違えた割合)で表し、低いほど良い結果です。
- top-1 誤り率: 確率が最も高い1クラスが正解でなかった割合
- top-5 誤り率: 確率の高い上位5クラスに正解が入っていなかった割合
ImageNet には「似た犬種」のように区別の難しいクラスが多いので、top-5 もよく使われます。たとえば正解が「シベリアンハスキー」の画像で、予測の1位が「アラスカン・マラミュート」、2位が「シベリアンハスキー」なら、top-1 では誤り、top-5 では正解です。
1.2 ニューラルネットワークの1層
ニューラルネットワークの1層は、入力ベクトル $\mathbf{x}$ に重み行列 $W$ を掛けてバイアス $\mathbf{b}$ を足し、活性化関数を通す処理です。
$$
\mathbf{y} = \mathrm{ReLU}(W\mathbf{x} + \mathbf{b})
$$
| 記号 | 意味 |
|---|---|
| $\mathbf{x}$ | 入力(数を並べたベクトル) |
| $W$ | 重み行列。学習で決める |
| $\mathbf{b}$ | バイアス(足し合わせた結果に加える定数)。学習で決める |
| $\mathrm{ReLU}$ | 負の値を 0 にする関数 |
| $\mathbf{y}$ | 出力 |
この式が言っていることは、「入力に重みを掛けて足し合わせ、負になったところを 0 にしたものが出力になる」です。
図の見方
- 左の図: 丸が数、線が重みです。入力 $x_1, x_2, x_3$ のそれぞれに線の重みを掛けて足し合わせ、出力 $y_1, y_2$ を作ります。これを行列で書いたものが $W\mathbf{x}$ です。
- 右の図: 横軸が ReLU に入れる値、縦軸が出てくる値です。負の値は 0 になり、正の値はそのまま通ります。
活性化関数には ReLU(Rectified Linear Unit)がよく使われます。$\mathrm{ReLU}(z) = \max(0, z)$ で、負の値を 0 にして正の値はそのまま通します。
活性化関数が必要なのは、線形変換だけを何層重ねても1層の線形変換と同じになるからです。$W_2(W_1\mathbf{x}) = (W_2W_1)\mathbf{x}$ のように、行列の積は1つの行列にまとまります。間に ReLU のような非線形な関数を挟むことで、層を重ねる意味が生まれます。この性質は、3.5節で「残差ブロックの中に重み層を2つ以上入れる理由」として再び出てきます。
1.3 学習とは何をしているのか
学習は、訓練データに対する誤差(損失)が小さくなるように重みを調整する作業です。
- 損失関数 $L$ を決めます。分類では、正解クラスの確率が低いほど大きくなる交差エントロピーを使います。
- 損失を各重み $w$ で微分した値(勾配)を求めます。勾配は「その重みを少し増やすと損失がどれだけ増えるか」を表します。
- 勾配の逆向きに少しだけ重みを動かします。
$$
w \leftarrow w - \eta \frac{\partial L}{\partial w}
$$
| 記号 | 意味 |
|---|---|
| $w$ | 重み(学習で決める数) |
| $L$ | 損失。正解とのずれの大きさ |
| $\frac{\partial L}{\partial w}$ | 勾配。$w$ を少し増やしたときの $L$ の増え方(坂の傾き) |
| $\eta$ | 学習率。1回に動かす量 |
| $\leftarrow$ | 右辺の値で $w$ を置き換える |
この式が言っていることは、「坂の傾き(勾配)を調べて、損失が下がる向きへ $\eta$ の分だけ重みを動かす」です。傾きが正なら右へ行くと損失が増えるので、左へ動かします。
図の見方
- 横軸は重み $w$、縦軸は損失 $L$ です。重みを変えると損失がこの曲線のように変わる、という状況を表しています。
- オレンジの点は更新のたびの重みの位置で、矢印の向きに少しずつ谷へ下りていきます。
これを勾配降下法と呼び、$\eta$ を学習率と呼びます。論文に出てくる関連用語をまとめておきます。
| 用語 | 意味 |
|---|---|
| SGD(確率的勾配降下法) | 全データではなく、ランダムに選んだ一部(ミニバッチ)で勾配を計算して更新する方法 |
| ミニバッチサイズ | 1回の更新に使う画像の枚数。論文の ImageNet 実験では 256 |
| イテレーション | 重みの更新1回。論文の図の横軸 iter. はこの回数 |
| モーメンタム | 前回までの更新方向を一定割合(論文では 0.9)残して、更新を滑らかにする工夫 |
| weight decay | 重みが大きくなりすぎないよう、更新のたびに重みを少し 0 に近づける工夫(論文では 0.0001) |
| 学習率の減衰 | 学習が進まなくなったら学習率を下げる。論文では 0.1 から始めて 10 分の 1 ずつ下げる |
学習曲線(誤差の推移のグラフ)に階段のような段差があるのは、学習率を下げたタイミングです。
1.4 誤差逆伝播と勾配消失
深いネットワークで勾配を求めるには、誤差逆伝播法(バックプロパゲーション)を使います。中身は合成関数の微分(連鎖律)です。$L$ 層のネットワークで、1層目の入力 $x_1$ に対する勾配は次のように各層の微分の掛け算になります。
$$
\frac{\partial E}{\partial x_1} = \frac{\partial E}{\partial x_L} \times \frac{\partial x_L}{\partial x_{L-1}} \times \cdots \times \frac{\partial x_2}{\partial x_1}
$$
| 記号 | 意味 |
|---|---|
| $E$ | 損失 |
| $x_l$ | $l$ 層目の値 |
| $\frac{\partial x_{l+1}}{\partial x_l}$ | その層で、変化が何倍になって次へ伝わるか(1層分の倍率) |
この式が言っていることは、「入口での勾配は、各層の倍率の掛け算になる」です。
図の見方
- 上の段: 灰色の矢印が順伝播(左から右へ計算して損失 $E$ を出す)、オレンジの矢印が逆伝播(右から左へ勾配を伝える)です。
- 下のグラフ: 横軸は通過した層の数、縦軸は勾配の大きさです。縦軸は1目盛りで100倍になる対数目盛です。0.8倍の線は右下がりに、1.2倍の線は右上がりに、どちらも急速に変化します。
掛け算が何十回も続くので、1層あたりの微分が1より少し小さいだけで勾配は急速に小さくなります。0.8 倍が50層続くと約 $1.4 \times 10^{-5}$ 倍です。逆に1より少し大きいと急速に大きくなります。前者を勾配消失、後者を勾配爆発と呼びます。勾配が消えると入口に近い層の重みがほとんど更新されず、学習が進みません。
1.5 畳み込みニューラルネットワーク(CNN)
画像を扱うときは、全結合層の代わりに畳み込み層を使います。
図の見方
- 左が入力の画像(1マスが1画素)、中央が 3×3 のフィルタ(数は学習する重み)、右が出力の特徴マップです。
- 左のオレンジ枠の9マスとフィルタの9つの数を、同じ位置どうしで掛けて足すと、右のオレンジの1マスの値になります。フィルタを1マスずつずらして、右の全マスを埋めます。
- 畳み込み: 3×3 などの小さなフィルタ(重み)を、画像の上で位置をずらしながら当て、重なった部分の積の和を出力します。同じフィルタを全位置で使い回すので、全結合層より重みがずっと少なく済みます。
- 特徴マップ: 畳み込みの出力です。フィルタが反応した場所が大きな値になります。
- ストライド: フィルタをずらす幅です。ストライド2なら出力の縦横が半分になります。
- チャネル: 特徴マップの枚数です。入力画像は RGB の3チャネルで、層を進むと64、128、256…と増やすのが一般的です。
図の見方
- 重なった四角の1枚1枚が特徴マップ1枚(1チャネル)です。「56×56×64」は縦 × 横 × チャネル数です。
- フィルタを128個使うので、出力のチャネル数は128になります。ストライド2なので縦横は半分の 28×28 です。
1つのフィルタは「3×3×入力チャネル数」の重みを持ち、出力の特徴マップを1枚作ります。フィルタを128個用意すれば出力は128チャネルです。
ほかに論文で出てくる部品です。
| 部品 | 働き |
|---|---|
| プーリング | 領域ごとに最大値や平均値をとって縦横を縮める |
| global average pooling | 各チャネルの特徴マップ全体の平均をとり、1チャネル1個の数値にする。最後の分類層の手前で使う |
| 全結合層(fc) | 普通の行列の掛け算の層。最後に1000クラス分の値を出す |
| softmax | 出力の値を、合計が1になる確率に変換する |
| FLOPs | 計算量の目安。この論文では掛け算と足し算の組の回数を数えている |
1.6 Batch Normalization と初期化
2015年の時点で、勾配消失はある程度対策されていました。この論文も序論で「正規化した初期化と、途中の層での正規化によって大きく改善された」と書いています。代表が次の2つです。
- He の初期化(He et al. 2015): ReLU を使うネットワークで、層を通っても信号の大きさが保たれるように重みの初期値の分散を決める方法です。
- Batch Normalization(BN、Ioffe & Szegedy, 2015): ミニバッチの中で、各チャネルの値から平均を引いて標準偏差で割り、平均0・標準偏差1にそろえます。その後、学習するパラメータ $\gamma$(倍率)を掛け、$\beta$(ずらし)を足します。
図の見方
- ある1チャネルの値の分布(ヒストグラム)です。横軸が値、棒の高さがその値の個数です。
- 左の広がった分布(平均3、標準偏差2)が、BN の正規化で右のように 0 を中心とした幅1の分布にそろいます。
ResNet では、各畳み込みのすぐ後、活性化関数の前に BN を入れています。BN の直後で平均を引くので、畳み込み層のバイアス $\mathbf{b}$ は打ち消されます。そのため数式でもバイアスを省略しています。
1.7 訓練誤差・テスト誤差・過学習
- 訓練誤差: 学習に使ったデータでの誤り率です。練習問題の点数にあたります。
- テスト誤差(検証誤差): 学習に使っていないデータでの誤り率です。本番の点数にあたります。
モデルの重みが多すぎると、訓練データを丸暗記してしまい、訓練誤差は下がるのにテスト誤差は悪化することがあります。これを過学習と呼びます。過学習では、深い(大きい)モデルの訓練誤差は浅いモデルより低くなるのが特徴です。この点が2章で重要になります。
1.8 2015年までの流れ
図の見方
- 縦軸は top-5 誤り率で、棒が低いほど良い成績です。棒の中の数字はそのモデルの層の数です。
- 層が深くなるほど棒が低くなっていることが分かります。
| 年 | モデル | 層の数 | 特徴 |
|---|---|---|---|
| 2012 | AlexNet | 8 | GPU で大きな CNN を学習し、従来手法を大きく上回った |
| 2014 | VGG | 16, 19 | 3×3 の畳み込みだけを重ねる単純な設計で深くした |
| 2014 | GoogLeNet | 22 | 複数の大きさのフィルタを並べた Inception モジュール |
| 2015 | ResNet | 最大152 | 本論文 |
2012年以降、層を深くするほど成績が上がっていました。そこで「層を重ねれば重ねるほど良いのか」という問いが自然に出てきます。この論文はこの問いから始まります。
2. 論文が扱う問題(劣化問題)
2.1 Figure 1 の読み方
論文の図に日本語の注釈を付けたものです。CIFAR-10 で、ショートカットを持たない普通のネットワーク(論文では plain network と呼ぶ)を20層と56層で学習した結果です。
図の見方
- 左が訓練誤差(練習問題の誤り率)、右がテスト誤差(本番の誤り率)です。
- 縦軸は誤り率で、下ほど良い状態です。横軸は重みの更新回数(単位は1万回)で、右へ行くほど学習が進みます。
- 黄色の線が20層、赤の線が56層です。途中で線ががくんと下がるのは、学習率を下げたタイミングです。
- 見るところは左のグラフです。訓練誤差でも、赤(56層)が最初から最後まで黄(20層)より上にあります。
56層は、テスト誤差だけでなく訓練誤差でも20層より悪くなっています。著者はこの現象を劣化問題(degradation problem)と呼びました。深さを増やすと精度が頭打ちになり、その後急に悪くなるという現象です。
2.2 劣化問題の原因から外せるもの
劣化問題が何でないのかを、論文は順に確かめています。
- 過学習ではない: 過学習なら深いモデルの訓練誤差は低くなるはずです。訓練誤差が高いので、暗記しすぎではなく、練習問題すら解けていない状態です。
- 勾配消失ではない(と著者は主張): BN を使っているので順伝播の信号は分散0にならず、逆伝播の勾配の大きさも健全だったと確認しています(4.1節)。実際、34層の plain network もそれなりの精度には達します。
- 学習回数が足りないのでもない: 学習回数を3倍にしても劣化は残りました(脚注3)。
図の見方
- 過学習と劣化問題の違いを描いた模式図で、実際のデータではありません。
- グレーが浅いモデル、オレンジが深いモデル、破線が訓練誤差、実線がテスト誤差です。
- 見るところはオレンジの破線(深いモデルの訓練誤差)です。左の過学習では一番下にあり、右の劣化問題ではグレーより上にあります。
著者は原因について、深い plain network は収束の速さが指数的に遅いのかもしれないと推測していますが、詳しい理由は今後の課題としています。
2.3 構成による解(思考実験)
劣化問題が奇妙だと言える理由を、論文は次の思考実験で説明しています。
図の見方
- 上の段は学習済みの浅いモデルで、四角1つが層です。
- 下の段は、上の段と同じ層をコピーし、後ろに恒等写像の層を足した深いモデルです。下の段の出力は上の段とまったく同じになります。
学習済みの浅いモデルを用意し、その後ろに層を追加して深いモデルを作ります。追加した層がすべて恒等写像(入力をそのまま出力する関数 $h(\mathbf{x}) = \mathbf{x}$)になっていれば、深いモデルの出力は浅いモデルと同じです。
つまり深いモデルには「浅いモデルと同じ訓練誤差になる重み」が必ず存在します。それなら深いモデルの訓練誤差は浅いモデル以下になるはずです。ところが実際の学習(SGD)では、その重みを見つけられていません。
ここで区別しておきたいのは、「解が存在すること」と「学習でその解にたどり着けること」が別の問題だという点です。劣化問題は後者の問題です。
2.4 恒等写像を学習しにくい理由(著者の仮説)
著者は「非線形な層を何層も重ねて恒等写像を近似するのは、実際の学習(SGD)にとって難しいのかもしれない」と考えました。論文に具体例はないので、直感をつかむための例を挙げます。
図の見方
- 上の段は、重みを単位行列 $I$(掛けても値が変わらない行列)にして ReLU を通した場合です。ReLUの性質で$-1$ が $0$ に変わってしまいます。
- 下の段は、正の部分と負の部分に分けてそれぞれ ReLU を通し、後で引いた場合です。元に戻りますが、重みをこの形に合わせる必要があります。
$\mathbf{x} = (2, -1)$ を、重み層と ReLU でそのまま出したいとします。重みを単位行列にしても、ReLU が負の成分を 0 にしてしまい $(2, 0)$ になります。ReLU を通しても情報を失わないようにするには、$\mathbf{x}$ を正の部分 $\mathrm{ReLU}(\mathbf{x})$ と負の部分 $\mathrm{ReLU}(-\mathbf{x})$ に分けて通し、後で引くといった工夫が要ります。
恒等写像は作れますが、重みを特定の形にぴったり合わせる必要があります。重みはランダムな値から学習を始めるので、その形に偶然近づく保証はありません。この例は理解のための補足で、論文が示した証明ではない点に注意してください。
3. 提案手法(残差学習)
3.0 記号の約束
この章では式がいくつか出てくるので、記号の意味を先にまとめます。
| 記号 | 意味 | 読み方のヒント |
|---|---|---|
| $\mathbf{x}$ | ブロックへの入力(ベクトル。画像なら特徴マップ) | 太字はベクトルの印 |
| $H(\mathbf{x})$ | そのブロックで本当に作りたい関数 | 理想の入出力の対応 |
| $\mathcal{F}(\mathbf{x})$ | 重み層が計算する関数。ResNet では差分 $H(\mathbf{x}) - \mathbf{x}$ | 「残差関数」と呼ぶ |
| $\mathbf{y}$ | ブロックの出力 | |
| $W_1, W_2, \ldots$(まとめて ${W_i}$) | それぞれの重み層の重み(行列) | $\mathcal{F}(\mathbf{x}, {W_i})$ は「重みを使って $\mathbf{x}$ から計算する $\mathcal{F}$」 |
| $\sigma$ | ReLU | 負の値を 0 にする関数 |
| $I$ | 単位行列 | 掛けても値が変わらない行列 |
3.1 定式化
数層の重み層で表したい関数を $H(\mathbf{x})$ とします。普通は層に $H(\mathbf{x})$ そのものを学習させます。ResNet では代わりに、入力との差分
$$
\mathcal{F}(\mathbf{x}) := H(\mathbf{x}) - \mathbf{x}
$$
を層に学習させ、最後に入力を足して戻します。
$$
H(\mathbf{x}) = \mathcal{F}(\mathbf{x}) + \mathbf{x}
$$
この $\mathcal{F}$ を残差関数と呼びます。残差は「目標と基準の差」という意味の言葉です。1つ目の式の $:=$ は「左辺を右辺で定義する」という記号です。
2つの式が言っていることは、「作りたい関数 $H$ を、入力 $\mathbf{x}$ と差分 $\mathcal{F}$ に分け、差分だけを重み層に学ばせる」です。
図の見方
- どちらも上の $\mathbf{x}$ から下へ計算が進みます。
- 左の普通のブロックでは、重み層が出力 $H(\mathbf{x})$ そのものを作ります。
- 右の残差ブロックでは、オレンジの線(ショートカット)が $\mathbf{x}$ をそのまま下の「+」まで運び、重み層の出力 $\mathcal{F}(\mathbf{x})$ に足します。
論文の Figure 2 がこの構造です。
図の見方
- weight layer は重み層、relu は ReLU、右側の identity と書かれた線がショートカットです。
入力 $\mathbf{x}$ は重み層を通る道と、重み層を飛ばして出口で足される道(ショートカット接続)に分かれます。ショートカットは何もせず値を運ぶだけの恒等写像です。
3.2 なぜ学習しやすくなると考えたのか
もし最適な関数が恒等写像なら、残差ブロックでは重み層の出力を 0 にするだけで済みます。重みを 0 に近づけるのは、ランダムな値から特定の行列の形を作るよりずっと簡単です。
実際の問題で最適な関数がちょうど恒等写像になることはまずありません。それでも、最適な関数が「0 を出す関数」より「恒等写像」に近い場合は、恒等写像からのずれ(小さな修正)を学習する方が、関数をゼロから学習するより簡単だろうと著者は考えました。論文はこれを前処理(preconditioning)と表現しています。問題の形を変えて解きやすくするという意味です。
数値の例で見てみます。
図の見方
- 3つのグラフは、それぞれ3つの数を並べたベクトルを棒で表したものです。棒の高さが値です。
- 右の残差 $\mathcal{F}(\mathbf{x})$ は、左の $\mathbf{x}$ や真ん中の $H(\mathbf{x})$ よりずっと小さくなっています。
入力が $(3.0, -2.0, 1.0)$ で、ほしい出力が $(3.2, -2.0, 0.9)$ だとします。普通の層は $(3.2, -2.0, 0.9)$ をまるごと作る必要があります。残差ブロックの重み層が作るのは $(0.2, 0.0, -0.1)$ という小さな修正だけです。
「残差を扱うと問題が解きやすくなる」という考え方は、ニューラルネット以外にもあります。論文の関連研究では、画像検索の特徴量 VLAD(辞書との差を符号化する)や、偏微分方程式を解くマルチグリッド法(粗い解との差を細かい格子で解く)を例に挙げています。
3.3 ブロックの式(式1)
論文の式(1)です。
$$
\mathbf{y} = \mathcal{F}(\mathbf{x}, {W_i}) + \mathbf{x}
$$
Figure 2 の2層の場合、$\mathcal{F} = W_2,\sigma(W_1\mathbf{x})$ です。左から順に読むと、「$\mathbf{x}$ に $W_1$ を掛け、$\sigma$(ReLU)を通し、さらに $W_2$ を掛ける」という意味です。バイアスは、直後の BN で打ち消されるので省略しています。足し算の後にもう一度 ReLU を通します($\sigma(\mathbf{y})$)。
| 記号 | 意味 |
|---|---|
| $\mathbf{y}$ | ブロックの出力 |
| $\mathcal{F}(\mathbf{x}, {W_i})$ | 重み $W_1, W_2$ を使って $\mathbf{x}$ から計算する残差関数 |
| $W_1, W_2$ | 1つ目、2つ目の重み層の重み |
| $\sigma$ | ReLU |
式(1)が言っていることは、「重み層2つで差分 $\mathcal{F}$ を計算し、入力 $\mathbf{x}$ をそのまま足す」です。
足し算は要素ごとの足し算で、畳み込み層の場合はチャネルごとに特徴マップ同士を足します。ショートカットには重みがないので、パラメータも計算量もほぼ増えません(足し算の分だけです)。このおかげで、同じ層数・同じパラメータ数の plain network と公平に比べられます。5章の実験はこの性質を利用しています。
3.4 次元が変わるときのショートカット(式2)
ネットワークの途中では、縦横が半分になってチャネル数が倍になる箇所があります。そこでは $\mathbf{x}$ と $\mathcal{F}(\mathbf{x})$ の形が違うので、そのままでは足せません。
図の見方
- 重なった四角は特徴マップの束で、横の数字は 縦 × 横 × チャネル数 です。左の $\mathbf{x}$ は 56×56×64 です。
- 上の (A) で白い四角になっているのが、0 で埋めたチャネルです。
論文は2つの方法を考えています。
- (A) 恒等写像のまま、縦横は1マスおきに取り出して半分にし、足りないチャネルを 0 で埋める。追加のパラメータはありません。
- (B) 式(2)のように、行列 $W_s$ を掛けて形を合わせる。実際には 1×1 の畳み込み(ストライド2)で実装します。
$$
\mathbf{y} = \mathcal{F}(\mathbf{x}, {W_i}) + W_s\mathbf{x}
$$
式(2)は、式(1)の「$+,\mathbf{x}$」を「$+,W_s\mathbf{x}$」に替えただけです。$W_s$ は形を合わせるための行列で、1×1 の畳み込みで実装します。
形が同じところでも $W_s$ を使うことはできますが、5.2節の実験で「恒等写像で十分」と確かめたので、$W_s$ は形を合わせる箇所だけで使います。
3.5 重み層を2つ以上入れる理由
ブロックの中の重み層が1つだけだと、$\mathbf{y} = W_1\mathbf{x} + \mathbf{x} = (W_1 + I)\mathbf{x}$ となり、ただの線形変換と同じです。間に ReLU を挟める2層以上にする必要があります。論文でも、1層のブロックでは利点が見られなかったと書いています。実際のブロックは、ResNet-34 までが2層、ResNet-50 以上が3層です。
3.6 逆伝播から見た残差接続(続編論文の解析)
この節の式は、本論文ではなく同じ著者の続編(He et al. 2016b、Identity Mappings in Deep Residual Networks)で示されたものです。
手順1: ブロックを重ねると何が足されるか
ブロックの出口の ReLU を除いて単純化すると、1つのブロックは「次の値 = 今の値 + 差分」、つまり $\mathbf{x}_{l+1} = \mathbf{x}_l + \mathcal{F}(\mathbf{x}_l)$ です。これを $l$ 番目から $L$ 番目まで重ねると、次のように書けます。
$$
\mathbf{x}_L = \mathbf{x}_l + \sum_{i=l}^{L-1} \mathcal{F}(\mathbf{x}_i)
$$
| 記号 | 意味 |
|---|---|
| $\mathbf{x}_l$ | $l$ 番目のブロックへの入力(入口側) |
| $\mathbf{x}_L$ | $L$ 番目の値(出口側。$L$ は $l$ より大きい) |
| $\sum_{i=l}^{L-1}$ | $i = l$ から $L-1$ までのブロックについて足し合わせる |
| $\mathcal{F}(\mathbf{x}_i)$ | $i$ 番目のブロックの差分 |
この式が言っていることは、「深い位置の値は、浅い位置の値に各ブロックの差分を足し合わせたもの」です。層どうしが掛け算ではなく足し算でつながっています。
数値で確かめます。入口の値が $\mathbf{x}_l = 2$ で、3つのブロックの差分が 0.1、−0.2、0.05 なら、出口の値は $2 + 0.1 - 0.2 + 0.05 = 1.95$ です。各ブロックは入力に小さな修正を足していくだけ、というイメージです。
手順2: 微分すると「1」が出てくる
手順1の式を $\mathbf{x}_l$ で微分し、連鎖律を使うと次の式になります。
$$
\frac{\partial E}{\partial \mathbf{x}_l} = \frac{\partial E}{\partial \mathbf{x}_L}\left(1 + \frac{\partial}{\partial \mathbf{x}_l}\sum_{i=l}^{L-1}\mathcal{F}(\mathbf{x}_i)\right)
$$
| 記号 | 意味 |
|---|---|
| $\frac{\partial E}{\partial \mathbf{x}_l}$ | 入口側での勾配 |
| $\frac{\partial E}{\partial \mathbf{x}_L}$ | 出口側での勾配 |
| かっこの中の 1 | ショートカットだけを通る分($\mathbf{x}_l$ を $\mathbf{x}_l$ で微分した値) |
| かっこの中の残り | 重み層を通る分 |
かっこの中に「1」があるので、重み層の部分がどれだけ小さくても、出口の勾配 $\frac{\partial E}{\partial \mathbf{x}_L}$ は少なくともそのままの大きさで $\mathbf{x}_l$ へ届きます。plain network では勾配が各層の倍率の掛け算(1.4節)になるのと対照的です。
1次元に単純化した数値例です。重み層の微分がどれも 0.1 だとすると、plain では $0.1 \times 0.1 \times 0.1 = 0.001$ まで小さくなります。残差ブロックでは各ブロックの微分が $1 + 0.1$ なので、$(1 + 0.1)^3 \approx 1.33$ となり、小さくなりません。
手順3: 経路として見る
ブロックが3つの場合を、各ブロックの微分を $1 + f_i$ と書いて展開すると分かりやすくなります。
図の見方
- 縦の列1本が、入力から出力までの経路1本です。上から順にブロック1、2、3を通ります。
- オレンジの四角 $f_i$ はブロック $i$ の重み層を通ること、灰色の縦線と「1」はショートカットだけを通ることを表します。
- 経路1は重み層を1つも通らない経路で、展開した式の「1」にあたります。
$(1+f_1)(1+f_2)(1+f_3) = 1 + f_1 + f_2 + f_3 + f_1f_2 + \cdots + f_1f_2f_3$ の各項は、入力から出力までの経路1本に対応します。「1」はすべてのショートカットだけを通る経路で、重み層を1つも通りません。この経路がある限り、勾配が掛け算で消えきることはありません。
ただし2.2節のとおり、本論文の著者は劣化問題の原因を勾配消失とは考えていません。この節は「残差接続には勾配を伝えやすい性質もある」という補足程度として見てください。
3.7 関連研究との違い
ショートカット接続自体は新しいアイデアではありません。論文の関連研究では次のものが挙がっています。
- 古いニューラルネット(多層パーセプトロン)で、入力から出力へ線形層を直接つなぐ方法
- GoogLeNet などで、途中の層に補助の分類器をつないで勾配を補う方法
- 同時期に発表された Highway Networks(Srivastava et al. 2015)
Highway Networks は最も近い研究なので、違いをできるようにしましょう。
Highway Networks では、重み層の出力 $H(\mathbf{x})$ と入力 $\mathbf{x}$ を、ゲート $T(\mathbf{x})$ で重みづけして混ぜます。
$$
\mathbf{y} = T(\mathbf{x}),H(\mathbf{x}) + (1 - T(\mathbf{x})),\mathbf{x}
$$
| 記号 | 意味 |
|---|---|
| $T(\mathbf{x})$ | ゲート。0〜1 の値で、入力から計算され、学習するパラメータを持つ |
| $H(\mathbf{x})$ | 重み層の出力 |
| $1 - T(\mathbf{x})$ | ショートカット側の割合 |
この式が言っていることは、「重み層の出力と入力を、$T$ 対 $1-T$ の割合で混ぜる」です。
図の見方(上の図)
- どちらも上の $\mathbf{x}$ から下へ計算が進みます。
- 左の Highway ではショートカットに「×(1−T)」が付いていて、$T$ が 1 に近づくと閉じます。右の ResNet のショートカットには何も付いていません。
$T$ は入力に応じて変わり、学習するパラメータを持ちます。$T$ が1に近づくとショートカットが閉じ、普通の層と同じになります。ResNet のショートカットはパラメータがなく、常に開いていて、入力の情報は必ず出口まで届きます。また Highway Networks では、100層を超えるほど深くしたときに精度が上がることは示されていませんでした(CIFAR-10 で19層は 7.54%、32層は 8.80% と悪化)。
4. ネットワークの構造
4.1 Plain-34 と ResNet-34
図の見方
- 左から VGG-19、34層の plain network、34層の ResNet です。上が入力の画像、下が出力で、四角1つが層です。
- 「3x3 conv, 64」は 3×3 の畳み込みでフィルタが64個、「/2」はストライド2で縦横を半分にする層、「fc 1000」は1000クラスを出す全結合層です。
- 右端の ResNet で四角2つごとに付いている曲線がショートカットです。点線はチャネル数が変わる箇所のショートカットです。
Figure 3 は左から VGG-19、34層の plain network、34層の ResNet です。plain network は VGG の考え方にならい、次の2つのルールで作っています。
- 出力の縦横が同じ層は、フィルタの数(チャネル数)を同じにする
- 縦横が半分になったら、フィルタの数を倍にする(1層あたりの計算量を保つため)
縦横を半分にするのは、プーリングではなくストライド2の畳み込みで行います。最後は global average pooling と1000クラスの全結合層です。
ResNet-34 は、この plain network の2層ごとにショートカットを入れたものです。実線は恒等写像のショートカット、点線は次元が変わる箇所のショートカット(3.4節の A か B)です。
VGG-19 の計算量は 196億 FLOPs ですが、34層の plain network は 36億 FLOPs で、VGG-19 の 18% です。チャネル数を抑え、重い全結合層を減らしたことによります。
4.2 1×1 畳み込みとボトルネック構造
50層以上のモデルでは、ブロックの形を変えています。
図の見方
- 「64-d」「256-d」は、入力が64チャネル、256チャネルという意味です。
- 「1x1, 64」は 1×1 の畳み込みでフィルタ64個です。
左が ResNet-34 のブロック(3×3 を2回)、右が ResNet-50/101/152 のボトルネックブロック(1×1 → 3×3 → 1×1)です。
1×1 の畳み込みは、縦横方向には広がりを持たず、各画素のチャネル方向のベクトルに行列を掛ける処理です。チャネル数を減らしたり増やしたりするのに使います。
図の見方
- 左は 56×56 の特徴マップが256枚、右は64枚重なったものです。オレンジの小さな四角が、ある1つの画素です。
- その画素の位置にある256個の値に行列を掛けて64個にします。縦横の大きさは変わりません。
ボトルネックブロックでは、256チャネルの入力を 1×1 で64チャネルに減らし、64チャネルで 3×3 の畳み込みをして、1×1 で256チャネルに戻します。真ん中が細いので「ボトルネック(瓶の首)」と呼びます。重みの数を数えると次のとおりです。
| ブロック | 計算 | 重みの数 |
|---|---|---|
| 256チャネルのまま 3×3 を2回 | $2 \times 3 \times 3 \times 256 \times 256$ | 1,179,648 |
| ボトルネック | $256 \times 64 + 3 \times 3 \times 64 \times 64 + 64 \times 256$ | 69,632 |
| 64チャネルで 3×3 を2回(ResNet-34 のブロック) | $2 \times 3 \times 3 \times 64 \times 64$ | 73,728 |
図の見方
- 横棒の長さが1ブロックの重みの数です。長いほど計算も重くなります。
- ボトルネック(オレンジ)は、ResNet-34 のブロック(一番下)とほぼ同じ長さです。
ボトルネックは、256チャネルを扱いながら ResNet-34 のブロックと同じくらいの計算量に収まります。論文も「2つの設計の計算量は同程度」と書いています。
ボトルネックではショートカットが恒等写像であることが特に重要です。ショートカットにも $W_s$ を使うと、256チャネル同士をつなぐ 256×256 の行列が入り、計算量とモデルの大きさがおよそ倍になるからです。
論文の脚注4によると、ボトルネックを使う理由は主に計算時間の都合で、ボトルネックでない深い ResNet でも深さに応じて精度は上がります。
4.3 ResNet-50/101/152
ResNet-34 の2層ブロックをすべてボトルネックブロックに置き換えたものが ResNet-50 です。ブロックの数を増やしたものが ResNet-101 と ResNet-152 です。
| モデル | FLOPs |
|---|---|
| ResNet-18 | 18億 |
| ResNet-34 | 36億 |
| ResNet-50 | 38億 |
| ResNet-101 | 76億 |
| ResNet-152 | 113億 |
| VGG-16 / VGG-19(参考) | 153億 / 196億 |
152層でも VGG より計算量が少ない点は、論文でも強調されています。
4.4 学習の設定(3.4節)
論文の3.4節は用語が詰まっているので、意味を補います。
| 論文の記述 | 意味 |
|---|---|
| 短辺を [256, 480] からランダムに選んでリサイズ | 画像の大きさをばらつかせるデータ拡張 |
| 224×224 をランダムに切り出し、左右反転も使う | 位置や向きを変えたデータ拡張 |
| 画素ごとの平均を引く | 入力の値を0付近にそろえる前処理 |
| BN を各畳み込みの直後、活性化の前に入れる | 1.6節の BN |
| He の初期化で、すべて最初から学習 | 事前に学習した重みは使わない |
| ミニバッチ 256、学習率 0.1 から開始し、誤差が下がらなくなったら 10 分の 1 | 1.3節の SGD |
| 最大 60万イテレーション、weight decay 0.0001、モーメンタム 0.9 | 1.3節参照 |
| dropout は使わない | 過学習対策の dropout(学習中にニューロンをランダムに止める)は、BN の論文にならって使わない |
| 10-crop テスト | テスト画像から四隅と中央の5か所を切り出し、左右反転を合わせた10枚の予測を平均する |
5. 実験
5.1 ImageNet での plain network と ResNet の比較
図の見方
- 読み方は Figure 1 と同じで、縦軸が誤り率(下ほど良い)、横軸が更新回数です。
- 左が plain network、右が ResNet で、どちらも18層(水色)と34層(赤)です。細い線が訓練誤差、太い線が検証誤差(画像の中央を切り出したもの)です。
- 見るところは赤と水色の上下関係です。左では赤(34層)が上、右では赤が下にあります。ここでの ResNet は選択肢 A(ゼロ埋め)を使っているので、plain network とパラメータ数が完全に同じです。
訓練誤差の細い線の方が検証誤差の太い線より上にある時期があります。論文に説明はありませんが、訓練誤差はデータ拡張をかけた画像で測るため、と考えられます。
| 18層 | 34層 | |
|---|---|---|
| plain | 27.94 | 28.54 |
| ResNet | 27.88 | 25.03 |
(Table 2、top-1 誤り率 %、10-crop テスト)
図の見方
- どちらも縦軸は top-1 誤り率で、低いほど良い結果です。
- 左は横軸が層の数です。灰色の plain は右上がり(深いと悪い)、オレンジの ResNet は右下がり(深いと良い)です。
- 右はショートカットの種類(A、B、C)と深さ別の結果です。A でも plain よりずっと低くなっています。
読み取れることは3つです。
- plain では34層が18層より悪い(劣化問題が ImageNet でも起きる)。訓練誤差も34層の方が高い。
- ResNet では34層が18層より 2.8 ポイント良い。訓練誤差も下がっている。劣化問題が解消されている。
- 18層同士では最終的な精度がほぼ同じだが、ResNet の方が序盤の収束が速い。18層程度ならSGDは plain network でも良い解を見つけられ、残差接続は収束を早める形で効果を発揮します。
パラメータ数も計算量も同じ2つを比べて、ショートカットの有無だけが違う、という条件の揃え方がこの実験の要点です。
5.2 ショートカットの種類の比較(Table 3)
「ショートカットに $W_s$ を入れてパラメータが増えたから良くなったのでは」という疑問に答える実験です。
| ショートカット | top-1 誤り率(%) |
|---|---|
| plain-34(ショートカットなし) | 28.54 |
| A: すべて恒等写像、次元が増えるところはゼロ埋め | 25.03 |
| B: 次元が増えるところだけ $W_s$ | 24.52 |
| C: すべて $W_s$ | 24.19 |
A でもすでに plain より 3.5 ポイント良く、A・B・C の差は小さいことが分かります。著者の解釈は次のとおりです。
- B が A より少し良いのは、A でゼロ埋めしたチャネルには残差学習が働かないから
- C が B より少し良いのは、13本分の $W_s$ でパラメータが増えたから
- 差が小さいので、$W_s$ は劣化問題の解決に必要ではない。以降は計算量の少ない B を使う
5.3 より深いモデルと最終成績
Table 3 の続きでは、深くするほど誤り率が下がっています。
| モデル | top-1(%) | top-5(%) |
|---|---|---|
| ResNet-50 | 22.85 | 6.71 |
| ResNet-101 | 21.75 | 6.05 |
| ResNet-152 | 21.43 | 5.71 |
(10-crop テスト、検証データ)
複数の大きさの画像で評価を平均すると、ResNet-152 単体で top-5 誤り率 4.49%(検証データ)でした。深さの違う6つのモデルを組み合わせた(アンサンブル)結果はテストデータで 3.57% で、ILSVRC 2015 の分類部門で1位になりました。
5.4 CIFAR-10 で深さを極端に増やす
CIFAR-10 では、層数を $6n + 2$ にした単純な構造で、深さの影響を調べています。ショートカットはすべて選択肢 A です。
図の見方
- 読み方は Figure 1 と同じで、縦軸が誤り率、横軸が更新回数です。
- 左が plain、中央が ResNet、右が110層と1202層の ResNet です。細い破線が訓練誤差、太い線がテスト誤差、線の色が層の数です。
- 見るところは、左では深いほど上(悪い)、中央では深いほど下(良い)になっていることです。
- plain は深くするほど訓練誤差もテスト誤差も悪くなります(ImageNet と同じ傾向)。
- ResNet は110層まで深くするほど良くなります。
図の見方
- 横軸は層の数で、20層から1202層まで幅が広いので対数目盛にしています。縦軸はテスト誤り率で、低いほど良い結果です。
- 110層までは右下がりで、1202層で上がります。
110層では学習率 0.1 だと最初に学習が進まなかったので、訓練誤差が80%を切るまで(約400イテレーション)学習率 0.01 で学習し、その後 0.1 に戻しています。学習の最初だけ学習率を小さくする考え方は、現在ではウォームアップと呼ばれて広く使われています。
1202層では訓練誤差が 0.1% 未満まで下がり、学習自体には問題がありませんでした。一方でテスト誤差は 7.93% で、110層(6.43%)より悪くなっています。訓練誤差が十分低いのにテスト誤差が悪いので、著者はこれを過学習と考えています。1202層のモデルは1940万パラメータあり、5万枚のデータに対して大きすぎた可能性があります。この実験では dropout などの強い正則化を使っていないので、組み合わせれば改善するかもしれない、と著者は今後の課題にしています。
つまり残差接続は最適化の問題(劣化問題)を解決しますが、過学習まで防ぐものではありません。
5.5 層の応答の分析(Figure 7)
図の見方
- 縦軸は各層の出力の標準偏差で、「その層がどれくらい大きな値を出しているか」の目安です。横軸は層の番号です。
- 上のグラフは層の順番どおり、下のグラフは値の大きい順に並べ替えたものです。並べ替えた下のグラフの方が比べやすくなっています。
- 破線が plain、実線が ResNet で、色は層の数(黄が20層、赤が56層、黒が110層)です。
- 見るところは、下のグラフで実線が同じ色の破線より下にあることです。
各 3×3 畳み込み層の出力(BN の後、ReLU や足し算の前)の標準偏差を、層ごとに並べたグラフです。ResNet ではこの値が残差関数 $\mathcal{F}$ の出力の大きさにあたります。上は層の順番どおり、下は大きい順に並べ替えたものです。破線が plain、実線が ResNet で、色は層の数(黄が20層、赤が56層、黒が110層)を表します。
- ResNet の方が plain より全体に応答が小さい。残差関数は 0 に近いという3.2節の動機と合っています。
- ResNet の中では、深いモデルほど応答が小さい。層が多いと、1つの層が信号を変える量は小さくなる傾向があります。
縦軸の値は1前後で、BN の直後なのに1から離れる理由は、BN が正規化した後に学習するパラメータ $\gamma$ を掛けているからです。
5.6 物体検出への応用
ResNet で学習した特徴が分類以外にも役立つかを、物体検出で確かめています。物体検出は、画像の中の物体の位置(枠)とクラスを答えるタスクです。検出手法 Faster R-CNN の中で使う特徴抽出のネットワークを VGG-16 から ResNet-101 に替えただけで、COCO データセットの標準指標が 21.2 から 27.2 に上がりました(相対で28%の改善)。ほかの部分は同じなので、改善はネットワークの違いによるものと言えます。
6. 考察とその後の研究
6.1 論文が示したこと、示していないこと
示したこと
- 深い plain network では訓練誤差が悪化する(劣化問題)ことを、複数のデータセットで確かめた
- ショートカットで残差を学習させると、パラメータを増やさずに劣化問題が解消され、152層まで深さに応じて精度が上がった
- 残差関数の応答は小さく、恒等写像を基準にする考え方と整合した
示していないこと、残った課題
- 恒等写像を学習しにくいという話は仮説で、証明はされてない。脚注2でも「非線形の層が複雑な関数を近似できる」という仮定自体が未解決だと断っている
- 1202層では過学習が起きた
- 足し算の後に ReLU があるので、ショートカットは厳密には恒等写像になっていない(次節)
6.2 続編: pre-activation(He et al. 2016b)
本論文のブロックでは、足し算の後に ReLU を通します。このため、たとえ $\mathcal{F}(\mathbf{x}) = 0$ でも、$\mathbf{x}$ の負の成分は 0 になってしまいます。2.4節の例と同じで、ショートカット経路の上にある ReLU が情報を削ります。
図の見方
- どちらも上から下へ計算が進み、右側の線がショートカットです。
- 左(本論文)は「+」の後に ReLU(赤)があります。右(続編)は足した結果がそのまま次のブロックへ渡ります。
同じ著者は数か月後の論文で、BN と ReLU を重み層の前に移した pre-activation という形を提案しました。ショートカットの経路には足し算しか残らないので、3.6節の式がそのまま成り立ちます。この形で CIFAR-10 の1001層のネットワークを学習し、誤り率を改善しています。
6.3 ResNet は本当に深いのか(Veit et al. 2016)
Veit らは、学習済みの ResNet から途中のブロックを1つ取り除いても精度がほとんど落ちないことを示しました。VGG で同じことをすると、ほぼ当て推量の精度まで落ちます。
3.6節の展開図のように、$n$ 個のブロックを持つ ResNet には長さの違う $2^n$ 本の経路があります。Veit らは、学習中に勾配の大部分を運んでいるのは比較的短い経路(110層の ResNet でブロック5〜17個程度)だと分析し、ResNet は浅いネットワークの集まり(アンサンブル)のように振る舞うと解釈しました。これに関しては「深さの正体についての後続研究の解釈の1つ」として理解すると良いかと。
6.4 その他の発展
| 研究 | 内容 |
|---|---|
| Wide ResNet(Zagoruyko & Komodakis, 2016) | 層を増やす代わりにチャネル数を増やした16層程度の ResNet が、1000層の細い ResNet より良く、速く学習できた |
| ResNeXt(Xie et al. 2017) | ブロックの中の畳み込みをいくつかのグループに分けて並べた |
| DenseNet(Huang et al. 2017) | 足し算ではなく、前の層の出力すべてを連結して次の層に渡す |
6.5 Transformer とのつながり
図の見方
- 左が ResNet のブロック、右が Transformer の1層です。どちらも下の $\mathbf{x}$ から上へ計算が進みます。
- オレンジの線は、入力をそのまま運んで後で足す道です。両方にあります。
Transformer の論文は、各サブ層(Multi-Head Attention と Feed Forward)の周りに残差接続を置き、その後に Layer Normalization を行うと書いています。式は $\mathrm{LayerNorm}(\mathbf{x} + \mathrm{Sublayer}(\mathbf{x}))$ で、残差接続の引用先がこの ResNet の論文です。Transformerで出てきた「Add & Norm」の Add が、今回の $\mathcal{F}(\mathbf{x}) + \mathbf{x}$ にあたります。
Layer Normalization は、BN と同じく値を平均0・標準偏差1にそろえる処理ですが、ミニバッチ方向ではなく1つのデータの特徴量の方向で平均と標準偏差をとります。
その後、正規化をサブ層の前に移した Pre-LN という形が広く使われるようになりました。正規化を足し算の後ろから前へ動かすという点で、6.2節の pre-activation と考え方が近いと言えます。
7. Q&A
Q1. 劣化問題は、単に学習回数が足りないだけではないのか。
論文の脚注3で、学習回数を3倍にしても劣化が残ったと報告しています。回数を増やすだけでは解決しないと著者は判断しています。
Q2. 勾配消失が原因ではないと言えるのはなぜか。
BN を使っていて、順伝播の信号の分散が0にならないこと、逆伝播の勾配の大きさが健全であることを著者が確認しています(4.1節)。34層の plain network でもそれなりの精度に達するので、学習がまったく進まないわけではありません。ただし、なぜ収束が遅いのかの理由は論文でも推測にとどまっています。
Q3. $H(\mathbf{x})$ を学習するのと $\mathcal{F}(\mathbf{x}) = H(\mathbf{x}) - \mathbf{x}$ を学習するのは、表せる関数が同じなのでは。
同じです。論文も「どちらの形でも目的の関数を近似できるはずだが、学習のしやすさが違うかもしれない」と書いています。この論文の主張は表現力ではなく、最適化のしやすさについてのものです。
Q4. 18層同士では精度がほとんど変わらないのはなぜか。
18層程度なら SGD は plain network でも良い解を見つけられるからだと著者は説明しています。それでも ResNet の方が序盤の収束は速くなっています。
Q5. ショートカットに重みを入れた方(選択肢 C)が一番良いのに、なぜ使わないのか。
B との差が 0.33 ポイントと小さい割に、パラメータと計算量が増えるからです。特にボトルネック構造では、ショートカットに重みを入れると計算量とモデルの大きさがおよそ倍になります。
Q6. 1202層で悪くなったのは劣化問題ではないのか。
訓練誤差は 0.1% 未満まで下がっているので、学習(最適化)はできています。テスト誤差だけが悪いので、著者は過学習と判断しています。
Q7. Figure 7 は BN の後の値なのに、なぜ標準偏差が1にならないのか。
BN は正規化した後に学習するパラメータ $\gamma$ を掛け、$\beta$ を足します。測っているのはその後の値なので、1からずれます。
Q8. Highway Networks との違いは。
Highway はゲートで入力と変換後の値を混ぜ、ゲートにはパラメータがあり、閉じることもあります。ResNet のショートカットはパラメータがなく、常に入力をそのまま足します。
Q9. 今でも ResNet は使われているのか。
画像認識の基本的なモデルとして、比較の基準や特徴抽出に今も使われています。残差接続そのものは、Transformer を含め、深いネットワークのほとんどに入っています。
Q10. 残差接続のデメリットはあるか。
足し算のために、ブロックの入口の値を出口まで保持しておく必要があり、学習時のメモリを使います。また、Veit らの分析のように、深さがそのまま「深い推論」になっているとは限らないという指摘もあります。
8. 用語集
| 用語 | 意味 |
|---|---|
| 恒等写像 | 入力をそのまま出力する関数 $h(\mathbf{x}) = \mathbf{x}$ |
| 残差 | 目標と基準の差。ここでは $H(\mathbf{x}) - \mathbf{x}$ |
| ショートカット接続 | 1つ以上の層を飛ばして、入力を後ろの層につなぐ経路 |
| plain network | ショートカットを持たない普通のネットワーク |
| 劣化問題 | 層を増やすと訓練誤差まで悪化する現象 |
| 過学習 | 訓練データに合わせすぎて、未知のデータで性能が落ちる現象 |
| 勾配消失・爆発 | 逆伝播で勾配が層を通るたびに小さく(大きく)なりすぎる現象 |
| BN | ミニバッチ内で値を平均0・標準偏差1にそろえる層 |
| ボトルネック | 1×1 で次元を減らしてから 3×3 を行い、1×1 で戻すブロック |
| FLOPs | 計算量の目安。本論文では積和の回数 |
| アンサンブル | 複数のモデルの予測を平均して使うこと |
| 10-crop | テスト画像から10枚切り出して予測を平均する評価方法 |
| ウォームアップ | 学習の最初だけ学習率を小さくする方法 |



























