[機械学習のはじめ方] Part41: 代表的なCNNモデル(VGG, ResNet, EfficientNetなど)

機械学習

画像認識の世界を切り開いたモデルたちを学ぼう!

前の記事では、畳み込みニューラルネットワーク(CNN)の基本的な構造(畳み込み層、プーリング層、全結合層)や、転移学習について学びましたね。 今回は、画像認識の分野で大きな成果を上げてきた、代表的なCNNモデルである VGG, ResNet, EfficientNet を中心に、その特徴や違い、そしてどのような場面で使われるのかを見ていきましょう。これらのモデルは、画像認識技術の発展において重要なマイルストーンとなっています。

1. VGG: シンプルイズベスト? 深層化の先駆け

VGG(Visual Geometry Group)は、オックスフォード大学の研究チームによって開発されたモデルです。ILSVRC(ImageNet Large Scale Visual Recognition Challenge)2014で上位の成績を収めました。 VGGの最大の特徴は、3×3という小さな畳み込みフィルタのみを使用し、それらを連続して重ねることでネットワークを深く(多層に)した点にあります。これにより、パラメータ数を抑えつつ、より複雑な特徴を学習できるネットワーク構造を実現しました。

主な特徴

  • 3×3畳み込みフィルタ: 小さなフィルタを重ねることで、5×5や7×7といった大きなフィルタと同等の受容野( receptive field: 1つのニューロンが反応する入力領域の広さ)を、より少ないパラメータ数で実現できます。
  • シンプルな構造: 基本的に同じ構成(3×3畳み込み層 + ReLU活性化関数)のブロックを積み重ね、プーリング層でサイズを縮小するという、非常に単純で理解しやすいアーキテクチャです。
  • 深いネットワーク: VGG16(16層)やVGG19(19層)のように、当時の他のモデルと比較して非常に深いネットワークを実現しました。

メリット・デメリット

メリット 👍

  • 構造がシンプルで理解しやすく、実装も容易です。
  • 転移学習のベースモデルとして、特徴抽出器として広く利用されています。

デメリット 👎

  • 層が深いためパラメータ数が非常に多く(VGG16で約1億3800万)、計算コストが高いです。
  • メモリ消費量が多いです。
  • 層が深くなると勾配消失問題が発生しやすく、学習が困難になる場合があります。

VGGはそのシンプルさと汎用性の高さから、後の多くの研究に影響を与えました。特に転移学習では、事前学習されたVGGモデルの一部を特徴抽出器として利用するアプローチが今でも有効な場合があります。

2. ResNet: 「スキップ」が切り開いた超深層ネットワーク

ResNet(Residual Network)は、Microsoft Researchが開発し、ILSVRC 2015で優勝したモデルです。VGGよりもはるかに深いネットワーク(例えば152層)の学習を可能にし、深層学習の「深さ」の限界を大きく押し広げました。

ResNetの核心的なアイデアは、残差学習(Residual Learning)と、それを実現するためのスキップ接続(Skip Connection、またはショートカット接続)です。 スキップ接続は、ある層への入力(x)を、その層(または複数層)の出力(F(x))に足し合わせる(F(x) + x)という構造を持っています。これは、ネットワークが学習すべき目標を、入力xから直接出力H(x)を学習するのではなく、入力xとの「差分(Residual)」である F(x) = H(x) – x を学習するように変更することを意味します。

もし層を追加することが性能向上につながらない場合、理想的にはその追加層は恒等写像(入力をそのまま出力すること、つまり F(x)=0)を学習すればよいのですが、従来のネットワークではこれが難しいとされていました。しかし、ResNetでは F(x)=0 を学習するだけで恒等写像 H(x)=x が実現できるため、層を追加しても性能が低下しにくくなりました(劣化問題の解決)。また、スキップ接続は勾配が直接前の層に伝わるバイパス経路としても機能するため、勾配消失問題を効果的に抑制し、非常に深いネットワークの学習を可能にしました。

主な特徴

  • 残差ブロック (Residual Block): スキップ接続を持つ基本的なブロック構造。
  • スキップ接続: 入力をショートカットして後段の層の出力に加算する経路。これにより勾配の流れが改善されます。
  • 超深層ネットワーク: ResNet-50, ResNet-101, ResNet-152のように、100層を超えるネットワークの学習を実現しました。
  • 勾配消失/劣化問題の緩和: 深いネットワークでも学習が進むようになり、高い精度を達成できます。

メリット・デメリット

メリット 👍

  • 非常に深いネットワークでも安定して学習を進めることができます。
  • 多くの画像認識タスクで高い精度を達成できます。
  • 転移学習のベースモデルとしても非常に強力で、広く利用されています。

デメリット 👎

  • VGGよりはパラメータ効率が良いものの、依然としてパラメータ数は多いです。
  • アーキテクチャはVGGより複雑で、スキップ接続の挙動を直感的に理解するのは少し難しいかもしれません。

ResNetの登場は、深層学習モデル設計におけるブレークスルーであり、その残差学習の考え方は、以降の多くのネットワークアーキテクチャに影響を与え続けています。

3. EfficientNet: 精度と効率のベストバランスを求めて ⚖️

EfficientNetは、Google AIによって開発された、高い精度と計算効率(少ないパラメータ数と計算量)を両立させることを目指したモデル群です。従来、ネットワークの性能を向上させるためには、「深さ(Depth)」「幅(Width、チャネル数)」「解像度(Resolution、入力画像のサイズ)」のいずれかを個別にスケールアップするのが一般的でした。

EfficientNetでは、これらの3つの要素を個別にスケールアップするのではなく、バランス良く同時にスケールアップする「Compound Scaling(複合スケーリング)」という新しい手法を提案しました。具体的には、まず比較的小さなベースラインモデル(EfficientNet-B0)をニューラルアーキテクチャ探索(NAS)を用いて設計し、その後、複合係数(Compound Coefficient, φ)と呼ばれる単一の係数を用いて、深さ、幅、解像度を以下の関係式に従って統一的にスケールアップします。

depth: d = αφ
width: w = βφ
resolution: r = γφ

ここで、α, β, γ はグリッドサーチによって決定される定数です(論文では α=1.2, β=1.1, γ=1.15 がベースライン)。ユーザーは係数 φ を調整するだけで、モデルサイズ(B0〜B7)を系統的に変更できます。

主な特徴

  • Compound Scaling: ネットワークの深さ、幅、解像度をバランス良く同時にスケーリングすることで、効率的に性能を向上させます。
  • 高い精度と効率: 既存のモデル(ResNetなど)と比較して、同等以上の精度を少ないパラメータ数と計算量(FLOPS)で達成します。
  • ベースラインネットワーク (EfficientNet-B0): NASを用いて探索された、効率の良い基本構造。
  • スケーラブルなモデルファミリー: B0からB7まで、複合係数 φ を変えることで、要求される性能と計算リソースに応じて様々なサイズのモデルを選択できます。

メリット・デメリット

メリット 👍

  • 精度に対してパラメータ数と計算量が非常に少ないため、効率が良いです。
  • モバイルデバイスやエッジデバイスなど、リソースが限られた環境での利用に適しています。
  • 転移学習においても高い性能を発揮します。

デメリット 👎

  • Compound Scaling の理論的背景や最適な係数(α, β, γ)の探索はやや複雑です。
  • (特に初期のバージョンでは)学習の安定性や速度に課題がある場合がありました。

EfficientNetは、精度だけでなく「効率」を体系的に最適化するアプローチを示し、多くの実用的な場面で採用されています。その後、学習速度や安定性を改善したEfficientNetV2も登場しており、さらなる性能向上が図られています。

4. その他の代表的なCNNモデルたち ✨

VGG, ResNet, EfficientNet以外にも、画像認識の発展に貢献した重要なCNNモデルはたくさんあります。いくつか代表的なものを簡単に紹介しましょう。

モデル名主な特徴主な貢献・登場時期
AlexNetReLU活性化関数、Dropout、データ拡張などを導入し、深層学習による画像認識のブレークスルーとなった。ILSVRC 2012 優勝
GoogLeNet (Inception)複数のサイズの畳み込みフィルタやプーリングを並列に適用する「Inceptionモジュール」を提案。計算コストを抑えつつネットワークの表現力を高めた。ILSVRC 2014 優勝
MobileNetDepthwise Separable Convolutionという軽量な畳み込み演算を用いて計算量を大幅に削減。モバイルデバイス向けの効率的なモデル。2017年頃登場
DenseNet各層がそれ以前の全ての層からの特徴マップを直接受け取る密な接続(Dense Connection)を導入。特徴の再利用を促進し、勾配の流れを改善。CVPR 2017 Best Paper
Vision Transformer (ViT)自然言語処理で成功したTransformerアーキテクチャを画像認識に応用。画像をパッチに分割し、シーケンスとして処理する。大規模データセットでCNNを凌駕する性能を示すことも。2020年頃登場

特に近年では、自然言語処理分野で大きな成功を収めたTransformerのアーキテクチャを画像認識に応用するVision Transformer (ViT) やその派生モデルが注目を集めています。CNNとは異なるアプローチ(アテンション機構)で画像全体の関連性を捉えようとするもので、今後の発展が期待されています。

5. どのモデルを選ぶべき? 🤔

これだけ多くのモデルがあると、実際にどのモデルを使えば良いか迷ってしまいますよね。モデル選択は、解決したいタスクの種類、利用可能なデータ量、計算リソース(GPUメモリ、学習時間)、要求される精度や推論速度など、様々な要因を考慮して決定する必要があります。

  • 最高の精度が求められ、計算リソースに余裕がある場合: ResNetの深いバージョン(ResNet101, ResNet152)や、EfficientNetの大きいバージョン(B5〜B7)、あるいは最新のVision Transformer系のモデルが良い選択肢になる可能性があります。ただし、ViTなどは非常に大規模なデータセットでの事前学習が性能発揮の鍵となることが多いです。
  • 精度と計算効率のバランスを取りたい場合: ResNet-50やEfficientNetの中程度のサイズ(B0〜B4)などが汎用性が高く、良い候補になります。これらは転移学習のベースモデルとしても非常に人気があります。
  • モバイルデバイスやエッジAIなど、リソースが限られた環境で高速に推論したい場合: MobileNetシリーズやEfficientNet-Lite、ShuffleNetなど、軽量化と速度に特化したモデルが適しています。
  • まずは手軽に試したい、標準的なベースラインとして使いたい場合: VGG16やResNet-50は、多くの深層学習フレームワークで事前学習済みモデルが簡単に利用でき、導入のハードルが低いです。

多くの場合、特に手元にあるデータセットがそれほど大きくない場合は、ImageNetなどの大規模データセットで事前学習されたモデル(Pre-trained Model)を用いた転移学習(Transfer Learning)から始めるのが最も効果的です。これにより、学習時間とデータ量を節約しつつ、比較的高い精度を達成できる可能性が高まります。

TensorFlow (Keras) や PyTorch といった主要な深層学習フレームワークでは、これらの代表的なモデルが `applications` や `torchvision.models` モジュールなどを通じて簡単に利用できるようになっています。事前学習済みの重みをロードし、最後の分類層だけを自分のタスクに合わせて変更するといった実装が容易に行えます。


# TensorFlow (Keras) の例
from tensorflow.keras.applications import VGG16, ResNet50, EfficientNetB0
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras.models import Model

# 例: ResNet50をベースにした転移学習 (ImageNetの重みを使用、トップ層は除く)
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# ベースモデルの層は凍結(学習させない)
for layer in base_model.layers:
    layer.trainable = False

# 独自の分類層を追加
x = base_model.output
x = GlobalAveragePooling2D()(x) # プーリング
x = Dense(1024, activation='relu')(x) # 全結合層
predictions = Dense(10, activation='softmax')(x) # 例: 10クラス分類の出力層

# 新しいモデルを定義
model = Model(inputs=base_model.input, outputs=predictions)

# モデルをコンパイルして学習
# model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# model.fit(...)
        

# PyTorch (torchvision) の例
import torch
import torchvision.models as models
import torch.nn as nn

# 例: ResNet50をベースにした転移学習 (推奨される最新の重みを使用)
resnet_model = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2)

# ベースモデルのパラメータを凍結
for param in resnet_model.parameters():
    param.requires_grad = False

# 最後の全結合層 (fc層) を新しいものに置き換える
num_features = resnet_model.fc.in_features
resnet_model.fc = nn.Sequential(
    nn.Linear(num_features, 1024),
    nn.ReLU(),
    nn.Dropout(0.5), # 必要に応じてDropoutを追加
    nn.Linear(1024, 10) # 例: 10クラス分類の出力層
)

# GPUが利用可能ならモデルをGPUへ移動
# device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# resnet_model = resnet_model.to(device)

# 損失関数と最適化手法を定義して学習
# criterion = nn.CrossEntropyLoss()
# optimizer = torch.optim.Adam(resnet_model.fc.parameters(), lr=0.001) # fc層のパラメータのみ学習
# train_model(...)
        

コード例では、ResNet50をベースに、ImageNetで学習済みの重みを読み込み、最後の全結合層(分類層)を自分のタスク(ここでは10クラス分類)に合わせて置き換えています。ベースモデルの重みは初期段階では固定(凍結)し、新しく追加した層だけを学習させるのが一般的な転移学習のアプローチです。

まとめ

今回は、画像認識の歴史において重要な役割を果たしてきた代表的なCNNモデル、VGG, ResNet, EfficientNetを中心に、AlexNet, GoogLeNet, MobileNet, DenseNet, Vision Transformerといった他の重要なモデルにも触れながら、それぞれのアーキテクチャの特徴、メリット・デメリット、そして進化の系譜を見てきました。

  • VGG: 3×3フィルタによるシンプルな深層化の有効性を示しました。
  • ResNet: スキップ接続による残差学習で、超深層ネットワークの学習と勾配消失問題を克服しました。
  • EfficientNet: 精度と効率のトレードオフを体系的に最適化するCompound Scalingを提案しました。

これらのモデルは、単に画像分類タスクで高い性能を達成するだけでなく、物体検出、セマンティックセグメンテーション、画像生成など、様々なコンピュータビジョンタスクにおけるバックボーン(特徴抽出器)としても広く利用されています。 それぞれのモデルがどのような課題を解決するために、どのようなアイデア(構造や学習方法)を導入したのかを理解することは、新しいモデルを理解したり、自分のタスクに適したモデルを選択・カスタマイズしたりする上で非常に重要です。

これでCNNの代表的なモデルについての学習は完了です。次は、Step 8に進み、時間の流れに沿ったデータ、つまり時系列データを扱うためのモデルについて学んでいきましょう! 🎉

コメント

タイトルとURLをコピーしました