読者です 読者をやめる 読者になる 読者になる

ディープラーニング学習メモ #2 行列の積

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列の畳み込み

f:id:sanshonoki:20170301050110p:plain:w400

elementwise演算 (*演算)

elementwise演算は 単純に要素同士を掛け算するだけです。

  • 積ABの要素ij は Aの要素ijとBの要素ijの掛け算
  • 厳密には A、Bの行数と列数が同じでないと掛け算できない
  • ただし、numpyにはブロードキャストという仕組みがあるので列数と行数が一致していなくても演算可能(な場合がある)

f:id:sanshonoki:20170301050124p:plain:w400

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: シグモイドの微分  \sigma'(h) = \sigma(h) * (1 - \sigma(h))
例2: 入力誤差の伝搬  (\delta W^{T}) * \sigma'(h)
例1: 順伝搬  {Wx}
例2: 入力誤差の計算  \delta W^{T}
例3: 誤差から {\Delta W}を計算  \delta x^{T}

入力の次元数と出力の次元数が同じときは *演算 と考えていいです。

dot演算の例3では 入力が1次元のベクトルの場合に、*演算としても計算可能ですが2次元以上の場合に計算できないので dot演算として考えるのが無難でしょう。