UdacityのDeepLearning基礎コース、Week3以降は週5-6時間程度でレッスンコンテンツは一通りはこなせています。 ただ、後でしっかり復習しないと身につかない感じはあります。。 そりゃそうですよね、、世の中そんなに甘くない。(;^_^A
今日は行列の積についてメモを残します。
dot演算とelementwise演算
dot演算
学校の授業で習ったいわゆる行列の掛け算はdot演算と呼ばれるものになります。
- 行列A (m,n) * 行列B (n, p) = 行列C (m, p)
- Aの列数とBの行数を合わせる必要がある
- 積ABの要素ij は Aのi行とBのj列の畳み込み
elementwise演算 (*演算)
elementwise演算は 単純に要素同士を掛け算するだけです。
- 積ABの要素ij は Aの要素ijとBの要素ijの掛け算
- 厳密には A、Bの行数と列数が同じでないと掛け算できない
- ただし、numpyにはブロードキャストという仕組みがあるので列数と行数が一致していなくても演算可能(な場合がある)
numpyにはブロードキャストという仕組みがあるので列数と行数が一致していなくても演算可能になっています。ここが混乱しどころです。これは numpyが演算するときにサイズを変換してくれるためです。
ブロードキャスト
ブロードキャストできるかどうか? Broadcasting — NumPy v1.12 Manual
- ベクトル (n,) は行ベクトル (1,n) として扱う
- 各軸の次元が同じまたはどちらかが1
*演算 | dot演算 | |
---|---|---|
(m, 1) x (1, n) | ok | ok |
(m, 1) x (n, 1) | NG | NG |
(m, 1) x (n,) | ok | NG |
(n,) x (m, 1) | ok | NG |
okのパターンでは (m, n)の行列が出力されます。
使いどころ
ディープラーニングで出てくる計算の中で2種類の掛け算をどう使い分けるのか、、、
ざっくりまとめてみました。
*演算 | dot演算 |
---|---|
1つのノード内での計算 (シグモイドの微分計算etc) |
複数ノード間の計算 (重みWとベクトルとの計算) |
例1: シグモイドの微分 例2: 入力誤差の伝搬 |
例1: 順伝搬 例2: 入力誤差の計算 例3: 誤差からを計算 |
入力の次元数と出力の次元数が同じときは *演算 と考えていいです。
dot演算の例3では 入力が1次元のベクトルの場合に、*演算としても計算可能ですが2次元以上の場合に計算できないので dot演算として考えるのが無難でしょう。