我正在尝试实现我自己的神经网络,但我不是很有信心我的数学是正确的。
我正在做MNIST数字识别,所以我有10个概率的软最大输出。作为输出。然后,我计算我的增量输出如下:
delta_output = vector of outputs - one-hot encoded actual labeldelta_output是一个维数为10 x 1的矩阵。
然后我计算最后一个隐藏层的权重的增量,如下所示:
delta_hidden = weight_hidden.transpose * delta_output * der_hidden_activation(output_hidden)假设在最后的隐藏层中有N个节点,weight_hidden是N×10的维数的矩阵,上面的delta_output是10x1,der_hidden_activation(output_hidden)的结果是N x 1。
现在,我的第一个问题是,delta_output和der_hidden_activation(output_hidden)的乘法是否应该使用外积返回10xN矩阵?我认为我需要对得到的矩阵做一个哈达玛乘积,得到delta_hidden仍然是N x 10。
最后,我将这个delta_hidden乘以我的学习率,并从最后一个隐藏层的原始权重中减去它,得到新的权重。
我的第二个也是最后一个问题是,我错过了什么吗?
提前谢谢。
发布于 2020-04-10 09:00:34
假设在最后的隐藏层中有N个节点,weight_hidden是N×10的维数的矩阵,从上面开始的delta_output是10x1,并且der_hidden_activation(output_hidden)的结果是N x 1。
当从N个神经元的层(隐藏层)到M个神经元的层(输出层)时,在matrix multiplication下,权重矩阵的维数应该是M x N。因此,对于反向传播阶段,从M个神经元的层(输出)到N个神经元的层(隐藏层),使用权重矩阵的transpose,它将给出一个维数为(N X M)的矩阵。
现在,我的第一个问题是,delta_output和der_hidden_activation(output_hidden)的乘法应该返回一个使用外积的10 x N矩阵吗?我认为我需要对得到的矩阵做一个哈达玛乘积,得到delta_hidden仍然是N x 10。
是的,您需要使用hadamard product,但是您不能将delta_output和der_hidden_activation(output_hidden)相乘,因为它们是不同维数的矩阵(分别为10 x 1和N x 1)。相反,您将hidden_weight矩阵(N X 10)的转置乘以delta_output (10 X 1),得到N x 1的矩阵,然后使用der_hidden_activation(output_hidden)执行hadamard乘积。
如果我没弄错的话...
hidden_weight矩阵=

delta_output =
delta_hidden =

der_hidden_activation(output_hidden) =

将这个插入BP公式中。

正如您所看到的,您需要首先将weight_hidden (N X 10)的转置乘以delta_output (10 X 1),以产生一个矩阵(N X 1),然后将hadamard乘积与der_hidden_activation(output_hidden)一起使用。
最后,我将这个delta_hidden乘以我的学习率,并从最后一个隐藏层的原始权重中减去它,得到新的权重。
你不能将delta_hidden乘以学习率。你需要在偏差和增量权重矩阵上使用学习率...
增量权重矩阵是一个与您的(隐藏)权重矩阵具有相同维度的矩阵,并使用公式...

然后你可以很容易地应用学习率。

https://stackoverflow.com/questions/61130368
复制相似问题