グループ化畳み込みのアイデアがすごい

皆さんこんにちは、私の名前はドン・ドンカンです。

最近、グループ化畳み込みが私に大きな恩恵をもたらしました。これが問題です。

ここ数日で私が直面した頭痛の種は、特定のチップ上でニューラル ネットワークの適応を完了することです。このニューラル ネットワークには主に畳み込みが含まれており、一部の畳み込みには 2048 入力チャネルなど、多数のチャネルが含まれています。

問題は、このチップが専用チップであり、対応するハードウェア モジュールがこのような多数のチャネルによる畳み込み演算を直接サポートできないことです。

そこで私たちはブレインストーミングを開始しました。チップには内積演算をサポートする優れたベクトル命令セットが搭載されているため、最初の反応は内積演算を使用して畳み込みを結合することでした。

ただし、実験結果によると、内積命令を使用した場合の畳み込み効果は満足のいくものではありません。これは主に内積命令の呼び出し回数が多すぎて、ニューラル ネットワークの全体的なパフォーマンスが低下するためです。

途方に暮れていると、「写真を変えましょう」という声が聞こえてきた。

グラフの変更とは、ニューラル ネットワークの構造を変更することを指し、 pytorch、tvm などの多くの推論フレームワークにこの機能があります。

これらの推論フレームワークは、特定の専用 AI チップ アクセラレータに適応するようにターゲットにすることができ、そのために、一部のニューラル ネットワーク構造が変更され、いくつかの最適化ノード (パス) が追加されて、元々サポートされていない操作がサポートされる操作になります。

たとえば、この畳み込みの例では、大きな畳み込み (多数のチャネルを参照) を 2 つ以上の小さな畳み込みに変換して個別に計算し、計算が完了した後に結果を結合できます。

これは、畳み込みをチャネル次元で複数の畳み込み計算に分割する操作、つまりグループ畳み込み (Group Convolution) について説明します。

1. グループ化畳み込みとは何ですか?

グループ化畳み込みに関する情報はインターネット上にたくさんあります。簡単に言うと、グループ化畳み込みは、大きな畳み込みを複数の小さな畳み込みに統合するという目的を達成するために、チャネル次元で畳み込みをグループ化することによって計算されます。

わかりやすくするために、以下に示すように、畳み込み演算をチャネル次元に 2 つのデータのみを使用した最も単純な積和演算に簡略化します。

写真

通常の畳み込み演算では、A と B の乗算と累算で、1x3 + 2x4 = 11 が計算されます。

そして、それらをチャネル ディメンションでグループ化すると (この例では、チャネル ディメンションには 2 つのデータしかないため、2 つのグループに分割します)、次のようになります。

写真

最初のグループはチャネル次元の前半のみを計算し、2 番目のグループはチャネル次元の後半のみを計算します。

グループ化のプロセスを理解するのは簡単ではありません。

2. なぜグループ畳み込みが必要なのでしょうか?

グループ化畳み込みは、2012 年の ImageNet 画像分類コンペティションで Alex らによって初めて提案され、使用されました。当初の目的は、畳み込みニューラル ネットワークのトレーニング中のコンピューティングとメモリのオーバーヘッドの問題を解決することでした。

2012 年の GPU メモリは現在の GPU メモリほど大きくありませんでした。当時の GPU メモリはまだ非常に限られており、多数のチャネルで畳み込みを直接計算すると、ネットワーク全体に配置するとメモリを大量に消費します。

したがって、大きな畳み込みをチャネル方向に複数の小さな畳み込みに分割し、個別に計算することで、分割された小さな畳み込みをそれぞれ複数の GPU カードで実行できるようになり、1 つのモデルに対して複数のカードでの並列計算を実現できます。パフォーマンス。

この論文のグループ化された畳み込みは、入力チャネルをグループ化するだけでなく、出力チャネルもグループ化することに注意してください。

結果として得られるグループ化畳み込みは、元の計算量の 1/G になります (G はグループ数)。

3. グループ化された畳み込みと元の畳み込みは数学的に同等ですか?

慎重な友人はこの質問をするかもしれません。

グループ化された畳み込みについてのみ話す場合、チャネルの次元が分割されているため、結果は元の大規模な畳み込みと明らかに同等ではありません。

また、処理されないと最終的な推論精度にも影響しますが、この問題には良い解決策があります。

畳み込みアルゴリズムの中核は特徴抽出と融合であることはわかっています。畳み込み特徴抽出とは何なのかを理解するには 5 分です

他の操作が実行されない場合、グループ畳み込みはグループ内の小さな畳み込みの特徴融合のみを実行しますが、グループ間の特徴融合は行われないため、最終的なトレーニング推論結果に影響を与えます。

この問題を解決するために、グループ畳み込みの前にチャネル次元でシャッフル操作、つまりシャッフルが実行されることがよくあります。これにより、特徴を各グループにランダムに割り当てることができ、グループ間の特徴融合をより適切に完了できます。

4.「グループコンボリューション」の発想がすごい

上で遭遇した問題に戻ると、グループ化畳み込みのアイデアを使用して、必要に応じて大規模な畳み込み演算を魔法のように変更する必要があります。

次の図に示すように、入力チャネル ci の畳み込みは、入力チャネル次元で ci/2 の 2 つの畳み込みに分割され、畳み込み演算用に「グループ化」され、加算によって追加されます。

写真

解決する問題が異なるため、出力チャネルはここではグループ化されていません。メモリは問題ではありません。問題は、入力チャネルが大きすぎることだけです。

上記の魔法の変換により、最終的な結果を元の畳み込み計算と一致させることができ、「グループ化畳み込み」のアイデアを借用することで、私が遭遇した問題を非常にうまく解決できます。

おすすめ

転載: blog.csdn.net/dongtuoc/article/details/134085473