我正在尝试在CUDA中实现前馈神经网络。 到目前为止,我已经使用Jeff Heaton's YouTube videos作为推断算法并实现它们的指南。 我不清楚一件事:
他的Gradient Calculation视频中的Heaton解释了如何获得输出神经元的节点deltaδ[i]。 然后我必须在我之前的(隐藏层)中将其重复为δ[k]才能计算δ[i]。
但是,没有提及当我有多个节点增量时,或者层 i 到层 k的多个传出权重时会发生什么。同样,我对如何计算特定重量的梯度感到困惑;使用节点增量或图层的增量?
例如,如果我的输出层有2个神经元,会发生什么?我是否对层 k 中所有节点的δ[k]求和?
Heaton提供的公式:
f'( Sum (weight[i] * input[i] ) ) * Σ w[ki] * δ[k]
似乎表明δ[k]代表前一层(而不仅仅是输出节点),如视频@ 9:25'所示。
事实上,YouTube视频中的两条评论也提出了同样的问题,但没有给出满意的答复。
据我所知,δ[k]表示 i 连接到的上一层/下一层 k 的错误,而不是 i 层中当前节点连接到哪个节点?
编辑
我在线阅读了一些论文和教程/课程,但似乎在某种程度上回答了我的问题,可以是found here。 具体来说,博客作者使用的公式与Heaton使用的公式相同,但他解释说:
HLN = Hidden Layer Neuron,
LLN = Last Layer Neuron,
aO=actualOUTPUT,
dE=deltaError
HLN.dE = (HLN.aO) x (1-HLN.aO) x (Sum of [LLN.dE x LLN to HLN connection weight])
这似乎暗示公式实际上是:
Si = Σ (w[ji] * a[j])
δ[i] = f'( Si ) * Σ( w[ki] * δ[k] )
用语言说:
先前激活输出的总和乘以其边缘 (权重),是通过S形导数。
然后,对于每个外出的重量 w [ki] 乘以相应的 δ[k] (例如, w [ki] * δ[κ] )。将这些值相加,并乘以S形导数的结果。
如果发生这种情况,我仍然希望听到已实施前馈神经网络的人的发言。