DenseNet徹底解説:全層を結ぶ密結合CNNの威力とは?勾配消失を克服する連結構造
こんにちは、ゆずかきです。
ここからは、「DenseNet(Densely Connected Convolutional Networks)」 と呼ばれるネットワーク構造について、一つの技術ブログ記事としてまとめてみたいと思います。
今回取り上げる「DenseNet」は、Gao Huang らが中心となって発表した論文
Densely Connected Convolutional Networks (arXiv:1608.06993v5, 2018)
にて紹介された手法です。
「各層を“全て”直接的につなぐ」という、とにかく贅沢なSkip Connection が特徴であり、
- Vanishing Gradientの緩和
- パラメータ効率の向上
- 高い性能(精度)の獲得
- 容易な学習
など、多くのメリットを引き出すことに成功したCNNのアーキテクチャです。ResNetが示した「ショートカットで層をスキップする」という概念を、さらに強化して「各層をすべて次の全層に直結する」という密結合(Dense)な構造を実現します。結果として、古典的なCNNにも匹敵する分かりやすい仕組みでありながら、高精度かつパラメータ数を抑えやすいのが特徴です。
それでは早速、本論文の内容を一通り振り返りながら、できるだけ噛み砕いて説明していきましょう。
§本記事の構成
- はじめに: DenseNetとは?
- 論文の背景
- DenseNetのアーキテクチャ概要:各層を“完全結合”
- Dense Block & Growth Rate: 密結合構造の要点
- 実験結果と考察: CIFAR・SVHN・ImageNet
- DenseNetの強み:なぜ強い?何が新しい?
- 課題と今後の展望
- まとめ
「従来手法の残差構造とも似ているけど、微妙に違う?」「全ての層同士を結合しちゃって大丈夫なの?」など気になる点も多いと思います。順を追って見ていきましょう。
§はじめに: DenseNetとは?
論文タイトルは、
Densely Connected Convolutional Networks
Gao Huang, Zhuang Liu, Kilian Q. Weinberger, Laurens van der Maaten
2016年からarXivに投稿されていた研究で、2018年1月時点のバージョン (arXiv:1608.06993v5) が公開されています。ResNetやHighway Networkといった「深い層をスムーズに学習するためのSkip Connection」手法の系譜に位置するモデルですが、DenseNet はさらに一歩進んで、L層あれば L(L+1)/2 個もの結合を作り出す驚きの構造を提案します。
具体的には、従来のCNN(あるいはResNet)では「層i → 層i+1」という順番の接続しかありませんでした。しかしDenseNet では、
層0の出力を層1,2,3…L すべてに入力する
層1の出力を層2,3,4…L すべてに入力する
層2の出力を層3,4,5…L すべてに入力する
(以下同様)
という形で、どの層からもあらゆる後続層へ直接情報が流れるように設計されています(もちろんサイズが異なる層同士はそのままではつなげないので工夫あり)。
ポイントは、従来のResNetが「出力を足し合わせる(加算)」方式 だったのに対し、DenseNetでは「出力をすべて連結する(concat)」という方式 になっているところ。こうすることで、各層が生成した特徴マップを「次の次の次の…層まで」常に活かし続けることができるわけです。
§論文の背景
CNNが深くなればなるほど表現能力が高まる、というのはAlexNet→VGG→GoogLeNet→ResNet…という歴史で明らかになってきました。しかし、深くなるほど勾配消失(Vanishing Gradient) や過学習 が生じやすく、学習が難しいという問題がありました。
- ResNetやHighway Networkはショートカット(Skip Connection) で、浅い層への勾配の伝播が届きやすくなるよう工夫。
- Stochastic Depthは、ランダムで層を落として学習を進めることで、さらに勾配が伝わりやすくなる実験的成果を得た。
こうした流れを受けて、本論文では「じゃあもう、全層同士を接続したらもっと楽になるんじゃない?」と発想を広げ、Dense Connectivity を提案。結果として、モデルが非常に深くても学習が安定 し、パラメータ数も削減できるという実験結果を示しました。
§DenseNetのアーキテクチャ概要:各層を“完全結合”
まず、通常のCNNやResNetとDenseNetを比較してみましょう。
- 通常のCNN
- 層iの出力(xi)→ 層i+1の入力
- xi+1 = Hi(xi) (Hi はConv, BN, ReLUなどの合成関数)
- ResNet
- 層iの出力を恒等写像(Identity)でスキップ接続
- xi+1 = Hi(x_i) + xi
- DenseNet
- 層iの出力を、層i+1だけでなく「以降の全ての層」へ結合
- 結合方式は加算ではなくconcat(連結)
- つまり、層j (j>i) は「x_i も含む、すべての先行層の出力」をまとめて入力とする
これを式で書くと、
x_l = H_l([x_0, x_1, x_2, …, x_{l-1}])
になります([x_0, x_1, …] は単なる「連結」を表す)。
ここで「同じサイズの特徴マップ同士」でなければ連結できないので、DenseNetではいくつかのブロック(Dense Block)に分割し、ブロック間ではTransition Layer を挟みます。
- Dense Block: 中はサイズが同じ特徴マップなので、すべての層が相互に連結
- Transition Layer: プーリングや1×1 Convolutionなどでサイズを縮め、次のDense Blockへ受け渡し
§Dense Block & Growth Rate: 密結合構造の要点
DenseNetでは、Growth Rate と呼ばれるパラメータが一つの要です。
- Growth Rate (k)
- 各層が出力する特徴マップのチャネル数
- 例えば k=12 とか k=32 など設定が可能
- l番目の層が作る出力チャネル数 = k
なぜこの設定が重要かというと、前のすべての層の出力チャネルを“連結”して渡す ので、もし各層が大量のチャネルを生成してしまうと最終的なチャネル数が膨大になり、パラメータが爆発的に増加してしまいます。
しかしながら、DenseNetは「すでに学習済みのチャネルは使い回す」設計なので、各層ごとの出力は少なくても最終的には豊かな表現を得られます。ここがResNet以上のパラメータ効率を発揮するポイントと言えるでしょう。論文中でも、k=12やk=24程度でも非常に強力な結果が得られると報告されています。
加えて、Bottleneck Layer と呼ばれる1×1畳み込みを組み合わせることで、計算量削減をさらに行う手法 (DenseNet-B) や、Transition Layerでチャネルを絞る圧縮率 (θ) を導入した DenseNet-C といったバリエーションも提示。最終的にDenseNet-BC(Bottleneck + Compression)というアーキテクチャが広く使われています。
§実験結果と考察: CIFAR・SVHN・ImageNet
論文では、DenseNetを下記の競合ベンチマークで検証しています。
- CIFAR-10, CIFAR-100
- 32×32ピクセルの小さな画像分類
- Train: 5万枚、Test: 1万枚
- SVHN (Street View House Numbers)
- 32×32ピクセルの数字画像
- Train + extra: 約60万枚相当、Test: 2.6万枚
- ImageNet
- 1000クラス、100万枚以上の大規模画像データセット
それぞれ既存のResNet, FractalNet, WideResNet など最先端モデルと比較し、DenseNetの高精度・パラメータ効率が評価されています。
CIFAR & SVHN
論文の結果(Table 2)を見ると、例えばCIFAR-10において、
- DenseNet-BC (L=190, k=40):Error Rate = 3.46% (Data Augmentationあり)
- 他の競合(ResNetやFractalNet)の最良スコア:だいたい4%台~5%台
という形でDenseNetが最高精度を達成。さらに、パラメータ数は大幅に少なく、1001層もの超深いResNetを上回る性能を、パラメータ数1/3以下で出すなどの結果が示されています。
またSVHN でも、DenseNetは既存手法よりも高い精度を示しており、特に深い(L=100)DenseNet-BCで状態-of-the-artに近いスコアを実現しています。
ImageNet
ImageNetの実験(Table 3, Figure 3)でも、
- DenseNet-121 (25Mパラメータ) と、ResNet-50 (25.6Mパラメータ) がほぼ同等の演算量で比較されたとき、エラー率はDenseNetの方が優位
- DenseNet-201 (約20Mパラメータ) は、ResNet-101 (約44.7Mパラメータ) と近い精度
- FLOPs(浮動小数点演算量)が同等なら、DenseNetの方がより高い精度を出せる
という形でパラメータ・演算量ともに削減できる利点が報告されています。大規模データセットでも、「層を大量に積む→DenseBlockでSkip Connectionを増強」という設計が有効だと確認されたわけですね。
§DenseNetの強み:なぜ強い?何が新しい?
論文中でも強調されている、DenseNetのメリットを列挙してみましょう。
- 勾配消失を緩和
- 全層が互いに直接つながっているので、勾配が伝わりやすい
- ResNetでも同様の議論があるが、DenseNetの場合は加算ではなく連結なので、尚更“情報流”が豊富
- パラメータ効率が高い(Parameter Efficiency)
- 既に出現した特徴マップを再利用し、新しい特徴マップ(kチャネル)だけを学習で追加していく
- 無駄に重複した表現を学習する必要がない
- 強力なFeature Reuse
- どの層でも、過去すべての層が作った特徴を取り出せる
- 有用な低レベル特徴を後段の層で何度でも再利用できる
- Implicit Deep Supervision(暗黙の深層監督)
- 全ての層が「ほぼ直接」損失関数と結びついているような状態
- DSN(Deeply Supervised Nets)に近い発想。中間層が自動的に“良い特徴”を学びやすい
- 学習が安定しやすい
- 非常に深く積んでもオプティマイズが難しくなりにくい
- 論文中では、単純なハイパーパラメータで数百層に及ぶDenseNetを安定学習させている
§課題と今後の展望
もちろん、DenseNetにもいくつか課題は存在します。
- 実装上のメモリ効率
- 各層の出力を後続すべての層に連結するため、GPUメモリ使用量が増大するリスクがある
- 論文のSupplementaryなどで「Memory Efficient DenseNet」という実装上の最適化が提案されている
- 計算量
- 同じ深さ・幅であれば、ResNetよりも計算量はそこまで増えないものの、特徴連結の管理を上手くやらないと非効率な実装となる可能性
- 大規模タスクを実行する際には、ハードウェアとの兼ね合いでボトルネックをどう設定するかが重要
- 他のタスクへの汎用性
- 論文中では画像認識が主な検証対象。とはいえ、セグメンテーションや物体検出などでもDenseNetを応用した研究が色々と出てきている
- 将来的にはマルチモーダルにも展開が期待される
論文の結びとして著者たちは、「これだけSkip Connectionが豊富なので、DenseNetは他の用途(転移学習など)にも有用性があるのでは」と示唆しています。また、Deep Supervision的な効果があるため、他の領域への展開も面白そうです。
§まとめ
以上、DenseNet という超・密結合型のCNNアーキテクチャをひととおり見てきました。
- 各層から後続層へ全て結合してしまうため、膨大なSkip Connectionが得られる
- ResNetのような「加算」ではなく「連結」で特徴を再利用する
- 結果として、勾配消失の緩和・Feature Reuse・パラメータ効率 を高い水準で実現
- CIFARやImageNetといったベンチマークで既存手法を上回る精度&コンパクト化を実証
「モデルを深くしつつも、勾配が届きやすい/無駄が少ない」 という哲学は、近年の深層学習モデルの傾向に合致しています。現状では主に画像認識分野でよく使われるアーキテクチャですが、研究コミュニティでは転移学習やセグメンテーションなどへの応用例も多数報告されています。ぜひ一度、DenseNet のコードを眺めてみると「なるほど、こんな風に連結しているのか」とイメージが湧くと思います。
最後までお読みいただき、ありがとうございました!
🔑この記事のポイントまとめ
- DenseNet:すべての層同士が連結するCNNアーキテクチャ
- 特徴マップのconcat により、過去のすべての特徴を再利用→パラメータ効率・勾配伝播 が向上
- CIFAR-10やSVHN、ImageNetで高精度&コンパクト を実証
- Growth Rate (k) と Bottleneck (1×1 Conv)、Compression (θ) といったハイパーパラメータで柔軟に設計可能
- ResNet の発想をさらに拡張した構造として、Feature Reuse や Implicit Deep Supervision を実現
§参考文献(論文リンク)
- Densely Connected Convolutional Networks: httpss://arxiv.org/abs/1608.06993
- Github(liuzhuang13/DenseNet): httpss://github.com/liuzhuang13/DenseNet
※以下は参考として最新の汎用モデルのリンクです
- Segment Anything: httpss://arxiv.org/abs/2304.02643
- Github: httpss://github.com/facebookresearch/segment-anything
- 公式Webデモ: httpss://segment-anything.com
おわりに
DenseNetは「とにかくレイヤーを全部つないでしまえ!」というシンプルかつ大胆な発想で、畳み込み層の冗長な重複を削減しつつ精度を向上させました。論文が初出の2016~2018年ごろから、すでに多くの手法がその特徴再利用の考え方を取り入れたり、改変版のDenseNetが様々登場しています。
ResNetやHighway Networkの系譜をさらに強化し、「全層どころかブロック間もつなぐ」という設計は、今後のネットワークアーキテクチャの一つの定番の考え方としても定着しそうです。
深層学習でCNNモデルを組む際には、ぜひ「密結合」の効果を試してみるのも一手だと思います。最後までご覧いただき、ありがとうございました。
ディスカッション
コメント一覧
まだ、コメントがありません