ディープラーニング、特に画像認識の分野でよく耳にする畳み込みニューラルネットワーク(CNN)。その性能を左右する重要なパラメータの一つに「ストライド(Stride)」があります。
この記事では、ディープラーニングの学習を始めたばかりの方でも理解できるように、「ストライド」の基本的な意味から、その役割やモデルに与える影響までを分かりやすく解説していきます。
ストライドの基本的な考え方
ストライドとは、一言で言うと「フィルター(またはカーネル)を動かす歩幅」のことです。
畳み込みニューラルネットワーク(CNN)では、入力データ(例えば画像)に対して「フィルター」と呼ばれる小さな行列をスライドさせながら計算(畳み込み演算)を行い、データの特徴を抽出します。このフィルターを、入力データ上で一度にどれくらいの距離を移動させるかを決めるのがストライドです。
- ストライドが1 (Stride=1): フィルターを1ピクセルずつ、細かく動かします。
- ストライドが2 (Stride=2): フィルターを2ピクセルずつ、大きく動かします。
この「歩幅」の大きさが、後続の処理に大きな影響を与えます。ストライドは主に「畳み込み層」と「プーリング層」という2つの場所で利用されますが、基本的な意味はどちらも同じです。
1. 畳み込み層におけるストライド
畳み込み層の役割は、画像からエッジや模様といった局所的な特徴を検出することです。ここでストライドが重要な役割を果たします。
ストライドの値を変更すると、出力される特徴マップ(Feature Map)のサイズが変わります。特徴マップとは、フィルターによって抽出された特徴をまとめたものです。
出力サイズの計算式は以下の通りです。(※パディングがない場合)
例えば、5×5の入力画像に3×3のフィルターを適用する場合を考えてみましょう。
- ストライドが1の場合:
(5 – 3) / 1 + 1 = 3 となり、出力は 3×3 の特徴マップになります。入力情報をより密に捉えることができます。 - ストライドが2の場合:
(5 – 3) / 2 + 1 = 2 となり、出力は 2×2 の特徴マップになります。出力サイズが小さくなり、情報の抽出は粗くなりますが、計算コストを削減できます。
このように、ストライドを大きくすると、出力される特徴マップの次元が削減される(ダウンサンプリングされる)効果があります。
Pythonコードでの指定例 (TensorFlow/Keras)
実際のコードでは、畳み込み層(Conv2D
)の引数としてstrides
を指定します。
import tensorflow as tf
from tensorflow.keras import layers
# ストライドが (1, 1) の場合
conv1 = layers.Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding='valid')
# ストライドが (2, 2) の場合
conv2 = layers.Conv2D(filters=64, kernel_size=(3, 3), strides=(2, 2), padding='valid')
strides=(1, 1)
は、縦方向と横方向の移動量をそれぞれ1に設定することを意味します。
2. プーリング層におけるストライド
プーリング層は、畳み込み層で抽出された特徴マップを圧縮し、計算負荷を軽減したり、多少の位置のズレを吸収したりする役割を持ちます。代表的なものにマックスプーリング(Max Pooling)があります。
プーリング層でも、畳み込み層と同様にストライドが使われます。これは、プーリングを行う範囲(ウィンドウ)をどれだけ動かすかを指定するものです。
一般的に、プーリング層ではウィンドウサイズとストライドの値を同じに設定することがよくあります。例えば、2×2のウィンドウでプーリングを行う場合、ストライドも2に設定します。これにより、プーリングの範囲が重なることなく、特徴マップのサイズをきれいに半分にすることができます。
Pythonコードでの指定例 (TensorFlow/Keras)
プーリング層(MaxPooling2D
)でも、同様にstrides
引数で指定します。
import tensorflow as tf
from tensorflow.keras import layers
# 2x2のウィンドウサイズで、ストライドを2に設定
# この場合、stridesを指定しなくてもデフォルトでpool_sizeと同じ値が設定されることが多い
pooling_layer = layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2))
ストライドの大きさがモデルに与える影響
ストライドは単なる「歩幅」ですが、その値はモデル全体の性能や特性に大きく影響します。ストライドを調整することは、一種のトレードオフの関係にあります。
項目 | ストライドが小さい (例: 1) | ストライドが大きい (例: 2以上) |
---|---|---|
出力サイズ | 大きくなる | 小さくなる(ダウンサンプリング) |
計算コスト | 高くなる(後続の層への入力が大きいため) | 低くなる(計算量が削減される) |
特徴の抽出 | フィルターの適用領域が重なるため、より密で詳細な特徴を抽出しやすい | 情報の抽出が粗くなるが、より大局的な特徴を捉えやすくなる |
モデルの精度 | 位置情報などをより多く保持するため、精度向上に繋がる可能性がある | 情報の損失が大きいため、精度が低下する可能性がある |
まとめ
今回は、ディープラーニングにおける「ストライド」について解説しました。最後にポイントをまとめます。
- ストライドは、CNNにおけるフィルター(カーネル)やプーリングウィンドウを動かす「歩幅」のこと。
- 主に「畳み込み層」と「プーリング層」で使われる。
- ストライドを大きくすると、出力される特徴マップのサイズが小さくなり、計算コストが削減される。
- ストライドを小さくすると、より詳細な特徴を抽出できる可能性があるが、計算コストは増加する。
- ストライドは、モデルの性能と計算効率のバランスを取るための重要なハイパーパラメータである。
ストライドの役割を理解することは、CNNのアーキテクチャを深く理解し、自分でモデルを設計・調整する際の大きな助けとなります。