我对机器学习的世界还比较陌生。在大致了解了这个概念后,我尝试创建一个从头开始训练深度学习网络的程序。我的目标是尽可能少地使用外部资源/帮助,并自己弄清楚每一步和问题。现在我已经完成了,我正在比较我的方法和那些知道自己在做什么的人创建的解决方案之间的差异。我看到的这些差异之一是反向传播算法,我正在尝试理解它(但有点挣扎)。
在研究该算法时,大多数网站将其描述为一种计算网络损失梯度的方法。但是,我用于计算损失梯度的方法涉及的数学和复杂性要少得多——我并不完全理解——而且似乎完成了同样的事情:
要计算出这个损失函数的梯度,你可以调整损失函数中的每个参数并找出损失的变化量。除以你改变它的程度,你可以得到当前网络状态下损失梯度的近似值。这是我在代码中的意思的粗略概述:
function LossGradient():
current_loss = CalculateLoss()
gradient_vector = []
i = 0
delta = 0.00001 # some really small value
for weight in network:
weight += delta # tweak weight by delta ( a tiny amount )
new_loss = CalculateLoss() # calculate the loss after tweaking
gradient_vector[i] = (new_loss - old_loss) / delta # store ∂Loss/∂W_i in gradient vector
i += 1
# do the same for biases
return gradient_vector
我的问题是,与我使用的这种简单方法相比,反向传播有什么优势?我正在努力完全理解算法,似乎没有资源可以解释算法为什么以及如何更有效。
任何见解将不胜感激。