ニューラルネットワーク

スキップ接続 すきっぷせつぞく

スキップ接続Skip Connection残差接続U-NetDenseNet深層学習
スキップ接続について教えて

簡単に言うとこんな感じ!

スキップ接続は「途中の層を飛び越えて情報を直接つなぐ」仕組みだよ。残差接続もスキップ接続の一種。U-Netでは「エンコーダで学んだ細かい特徴」をデコーダに直接渡すためにスキップ接続が使われて、医療画像の精密なセグメンテーションを可能にするんだ!


スキップ接続とは

スキップ接続(Skip Connection) は、ある層の出力を、いくつかの層を「スキップ(飛び越えて)」後ろの層に直接接続する構造の総称です。残差接続(Residual Connection)はスキップ接続の特殊ケースで、スキップした情報と通過後の情報を足し算(加算)で結合します。

スキップ接続の一般的な結合方法は複数あります。残差接続のような加算の他、特徴マップを横に並べる連結(Concatenation)もよく使われます。連結ではチャンネル数が増えますが、元の情報をそのまま保持できます。

最も有名な使用例はU-Net(医療画像セグメンテーション向けのモデル)で、エンコーダの各層からデコーダの対応する層へスキップ接続が張られ、ダウンサンプリングで失われた細かい空間情報をデコーダに届けます。


主なスキップ接続の種類

アーキテクチャ結合方法特徴
ResNet加算同じ次元でスキップ。パラメータ増なし
U-Net連結(Concat)エンコーダ→デコーダ。空間情報を保持
DenseNet連結(全接続)前の全層の出力を後ろに連結。特徴を最大再利用
Highway Networkゲート付き加算ゲートで通過量を制御
import torch
import torch.nn as nn

# U-Net風のスキップ接続(連結)の例
class UNetBlock(nn.Module):
    def __init__(self, in_channels, out_channels):
        super().__init__()
        self.encoder = nn.Conv2d(in_channels, out_channels, 3, padding=1)
        self.decoder = nn.Conv2d(out_channels * 2, out_channels, 3, padding=1)

    def forward(self, x):
        enc = self.encoder(x)           # エンコーダ出力を保存
        # ...ここでダウンサンプリング・処理...
        decoded = torch.cat([enc, enc], dim=1)  # スキップ接続(連結)
        return self.decoder(decoded)

歴史と背景

  • 2015年:ResNetで残差接続(加算型スキップ接続)が発表
  • 2015年:U-Netが医療画像セグメンテーションで連結型スキップ接続を採用
  • 2016年:DenseNetが全接続型スキップ接続を発表し、パラメータ効率の良さが注目
  • 現在:スキップ接続は深層学習の設計において「ほぼ必須の構造要素」となっている

スキップ接続の役割

役割内容
勾配の経路確保浅い層への勾配が途切れにくくなる
特徴の再利用浅い層の低レベル特徴を深い層で活用
情報の保存ダウンサンプリングで失われた空間情報を補完
学習の容易化モデルが恒等写像を学習しやすくなる

関連用語