首先我们看一个代价函数:
这⾥ w 表⽰所有的⽹络中权重的集合,b 是所有的偏置,n 是训练输⼊数据的个数,a 是表⽰当输⼊为 x 时输出的向量,求和则是在总的训练输⼊ x 上进⾏的。我们把 C 称为⼆次代价函数;有时也被称为均⽅误差或者 MSE。
可以看到 C(w, b) 是⾮负的,因为求和公式中的每⼀项都是⾮负的。此外,代价函数 C(w, b) 的值相当⼩,即 C(w, b) ≈ 0,精确地说,是当对于所有的训练输⼊ x,y(x) 接近于输出 a 时。因此如果我们的学习算法能找到合适的权重和偏置,使得 C(w, b) ≈ 0,它就能很好地⼯作。
相反,当 C(w, b) 很⼤时就不怎么好了,那意味着对于⼤量地输⼊,y(x) 与输出 a 相差很⼤。因此我们的训练算法的⽬的,是最⼩化权重和偏置的代价函数 C(w, b)。换句话说,我们想要找到⼀系列能让代价尽可能⼩的权重和偏置。我们将采⽤称为梯度下降的算法来达到这个⽬的。
为什么要介绍⼆次代价呢?毕竟我们最初感兴趣的内容不是能正确分类的图像数量吗?为什么不试着直接最⼤化这个数量,⽽是去最⼩化⼀个类似⼆次代价的间接评量呢?这么做是因为在神经⽹络中,被正确分类的图像数量所关于权重和偏置的函数并不是⼀个平滑的函数。⼤多数情况下,对权重和偏置做出的微⼩变动完全不会影响被正确分类的图像的数量。这会导致我们很难去解决如何改变权重和偏置来取得改进的性能。⽽⽤⼀个类似⼆次代价的平滑代价函数则能更好地去解决如何⽤权重和偏置中的微⼩的改变来取得更好的效果。这就是为什么我们⾸先专注于最⼩化⼆次代价,只有这样,我们之后才能测试分类精度。
我们打算使⽤⼀种被称为梯度下降的技术来解决这样的最⼩化问题。然后我们回到在神经⽹络中要最⼩化的特定函数上来。
假设我们要最⼩化某些函数,C(v)。它可以是任意的多元实值函数,v = v1, v2, . . .。注意我们⽤ v 代替了 w 和 b 以强调它可能是任意的函数 —— 我们现在先不局限于神经⽹络的环境。为了最⼩化 C(v),想象 C 是⼀个只有两个变量 v1 和 v2 的函数:
我们想要的是找到 C 的全局最⼩值。当然,对于上图的函数,我们⼀眼就能找到最⼩值。那只意味着,也许我展⽰的函数过于简单了!通常函数 C 可能是⼀个复杂的多元函数,看⼀下就能找到最⼩值是不可能的。
⼀种解决这个问题的⽅式是⽤微积分来解析最⼩值。我们可以计算导数去寻找 C 的极值点。运⽓好的话,C 是⼀个只有⼀个或少数⼏个变量的函数。但是变量过多的话那就是噩梦。⽽且神经⽹络中我们经常需要⼤量的变量——最⼤的神经⽹络有依赖数亿权重和偏置的代价函数,极其复杂。⽤微积分来计算最⼩值已经不可⾏了。
有⼀个漂亮的推导法暗⽰有⼀种算法能得到很好的效果。⾸先把我们的函数想象成⼀个⼭⾕。只要瞄⼀眼上⾯的绘图就不难理解。我们想象有⼀个⼩球从⼭⾕的斜坡滚落下来。我们的⽇常经验告诉我们这个球最终会滚到⾕底。也许我们可以⽤这⼀想法来找到函数的最⼩值?我们会为⼀个(假想的)球体随机选择⼀个起始位置,然后模拟球体滚落到⾕底的运动。我们可以通过计算 C 的导数(或者⼆阶导数)来简单模拟——这些导数会告诉我们⼭⾕中局部“形状”的⼀切,由此知道我们的球将怎样滚动。
为了更精确地描述这个问题,让我们思考⼀下,当我们在 v1 和 v2 ⽅向分别将球体移动⼀个很⼩的量,即 ∆v1 和 ∆v2 时,球体将会发⽣什么情况。微积分告诉我们 C 将会有如下变化:
我们要寻找⼀种选择 ∆v1 和 ∆v2 的⽅法使得 ∆C 为负;即,我们选择它们是为了让球体滚落。为了弄明⽩如何选择,需要定义 ∆v 为 v 变化的向量,
T 是转置符号。
我们也定义 C 的梯度为偏导数的向量:
我们⽤ ∇C 来表⽰梯度向量,即:
有了这些定义,∆C 的表达式 (7) 可以被重写为:
这个表达式解释了为什么 ∇C 被称为梯度向量:∇C 把 v 的变化关联为 C 的变化,正如我们期望的⽤梯度来表⽰。但是这个⽅程真正让我们兴奋的是它让我们看到了如何选取 ∆v 才能让∆C 为负数。假设我们选取:
这⾥的 η 是个很⼩的正数(称为学习速率)。⽅程 (9) 告诉我们 ∆C ≈ −η∇C·∇C = = η∥∇C∥2。由于 ∥∇C∥2 ≥ 0,这保证了 ∆C ≤ 0,即,如果我们按照⽅程 (10) 的规则去改变 v,那么 C 会⼀直减⼩,不会增加。(当然,要在⽅程 (9) 的近似约束下)。这正是我们想要的特性!因此我们把⽅程 (10) ⽤于定义球体在梯度下降算法下的“运动定律”。也就是说,我们⽤⽅程 (10) 计算∆v,来移动球体的位置 v:
然后我们⽤它再次更新规则来计算下⼀次移动。如果我们反复持续这样做,我们将持续减⼩C 直到 —— 正如我们希望的 —— 获得⼀个全局的最⼩值。
总结⼀下,梯度下降算法⼯作的⽅式就是重复计算梯度 ∇C,然后沿着相反的⽅向移动,沿着⼭⾕“滚落”。我们可以想象它像这样:
我已经解释了具有两个变量的函数 C 的梯度下降。但事实上,即使 C 是⼀个具有更多变量的函数也能很好地⼯作。我们假设 C 是⼀个有 m 个变量 v1, . . . , vm 的多元函数。那么对 C 中⾃变量的变化 ∆v = (∆v1, . . . , ∆vm)T,∆C 将会变为:
这⾥的梯度 ∇C 是向量
正如两个变量的情况,我们可以选取
⽽且 ∆C 的(近似)表达式 (12) 保证是负数。这给了我们⼀种⽅式从梯度中去取得最⼩值,即使 C 是任意的多元函数,我们也能重复运⽤更新规则
你可以把这个更新规则看做定义梯度下降算法。这给我们提供了⼀种⽅式去通过重复改变 v来找到函数 C 的最⼩值。这个规则并不总是有效的 —— 有⼏件事能导致错误,让我们⽆法从梯度下降来求得函数 C 的全局最⼩值,这个观点我们会在后⾯的章节中去探讨。但在实践中,梯度下降算法通常⼯作地⾮常好,在神经⽹络中这是⼀种⾮常有效的⽅式去求代价函数的最⼩值,进⽽促进⽹络⾃⾝的学习。
事实上,甚⾄有⼀种观点认为梯度下降法是求最⼩值的最优策略。假设我们正在努⼒去改变∆v 来让 C 尽可能地减⼩。这相当于最⼩化 ∆C ≈ ∇C · ∆v。我们⾸先限制步⻓为⼩的固定值,即 ∥∆v∥ = ϵ,ϵ > 0。当步⻓固定时,我们要找到使得 C 减⼩最⼤的下降⽅向。可以证明,使得∇C · ∆v 取得最⼩值的 ∆v 为 ∆v = = η∇C,这⾥ η = ϵ/∥∇C∥ 是由步⻓限制 ∥∆v∥ = ϵ 所决定的。因此,梯度下降法可以被视为⼀种在 C 下降最快的⽅向上做微⼩变化的⽅法。
我们怎么在神经⽹络中⽤梯度下降算法去学习呢?其思想就是利⽤梯度下降算法去寻找能使得⽅程 (6) 的代价取得最⼩值的权重 wk 和偏置 bl。为了清楚这是如何⼯作的,我们将⽤权重和偏置代替变量 vj。也就是说,现在“位置”变量有两个分量组成:wk 和 bl,⽽梯度向量 ∇C 则有相应的分量 ∂C/∂wk 和 ∂C/∂bl。⽤这些分量来写梯度下降的更新规则,我们得到:
通过重复应⽤这⼀更新规则我们就能“让球体滚下⼭”,并且有望能找到代价函数的最⼩值。换句话说,这是⼀个能让神经⽹络学习的规则。
应⽤梯度下降规则有很多挑战。我们将在下⼀章深⼊讨论。但是现在只提及⼀个问题。为了理解问题是什么,我们先回顾(6) 中的⼆次代价。注意这个代价函数有着这样的形式
即,它是遍及每个训练样本代价
的平均值。
在实践中,为了计算梯度 ∇C,我们需要为每个训练输⼊ x 单独地计算梯度值 ∇Cx,然后求平均值
不幸的是,当训练输⼊的数量过⼤时会花费很⻓时间,这样会使学习变得相当缓慢。
有种叫做随机梯度下降的算法能够加速学习。其思想就是通过随机选取⼩量训练输⼊样本来计算 ∇Cx,进⽽估算梯度 ∇C。通过计算少量样本的平均值我们可以快速得到⼀个对于实际梯度 ∇C 的很好的估算,这有助于加速梯度下降,进⽽加速学习过程。
更准确地说,随机梯度下降通过随机选取⼩量的 m 个训练输⼊来⼯作。我们将这些随机的训练输⼊标记为 X1, X2, . . . , Xm,并把它们称为⼀个⼩批量数据(mini-batch)。假设样本数量m ⾜够⼤,我们期望 ∇CXj 的平均值⼤致相等于整个 ∇Cx 的平均值,即
这⾥的第⼆个求和符号是在整个训练数据上进⾏的。交换两边我们得到
证实了我们可以通过仅仅计算随机选取的⼩批量数据的梯度来估算整体的梯度。
为了将其明确地和神经⽹络的学习联系起来,假设 wk 和 bl 表⽰我们神经⽹络中权重和偏置。随机梯度下降通过随机地选取并训练输⼊的⼩批量数据来⼯作
其中两个求和符号是在当前⼩批量数据中的所有训练样本 Xj 上进⾏的。然后我们再挑选另⼀随机选定的⼩批量数据去训练。直到我们⽤完了所有的训练输⼊,这被称为完成了⼀个训练迭代期(epoch)。然后我们就会开始⼀个新的训练迭代期。
梯度下降算法⼀个极端的版本是把⼩批量数据的⼤⼩设为 1。即,假设⼀个训练输⼊ x,我们按照规则
更新我们的权重和偏置。然后我们选取另⼀个训练输⼊,再⼀次更新权重和偏置。如此重复。这个过程被称为在线、online、on-line、或者递增学习。在 online 学习中,神经⽹络在⼀个时刻只学习⼀个训练输⼊(正如⼈类做的)。
看到一篇文章有一个总结,我觉得挺不错这里粘出来:
并贴上地址:https://blog.csdn.net/lien0906/article/details/79193103