Bridge over troubled Techs.

オープンストリーム CTO 寺田英雄の個人的ブログ

ディープラーニング ResNet のヒミツ

 先日、当社と共同研究をしている庄野研のゼミに参加させてもらった。その日は論文の輪講の日だった。そこでM2のSさんがレクチャーしてくれた Deep Residual Learning の話が面白かったので、以下メモとして記してみる。

#なお、このメモはDLについての基本的な仕組みは知っている人を前提に書いている。

 ResNetとは?

 もの凄い勢いで活発に研究されている Deep Learning機械学習であるが、昨年 ILSVRC'2015 という学会のコンペで、一般物体認識で最高性能を叩き出した ResNet (Deep Residual Net)という学習・識別器がある。当時 Microsoft Research にいた Kaiming He 氏が開発した、152層!のニューラルネットである。その論文はこちら

 多層ネットワークの勾配消失/発散問題

 昨今のDL研究で分かってきたDLの性質の一つとして、"Wide より Deep"というものがある(追記:さらに最近では、Wideも重要という論文も出てきている)。同じニューロン数で学習するなら、ネットワークの各層の幅(ニューロン数)をワイドにするよりも、階層の深さをよりディープにしたほうが性能があがるという性質である。

#なお、これは経験則に近いものらしく、理論的になぜそうなのかというのは、あまり良く分かってはいないらしい。 

 ならば、『どんどん階層を増やせば良いじゃない』か、と誰でも考えるが、問題はそれほど単純ではない。従来の方式で単純に階層を増やしすぎると勾配消失(vanishing)勾配発散(exploding)という問題が発生してしまって、うまく学習できなくなるのである。なお、この勾配の消失や発散をまとめて degradation と呼ぶらしい。de-gradationというニュアンスであろうか。 

勾配消失が起きる理由

 DLで学習する際には各層ごとに活性化関数を微分して勾配を求める。まず入力層に近い『浅い』層ではその層への入力と出力の差(accuracy)が大きいため、微分操作は有効に働く。しかし、学習が層の『深い』段階へと進むにつれ、(当たり前だが)学習が収束に近づくと入力から出力への変換精度がどんどん上がっていくため、入力と出力の差は極めて小さくなり、勾配を取りにくくなる。層から層への伝播は掛け算の性質をもっているため、この差の減少傾向は指数関数的になる。つまり、層を増やしていくと、あっという間に勾配が消えてなくなってしまうのである。

勾配発散が起きる理由

 DLでは、ある層のニューロンは次の層のニューロンと重みWで積和をとって結合している。この重みが1以上ならば、多層になると『重み✕重み✕重み・・・』が発散する可能性があることがわかる。

Residual Learning(残差学習)

 普通のDLの各階層では、入力信号 x をそのままネットワークに入力して出力 H(x) を計算し学習する。

 ResNetでは、出力から入力を引いた残差(Residual) F(x)=H(x)-x を学習する形にする。なぜそんなことをするのか?・・・前述の勾配消失の説明を思い出してほしい。DLでは深い層にいくほど、入力と出力の差が小さくなる、つまりH(x)はxに極めて近い値になる。しかし H(x) は有限なNNによる非線形写像であり、綺麗にxに近づけることは難しい場合が多い。むしろ、xに極めて近い出力が欲しいのだから、単純にxをそのまま出力し、それと H(x) の差 F(x) をNNで表現して写像すれば良いのではないか、という理屈が成り立ちそうだからである。(これがこの論文で実証したい中心仮説である。)

 これを実装するには、F(x)を直接計算しようとするよりも、下図のようなショートカット接続をネットワークに導入すれば良い。これにより weight layer(NN階層)はF(x)を学習する形になる。

f:id:terada-h:20161213165701p:plain

図1 残差学習の基本ユニット(これを何層も重ねる)

f:id:terada-h:20161213190641p:plain

図2 ResNetの実装例(34層)。左:従来の方式、右:ResNet方式

 ResNetの結果

 論文にある実験結果によれば、ResNetは素晴らしい効果を産んでおり、従来方式だと階層を増やしていくと、むしろ精度(エラー率)が悪化していたが、ResNet だとそのようなことはなく、層を増やせば増やすほどエラー率が低下する傾向となっている。

 たとえば、18層と34層を比較した結果が図3である。従来方式だと34層のほうが18層よりエラーが増えてしまっている。ResNetでは34層の方が良い結果となっている。

f:id:terada-h:20161213191516p:plain

図3 学習エラーの比較。左:従来方式、右:ResNet

さらに多階層もOK

 論文によれば、筆者らはさらに実験を続け、1202層!のResNetでも同様の傾向、つまり、degradation に邪魔されることなく学習が可能で、さらにエラー率が低下することを確認しているそうである(訓練誤差0.1%、テスト誤差7.93%)。

 この手法の登場により、理屈の上では飛躍的にDLの階層を増やせることになった。計算量は膨大になっていくが、計算機にお金を掛けられる人達であれば、どんどん階層を増やして精度を上げられるのである。すでに画像のパターン分類のようなタスクであれば、人間を超える認識精度に達していると言われるDLであるが、さらなる精度向上が何をもたらすのか興味深い所である。