Residual Networks (ResNet)
残差ネットワーク(ResNet)は、スキップ接続を通じて各ブロックの入力を出力に加算し、非常に深いネットワークの学習を可能にします。ブロック、派生モデル、コードを解説します。
残差ネットワーク(ResNet)は、残差ブロックで構成される深い畳み込みニューラルネットワーク(CNN)です。残差ブロックでは、ショートカット接続によって各ブロックの入力を出力に加算します。そのため、各ブロックは入力への補正だけを学習すればよく、50層、152層、さらには1,000層を超えるネットワークも安定して学習できます。Microsoft ResearchのKaiming He、Xiangyu Zhang、Shaoqing Ren、Jian Sunは、2015年の論文Deep Residual Learning for Image RecognitionでResNetを発表しました。残差ネットワークのアンサンブルは、ImageNetのILSVRC 2015 分類タスクで、トップ5誤差3.57%を達成して優勝しました。その後、残差接続はTransformerやリアルタイム物体検出器を含む、ほとんどのディープアーキテクチャで標準的な要素になりました。
劣化問題#
ResNet以前は、単純な畳み込み層の積み重ねに層を追加すると、やがて結果が悪化しました。ResNetの著者らは、56層の単純なネットワークが20層のネットワークより学習誤差が大きいことを示しました。そのため、過学習では性能低下を説明できませんでした。深いネットワークは、追加の層を恒等写像に設定すれば浅いネットワークと同等の性能を得られるはずでしたが、勾配降下法ではその解を見つけられませんでした。著者らはこの問題を劣化問題と名付けました。勾配消失問題は、重みの正規化初期化とバッチ正規化によってすでに大部分が解消されていたため、深い単純ネットワークでも収束はしましたが、より悪い解に到達していました。
残差ブロックの仕組み#
残差ブロックはy = F(x) + xを計算します。ここでxはブロックの入力、Fは通常、バッチ正規化とReLUを備えた2層または3層の畳み込みからなる小さな層のまとまりです。ブロックにとって最適な写像が恒等写像に近い場合、層が学習するのはFをゼロに近づけることだけであり、恒等写像を一から学習するよりはるかに簡単です。また、ショートカットによって、各ブロックを通じて勾配が直接逆方向に伝わります。恒等ショートカットはパラメーターを追加せず、計算量もほとんど増やしません。ブロックでチャネル数を変更する場合や、ストライド2でダウンサンプリングする場合は、xとF(x)の形状が一致しなくなるため、1×1畳み込みでショートカットを新しい形状に射影します。
ResNet-18とResNet-34は、この基本的な2層畳み込みブロックを積み重ねます。ResNet-50、ResNet-101、ResNet-152では、3層の畳み込みからなるボトルネックブロックを使います。1×1畳み込みでチャネル数を減らし、3×3の畳み込みで処理し、2つ目の1×1畳み込みでチャネル数を元に戻すことで、深いモデルのコストを抑えます。ResNet-50のパラメーター数は約2,560万です。原論文ではCIFAR-10で1,202層のネットワークも学習し、学習誤差を0.1%未満にしましたが、テスト誤差は7.93%で、110層ネットワークの6.43%を上回りました。著者らは、この差を小規模なデータセットでの過学習によるものとしました。
ResNetの派生モデル#
- Pre-activation ResNet: 同じ著者らによる2016年の続編では、各畳み込みの前にバッチ正規化とReLUを移動し、ショートカット経路を純粋な恒等写像にしました。また、CIFAR-10で1,001層のネットワークを学習しました。
- ResNeXt: 各ボトルネックを、cardinalityと呼ばれる幅の狭い多数の並列経路に分割することで、同じ計算コストで精度を高めます。
- Wide ResNet: 幅を広げたブロックを少数使用し、幅を深さの一部の代わりにできることを示しています。
- 最新化されたResNet: ConvNeXt(2022)は、大きなカーネル、レイヤー正規化、GELU活性化関数を採用してResNetの設計を更新し、Vision Transformerと競合できるようにしました。
事前学習済みResNetの利用#
事前学習済みResNetは、転移学習の一般的なベースラインやバックボーンとして、今もよく使われています。torchvisionのResNetモデルには、ImageNetの重みと対応する前処理が含まれているため、画像分類は数行で実行できます。
import urllib.request
import torch
from torchvision.io import decode_image
from torchvision.models import ResNet50_Weights, resnet50
# Load ResNet-50 with ImageNet weights and its matching preprocessing
weights = ResNet50_Weights.DEFAULT
model = resnet50(weights=weights).eval()
preprocess = weights.transforms()
# Download and decode a sample image
data = urllib.request.urlopen("https://ultralytics.com/images/bus.jpg").read()
image = decode_image(torch.frombuffer(bytearray(data), dtype=torch.uint8))
# Classify the image and report the most likely ImageNet class
with torch.no_grad():
probs = model(preprocess(image).unsqueeze(0)).softmax(dim=1)
score, index = probs.max(dim=1)
print(f"{weights.meta['categories'][index.item()]}: {score.item():.2f}")写真に写った市バスに最も近い、ImageNetの1,000クラスのうちの1つとしてminibus: 0.25が出力されます。独自のタスクでは、最後の全結合層を置き換え、新しいラベルでファインチューニングすると、残差段階がImageNetで学習した特徴を再利用できます。
ResNetと関連アーキテクチャ#
- VGGなどの単純なネットワーク: VGGはショートカットを使わずに3×3畳み込みを積み重ね、重み層は最大19層です。ResNet-152はVGG-19の8倍の深さがありながら、複雑さは低く抑えられています。
- Highwayネットワーク: ResNetと同時期に開発され、ショートカットを閉じられる学習可能なゲートを追加します。ResNetの恒等ショートカットは閉じられることがなく、パラメーターも追加しません。
- DenseNet: ショートカットを1つ追加する代わりに、ブロック内のそれ以前のすべての層の出力を連結します。チャネル数が増える一方で、特徴を再利用できます。
- U-Net: スキップ接続でエンコーダーの特徴マップをデコーダーまで運び、そこで連結します。個々のブロックを囲むのではなく、離れた段階同士を接続します。
- Vision Transformer(ViT): 畳み込みを自己注意機構に置き換えますが、他のTransformerと同様に、各注意サブレイヤーとフィードフォワードサブレイヤーの周囲には残差接続を維持します。
最新モデルにおける残差接続#
残差という考え方は、特定のResNetアーキテクチャを超えて広く使われています。大規模言語モデル(LLM)では各層が注意機構とフィードフォワードの出力を残差ストリームに加算し、ほとんどのCNN検出器は残差ブロックをバックボーンに使用しています。YOLO26では、入力チャネル数と出力チャネル数が一致する場合、C3k2ブロックはx + F(x)を返すボトルネックモジュールで構成されています。また、Ultralyticsパッケージには、ResNet-50およびResNet-101をバックボーンに使用するBaiduのRT-DETR設定も含まれています。ResNetの論文はCVPR 2016の最優秀論文賞を受賞し、2025年のNatureによる分析では、21世紀で最も引用された論文に選ばれました。










