畳み込みの誤った理解してない???
はじめに
畳み込み操作は機械学習のあらゆる場面で使われています。最初以下の動画を参考に勉強しましたが、Depth-wise Seaparable Convolution(深さ方向分離畳み込み)を学習する際に、機械学習で使われる畳み込みとはだいぶ違うことがわかったので、間違いを指摘しつつ解説していこうと思います。
一般的な畳み込み
ほとんどの記事では、畳み込み操作は2次元の画像データと、2次元の畳み込みフィルタを用いて説明されます。
たとえば、以下の例で考えてみましょう。
図のように、左上から順番に入力データと畳み込みフィルタを重ね合わせ、成分ごとの積を取り、各成分の値を足す操作をします。
畳み込みの説明としてこれは正しいですが、機械学習で扱う際にはデータの形状が異なります。
機械学習で使う畳み込み
先ほどの画像は2次元のデータでの畳み込みでした。ですが機械学習のほとんどの場合では3次元データでの畳み込みを行います。例えば、 カラー画像の場合、[幅・高さ・チャンネル(RGB)] の3チャンネルのデータになります。
以下の図のような場合を考えてみます。
2次元の場合とは、違い3次元の入力データを3次元の畳み込みフィルターで畳み込みます。成分ごとに積を取り、成分の和を取ります。最終的には畳み込み結果として、2次元のデータが得られます。この計算を畳み込みフィルタの数分行うので、最終的な畳み込み結果の形式は [幅、高さ、チャンネル(畳み込みフィルタ数)] となります。
一般的な畳み込みと機械学習で使う畳み込みの違い
一般的な畳み込み | 機械学習で使う畳み込み | |
---|---|---|
入力 | 2次元 | 3次元(幅、高さ、チャンネル数(RGB)) |
フィルタ | 2次元 | 3次元(幅、高さ、チャンネル数) |
出力 | 2次元 | 3次元(幅、高さ、チャンネル数(フィルタ数)) |
Depth-wise Separable Convolution(深さ方向分離畳み込み)
Depth-wise Separable Convolution(深さ方向分離畳み込み)は、3次元データに対する畳み込みの計算速度とパラメータ数を改善した手法になります。
- 通常の3次元データに対する畳み込みは、フィルターが空間的特徴の抽出とチャネル次元への統合を同時に行うように設計されているので、フィルタのパラメータ数と計算量が多くなります。
- Depth-wise separable Convolutionでは、Depth-wise ConvolutionとPoint-wise Convolutionの2つに操作に分割して処理します。
Depth-wise Convolution
入力データのチャンネル数分の畳み込みフィルタを用意します。入力データの各チャンネルに対して畳み込みを行います。下記の動画から分かるように、2次元の畳み込みを行っています。
Point-wise Convolution
Depth-wise Convolutionの出力を入力データとして受け取ります。Point-wise Convolutionでは、3次元の入力データを2次元に圧縮する処理を行います。この際のフィルタの形は(1x1x入力のチャンネル数)という形になっています。
まとめ
機械学習で使われる畳み込みは一般的に紹介される畳み込みとは違います。なぜなら、ほとんどの場合畳み込みネットワークでは3次元のデータを扱うので、2次元での畳み込みとは少し処理内容が異なるからです。
機械学習で使われる畳み込み操作は3次元のデータに対して3次元のフィルタを用いて畳み込みを行います。この操作は特徴抽出とチャンネルの統合を同時に行うため、フィルターが大きくなりやすく、また計算量が膨大になります。
Depth-wise Separable Convolutionでは、特徴抽出とチャンネルの統合をそれぞれDepth-wise ConvolutionとPoint-wise Convolutionに分割して処理するため、フィルタと計算量を効果的に小さくすることができます。
Discussion