G検定(ジェネラリスト検定)
たたみこみそうさ
畳み込み操作
Convolution Operation
畳み込み操作とは、カーネルと呼ばれる小さな重みの並びを入力の上で位置をずらしながら当てはめ、入力の値とカーネルの値を掛け合わせて足し合わせる演算です。数学上の畳み込みはカーネルを前後反転して重ねますが、多くの機械学習ライブラリはカーネルを反転しない相互相関を実装し、それを畳み込みと呼んでいます。
詳しい説明
畳み込み操作とは何か
畳み込み操作とは、カーネル(kernel)と呼ばれる小さな重みの並びを入力の上で位置をずらしながら当てはめ、入力の値とカーネルの値を掛け合わせて足し合わせる演算です。出力の位置1つにつき「入力の値とカーネルの値の積の和」を1つ計算し、その値を位置の順に並べたものが出力になります。
この語が指すのは演算そのものです。この演算を使って入力から特徴マップを作る層は畳み込み層と呼ばれ、層としての性質(パラメータの数や全結合層との違い)は畳み込み層の項目で扱います。
このページの式と用語は、イアン・グッドフェロー(Ian Goodfellow)、ヨシュア・ベンジオ(Yoshua Bengio)、アーロン・カービル(Aaron Courville)による教科書「Deep Learning」(2016年)の第9章に沿っています。
1次元の離散畳み込みの式
入力が1次元の並びのとき、離散的な畳み込みは次の式で表されます。
は入力、 はカーネル、 は出力です。 は畳み込みを表す記号で、掛け算の記号ではありません。 は出力を求める位置、 は入力の位置を表し、和は のとりうる値すべてについて取ります。
式の中で、カーネルの位置が になっている点に注目してください。出力の位置 を決めたとき、入力の位置 が1つ大きくなると、組になるカーネルの位置 は1つ小さくなります。つまりカーネルは、前後を反転した向きで入力に重ねられます。この反転が、数学上の畳み込みの特徴です。
カーネルは少数の位置にだけ値を持ち、それ以外の位置の値は0とみなします。そのため、1つの出力 の計算に関わる入力は、位置 の近くにある少数の値だけです。画像のような2次元の入力でも考え方は同じで、カーネルも縦横に並んだ重みになり、縦と横の2方向について積の和を取ります。
数値を使った計算例
以下の数値は説明のために作った架空の例です。入力を 、、、、 の5個とし、カーネルを 、、 の3個とします。 はこの3つの位置以外では0です。
カーネルが0でない項だけを残すと、式は次のようになります。
計算に必要な入力の3つの値がすべてそろう位置は、 の3か所です。
出力は2、1、10の並びになります。 の計算を項ごとに見ると、入力の にはカーネルの が、 には が、 には が掛けられています。入力の並びで右にある値ほど、カーネルの並びでは左にある値と組になっており、カーネルが反転して重なっていることが数値でも確かめられます。
出力の大きさは、大きな重みが掛かる位置の入力が大きいかどうかで決まります。この例では重み2が掛かる入力 が4と大きいので、 が10と大きくなりました。反対に、重み が掛かる位置の入力が大きいと、出力は小さくなります。
入力が5個、カーネルが3個のとき、入力の端からはみ出さずに計算できる出力は 個です。
実装で使われる相互相関との関係
カーネルを反転せず、そのままの向きで入力に重ねる演算は、相互相関(cross-correlation)と呼ばれます。1次元の式で書くと次のとおりです。
「Deep Learning」第9章は、多くの機械学習ライブラリが実際に実装しているのはこの相互相関であり、それを畳み込みと呼んでいると述べています。同書自身もこの呼び方の慣例に従い、カーネルを反転するかどうかが問題になる文脈でだけ両者を区別しています。つまり実装上は、カーネルを反転しない相互相関が使われることが多いということです。
先ほどと同じ入力とカーネルで相互相関を計算すると、式は となり、次の値が得られます。
出力は5、4、 の並びになり、畳み込みの結果である2、1、10とは異なります。一方、カーネルの並びを前後反転した 、1、2を使って相互相関を計算すると、、、 となり、畳み込みの結果と一致します。2つの演算の違いは、カーネルを反転して重ねるかどうかだけです。
畳み込み層・ストライド・パディングとの関係
畳み込み層は、この演算を使って入力から特徴マップを作る層です。畳み込み層の項目で説明しているとおり、畳み込み層ではカーネルの値を学習によって求めます。
ストライドは、畳み込みの出力から 個ごとに1つを取り出す間引きの幅です。同書は、畳み込みの出力から 個ごとに1つを取り出して間引く操作を示し、この間引きの幅 をストライドと呼んでいます。上の計算例の出力2、1、10をストライド2で間引くと、2個ごとに1つを取り出した2と10の2個が残ります(1つ飛ばしで残ることになります)。
パディングは、入力の端の外側に値を補う処理で、0を補うものをゼロパディングと呼びます。同書によると、ゼロパディングを使わない場合、入力の幅を 、カーネルの幅を とすると出力の幅は になり、層を重ねるたびに出力が縮みます。上の計算例で出力が3個になったのは、この場合にあたります。ゼロパディングを使うと、カーネルの幅と出力の大きさを別々に決められます。
誤解しやすい点
手で計算するときは、カーネルを反転するかどうかで結果が変わります。上の例では、同じ入力とカーネルから畳み込みでは2、1、10が、相互相関では5、4、 が得られました。ライブラリの関数名や教材の説明が「畳み込み」であっても、実装上は反転しない相互相関が使われていることが多いので、どちらの定義で計算しているかを先に確かめます。
「畳み込み」という名前から、入力を折りたたんで小さくする処理と考えないようにします。演算の中身は、位置ごとの積の和です。出力が入力より小さくなるのは、パディングを使わずに端からはみ出さない位置だけを計算する場合や、ストライドで間引く場合です。
試験で問われること
G検定
- 畳み込み操作は、カーネルを入力の上で位置をずらしながら当てはめ、入力の値とカーネルの値の積の和を位置ごとに計算する演算です。1次元の離散畳み込みは s(t) = Σ x(a) w(t-a) と表されます。
- 数学上の畳み込みはカーネルを前後反転して入力に重ねます。実装上は、カーネルを反転しない相互相関が使われることが多く、それも畳み込みと呼ばれています。
- パディングを使わない場合、出力の幅は、入力の幅からカーネルの幅を引いて1を足した値になります。入力5個・カーネル3個なら出力は3個です。
- 畳み込み操作は演算そのものを指し、畳み込み層はこの演算を使って特徴マップを作る層を指します。ストライドは出力を何個ごとに1つ取り出すかの幅、パディングは入力の端の外側に値を補う処理です。
最終更新日: 2026/09/23