神经网络的实现中,由于用到反向传播,于是反向运算就成了很关键的一步。
由于普通计算机语言中运算是单向的,所以任何一个深度学习框架都要实现反向的运算过程,这无疑增加了实现的的复杂度。另外求导运算的每一个公式都要重新编写,无疑给开发人员造成了巨大的工作量。
鉴于神经网络更新过程中的梯度往往需要乘上一个参数以防止过耦合,于是梯度的运算可以采用较为粗糙的方法。
也就是将输入按照一定的规则加上一个小的数值,然后计算梯度,将输入数据的梯度与输出数据的梯度求商,就可以得到正确的梯度方向(正值或者负值)。
这样处理过后,只需要一点点小的技巧,就可以复用所有现有的数值、矩阵运算单向类库,而不需要从底层开始全盘代码重构了。
双向运算的实现是深度学习框架的关键,但用单向来模拟双向,也不失为一种办法。
data(){
value,
grad,
updateFactor
}
dataC.value=dataA.value*dataB.value+1
dataA.grad=((data.value+dataA.grad*dataA.updateFactor)*dataB+1-dataC.value)/dataA.grad
data.update()=data.value-data.grad*data.updateFactor