深度学习(三)梯度下降和反向传播算法

本文内容:
1.什么是梯度下降方法?
2.反向传播算法(BP算法)

1.为什么要梯度优化

上一节介绍过,我们的第一个神经网络示例中,每个神经层都用下述方法对输入数据进行 变换。

output = relu(dot(W, input) + b)

在这个表达式中,W 和 b 都是张量,均为该层的属性。它们被称为该层的权重(weight)可训练参数(trainable parameter),分别对应 kernel 和 bias 属性。

这些权重包含网络从观察 训练数据中学到的信息。

一开始,这些权重矩阵取较小的随机值,这一步叫作随机初始化(random initialization)

当然,W 和 b 都是随机的,relu(dot(W, input) + b) 肯定不会得到任何有用的表示。

虽然得到的表示是没有意义的,但这是一个起点。下一步则是根据反馈信号逐渐调节这些权重。这个逐渐调节的过程叫作训练,也就是机器学习中的学习。

上述过程发生在一个训练循环(training loop)内,其具体过程如下。必要时一直重复这些步骤。

(1) 抽取训练样本x和对应目标y组成的数据批量。
(2) 在 x 上运行网络[这一步叫作前向传播(forward pass)],得到预测值 y_pred。
(3) 计算网络在这批数据上的损失,用于衡量y_pred和y之间的距离。
(4) 更新网络的所有权重,使网络在这批数据上的损失略微下降。

最终得到的网络在训练数据上的损失非常小,即预测值 y_pred 和预期目标 y 之间的距离非常小。网络“学会”将输入映射到正确的目标。乍一看可能像魔法一样,但如果你将其简化为基本步骤,那么会变得非常简单。

第一步看起来非常简单,只是输入 / 输出(I/O)的代码。第二步和第三步仅仅是一些张量运算的应用,所以你完全可以利用上一节学到的知识来实现这两步。
难点在于第四步:更新网络的权重,也就是著名的BP误差逆传播算法。

考虑网络中某个权重系数,你怎么知道这个系数应该增大还是减小,以及变化多少?
就像我们开车,上一秒车头往左偏了30度,接下来我们要计算下一秒方向盘向右打多少度才能板正车头?

一种简单的解决方案是,保持网络中其他权重不变,只考虑某个标量系数,让其尝试不同 的取值。假设这个系数的初始值为 0.3。对一批数据做完前向传播后,网络在这批数据上的损失 是 0.5。如果你将这个系数的值改为 0.35 并重新运行前向传播,损失会增大到 0.6。但如果你将 这个系数减小到 0.25,损失会减小到 0.4。在这个例子中,将这个系数减小 0.05 似乎有助于使
损失最小化。对于网络中的所有系数都要重复这一过程。

但这种方法是非常低效的,因为对每个系数(系数很多,通常有上千个,有时甚至多达上百万个)都需要计算两次前向传播(计算代价很大)。一种更好的方法是利用网络中所有运算都是可微(differentiable)的这一事实,计算损失相对于网络系数的梯度(gradient),然后向梯度的反方向改变系数,从而使损失降低。

2.导数derivative 和梯度 gradient

导数

导数这个概念我们都不陌生,在微积分里学过,下面我们简单回忆一下导数的概念。

假设有一个连续的光滑函数 f(x) = y,将实数 x 映射为另一个实数 y。由于函数是连续的, x 的微小变化只能导致 y 的微小变化——这就是函数连续性的直观解释。假设 x 增大了一个很小的因子epsilon_x,这导致 y 也发生了很小的变化,即 epsilon_y:

f(x + epsilon_x) = y + epsilon_y

此外,由于函数是光滑的(即函数曲线没有突变的角度),在某个点 p 附近,如果 epsilon_x 足够小,就可以将 f近似为斜率为 a 的线性函数,这样epsilon_y 就变成了

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值