ディープラーニングを学び始めると、「パディング(Padding)」という専門用語に出会うことがあります。このパディングは、特に画像認識と自然言語処理(NLP)という2つの主要な分野で、それぞれ少し異なる、しかし重要な役割を担っています。
このブログでは、ディープラーニング初心者の方でも理解できるように、パディングの基本的な概念から、なぜそれが必要なのか、そして具体的にどのように使われるのかを分かりやすく解説していきます。
1. 画像認識(CNN)におけるパディング
画像認識の分野では、主に畳み込みニューラルネットワーク(CNN)というモデルが使われます。CNNにおけるパディングは、入力データ(画像など)の周囲に特定の値(通常は0)を追加して、データのサイズを意図的に大きくする処理を指します。
なぜパディングが必要なのか?
CNNでは、「畳み込み」という処理で画像の特徴を抽出します。これは、フィルター(カーネル)と呼ばれる小さなウィンドウを画像の左上から右下へスライドさせながら計算していく処理です。 このとき、パディングがないと2つの問題が発生します。
- 情報の損失: 畳み込み演算を行うと、画像の端にあるピクセルは、中央のピクセルに比べてフィルターが通過する回数が少なくなります。 その結果、画像の端にある重要な情報が失われやすくなります。パディングで周囲を埋めることで、端のピクセルも十分に計算対象となり、情報の損失を防ぎます。
- 出力サイズの縮小: 畳み込み処理を1回行うごとに、出力されるデータ(特徴マップ)のサイズは入力よりも小さくなります。 これを繰り返すと、データが最終的になくなってしまう可能性があります。パディングは出力サイズを維持、または調整する役割を果たし、より深いネットワーク層を構築することを可能にします。
パディングの種類
CNNでよく使われるパディングには、主に2つの設定があります。
種類 | 説明 | 出力サイズ |
---|---|---|
Valid Padding | パディングを一切行わない設定です。 畳み込み演算によって、出力サイズは入力サイズよりも小さくなります。 | 小さくなる |
Same Padding | 出力サイズが入力サイズと同じになるように、自動的にパディングを追加する設定です。 一般的にはゼロ(0)で埋める「ゼロパディング」が使われます。 | 同じになる |
この他にも、画像の境界の値をコピーする「リフレクションパディング」や「レプリケーションパディング」といった手法も存在します。
実装例 (TensorFlow/Keras)
PythonのライブラリであるTensorFlow/Kerasでは、畳み込み層(`Conv2D`)の引数 `padding` を指定するだけで簡単に実装できます。
import tensorflow as tf
from tensorflow.keras import layers
# 28x28ピクセルの白黒画像1枚を想定 (バッチサイズ, 高さ, 幅, チャンネル数)
input_shape = (1, 28, 28, 1)
x = tf.random.normal(input_shape)
# Padding = 'valid' の場合
valid_conv = layers.Conv2D(filters=32, kernel_size=3, padding='valid')
output_valid = valid_conv(x)
print(f"Valid Padding Output Shape: {output_valid.shape}") # --> (1, 26, 26, 32) サイズが小さくなる
# Padding = 'same' の場合
same_conv = layers.Conv2D(filters=32, kernel_size=3, padding='same')
output_same = same_conv(x)
print(f"Same Padding Output Shape: {output_same.shape}") # --> (1, 28, 28, 32) サイズが維持される
2. 自然言語処理(NLP)におけるパディング
自然言語処理(NLP)の分野でもパディングは不可欠な技術ですが、その目的はCNNとは異なります。NLPにおけるパディングは、長さが異なる複数の文章(シーケンス)の長さを揃えるために使われます。
なぜパディングが必要なのか?
ディープラーニングモデルは、データをまとめて処理(バッチ処理)することで効率的に学習します。 しかし、文章の長さは「こんにちは」のように短いものもあれば、非常に長いレビュー文のように長いものもあり、バラバラです。 モデルは固定長のデータを受け取る必要があるため、そのままではバッチ処理ができません。
そこでパディングの出番です。バッチ内で最も長い文章に合わせて、それより短い文章の後ろ(または前)に特別な値(通常は0)を追加して、すべての文章の長さを強制的に同じにします。 これにより、モデルはデータをまとめて効率的に処理できるようになります。
パディングの位置
パディングを追加する位置によって、2つの種類に分けられます。
種類 | 説明 |
---|---|
Post-padding (後方パディング) | シーケンス(文章)の後ろにパディングを追加します。こちらが一般的によく使われます。 |
Pre-padding (前方パディング) | シーケンス(文章)の前にパディングを追加します。リカレントニューラルネットワーク(RNN)のようなモデルで、最後の情報を重視したい場合に有効なことがあります。 |
実装例 (TensorFlow/Keras)
TensorFlow/Kerasでは、`pad_sequences`という便利なユーティリティ関数が用意されています。
from tensorflow.keras.preprocessing.sequence import pad_sequences
# トークン化され、IDに変換された文章データを想定
sequences = [
, # 長さ3の文章
, # 長さ4の文章
# 長さ2の文章
]
# Post-padding (デフォルト)
padded_sequences_post = pad_sequences(sequences, padding='post')
print("Post-padding:")
print(padded_sequences_post)
# 出力:
# [[ 10 25 8 0]
# [ 5 31 99 2]
# [101 7 0 0]]
# Pre-padding
padded_sequences_pre = pad_sequences(sequences, padding='pre')
print("\nPre-padding:")
print(padded_sequences_pre)
# 出力:
# [[ 0 10 25 8]
# [ 5 31 99 2]
# [ 0 0 101 7]]
パディングで追加された値(0)は、後続のレイヤーで「マスク」処理され、モデルの計算には影響を与えないように扱われるのが一般的です。
まとめ
今回は、ディープラーニングにおける「パディング」について、画像認識(CNN)と自然言語処理(NLP)の2つの文脈から解説しました。
- CNNのパディング: 画像の端の情報を保護し、出力サイズを維持するために、データの周囲に値を追加する。
- NLPのパディング: 長さが異なる文章データを固定長に揃え、バッチ処理を可能にするために、短いシーケンスに値を追加する。
パディングは、一見地味な処理に見えるかもしれませんが、モデルの性能を最大限に引き出し、安定した学習を実現するために不可欠な技術です。 この記事が、あなたのディープラーニング学習の一助となれば幸いです。