スキップ接続 すきっぷせつぞく
スキップ接続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が全接続型スキップ接続を発表し、パラメータ効率の良さが注目
- 現在:スキップ接続は深層学習の設計において「ほぼ必須の構造要素」となっている
スキップ接続の役割
| 役割 | 内容 |
|---|---|
| 勾配の経路確保 | 浅い層への勾配が途切れにくくなる |
| 特徴の再利用 | 浅い層の低レベル特徴を深い層で活用 |
| 情報の保存 | ダウンサンプリングで失われた空間情報を補完 |
| 学習の容易化 | モデルが恒等写像を学習しやすくなる |
関連用語
- 残差接続(Residual Connection) — 加算型スキップ接続の代表
- ResNet — 残差接続を使い深層化を実現したモデル
- セマンティックセグメンテーション — U-NetのスキップでU-Netが活躍するタスク
- インスタンスセグメンテーション — スキップ接続を活用するセグメンテーション
- 勾配消失 / 勾配爆発 — スキップ接続が緩和する問題