我想首先以具有 2 个输入节点、3 个隐藏节点和 2 个输出节点的普通神经网络为例。让输入和隐藏节点之间的权重为(2x3)和隐藏节点和输出(3x2)之间的权重是. 最后一层具有线性激活。误差梯度:
但这不满足权重更新方程,因为产品的大小为 2x1。但它应该是 2x3。
我想首先以具有 2 个输入节点、3 个隐藏节点和 2 个输出节点的普通神经网络为例。让输入和隐藏节点之间的权重为(2x3)和隐藏节点和输出(3x2)之间的权重是. 最后一层具有线性激活。误差梯度:
但这不满足权重更新方程,因为产品的大小为 2x1。但它应该是 2x3。
请务必注意,您将权重存储在列中的前一层。所以我的例子将专门针对这种情况。
如果您使用不同的符号(从神经元到前一层的权重在矩阵的行中) - 交换下面的“行”和“列”:
对于您的情况,任何传入梯度(来自上面的层或来自 Error aka Cost 函数)必须具有维度 2。它必须是向量。否则它不会在物理上“匹配”您的输出节点。
A节
您的权重(隐藏到输出层)的梯度将是一个 3x2 矩阵。你可以从你的权重中减去这个矩阵来纠正它们。不要忘记学习率。
要构建此矩阵,请将传入的梯度(维数为 2 的 vec,已通过激活函数)复制到新的空矩阵 (3x2) 的每一行中,然后将其每一列按组件乘以 3 的 fwdprop 输出-节点隐藏层。这是你的GradForWeights矩阵
B节
梯度 wrt 隐藏节点将是一个 3d 向量。
为此,请在Weights(3x2) 和传入梯度向量 (2d) 之间使用点积。结果向量的维数为 3,也可以用作下面层的“输入梯度向量”(当然,在您通过该子层的激活函数之后)。