我创建了一个神经网络,该神经网络具有一个包含3个节点的隐藏层,将S形函数用作激活函数
输入层(2个节点):
X | X是大小为(1x2)的矩阵
隐藏层(3个节点):
W1 =>的大小为(3x2)
Z1 = X.(W1.T)+ b
A1 =σ(Z)| (W1.T)是矩阵W的转置
输出层(4个节点):
W2 =>的大小为(4x3)
Z2 = A1。(W2.T)+ b
A2 =σ(Z)
E = 0.5 *(Y- A2)^ 2 | Y是大小为(1x4)的矩阵
我想应用链式规则来计算隐藏层的W如何影响E(成本函数)
dEdW1 = dEdA2 * dA2dZ2 * dZ2dA1 * dA1dZ1 * dZ1dW1
=(A2-Y)*(σ(Z2)*(1-σ(Z2)))* W2.T *(σ(Z1)*(1-σ(Z1)))* X
矩阵大小=>(1x4)*(1x4)*(3x4)*(1x3)*(1x2)
我知道我的导数存在问题,因为我无法将矩阵相乘(它们的大小不同),有人可以指出如何解决此问题
这是实现:
答案 0 :(得分:0)
您可能应该转置矩阵。
矩阵乘法的工作方式类似于“ AxB * BxC = AxC”,因此您将无法进行乘法(1x4)*(3x4)。尝试转置第二个,这样您将获得(1x4)*(4x3)乘法。
并对其余部分进行重新排序,因此它看起来应该像(4x1)(1x4)(4x3)(3x1)(1x2)
答案 1 :(得分:0)
切换体重矩阵。假设以下情况:例如,给定尺寸为4x2的输入矩阵X(也就是说,您有4个输入-也就是行-每个输入的维数为2个元素),例如:
[[0,0],[0,1],[1,0],[1,1]]
如果您的隐藏层有4个神经元,则w0权重矩阵的大小将变为2x4。您将拥有一个由4个元素组成的b0偏差矢量,并且在计算该层的激活率后,您将得到:
z1 = X @ w0 + b0 # 4x2 * 2x4 + 1x4 = 4x4
a1 = f(z1) # 4x4
然后说,在输出层中,您有2个元素,这些元素使w1矩阵的大小为4x2,b1向量的大小为2。
z2 = a1 @ w1 + b1 # 4x4 * 4x2 + 1x2 = 4x2
a2 = f(z) # 4x2
在反向传播期间,您为每个图层计算的增量为:
d_O = (Y - T) * f'(z2)
d_H = d_O @ W1.T * f'(z1)
其中Y是您的网络对尺寸的猜测:4x2
T是训练标签,因此必须匹配:4x2
乘法是逐元素乘法,这使您
d_O大小为4x2
计算隐藏层增量尺寸非常相似:
d_O:4x2
W1的大小为4x2,因此转置为2x4,@是您的d_H尺寸的标准矩阵乘法,结果为:
d_H大小为4x4
要更新体重,您可以:
dW1 := a1.T @ d_O
dW2 := X.T @ d_H
其中a1是4x4矩阵,d_O是4x2矩阵,这使dW1成为4x2矩阵。 W1的大小为4x2。
X是大小为4x2的输入矩阵,则X.T为2x4,而d_H为4x4,这使得dW0为2x4。您原来的W0是2x4。
Bias三角洲要简单得多
db1 = np.sum(d_O, axis=0)
db0 = np.sum(d_H, axis=0)