【问题标题】:Can somebody please explain the backpropagation algorithm to me?有人可以向我解释反向传播算法吗?
【发布时间】:2012-10-17 06:01:32
【问题描述】:

我最近在 Coursera 上完成了 Ng 教授的机器学习课程,虽然我喜欢整个课程,但我从来没有真正理解过用于训练神经网络的反向传播算法。

我理解它的问题是,他只为全连接的前馈网络教授它的矢量化实现。我的线性代数生疏了,如果有人能教我通用算法,我认为会更容易理解。也许以面向节点的方式。

我会尝试简单地表述问题,但我可能误解了反向传播的工作原理,所以如果这没有意义,请忽略它:

对于任何给定的节点 N,给定输入权重/值、输出权重/值以及 N 输出到的所有节点的误差/成本,我如何计算 N 的“成本”并使用它来更新输入权重?

【问题讨论】:

  • 这是一个相当广泛的问题。在dsp.stackexchange.com,你可能会有更好的运气。
  • 你可以在galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html找到一个很好的解释,有图片,@
  • 这是一个很好的解释,马克!我不太确定我是否理解差异位。 df(e)/de 是指相对于整个加权和 (e) 的导数,还是仅表示我们要更新的权重的连接输入?假设节点具有线性激活函数,df(e)/de 是否总是等于 1 (f(e) = e --> df(e)/de = 1)?或者它是否总是等于我们正在更新的权重 (f(e) = w1x1 + w2x2 --> df(e)/dx1 = w1)
  • 嘿@J.Ashworth,我现在正在上这门课。可以回答下面的问题吗? - 为什么最后一层的目标函数的导数是观察值和预测值之间的差异?假设我们正在使用 sigmoid 函数来获取输入并将其转换为非线性值......
  • 我的意思是我查看了逻辑回归的目标函数的导数,并且我知道导数等于(预测之间的差异)*x_varaiable...所以为什么在神经网络的情况下我们摆脱x_variable 并仅保留(预测之间的差异)部分?

标签: algorithm neural-network backpropagation


【解决方案1】:

让我们考虑一个反向传播 (BP) 网络中的节点。它有多个输入,并产生一个输出值。我们希望在训练中使用纠错,因此它还会根据节点的错误估计更新权重。

每个节点都有一个偏差值,θ。您可以将其视为对内部恒定 1.0 值输入的权重。

激活是加权输入和偏差值的总和。让我们将我们感兴趣的节点称为 j,前一层的节点的值为 i,而后一层的节点的值为 k。那么我们的节点 j 的激活是:

netj = ∑i (oi × wij) + θj

也就是说,j 的激活值是节点 i 的输出与连接节点 i 和 j 的相应权重的乘积之和,再加上偏差值。

我们节点 j 的输出是激活的传递函数:

oj = f(netj)

f 通常是 sigmoid 函数。

f(netj) = 1 / (1 + e-netj)

sigmoid 函数有一个易于指定的一阶导数:

f'(netj) = f(netj) × (1.0 - f(netj))

无论我们使用什么传递函数,我们都需要知道如何计算它的一阶导数。 BP 通过链式法则通过梯度下降工作,所以这很重要。上面的等式会随着传递函数的不同而不同。

到目前为止,我们知道如何获取输入值、计算激活、计算输出以及计算激活的一阶导数。现在我们需要处理错误和权重调整。

在 BP 中用于节点误差估计的值称为 δ。节点的 δ 与节点激活的一阶导数和它接收的误差项成正比。接收到的误差项有两种公式,一种用于输出节点,一种用于隐藏节点。

一般来说,

δ = f'(net) × (收到的误差)

对于输出节点,

δ输出 = f'(net) × (t - o)

其中 t 是该输出节点的期望值,o 是该输出节点的实际输出值。

对于我们的隐藏节点j,是这样的:

δj = f'(netj) × ∑k (δk × wjk)

我们的节点 j 的 δ,δj,是给定激活的传递函数的一阶导数乘以下一层(更接近输出)中的 delta 之和的乘积每个都有连接权重的值。有了这个,我们可以计算如何调整前一层节点(更接近输入)的权重。

dwij = L × oi × δj

dw 这里表示“权重的变化”,所以方程的意思是,从节点 i 到我们的节点 j 的权重变化等于学习参数 L 的乘积(通常所有节点的值都相同)网络)、节点 i 的输出值和节点 j 的 δ(误差项)。

调整偏差值类似于调整权重。

dθj = L × f(θj) × δj

dθ 这里表示“θ 的变化”。我们必须将传递函数应用于偏置值 θj 以获得类似于节点输出的术语。否则,它看起来就像另一个等式。

我应该注意,计算权重变化应该在网络范围内完成,然后在计算完所有这些变化后应用这些变化。

【讨论】:

  • 能否解释为什么最后一层目标函数的导数是观测值和预测值之间的差异?假设我们正在使用 sigmoid 函数来获取输入并将其转换为非线性值......
  • 我的意思是我查看了逻辑回归的目标函数的导数,并且我理解导数等于(预测之间的差异)*x_varaiable...所以为什么在神经网络的情况下我们摆脱x_variable 并仅保留(预测之间的差异)部分?
  • @user2543622,目标函数的导数其实就是这个目标函数的梯度,就是MSE(常用的目标函数)的导数向量。
  • 我已经尝试找出反向传播 3 天了!我查看了数十个示例和教程,虽然它们允许我复制/粘贴并使其工作,但我无法找到关于 如何 和 为什么 i> 它起作用了(我想了解它,而不仅仅是使用它)。这个答案是我发现的绝对最好的解释,一步一步分解成简单的英语。这个答案需要更多的支持,所以更容易找到!
【解决方案2】:

对于任何给定的节点 N,给定输入权重/值,输出 权重/值,以及 N 输出到的所有节点的误差/成本, 如何计算 N 的“成本”并使用它来更新输入 重量?

您永远不会真正对单个神经元的中间成本函数感兴趣。相反,您对最终产出的成本感兴趣;总是。然后用它来将后面层中的神经元所需的变化率一直传播到前面。

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 2017-01-17
    • 2011-03-10
    • 2023-03-25
    • 2021-02-18
    • 2012-04-09
    • 1970-01-01
    • 2023-02-08
    • 2011-01-08
    相关资源
    最近更新 更多