画像認識アーキテクチャの進化大全: CNN・ViT・Mamba・MLPの比較

AI技術の急速な進歩により、画像認識は私たちの生活に深く浸透し、顔認証、自動運転、医療画像診断など、多岐にわたる分野で革新をもたらしています。この画像認識技術の発展を支えているのが、ディープラーニングにおけるモデルアーキテクチャの目覚ましい進化です。

本記事では、画像認識の歴史を彩る主要なアーキテクチャに焦点を当て、その進化の軌跡をたどります。畳み込みニューラルネットワーク(CNN)の登場から、Transformerの概念を画像領域に適用したVision Transformer(ViT)、そして近年注目を集めるMLP-MixerやMamba系アーキテクチャまで、それぞれの特徴と技術的革新を深掘りします。

各アーキテクチャについては、その核となるアイデアを分かりやすく解説し、さらにPyTorchを用いた簡単なサンプルコードを交えながら、実践的な理解を深めることを目指します。画像認識の最前線を理解し、ご自身のプロジェクトに活かすための第一歩として、ぜひ本記事をご活用ください。

畳み込みニューラルネットワーク

畳み込みニューラルネットワーク(CNN)は、画像認識分野に革命をもたらしたディープラーニングモデルの基盤です。画像の局所的な特徴を捉える畳み込み層と、特徴マップを圧縮するプーリング層を交互に重ねることで、画像から高レベルな特徴を効率的に抽出します。ここでは、主要なCNN系アーキテクチャとその進化を解説します。

AlexNet

AlexNetは、2012年に発表され、深層学習が画像認識タスクにおいて従来のSOTA(State-of-the-Art)手法を大きく上回る性能を示すことを証明し、「ImageNet革命」の始まりを告げました 。深層畳み込みネットワークの先駆けとして、ReLU活性化関数、Dropout、データ拡張といった技術を導入し、大規模データセットImageNetでの画像分類タスクで高い精度を達成しました 。これにより、深層学習が画像認識の主流となる道を切り開きました。

import torch
from torchvision.models import alexnet

batch_size, n_colors, width, height= (2, 3, 224, 224)
inputs = torch.rand(batch_size, n_colors, width, height)

model = alexnet(weights=None)
outputs = model(inputs)
print(outputs.shape)

VGGNet

VGGNetは2014年に発表され、3×3の小さな畳み込みフィルタを複数層にわたって積み重ねるというシンプルな構造が特徴です 。これにより、モデルを深くすることで表現能力を高めつつ、畳み込み層のパラメータ数を抑えることに成功しました。その単純な構造は実装が容易であり、他の多くのCNNモデルの設計に影響を与えましたが、巨大なモデルサイズとなる傾向がありました

import torch
from torchvision.models import vgg16

batch_size, n_colors, width, height= (2, 3, 224, 224)
inputs = torch.rand(batch_size, n_colors, width, height)

model = vgg16(weights=None)
outputs = model(inputs)
print(outputs.shape)

GoogLeNet (Inception v1)

GoogLeNetは2014年に登場し、Inceptionモジュールと呼ばれるブロックを導入したことで知られています 。Inceptionモジュールは、異なるサイズの畳み込みフィルタ(1×1, 3×3, 5×5)やプーリング層を並列に配置し、それぞれの出力を結合することで、複数スケールの特徴を同時に捉えることを可能にしました 。また、1×1畳み込みを導入してパラメータ数を削減するなどの工夫により、高い精度と効率性を両立させました

import torch
from torchvision.models import googlenet

batch_size, n_colors, width, height= (2, 3, 224, 224)
inputs = torch.rand(batch_size, n_colors, width, height)

model = googlenet(weights=None)
outputs = model(inputs)
print(outputs.shape)

Inception v3

Inception v3は、GoogLeNetの改良版として2015年に発表されました 。Inceptionモジュールの設計をさらに洗練させ、大きな畳み込みフィルタを小さなフィルタに分解する「Factorized Conv」や、正則化手法である「Label Smoothing」を導入しました 。これにより、モデルの計算効率と精度がさらに向上し、高性能かつ軽量なモデルとして評価されています

import torch
from torchvision.models import inception_v3

batch_size, n_colors, width, height= (2, 3, 299, 299) # Inception_v3 requires 299x299 input size
inputs = torch.rand(batch_size, n_colors, width, height)

# Inception_v3's auxiliary logits are typically used during training.
# For inference, they are often disabled.
model = inception_v3(weights=None, aux_logits=False)
outputs = model(inputs)
print(outputs.shape)

ResNet

ResNet (Residual Network) は、2015年に発表された画期的なアーキテクチャで、100層を超えるような「超深層」のネットワークでも安定して学習できる残差接続(スキップ接続)を導入しました 。このスキップ接続は、入力の一部をそのまま後段の層に伝えることで、勾配消失問題を緩和し、非常に深いネットワークの学習を可能にしました 。これにより、層を深くするほど精度が向上するという新たな道が開かれました。

2種類の残差接続(https://arxiv.org/pdf/1512.03385 より引用)
import torch
from torchvision.models import resnet50

batch_size, n_colors, width, height= (2, 3, 224, 224)
inputs = torch.rand(batch_size, n_colors, width, height)

model = resnet50(weights=None)
outputs = model(inputs)
print(outputs.shape)

ResNeXt

ResNeXtは、2016年にResNetを拡張したモデルとして提案されました 。ResNeXtの主な特徴は、「カーディナリティ(cardinality)」と呼ばれる概念の導入です。これは、並列に配置された複数の同じ形状の変換ブロックの数を指し、グループ畳み込みを用いて効率的に実装されます 。これにより、ResNetと同様の深さやパラメータ数で、より高い精度を実現し、実装の容易さと精度のバランスに優れています

左-ResNet、右-ResNeXthttps://arxiv.org/pdf/1611.05431 より引用)
import torch
from torchvision.models import resnext50_32x4d

batch_size, n_colors, width, height= (2, 3, 224, 224)
inputs = torch.rand(batch_size, n_colors, width, height)

model = resnext50_32x4d(weights=None)
outputs = model(inputs)
print(outputs.shape)

DenseNet

DenseNetは2016年に発表されたアーキテクチャで、各層をその後のすべての層と直接接続するという「密な接続」が特徴です 。これにより、特徴の再利用が促進され、勾配の伝播が改善されるため、少ないパラメータ数で高い効率と精度を実現します 。特に、従来のCNNが抱えていた勾配消失問題の緩和と、特徴の有効活用において大きな進歩をもたらしました。

import torch
from torchvision.models import densenet121

batch_size, n_colors, width, height= (2, 3, 224, 224)
inputs = torch.rand(batch_size, n_colors, width, height)

model = densenet121(weights=None)
outputs = model(inputs)
print(outputs.shape)

ShuffleNet V2

ShuffleNet V2は2018年に発表された、モバイルデバイス向けの超軽量CNNモデルです 。効率的な設計を追求し、チャネルシャッフルやポイントワイズ分離畳み込みといった技術を導入することで、限られた計算資源下での高速な推論を可能にしました 。モバイルや組み込みデバイスでのAIアプリケーションにおいて、高い実用性を提供します

(a): 基本的なShuffleNet、(b) 空間ダウンサンプリング(2×)用のShuffleNet、(c) ShuffleNet v2の基本ユニット、(d) 空間ダウンサンプリング(2×)用のShuffleNet v2ユニット、DWConv: 深さ方向畳み込み、GConv: グループ畳み込み(https://arxiv.org/pdf/1807.11164 より引用)
import torch
from torchvision.models import shufflenet_v2_x1_0

batch_size, n_colors, width, height= (2, 3, 224, 224)
inputs = torch.rand(batch_size, n_colors, width, height)

model = shufflenet_v2_x1_0(weights=None)
outputs = model(inputs)
print(outputs.shape)

MobileNet V2

MobileNet V2も2018年に発表された軽量アーキテクチャの代表格であり、スマートフォンやエッジAIデバイス向けに広く利用されています 。Depthwise Separable Convolutionと、入力と出力の次元を保持する「Linear Bottleneck」構造を導入することで、高い精度を保ちながらも、大幅な計算コストとパラメータ数の削減を実現しました

import torch
from torchvision.models import mobilenet_v2

batch_size, n_colors, width, height= (2, 3, 224, 224)
inputs = torch.rand(batch_size, n_colors, width, height)

model = mobilenet_v2(weights=None)
outputs = model(inputs)
print(outputs.shape)

EfficientNet

EfficientNetは2019年に発表され、精度と計算効率の両立を最適化するモデルです 。Compound Scalingという手法を導入し、ネットワークの深さ、幅、解像度の3つの要素をバランス良くスケーリングすることで、高い精度を維持しつつ、計算コストを大幅に削減します 。NAS (Neural Architecture Search) によって設計されたベースラインモデルを基盤とし、多様なタスクで優れた性能を発揮します

モデルのスケーリング: (a)はベースライン・ネットワーク、(b)~(d)はネットワークの幅、深さ、解像度の1つの次元のみを増加させる従来のスケーリング、(e)はEfficientNetによる複合スケーリング法で、3次元すべてを一定の比率で均一にスケーリング(https://arxiv.org/pdf/1905.11946 より引用)
import torch
from torchvision.models import efficientnet_b0

batch_size, n_colors, width, height= (2, 3, 224, 224)
inputs = torch.rand(batch_size, n_colors, width, height)

model = efficientnet_b0(weights=None)
outputs = model(inputs)
print(outputs.shape)

ConvNeXt

ConvNeXtは2022年に発表された、Vision Transformer(ViT)の設計思想をCNNに再考して取り入れた新しいアーキテクチャです 。LayerNorm、GELU活性化関数、Depthwise ConvolutionといったViTで効果が確認された要素をCNNに適用することで、従来のCNNの堅牢性を保ちつつ、ViTに匹敵する、あるいはそれを上回る高い精度を達成しました 。これはCNNの最新の再考版として注目されています

import torch
from torchvision.models import convnext_tiny

batch_size, n_colors, width, height= (2, 3, 224, 224)
inputs = torch.rand(batch_size, n_colors, width, height)

model = convnext_tiny(weights=None)
outputs = model(inputs)
print(outputs.shape)

CNNアーキテクチャ比較

モデル名発表年主な特徴技術的革新パラメータ効率備考
AlexNet2012深いCNNの先駆けReLU, Dropout, データ拡張ImageNet革命の始まり
VGGNet2014シンプルな構造(3×3 Convのみ)深い層を積み重ねた単純構造△(巨大モデル)実装容易だが冗長
GoogLeNet (Inception v1)2014Inceptionモジュールによる複数スケール処理1×1 Conv, パラメータ削減モジュール設計の先駆け
Inception v32015モジュールの洗練化Factorized Conv, Label smoothing高性能かつ軽量
ResNet2015残差接続による超深層ネットスキップ接続深さ100層超でも学習可能
ResNeXt2016ResNetの拡張分離可能な“cardinality”概念実装・精度バランス良
DenseNet2016各層を全結合的に接続フィーチャー再利用、勾配流の改善高効率・パラメータ少
ShuffleNet V22018モバイル向け超軽量CNNチャネルシャッフル, ポイントワイズ分離Convモバイル・組込み向け
MobileNet V22018軽量アーキテクチャの定番Depthwise Separable Conv, Linear Bottleneckスマホ・Edge AI向け
EfficientNet2019精度・効率の両立Compound Scaling, NAS設計精度/計算効率のトレードオフ最適化
ConvNeXt2022ViTに触発されたCNN再設計LayerNorm, GELU, Depthwise ConvCNN最新再考版、精度高い

Vision Transformer

Vision Transformer (ViT) は、自然言語処理分野で大きな成功を収めたTransformerモデルを画像認識タスクに適用した画期的なアーキテクチャです。画像をパッチに分割し、それぞれをトークンとして扱うことで、CNNとは異なるアプローチで画像の特徴を学習します。自己注意機構により、画像全体における各パッチ間の関係性を捉えることが可能となり、画像認識の新たな可能性を切り開きました。

ViT

ViT (Vision Transformer) は、2020年にGoogleによって発表された、Transformerベースの初の画像分類モデルです 。画像を固定サイズのパッチに分割し、それぞれのパッチを線形に埋め込んでトークンとして扱います 。これらのトークンに位置エンコーディングを加えてTransformerエンコーダに入力することで、画像全体の大域的な依存関係を学習します。ImageNetなどの大規模データセットでCNNに匹敵する性能を示し、Transformerが画像認識においても有効であることを証明しました

import torch
from vit_pytorch import ViT

v = ViT(
    image_size=256,
    patch_size=32,
    num_classes=1000,
    dim=1024,
    depth=6,
    heads=16,
    mlp_dim=2048,
    dropout=0.1,
    emb_dropout=0.1
)

img = torch.randn(1, 3, 256, 256)
preds = v(img)
print(preds.shape) # (1, 1000)

Token-to-Token ViT (T2T-ViT)

Token-to-Token ViT (T2T-ViT) は2021年に提案されたモデルで、ViTの初期の課題であった位置情報や局所性の保持を改善することを目的としています 。T2T-ViTは、トークンを段階的に統合する「soft split」と呼ばれる手法を用いることで、画像の局所的な情報をより適切に捉えることを可能にします 。これにより、ViTの性能向上に貢献しました

import torch
from vit_pytorch.t2t import T2TViT

v = T2TViT(
    dim = 512,
    image_size = 224,
    depth = 5,
    heads = 8,
    mlp_dim = 512,
    num_classes = 1000,
    t2t_layers = ((7, 4), (3, 2), (3, 2)) # tuples of the kernel size and stride of each consecutive layers of the initial token to token module
)

img = torch.randn(1, 3, 224, 224)

preds = v(img) # (1, 1000)

CrossViT

CrossViTは2021年に発表されたモデルで、異なる解像度のトークンを融合する特徴を持ちます 。これは、マルチスケールのトークン学習を可能にすることで、グローバルな情報とローカルな情報の両方を統合的に処理することを目指しています 。これにより、画像全体の大まかな構造と詳細なテクスチャの両方を効率的に捉え、認識精度を向上させることが期待されます

import torch
from vit_pytorch.cross_vit import CrossViT

v = CrossViT(
    image_size = 256,
    num_classes = 1000,
    depth = 4,               # number of multi-scale encoding blocks
    sm_dim = 192,            # high res dimension
    sm_patch_size = 16,      # high res patch size (should be smaller than lg_patch_size)
    sm_enc_depth = 2,        # high res depth
    sm_enc_heads = 8,        # high res heads
    sm_enc_mlp_dim = 2048,   # high res feedforward dimension
    lg_dim = 384,            # low res dimension
    lg_patch_size = 64,      # low res patch size
    lg_enc_depth = 3,        # low res depth
    lg_enc_heads = 8,        # low res heads
    lg_enc_mlp_dim = 2048,   # low res feedforward dimensions
    cross_attn_depth = 2,    # cross attention rounds
    cross_attn_heads = 8,    # cross attention heads
    dropout = 0.1,
    emb_dropout = 0.1
)

img = torch.randn(1, 3, 256, 256)

pred = v(img) # (1, 1000)

CaiT

CaiT (Class-attention in Image Transformers) は2021年に発表された、深層ViTに特化したモデルです 。このモデルは、特に深い層での訓練安定性を向上させるために、「クラスアテンション」と「LayerScale」という技術を導入しています 。これにより、従来のViTでは難しかった非常に深いTransformerネットワークの安定した訓練を可能にし、より高精度なモデルの実現に貢献しました

CLSトークンの挿入タイミングによる性能差の比較:ViT(左)ではCLSトークンを初期から挿入するが、役割の混在により性能を阻害する可能性がある。CLSを後段で挿入する設計(中央)はこの課題を緩和し、CaiT(右)ではCLS挿入時にパッチ埋め込みを凍結することで効率と性能の向上を図っている(https://arxiv.org/pdf/2103.17239 より引用)
import torch
from vit_pytorch.cait import CaiT

v = CaiT(
    image_size = 256,
    patch_size = 32,
    num_classes = 1000,
    dim = 1024,
    depth = 12,             # depth of transformer for patch to patch attention only
    cls_depth = 2,          # depth of cross attention of CLS tokens to patch
    heads = 16,
    mlp_dim = 2048,
    dropout = 0.1,
    emb_dropout = 0.1,
    layer_dropout = 0.05    # randomly dropout 5% of the layers
)

img = torch.randn(1, 3, 256, 256)

preds = v(img) # (1, 1000)

PiT (Pooling-based Vision Transformer)

PIT (Pooling-based Vision Transformer) は2021年に提案された、CNNライクな階層構造を持つViTです 。トークンプーリングを導入することで、CNNの直感的な設計思想をViTに取り入れ、スケーラビリティを向上させています 。これにより、Transformerの柔軟性とCNNの効率性を組み合わせた、新しいアプローチを提示しました

import torch
from vit_pytorch.pit import PiT

v = PiT(
    image_size = 224,
    patch_size = 14,
    dim = 256,
    num_classes = 1000,
    depth = (3, 3, 3),     # list of depths, indicating the number of rounds of each stage before a downsample
    heads = 16,
    mlp_dim = 2048,
    dropout = 0.1,
    emb_dropout = 0.1
)

# forward pass now returns predictions and the attention maps

img = torch.randn(1, 3, 224, 224)

preds = v(img) # (1, 1000)

LeViT

LeViTは2021年に発表された、高速かつ高精度なVision Transformerです 。CNNとViTのハイブリッド設計を採用し、モバイルデバイス向けに最適化されています 。軽量でありながらも高い推論速度と優れた精度を両立することで、スマートフォンやエッジデバイス上でのAIアプリケーションの展開を容易にします

import torch
from vit_pytorch.levit import LeViT

levit = LeViT(
    image_size = 224,
    num_classes = 1000,
    stages = 3,             # number of stages
    dim = (256, 384, 512),  # dimensions at each stage
    depth = 4,              # transformer of depth 4 at each stage
    heads = (4, 6, 8),      # heads at each stage
    mlp_mult = 2,
    dropout = 0.1
)

img = torch.randn(1, 3, 224, 224)

levit(img) # (1, 1000)

ViTアーキテクチャ比較

モデル名発表年主な特徴技術的革新計算効率備考
ViT2020初のTransformerベース画像分類モデルパッチ分割 + ポジショナルエンコーディング△(高データ依存)ImageNetでCNNに匹敵する性能を示す
Token-to-Token ViT (T2T-ViT)2021トークン精製による局所性保持トークンを段階的に統合(soft split)ViTの初期欠点(位置・局所性)を改善
CrossViT2021異なる解像度のトークンを融合マルチスケールのトークン学習グローバル・ローカル情報の統合
CaiT2021深層ViTに特化クラスアテンション、LayerScale△(重い)深い層でも安定に訓練可能
PiT (Pooling-based ViT)2021CNNライクな階層ViTトークンプーリングによるスケーラビリティCNNの直感的設計を導入
LeViT2021高速・高精度のViTハイブリッド設計(CNN+ViT), Mobile向けモバイルフレンドリーなViT

MLP-Mixer / Mamba 系アーキテクチャ

近年、畳み込み層や自己注意機構に依存しない、新たなディープラーニングアーキテクチャが画像認識分野で注目を集めています。MLP-Mixerは多層パーセプトロン(MLP)のみで構成され、Vision Mambaは状態空間モデル(SSM)を基盤とするなど、これまでの常識を覆すモデルが登場し、画像認識の可能性をさらに広げています。

MLP-Mixer

MLP-Mixerは2021年にGoogleによって発表された、画像認識のための革新的なアーキテクチャです 。その最大の特徴は、畳み込み層も自己注意機構も用いず、多層パーセプトロン(MLP)のみで画像分類を可能にしている点です 。画像をパッチに分割し、これらのパッチに対してチャネル方向と空間方向(パッチ間)の2方向でMLPを適用することで、画像全体から特徴を抽出します 。このモデルは、Transformerのような複雑な構造を不要としながらも、競争力のある性能を示し、アーキテクチャ設計の新たな方向性を示しました 。ResMLPやgMLP、TokenMixer、CycleMLPなどがMLP-Mixerの派生アーキテクチャとして提案されています

import torch
from mlp_mixer_pytorch import MLPMixer

model = MLPMixer(
    image_size = 256,
    channels = 3,
    patch_size = 16,
    dim = 512,
    depth = 12,
    num_classes = 1000
)

img = torch.randn(1, 3, 256, 256)
pred = model(img)
print(pred.shape) # (1, 1000)

Vision Mamba

Vision Mambaは2024年に登場した、状態空間モデル(SSM)をベースとする視覚モデルです 。従来のTransformerが持つ二次的な計算コストや推論時のレイテンシといった課題に対し、Mambaブロックを導入することで、長距離依存性を高効率に処理することを可能にしています 。これにより、計算効率とスケーラビリティを両立させながら、ImageNetなどの画像認識タスクにおいて競争力のある性能を示しています 。MambaFormerやVSSM(Vision State Space Model)などがVision Mambaの派生アーキテクチャとして研究されています 。

import torch
from vision_mamba import Vim

# Forward pass
x = torch.randn(1, 3, 224, 224) # Input tensor with shape (batch_size, channels, height, width)

# Model
model = Vim(
    dim=256,  # Dimension of the transformer model
    heads=8,  # Number of attention heads
    dt_rank=32,  # Rank of the dynamic routing matrix
    dim_inner=256,  # Inner dimension of the transformer model
    d_state=256,  # Dimension of the state vector
    num_classes=1000,  # Number of output classes
    image_size=224,  # Size of the input image
    patch_size=16,  # Size of each image patch
    channels=3,  # Number of input channels
    dropout=0.1,  # Dropout rate
    depth=12,  # Depth of the transformer model
)

# Forward pass
out = model(x) # Output tensor from the model
print(out.shape) # Print the shape of the output tensor
print(out) # Print the output tensor

MLP-Mixer / Mamba 系アーキテクチャの比較

モデル名発表年主な特徴技術的革新計算効率備考
MLP-Mixer2021全体をMLPのみで構成パッチ×チャネル軸にMLP適用(2方向)△(データ依存)Transformer不要な構造の提示
ResMLP2021深層MLPベースモデルチャネル間のMLP+残差接続Vision Transformer代替の一環
gMLP2021軽量かつ自己注意的MLPSpatial Gating Unit(SGU)を導入MLPとゲート構造の融合
TokenMixer2022Token間の情報流動を強化様々なMixer操作(avg, conv, self-attn)汎用性を追求したMixer設計
CycleMLP2021CNN風のMLP構造Local receptive field + cyclic shiftCNN的局所性を導入
Vision Mamba2024SSMベースの視覚モデルMambaブロック(長距離依存性の高効率処理)計算効率・スケーラビリティ両立
MambaFormer2024Mamba + Transformerのハイブリッド遠近依存性を動的に切替ImageNetでもSOTAに迫る性能
VSSM (Vision State Space Model)2024完全SSMベースのモデルState Spaceレイヤーを畳み込み的に適用Transformer非依存の代替候補

おわりに

今回は、画像認識技術の進化を支える主要なディープラーニングアーキテクチャについて解説してきました。畳み込みニューラルネットワーク(CNN)が画像認識の夜明けを告げ 、AlexNet 、VGGNet 、ResNet といった画期的なモデルが次々と登場し、その性能を飛躍的に向上させました。その後、自然言語処理の分野で成功を収めたTransformerの概念が画像領域にも適用され、Vision Transformer(ViT) が新たな可能性を開拓しました。DeiT やSwin Transformer といった派生モデルも生まれ、効率性と汎用性を高めています。

さらに近年では、MLP-Mixer のようにMLPのみで構成されるモデルや、Mamba のような状態空間モデルを基盤としたアーキテクチャが登場し、従来の常識を打ち破る研究が進んでいます。これらの進化は、画像認識が多岐にわたる分野で応用される基盤となっており、今後もその発展から目が離せません。

More Information