1.深層学習における要素ごとの特徴の乗算と加算の違いは何ですか?
多くの深層学習モデルを設計する場合、分岐処理の後に要素ごとに中間の特徴を乗算または加算することがありますが、乗算と加算の微妙な違いがわからないのですか?
答え: 追加される 2 つのテンソルは、通常、固有の意味を持つテンソルです. 乗算される場合、一般的に言えば、テンソルの 1 つが固有の意味ではなく、重みに似た意味を持ちます.
二、concatenation operation
ベクトル間の連結
コード例は次のとおりです。
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a.shape)
b = np.array([[5, 6]])
print(b.shape)
np.concatenate((a, b))
c= np.concatenate((a, b))
print(c)
print(c.shape)
Out[1]: (2, 2)
Out[2]: (1, 2)
Out[3]:
array([[1, 2],
[3, 4],
[5, 6]])
Out[4]: (3, 2)
3.内積
ベクトル内積
import numpy as np
np1 = np.array([4, 6])
np2 = np.array([[-3], [7]])
print(np.dot(np1, np2)
## [30]
# 4*-3 + 6*7 = 42*12 = 30
四、要素ごとの積
要素ごとの積は、実際には同じ次元の 2 つのベクトル/行列に各要素を掛けたものです。
これは次の場所にあります: 私の他の記事
import numpy as np
np1 = np.array([4, 6])
np2 = np.array([-3, 7])
print(np2 * np1)
# [-12 42]
import numpy as np
np1 = np.array([4, 6])
print(np1 * 3)
# [12 18]
5. DL では、連結/要素ごとの乗算/要素ごとの加算をいつ使用しますか?
深層学習では、情報を融合する場合、連結を使用する場合、要素ごとの乗算を使用する場合、要素ごとの加算を使用する場合はいつですか?
答え:
ドット乗算は実際にはゲートの形をしており、パフォーマンスが低下する可能性があります。Concatenate は単純なスプライシングであり、ネットワークはそれ自体で変換することを学習する必要があります。
実際のプロセスでは、それは試されるだけかもしれません。
特徴マップの 6 つ、いくつかの接続形式
(1) 連結: チャネル マージ、各チャネルは対応する畳み込みに対応します。
(2) 要素ごとの加算 (計算量は (1) よりも小さい): 対応する特徴マップを加算し、畳み込みます。対応するチャネルの機能マップは同様のセマンティクスを持ち、対応する機能マップは畳み込みカーネルを共有します。
比較:
加算法:加算の特徴結合法は、画像の特徴を記述する情報量を増加させますが、画像自体を記述する次元は増加しませんが、各次元の情報量は増加します。最終的なイメージは有益です。
連結法:この方法は、チャンネル数の組み合わせ、つまり、画像自体を記述する特徴の数(チャンネル数)が増えていますが、各特徴の下の情報は増えていません。
明らかにconcatenateの計算量>addの計算量
別の方法: 要素ごとの max および要素ごとの平均メソッドもあります.
実験結果: max>avg>concate
7. まとめ
新しい機能は、追加操作によって取得されます. この新しい機能は、元の機能のいくつかの特性を反映することができます, しかし、元の機能のいくつかの情報は、追加方法のために失われます. 連結は、元の機能を直接スプライスし、ネットワークはフュージョン機能の方法を学習します。このプロセスで情報が失われることはありません。
concat による計算量は比較的大きいため、元のフィーチャ間の関係を add 操作で融合できれば、add 操作を使用すると計算コストを節約できます。
参考:
深層学習で --- 合併層、連結層、加算層の違い - プログラマー募集
Pytorch チュートリアル (15): 要素ごと、Broadcasting_vincent_duan のブログ - CSDN Blog_element-wise