为什么使用反向传播来寻找损失梯度?

数据挖掘 机器学习 深度学习 损失函数 梯度下降 反向传播
2022-03-06 03:19:34

我对机器学习的世界还比较陌生。在大致了解了这个概念后,我尝试创建一个从头开始训练深度学习网络的程序。我的目标是尽可能少地使用外部资源/帮助,并自己弄清楚每一步和问题。现在我已经完成了,我正在比较我的方法和那些知道自己在做什么的人创建的解决方案之间的差异。我看到的这些差异之一是反向传播算法,我正在尝试理解它(但有点挣扎)。

在研究该算法时,大多数网站将其描述为一种计算网络损失梯度的方法。但是,我用于计算损失梯度的方法涉及的数学和复杂性要少得多——我并不完全理解——而且似乎完成了同样的事情:

Loss(w0,w1,w2,...,b0,b1,b2,...)

Loss(...)=[Loss(...)w0,Loss(...)w1,...]

要计算出这个损失函数的梯度,你可以调整损失函数中的每个参数并找出损失的变化量。除以你改变它的程度,你可以得到当前网络状态下损失梯度的近似值。这是我在代码中的意思的粗略概述:

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

我的问题是,与我使用的这种简单方法相比,反向传播有什么优势?我正在努力完全理解算法,似乎没有资源可以解释算法为什么以及如何更有效。

任何见解将不胜感激。

1个回答

如果你知道f(x)=wx+b, 那么你也知道fb=1. 该函数LossGradient不使用该信息,并将通过评估该函数来估计它f. 然后它计算损失。一般来说,它计算fLoss每个可学习参数一次。

反向传播使用有关正在优化的功能的知识以提高效率。这意味着首先评估f 一次,然后评估Loss 一次,然后更新所有参数。当您有少量参数时,这种效率可能对您来说并不重要,但是如果f有数亿,或数千亿的参数。

并不是说像您这样的方法永远不会有用(请参阅无导数优化),只是如果您有额外的信息,使用它会有所帮助。