p_1_1_forward_propagation_after(質問管理番号)

回答日時: 2019/02/14
Q: 入力値と重みの内積の質問になります。

■順伝播(単層・複数ユニット)では、
下記のように、x×Wになっており、
計算でエラーは発生しておりません。

# 入力値
x = np.array([1.0, 5.0, 2.0, -1.0])

# 重み
W = np.array([
[0.1, 0.2, 0.3],
[0.2, 0.3, 0.4],
[0.3, 0.4, 0.5],
[0.4, 0.5, 0.6]
])

# 総入力
u = np.dot(x, W) + b

■順伝播(単層・複数ユニット)のafter
では、下記のようにW×xになっております。

# 重み
W = np.array([
[0.1, 0.2, 0.3, 0],
[0.2, 0.3, 0.4, 0.5],
[0.3, 0.4, 0.5, 1],
])

# 入力値
x = np.array(
[1.0, 5.0, 2.0, -1.0]
)

# 総入力
u = np.dot(W, x) + b

重みが3×4なのでxとWを逆にしたということだと理解できます。

ただ、
# 入力値
x = np.array(
[1.0, 5.0, 2.0, -1.0]
)
を何行何列と考えれば良いのかわかっておりません。ベクトルなので、1×4にもなるし、4×1にもなるということでしょうか。

shape: (4,)
はどのように考えればよろしいでしょうか。

A: shape: (4,)は1次元ベクトルですが、numpyの仕様上、1×4とも4×1とも異なります(イメージはベクトルでいいと思いますが)。
どちらかというとnumpy.dotの仕様についてですが、これは1つ目の配列のshapeの最後の次元と、2つ目の引数のshapeの最初の次元とで行列積(テンソル積、内積)を計算します。ただし、「1つ目の配列のshapeの最後の次元=2つ目の引数のshapeの最初の次元」でないといけない。例えば、shape:(3, 4)のnumpy配列なら最初の次元は3で最後の次元は4です。shape:(4,)なら最初の次元も最後の次元も4です。このことを考えると、コードに矛盾はありません。

 

回答日時: 2019/02/14
Q: 1_1_forward_propagation_afterでは、
入力値のshapeは全てshape: (2,)という形です。1_2_back_propagationでは、
入力値のshapeはshape: (1, 3)という形に
なっております。

どのような理由でコードに違いがあるか

A: 1_1_forward_propagation_afterでは、順伝播について簡単に理解することを目的に、そのように簡略化しています。一般的にはミニバッチを考慮した形、つまり1_2_back_propagationのようにshape: (1, 3)のような形が普通です(1の部分をN>1にしても動作するため)。