神经网络背后的数学原理:第 2 部分 - ADALINE 感知器





5.00/5 (9投票s)
一个可供自己尝试的指南,了解 ADALINE 感知器背后的基本数学原理。
目录
- 引言
- ADALINE 感知器的基本数学公式
- 为什么我们需要另一个感知器?
- 均方误差、凸优化:你在说什么?
- 寻找函数的最小值
- 可微、连续?还有其他你想说的词吗?
- 是的,这里还有一个词:“矩阵”
- 还有一些词:临界点、驻点和费马定理
- 优化(最小化)均方误差
- 梯度下降
- ADALINE 学习规则
- 总结
- ADALINE 感知器有什么问题?
- 参考文献
- 历史
引言
许多文章在介绍感知器时,都会展示定义它的基本数学公式,但却很少解释它究竟是如何工作的。
当然,我们可以在不真正理解基本数学原理的情况下使用感知器,但难道不也很有趣地看到我们在学校学过的所有这些数学知识如何帮助我们理解感知器,以及进一步理解神经网络吗?
我从一系列关于支持向量机的文章中获得了这个系列文章的灵感,这些文章解释了基本的数学概念,并逐步深入到更复杂的数学。所以,我的目标是写这篇文章并附带代码:向你展示感知器中涉及的数学。而且,如果时间允许,我还会写一些关于卷积神经网络的文章。
当然,在解释数学时,问题在于:什么时候停止解释?其中涉及到一些相当基础的数学,例如*什么是向量?*、*什么是余弦?*等等。我将假设一些基本的数学知识,比如你对*向量*有一个概念,你知道几何学的基础等等。我的假设将是任意的,所以如果你认为我在某些解释上进展太快,请随时发表评论。
那么,让我们开始吧。
系列文章
- 神经网络背后的数学:第一部分 - 罗森布拉特感知器
- 神经网络背后的数学原理:第 2 部分 - ADALINE 感知器
- 神经网络背后的数学:第三部分 - 神经网络
- 神经网络背后的数学:第四部分 - 卷积神经网络
免责声明
本文讨论的是感知器涉及的数学,而不是用于说明这些数学概念的代码。尽管我无意写这样的文章,但永远不要说“永远”…
设定一些界限
感知器基本上接收一些称为“特征”的输入值,在下面的公式中用 \(x_1, x_2, ... x_n\) 表示,并将它们乘以一些称为“权重”的因子,用 \(w_1, w_2, ... w_n\) 表示,对这些乘积求和,并根据此和的值输出另一个值 \(o\)
感知器有几种类型,它们之间在求和结果输出的方式上有所不同,即上述公式中的函数 \(f()\)。
在本文中,我们将基于 Adaline 感知器。Adaline 是 Adaptive Linear Neuron 的缩写。在本文中,当提到 Adaline 感知器时,我将简单地使用“感知器”一词。我假设你已经阅读了关于罗森布拉特感知器的文章,因此你已经熟悉了理解通用感知器基本公式所必需的基本向量数学。
我们将研究涉及的数学并讨论其局限性,从而为未来的文章打下基础。
ADALINE 感知器的基本数学公式
罗森布拉特感知器和 ADALINE 感知器的数学公式之间没有太大区别
主要区别在于 \(otherwise\) 情况返回 \(-1\) 而不是 \(0\),这在这里很重要。
但我们仍然计算点积并将其与一个值进行比较,所以我们仍然只有两种可能的输出,并且我们仍然只能对线性可分数据进行分类。所以,基本上,我们无法比罗森布拉特感知器做得更多。
那么我们为什么要需要新的感知器呢?
为什么我们需要另一个感知器?
在上一篇关于罗森布拉特感知器的文章中,我们最终能够通过特征的线性组合将“事物”分为两个不同的类别。我们还能要求什么?
嗯,能更好地估计线性边界就不错了。对于罗森布拉特感知器,我们对最终的学习将给出的边界没有任何控制:正如在前一篇文章中所演示的,它可以是分离我们两个类的任何一条线。
还记得罗森布拉特感知器的学习过程吗?我们将误差 \(e\) 定义为对于输入向量 \(\mathbf{x}\) 和权重向量 \(\mathbf{w}\),期望输出 \(d\) 和实际输出 \(o\) 之间的差值。
(如果上述公式对你来说像中文,你应该看看关于罗森布拉特感知器的文章。)
实际输出 \(o\) 由单位阶跃函数决定,在上面的公式中用 \(H()\) 表示。我们可以使用这个误差定义一个成本函数,然后尝试最小化这个成本函数。成本函数基本上是一个函数,它计算模型相对于期望值的总误差,因此通过最小化成本函数的结果,我们最小化误差。
ADALINE 感知器的成本函数基于均方误差/均方误差之和,在本例(线性回归)中,它属于一类称为凸优化的优化算法。
均方误差、凸优化:你在说什么?
如果你在网上搜索 ADALINE 感知器的信息,你很可能会找到各种学习规则的定义。最初的学习规则是最小均方滤波器,也称为 Widrow-Hoff 学习规则,以其发明者的名字命名。然而,在我们这个数字计算机时代,你也会找到均方误差方法的参考。在接下来的部分,你将看到它们基本上归结为相同的基本思想。
均方误差
我们试图优化(即最小化)误差平方和。误差的定义方式与罗森布拉特感知器类似,但在这里我们直接使用点积的结果。
然后我们将成本函数定义为这些误差的平方和。
其中 \(M\) 是样本的数量。因此,我们对所有样本求和。
除以 \(2\) 没关系,这是为了得到一个方便的函数,稍后我们可以对其进行求解。在讨论了导数之后,这一点将变得清楚。
但为什么是*平方*?
如果你在网上搜索解释,那么你很可能读到过类似这样的话:
因为我们想要所有值都为正
这是真的:我们确实想要正值。想象一下我们只计算误差的总和。我们会得到正负值,它们会相互抵消。因此,总和会变小(甚至可能为零),尽管我们的解决方案不是最优的。如果我们首先使误差值变为正值,然后对它们求和,那么得到零的唯一方法是我们的感知器结果与我们的样本结果相等。也就是说:如果我们没有误差。
自己试试
均方误差与误差和的交互式比较
好的,但为什么不直接取误差的绝对值呢?在网上搜索,大多数答案是:
因为大的误差在结果中占的比例更大。
因为取绝对值无法进行微分
要理解最后一个原因,我们需要理解*凸优化*。
上面不是对为什么使用均方误差进行严格的数学解释。有一个严格的解释涉及*似然*、*最大似然*等。但这相当大的主题,我们已经有很多东西要解释了,所以在这里不再进一步解释。但我确实打算提供一篇单独的文章来详细介绍这一点。
如上所述,你还会找到使用均方误差的学习过程定义。
ADALINE 感知器的原始定义使用了这个定义。对于优化,使用均方误差还是均方误差之和(我们很快就会看到)没有任何区别,但是,如果我们想比较取决于样本结果,那么当我们比较的样本数量不同时,使用均方误差之和会有所不同。请看下一段。
平方项的*计算*
当你开始在网上搜索关于均方误差的信息时,你会发现对平方项的各种处理。很容易迷失方向:我确实迷失过。所以,让我们简要地检查一些组合,看看为什么我们最终使用均方误差。
- 最小二乘误差 这是确定我们模型的一种方法。我们试图最小化(最小化)误差平方和。
- 残差平方和 这与均方误差基本上相同。我们使用“残差”一词而不是“误差”。
- 普通最小二乘法 如果我们的模型是线性模型(感知器就是),那么它与最小二乘误差相同。因此,这也是一种确定我们模型的方法,但专为线性模型设计。
- 均方误差 均方误差计算平方误差的平均值。平均值是通过将所有样本误差的总和除以样本数量来计算的,因此,它基本上是最小二乘误差除以样本数量。它是计算权重后评估质量的一个好度量。通过计算平方误差的平均值,我们考虑了我们要检查的样本数量。可以想象一下,在上面的公式中不除以样本数量:很明显,样本数量越多,平方和就越大,从而隐藏了期望的度量。
自己试试
均方误差与均方误差之和的交互式比较
凸优化
在凸优化中,我们试图最小化一个凸函数。
什么是凸函数?
来自维基百科
…如果函数图线上任意两点之间的线段位于图线上方或图线上,则称之为凸。等价地,如果…函数上方(或本身)的点的集合是凸集,则该函数是凸的。
(如果你不熟悉线段和凸集的概念,你应该查看本系列的第一篇文章,其中我讨论了这两者。)
用数学来表示,这个定义变为:
其中 \(A\) 和 \(B\) 是 \(\mathbb{R}^n\) 中的两个点,\(\lambda\) 在区间 \((0, 1)\) 内。
用通俗的话说,这个公式表明,对于一个凸函数,输入点 \(A\) 和 \(B\) 之间的“超线”上的任何函数值都必须小于连接 \(A\) 和 \(B\) 的两个函数结果的“超线”上的相应点。如果你不熟悉线段的概念(这个公式由此而来),你应该阅读本系列第一篇文章中关于线段的部分。
以下说明了这个公式。
自己试试
均方误差与均方误差之和的交互式比较
以下是一个公式不成立的例子。
自己试试
均方误差与均方误差之和的交互式比较
你可能会问,如果线段完全在函数图的下方会怎样?那么我们就有了一个凹函数。可以清楚地看到,这只是一个负的凸函数,因此如果 \(f(x)\) 是一个凸函数,那么 \(-f(x)\) 就是一个凹函数。
我们的成本函数,即均方误差之和,是一个凸函数。
什么是优化?
凸函数有趣的地方在于它只有一个最小值。因此,如果感知器的成本函数是一个凸函数,那么我们就可以找到这个函数的唯一最小值,从而为我们的问题找到了一个唯一的最佳解决方案。
这是 ADALINE 感知器与罗森布拉特感知器的主要区别:我们可以找到一个**保证**的最优解,对于给定的一组样本,该解**始终相同**。即使学习数据不是严格可分的,我们也能找到一个解,尽管这不一定是正确的解:有些点可能最终落在错误的半空间中。但误差将是最小的。
因此,在这种情况下,*优化*的行为是找到成本函数的最小值所对应的自变量。
寻找函数的最小值
首先,让我们在数学上定义什么是最小值。
我们可以将这个定义扩展到多变量函数。
用通俗的话说:如果函数的所有邻近值都大于这个最小值,那么我们就找到了函数的最小值。
通常通过计算函数的导数来找到最小值。正如我们稍后将展示的,函数的导数可以看作是函数的斜率。或者:函数在某一点的导数等于该点函数切线的斜率。
对于单变量函数,这一点可以很容易地从图上看出。
当函数的斜率(即导数)为零时,也就是说,当切线水平时,我们通常有一个最小值、最大值或水平拐点。
因为我们的成本函数是凸函数,所以我们知道它有一个最小值。
虽然上面的直观感觉上还可以,但更正式的解释可以在费马关于驻点的定理中找到,但我们稍后会回到这一点。
所以,为了找到最小值,我们必须找到斜率为 \(0\) 的地方,因为斜率就是导数(我们将在下一节看到原因),我们必须能够找到函数的导数。
但在这与罗森布拉特感知器相关的问题是:为了进行微分(即计算导数),函数必须是连续的,而单位阶跃函数不是连续的。
然而,ADALINE 感知器将误差定义为期望输出 \(d\) 与点积值之间的差值,即应用激活函数之前的值。
这是连续的,因此是可微的。
但让我们退后一步,先解释一下“可微”和“连续”的含义。
可微、连续?还有其他你想说的词吗?
单变量函数的导数
假设我们有一个单变量函数。
取导数的操作称为微分。导数的数学定义是:
注意 \(f\) 上的撇号('\)):这表示导数。
有时会使用另一种符号:
其中我们可以将 \(d\) 理解为微小变化。所以导数是函数结果的微小变化除以该函数自变量的微小变化。因此,函数在某一点的导数是该点函数的斜率:它给出了函数输出对于该点输入变化量的一定变化量的度量。
为了在上述定义中明确表示,我们可以写成:
这个 \(\lim_{h\to0}\) 是什么意思?
理解函数的极限
一般来说,当我们写:
我们指的是当 \(x\) 趋近于 \(c\) 时,函数 \(f(x)\) 的值。
来自维基百科
\(f(x)\) 可以变得任意接近 \(L\),通过使 \(x\) 充分接近 \(c\)。在这种情况下,上面的等式可以读作“当 \(x\) 趋近于 \(c\) 时,\(f\) 的 \(x\) 的极限是 \(L\)”。
这并不意味着 \(x\) 等于 \(c\)!!!所以,它是以非常小的范围逼近,但从未达到。这种“逼近”(对于我们简单的函数 \(y = f(x)\))是从 \(c\) 的两侧进行的。
一个更严格的数学定义是极限的(ε, δ)定义。
设 \(I\) 是包含 \(c\) 的开区间(区间基本上是两个数字以及它们之间的所有数字。“开”意味着不包含边界上的两个数字,“闭”意味着包含边界上的两个数字),并且设 \(f\) 是定义在 \(I\) 上的函数(因此 \(f(x)\) 对边界数字之间的每个数字都有一个结果),但 \(c\) 可能除外。
设 \(\delta\) 和 \(\epsilon\) 是两个正数。
然后我们可以写:
表示对于所有 \(x \ne c\)
所以我们在这里说的是,对于每一个 \(\epsilon\),都存在一个 \(\delta\),使得上述公式成立。\(\epsilon\) 部分在这个数学定义中对应于维基百科定义中的\(f(x)\) 可以任意接近 \(L\) 部分,而 \(\delta\) 对应于通过使 \(x\) 充分接近 \(c\) 部分。
然而,这里有几点需要注意:
首先,我们取差值的绝对值。这意味着当我们说到 \(x\to{c}\) 时,我们指的是从各个方向逼近 \(c\)。在线性尺度上,这意味着从右侧和左侧。
其次:我们说*小于*,而不是*小于或等于*,这与函数定义中关于线段的部分的陈述相符。
并且设 \(f\) 是定义在 \(I\) 上的函数,除了 \(c\) 处可能例外。
函数不必在极限逼近的值处定义,因为我们实际上永远不会达到这个值!我们只是从各个方向逼近它或尽可能接近它。但请注意,这只在值本身处!它必须在值*周围*定义。
自己试试
函数的极限(交互式)
理解导数
回到我们的导数:简单来说,它是函数结果的变化除以函数自变量的变化,当自变量的变化趋近于(逼近)\(0\) 但不等于 \(0\) 时。
还记得我们说过计算极限时,函数不必在逼近值处定义吗?为了计算导数,函数必须在这些点处定义。不仅如此,它还必须是*连续的*。
函数要想可微,必须在其定义域的所有点上都存在导数。并且函数要想在某一点可微,它必须在该点处*连续*。
函数的连续性由数学表达式定义。
用通俗的话说:一个函数在某一点 \(c\) 处是连续的,如果函数逼近该点的极限等于函数在该点的值。注意这与极限本身的定义形成对比,在极限定义中我们说函数甚至不必在 \(c\) 处定义。
直观地,你可以将其视为填补一个空隙:在 \(c\) 周围有一个特定的值,我们说在 \(c\) 处我们也想要相同的值。
那么为什么这是可微性的必要条件呢?
这与可以除以 \(0\) 有关。
让我们回到微分的数学定义。
如果我们考虑在某一点进行微分,我们也可以写成:
以下不是严格的数学解释,而是“凭感觉”的解释。
如果我们考虑当 \(x\to{a}\) 时分母的值,那么这个值将趋近于(逼近)\(0\)。这意味着商的结果越来越大,对于 \(0\) 这个值,它是无穷大的。为了避免这个商达到无穷大,唯一的方法是确保分子本身也趋近于 \(0\)。因此,当 \(x\to{a}\) 时,\(f(x)\) 的值必须趋近于 \(f(a)\),这正是上面给出的连续性定义。
更严格的数学证明可以在参考部分找到。
自己试试
连续性
自己试试
微分
多变量函数的导数:方向导数
当然,我们的函数可以依赖于多个自变量和一个结果 \(y\)。
在这种情况下,斜率变成了*梯度*,并以某个方向计算。我们称之为*方向导数*。
我们将方向导数定义为在方向 \(u\) 上,其中 \(\hat{u}\) 是 \(u\) 方向上的单位向量,或者 \(\hat{u} = \frac{u}{\lvert\lvert{u}\lvert\lvert}\),为:
在这个公式中,符号 \({f'}_u\) 代表*方向导数*,而 \(\hat{u_1}, \hat{u_2}, ..., \hat{u_n}\) 是单位向量 \(\hat{u}\) 沿着 \(x_1, x_2, ...,x_n\) 轴的分量。
所以它是函数在 \(u\) 方向上的斜率(如果你不熟悉向量,现在是阅读本系列第一篇文章的好时机)。
但是,如何轻松计算它呢?更重要的是(对于我们的优化问题),它最大值出现在哪个方向?为此,我们需要所谓的*偏导数*。
多变量函数相对于其中一个变量的偏导数,是该函数对该变量的导数,而其他变量保持不变。你可以将其想象为我们将多变量函数简化为单变量函数,然后计算其导数。
假设我们有一个函数:
然后我们可以为每个变量定义偏导数:
其中在某一点 \((x_1,x_2,...,x_i, ...,x_n)\) 处的 \(x_i\) 方向上的偏导数是:
它是函数在 \(x_i\) 方向上的变化率/斜率。
自己试试
偏导数
多变量函数的导数:梯度向量
一个点的梯度是多变量函数最大增量方向上的向量,其幅度是该函数增大的速率。或者说,梯度是函数最大变化方向上的方向导数。它由函数的偏导数组成。
那么,为什么梯度是最大变化的方向呢?为此,我们需要研究梯度和方向导数之间的关系。我们可以证明梯度和方向导数之间的以下关系(请参阅参考部分,其中提供了一些互联网上的证明)。
所以,沿 \(u\) 方向的方向导数是梯度与 \(u\) 方向上的单位向量的点积。请注意,这是点积,因此结果是一个数字而不是向量!
正如我们在第一篇文章中所知,两个向量的点积可以通过向量的大小和它们之间的夹角来表示。
将此应用于上面方向导数的定义,得到:
并且由于余弦函数在 \(0\) 度角时的最大值为 1,我们知道当向量 \(\hat{u}\) 与梯度向量 \(\nabla{f}\) 方向相同时,方向导数最大。因此,方向导数在梯度方向上最大。
此外,由于向量 \(\hat{u}\) 的大小为 1(我们将其定义为单位向量),你可以看到梯度向量 \(\nabla{f}\) 的大小是该点函数的斜率。
导数的导数…:二阶导数、三阶导数等。
当然,最终,微分的结果也是一个函数,我们也可以(可能)对其进行微分。
对于单变量函数,这会产生所谓的*二阶导数*、*三阶导数*等。对于这些,我们使用符号:
或
对于多变量函数,我们也可以这样做。
但是,由于我们有多个变量,我们也有偏导数。这会产生偏导数的偏导数。请记住,对于一个具有多个变量的函数,我们对每个变量都有一个偏导数。但这些偏导数也是(可能)多个变量的函数,所以对于每个偏导数,我们有多个二阶偏导数。
假设我们有一个函数:
然后我们可以为每个变量定义偏导数:
但是,每个偏导数本身也可能是这些变量的函数。
因此,对于每个函数 \(g()\),我们再次有偏导数:
并且因为 \(g_i(x_1,x_2,...,x_i, ...,x_n) = \frac{\partial f}{\partial x_i}\)
当然,这些二阶偏导数也是多变量函数,所以同样的思路也适用于它们。
就像我们有了一阶方向导数用于多变量函数一样,我们也有一阶二阶方向导数,依此类推,更高阶的方向导数。
让我们看看二阶方向导数。它是函数 \(f\) 的方向导数在 \(u\) 方向上的方向导数。
还记得方向导数的定义吗(我将函数符号从 \(f\) 改为 \(g\),稍后你就会明白为什么)?
对于二阶方向导数,函数 \(g\) 是方向导数,因此:
所以 \(g\) 的导数是 \(f\) 的二阶导数,因此:
如果我们将其代入上面的公式:
正如你所看到的,这个公式开始变得很大。我省略了一些索引,但仍然很容易在所有这些索引中迷失。而我们只在二阶方向导数。想象一下更高阶(三阶、四阶等)方向导数会得到什么。
幸运的是,有一种更简洁的公式写法,但为此我们需要矩阵。
是的,这里还有一个词:“矩阵”
矩阵的定义
来自维基百科
在数学中,矩阵(复数形式:matrices)是数字、符号或表达式的矩形排列,按行和列排列。
在下面的例子中,我们有一个 3 行 4 列的矩阵。我们说我们有一个 \(3 \times 4\) 矩阵(读作“3 by 4”)。行数和列数被称为矩阵的*维度*。请注意,我们首先提到行数,然后是列数。
矩阵运算
两个矩阵的和与差
两个矩阵的和与差由矩阵中相同位置的每个元素的和或差定义。因此,假设我们有两个矩阵 \(A\) 和 \(B\),我们想计算它们的和 \(C\),那么:
其中 \(i\) 和 \(j\) 是行和列的下标。
举个例子:
那么和是:
减法也存在类似的定义。
这也意味着我们*不能*添加或减去具有不同维度的矩阵,因为对于一个矩阵中的某些元素,在另一个矩阵中将找不到对应的元素。
标量乘法
矩阵与标量的乘法是将标量乘以矩阵中的每个元素的结果。因此,如果我们有一个矩阵 \(A\) 和一个标量 \(\lambda\),那么:
其中 \(i\) 和 \(j\) 是行和列的下标。
举个例子:
那么与 \(\lambda\) 的标量乘法是:
矩阵乘法
两个矩阵的乘法定义为将第一个矩阵的行与第二个矩阵的列进行点积。因此,如果我们有一个维度为 \(m \times n\) 的矩阵 \(A\) 和一个维度为 \(n \times p\) 的矩阵 \(B\),那么:
从这个定义中,有几个要点需要注意:
- 两个矩阵的乘法只有当第一个矩阵 \(A\) 的列数等于第二个矩阵 \(B\) 的行数时才可能(注意我在公式介绍时使用的维度字母)。
- 如果我们有一个维度为 \(m \times n\) 的矩阵 \(A\) 和一个维度为 \(n \times p\) 的矩阵 \(B\),那么乘法结果矩阵的维度是 \(m \times p\)。
- 矩阵乘法*不是*可交换的。因此 \(AB \neq BA\)。从下面的乘法定义很容易看出这一点。事实上:由于关于列和行的要求,你甚至不确定是否可以进行乘法。
- 矩阵乘法是*可结合*的。因此 \(A(BC) = (AB)C\)。通过直接写出公式很容易证明这一点。在参考部分,我也提供了一个非常易于理解的证明链接。
例如,我们有一个维度为 \(4 \times 3\) 的矩阵 \(A\)。
并且我们有一个维度为 \(3 \times 2\) 的矩阵 \(B\)。
那么乘法是:
维度为 \(4 \times 2\)。
矩阵转置
矩阵的转置是这样得到的矩阵:将源矩阵的行转换为列,将列转换为行。因此,如果我们有一个维度为 \(m \times n\) 的矩阵 \(A\),那么:
举个例子,我们有一个维度为 \(4 \times 2\) 的矩阵 \(A\)。
那么转置是:
矩阵 \(A\) 的转置表示为 \(A^\top\).
关于转置和感知器积分函数符号的附注
如果你在网上搜索关于感知器的信息,你可能会发现一些使用这种转置的公式:
那么为什么我们不使用呢?
我们一直在使用向量表示法来表示感知器,它利用向量的点积。然而,与其将 \(w\) 和 \(x\) 视为向量,不如将它们视为具有 \(n\) 行和一列的矩阵,即维度为 \(n \times 1\)。
在这种情况下,点积被矩阵乘法取代,根据定义,这种乘法对于两个维度为 \(n \times 1\) 的矩阵是不定义的。但是,我们可以将一个维度为 \(1 \times n\) 的矩阵乘以一个维度为 \(n \times 1\) 的矩阵。为了得到这个 \(1 \times n\) 矩阵,我们取 \(n \times 1\) 矩阵的转置。因此出现了带转置的公式。
但是请注意,从数学上讲,点积的结果是一个标量,而矩阵乘法的结果是另一个矩阵。所以,虽然计算出的值相同,但数学结构却不同!
那么,为什么我们需要它们来进行方向导数呢?
现在我们了解了矩阵和矩阵乘法,让我们回到多变量函数的二阶方向导数。
让我们以一个有两个变量的函数为例来展开。警告:我将使用 \(x\) 和 \(y\) 代替 \(x\) 的下标,如 \(x_1\) 和 \(x_2\),因为我觉得这样更清楚:区分 \(x\) 和 \(y\) 比区分 \(x_1\) 和 \(x_2\) 更容易。因此,我也将使用 \(u_x\) 和 \(u_y\) 代替 \(u_1\) 和 \(u_2\)。
因此,我们有一个函数 \(f(x, y)\)。它的二阶方向导数等于:
如果我们展开下面的矩阵乘法:
第一次乘法展开:
得到:
然后继续第二次矩阵乘法:
如果我们比较这个最后的结果与二阶方向导数的展开定义,我们会发现它们是相同的。因此,矩阵乘法的结果就是二阶方向导数。
我们当然可以再次展开并推广到多个变量(使用下标表示变量)。
包含偏导数的矩阵称为Hessian矩阵 H。
如果我们现在定义另一个矩阵 U,它包含方向单位向量的系数,则:
我们可以将二阶方向导数重写为简洁的矩阵乘法:
还有一些词:临界点、驻点和费马定理
我们不要偏离主题:我们正在寻找一种找到函数最小值的方法。
我们可以使用费马关于驻点的定理来找到*局部极值*,即局部最小值或最大值。来自维基百科:
费马定理是一种通过证明函数的每个局部极值都是驻点来寻找可微函数在开集上的局部最大值和最小值的方法。
太好了,那么这些*驻点*又是什么呢?再次来自维基百科:
一个单变量可微函数的驻点是函数图上的一个点,在该点函数的导数为零。(…)对于一个多变量实数可微函数,驻点是图曲面上的一个点,在该点所有偏导数都为零(等价地,梯度为零)。
如果函数 \(f\) 在某一点的导数为 \(0\)**或未定义**,那么这些点称为*临界点*。所以基本上,你可以说所有驻点都是临界点,但并非所有临界点都是驻点,那些导数未定义的点*不是*驻点。
其中,*局部极值*是函数具有局部最大值或局部最小值的点。*局部*与*全局*相对,全局是指没有其他值小于/大于全局最小值/最大值处的值,而局部是指尽管在该点函数有一个最小值/最大值,但存在其他点函数可能得到更小/更大的结果。
但请注意,费马定理的方向反过来不成立:如果函数在某一点的导数为零,这*不一定*意味着我们有一个最小值或最大值!我们还可以有一个所谓的水平拐点(对于单变量函数)或鞍点(对于多变量函数)。
那么,我们如何知道我们确实有一个最小值呢?我们可以使用所谓的极值检验或二阶导数检验。对于单变量函数,它计算二阶导数,并根据其值将临界点分类为最小值、最大值或拐点。
- 如果 \(f'(x) = 0\) 且 \(f''(x) > 0\),则函数 \(f()\) 在 \(x\) 处有一个最小值。
- 如果 \(f'(x) = 0\) 且 \(f''(x) < 0\),则函数 \(f()\) 在 \(x\) 处有一个最大值。
- 如果 \(f'(x) = 0\) 且 \(f''(x) = 0\),则我们无法获得额外信息。
为了理解这是为什么,让我们回到导数的含义:函数在某一点的导数是该点函数的斜率。或者用另一种说法:它是函数在该点的变化率。
这也意味着,如果导数变号,斜率就变号。显然,函数只有在值穿过零时才能改变符号。如果斜率变号,则意味着函数从上升变为下降或反之。这相应地意味着我们有一个最大值或最小值。所以这直观地解释了为什么当导数为零时,我们可能有一个最小值或最大值(或拐点)。
为了区分最大值或最小值,我们需要检查一阶导数是开始为正然后变为负,还是反之。我们可以使用二阶导数,它告诉我们一阶导数的变化率或斜率。
如果一阶导数开始为正然后变为负,这意味着它在下降,这意味着变化率或斜率为负。因此,二阶导数为负。
因此,我们的规则是:
- 如果 \(f'(x) = 0\) 且 \(f''(x) < 0\),则函数 \(f()\) 在 \(x\) 处有一个最大值。
同样,如果一阶导数开始为负然后变为正,则斜率是上升的,因此二阶导数是正的,从而得出我们的规则
- 如果 \(f'(x) = 0\) 且 \(f''(x) > 0\),则函数 \(f()\) 在 \(x\) 处有一个最小值。
然而,如果一阶导数在穿过零(因此原始函数存在最大值或最小值)时,其自身的斜率为零(这意味着它是一个拐点),则二阶导数在该点处也将变为零。另一方面,如果一阶导数在变为零时,其自身存在最大值或最小值(它仅触及零,但不改变符号),则二阶导数再次变为零。但是,由于一阶导数不改变符号,因此微分后的函数没有最大值或最小值。简而言之:我们遇到了一种情况,即一阶导数和二阶导数都变为零,但我们仍然无法确定原始函数在该值处是否有最大值、最小值或拐点。
因此,规则
- 如果 \(f'(x) = 0\) 且 \(f''(x) = 0\),则我们无法获得额外信息。
为了能够得出结论,在这种情况下我们需要三阶导数。事实上,有一个通用的测试,即高阶导数测试。
令 \(n>1\),并且
- 函数 \(f\) 在点 \(c\) 的 \(n\) 阶导数不为零
- 所有较低阶导数(因此从 \(\frac{df}{dx}\) 到 \(\frac{d^{n-1}f}{dx^{n-1}}\))都为零
那么,如果 - n 为偶数且 \(n\) 阶导数为负;则点 \(c\) 处存在局部最大值
- n 为偶数且 \(n\) 阶导数为正;则点 \(c\) 处存在局部最小值
- n 为奇数且 \(n\) 阶导数为负;则点 \(c\) 处存在递减拐点
- n 为奇数且 \(n\) 阶导数为正;则点 \(c\) 处存在递增拐点
注意:如果您在互联网上查找有关此测试的信息,您会发现一些定义中,上述摘要中的奇偶数被互换了。原因是某些定义(例如维基百科上的定义)从 \(n=1\) 开始用于**二阶**导数。因此,对于二阶导数, \(n\) 是奇数,这符合我们上述摘要中的前两条规则。
自己试试
二阶导数检验
然而,对于多变量函数,情况更加复杂。在这种情况下,它被称为二阶偏导数检验。
回想一下我们上面关于单变量函数二阶导数检验的讨论:在其中,我们推断出如果函数的导数为零,那么我们需要计算二阶导数来区分最小值和最大值。如果二阶导数为负,则存在最大值;如果为正,则存在最小值。
我们可以在这里做出类似的断言。
我们已经证明,多变量函数的最大斜率沿梯度方向。因此,如果最大斜率为零,则所有方向上的方向导数都将为零。因为最大斜率就是梯度,所以为了使最大斜率为零,梯度必须为零,因此所有偏导数都必须为零。
现在我们如何区分最大值、最小值和鞍点?可以进行类似于单变量函数情况的思考。
为了使梯度为零的点成为最小值或最大值,我们必须使方向导数在所有方向上改变符号,或者方向导数必须在所有方向上继续上升或下降。这意味着二阶方向导数必须为正或负。
数学上
- 如果梯度为零,则当 \({f''}_u = U^\top H U \gt 0\) 时,我们有一个最小值。
- 如果梯度为零,则当 \({f''}_u = U^\top H U \lt 0\) 时,我们有一个最大值。
恰巧,上面的不等式有一个名称。
- 正定矩阵的定义是 \(A^\top H A \gt 0\)。
- 负定矩阵的定义是 \(A^\top H A \lt 0\)。
在这两个不等式中,矩阵 \(A\) 可以是任何单列矩阵。我们的矩阵 \(U\) 代表单位向量,但我们可以看到这与具有比例因子的 \(A\) 相同,或者 \(A\) 乘以一个标量。
因此
并且因为 \({\lambda}^2 \gt 0\),所以用矩阵 A 写的 But is the same as written with matrix U.
我们可以得出结论
- 如果函数的 Hessian 矩阵是正定的,则存在最小值。
- 如果函数的 Hessian 矩阵是负定的,则存在最大值。
优化(最小化)均方误差
那么,让我们来看看我们目前所处的位置。
- 我们已经定义了一个成本函数,以便能够确定最佳拟合(根据此成本函数)。
- 我们知道我们选择的成本函数是凸函数(我们稍后会证明它),因此它只有一个最小值。
- 我们可以通过对成本函数求导并确定导数为 0 的位置来确定这个唯一最小值所在的位置。
获取我们成本函数的导数
函数的导数总是相对于该函数的变量来计算的。如果我们看看我们的成本函数
在此
- M 是样本数量
- j 是样本的索引
并且有了
我们有
其中
- \(d\) 是期望输出
- \(w\) 是感知器的权重
- \(x\) 是感知器的输入(特征)。
您可能会认为我们需要对 \(x\) 求导,但这是错误的。我们想根据一些数据对(期望输出,观测特征),即 \((d, x)\),找到使总误差最小的 \(w\) 值。这意味着 \(w\) 是我们的变量,我们的未知数,而 \(d\) 和 \(x\) 是给定的值,我们将其代入误差函数。因此,我们根据 \(w\) 求导。
但是 \(w\) 是一个向量,这意味着误差函数是一个多变量函数。因此,我们需要对 \(w\) 向量中的每个 \(w_i\) 求偏导数。
有一些规则控制着函数导数的计算,例如幂法则、常数乘法、求和、差分、链式法则等。我们不会讨论所有规则,只讨论我们的成本函数所需的规则。
如果您有兴趣,可以查看参考部分了解其他规则。
如果我们采用成本函数,那么我们可以看到我们将需要幂法则来处理二次项,常数规则来处理除以 \(2\),求和规则和差分规则来处理 \(\sum\) 项,以及误差本身的计算(\(e = d-\mathbf{w} \cdot \mathbf{x}\)),最后是链式法则来将它们组合在一起。
让我们看看这些规则告诉我们什么,并将它们应用于我们的成本函数。
请注意索引,因为事情将变得非常混乱。
**常数乘法规则**
那么可以证明
应用于我们的成本函数
如果我们对第 \(k\) 维求偏导数
接下来是**求和规则**
那么可以证明
进一步应用于我们的成本函数中的 \(\sum_{j=1}^{M}\) 项
接下来是**链式法则**,它处理参数也是函数的函数。
假设我们有两个函数
那么我们可以将它们组合成一个函数
那么可以证明
以及**幂法则**
那么可以证明
如果我们结合应用于函数的幂法则和链式法则,我们得到
那么
进一步应用于我们的成本函数中的 \(\frac{\partial { ({(d-\mathbf{w} \cdot \mathbf{x})}^2})}{\partial w_i}\) 项
现在您也知道为什么我们要除以 \(2\):它使得平方项的系数在求导后消失。
在我们继续之前,请记住 \((d-\mathbf{w} \cdot \mathbf{x})_j\) 项是样本 \(j\) 的误差。
并且 \(\mathbf{w} \cdot \mathbf{x}\) 是点积,因此也是一个求和。
在此
- \(N\) 是我们特征向量的维度。
因此,误差函数(作为权重的函数)关于第 \(k\) 维的偏导数是
在此
- \(k\) 是我们进行偏导数的维度
- \(M\) 是样本数量
- \(j\) 是样本的索引
- \(i\) 是样本维度的索引
用语言来说
- 误差函数关于第 \(k\) 维的偏导数是
- 所有样本 \(j\) 的总和,其中
- 样本的误差
- 乘以样本 \(j\) 关于第 \(k\) 维的误差偏导数。
很明显,常数的导数为零:常数不发生变化。
在我们的误差函数中,\(d\) 是一个常数,所以它的导数为 \(0\)。但是,因为我们对每个 \(\mathbf{w_k}\) 求偏导数,所以当 \(\mathbf{i \neq k}\) 时,\(\mathbf{w_i}\) 也相对于 \(\mathbf{w_i}\) 是一个常数,因此应用此知识并利用求和规则并展开点积产生的求和,我们得到
在上述项中,只有 \(i=k\) 的项才保留:对于其他项,\(wx\) 项相对于 \(\partial w\) 的导数被视为常数,因此为 \(0\)。
因此,这是所有样本的误差乘以第 k 维的特征值之和。
证明凸性
回想一下我们在二阶偏导数检验中的讨论,我们得出结论:如果 Hessian 矩阵是半正定的,则函数是凸函数。还请记住,Hessian 矩阵是通过将函数的所有二阶偏导数按一定顺序排列到一个矩阵中形成的。
因此,要证明 Hessian 矩阵的半正定性,我们需要二阶偏导数。
上面,我们计算了一阶偏导数。
由此,我们可以计算二阶偏导数。
同样,\(\mathbf{w} \cdot \mathbf{x}\) 是一个点积,因此也是一个求和。
另外,\(d\) 是一个常数:它的导数为 \(0\),因此
与之前一样,上述项中只有 \(i = l\) 的项才保留,因为其他项相对于偏导数是常数。因此
最后,Hessian 矩阵是
所以,我们有 \(M\) 次矩阵
我们可以将此矩阵分解为以下列矩阵和行矩阵的乘积。
现在,回顾正半定性的定义
其中 \(A\) 是一个列矩阵,因此我们可以将其重写(通过替换为上述 Hessian 的表达式)。
由于矩阵乘法的结合律,我们可以写成
基本上,这是两个标量的乘法。由于标量乘法的可交换性
因此,我们得到一个标量的平方,它总是大于零。我们可以得出结论,结果必须大于或等于 \(0\),因此 Hessian 矩阵是半正定的,因此我们的成本函数是凸函数。
解决问题
因此,我们现在知道误差函数是凸函数,因此有一个全局最小值。如果我们能找到导数为零的地方,我们就找到了感知器的最优解。
有两种方法可以搜索成本函数的最小值。
第一种解决方案是使导数等于零。因此,我们计算导数,将其设为零,然后解该方程。这也可以得到一个精确解。我们在这里不再进一步讨论这个解决方案。这个解决方案只能用于我们非常简单的感知器,并且不能推广到多感知器神经网络。即使对于单个感知器,如果我们有很多属性来定义我们的两个目标类别(因此 \(N\) 很大),由于找到这个结果的计算复杂度,它在计算上不是一个可行的解决方案。
第二个解决方案称为梯度下降:我们在某个随机点计算梯度,以找到函数趋近于最小值(正在下降)的方向。然后我们朝着那个方向迈出一小步,重新开始。我们一直这样做,直到函数输出的变化低于预定义的阈值。
梯度下降
梯度下降(文字和图示)
梯度下降的关键思想是,从成本函数曲线上的某个随机点开始,我们希望移动到最小值方向,直到达到这个最小值。
从图形上看,我们希望这样做:
我们希望通过在曲线上下降来“迈步”到最小值。如果斜坡在下降,我们可以朝着 x 增加的方向移动;如果斜坡在上升,我们可以朝着 x 减小的方向移动。
因此,在梯度下降中,梯度用于确定我们要移动的方向。
梯度下降(公式)
假设我们有一个单变量函数 \(f(x)\)。
如果我们在函数的下降侧,我们希望向 x 增加的方向移动(迈步),因此
如果我们用符号 \(\Delta x\) 表示我们的步长
如果我们处于上升侧,我们希望向 x 减小的方向移动
如果我们选择 \(\Delta x\) 与斜率成比例(记住斜率等于导数 \(\frac{df(x)}{dx}\)),我们得到
在下降侧,斜率为负,我们得到(记住负数乘以负数得到正数)
当斜率为正时,在上升侧,我们得到
总的来说,我们可以进行与斜率的负值成比例的步长。或者,我们朝着与斜率相反的方向进行步长。
对于多变量函数,可以遵循类似的思路,但我们有一个方向导数等于特定方向上的斜率。正如我们所见,方向导数在梯度方向上具有最大值,因此这是我们将遵循的方向。因此,我们得到
其中 \(x_t\)、\(x\) 和 \(\nabla{f}\) 都是向量。
但可能会出错
可以证明,在正确的前提条件下,梯度下降算法总是收敛到(局部)最小值。但是,如果这些条件不满足,则不能保证收敛。
其中一个条件与 \(\lambda\) 的大小有关。如果 \(\lambda\) 过大,则可能发生超调,算法可能在最优解周围振荡。
自己试试
梯度下降
ADALINE 学习规则
ADALINE 学习规则可以写成
其中 \((d - o)\) 是误差 \(e\),所以
记住 \(\mathbf{w}\) 是一个向量,代表应用于我们特征向量 \(\mathbf{x}\) 中每个特征的权重,所以我们实际拥有的是(以列向量表示法编写向量)
让我们回顾一下误差函数的梯度。
此外,我们发现以下梯度下降规则可以找到函数 \(f(w)\) 的最小值。
其中 \(\nabla{f}\) 代表 \(f\) 的所有偏导数的向量。
将误差函数的梯度代入梯度下降规则,并考虑到 \(\mathbf{w_{i+1}}\) 和 \(\mathbf{w_i}\) 实际上是向量,我们得到
瞧!我们得到了学习规则。因此,ADALINE 学习规则是最小二乘误差函数上的梯度下降!!!
请注意,我们使用了所有样本的总误差。这与 Rosenblatt 感知器的学习规则不同,后者使用了单个样本的误差。我们称之为批量学习。
总结
ADALINE 感知器的基本公式
基本公式通过对特征进行加权将它们分为两个单独的类别。
我们已经看到,这是通过将特征向量 \(\mathbf{x}\) 和权重向量 \(\mathbf{w}\) 的点积与某个固定值 \(b\) 进行比较来完成的。如果点积大于此固定值,则将它们归类到其中一个类别,并分配标签 1;否则,我们将它们归类到另一个类别,并分配标签 -1。
ADALINE 感知器的行为
由于感知器的公式基本上是一个超平面,我们只能将事物分类到两个线性可分的类别中。第一个类别是超平面以上的东西,第二个类别是超平面以下的东西。
然而,与 Rosenblatt 感知器的区别在于,在学习过程中,即使我们的训练样本可能不是线性可分的,我们也能获得一个最优解,这是 Rosenblatt 感知器学习过程中不可能做到的。
形式化一些概念:一些定义
我们在这里涵盖了很多内容,但没有使用太多关于感知器、神经网络和机器学习的通用术语。数学方面已经有很多术语了,我不想再用更多定义来烦扰您了。
在关于 Rosenblatt 感知器的文章中,我们已经看到了一些定义,这里还有一些其他的定义:
目标函数
目标函数是用于评估优化问题解决方案性能的函数。在我们感知器的上下文中,它是用于评估候选权重向量的函数。
损失函数
目标函数不对我们如何优化做出任何假设(即我们是最大化、最小化还是其他),而损失函数则假设我们要最小化我们的目标函数。因为我们要最小化,所以好的损失函数通常为好结果赋予小值,为坏结果赋予大值。
成本函数
成本函数这个名称通常与损失函数同义。
误差函数
误差函数可以看作是单个训练示例的成本函数。
L1 和 L2 损失
回想一下我们关于平方误差和仅使用差值绝对值的可能性的讨论?误差的绝对值称为L1 损失,平方值称为L2 损失。
批量学习与在线学习
如果我们一次使用所有样本来寻找最优解,我们就称之为批量学习:我们使用一批样本来优化我们的成本函数。这与 Rosenblatt 感知器不同,后者在我们每得到一个新样本后都会重新计算权重。在后一种情况下,我们称之为在线学习。
ADALINE 感知器有什么问题?
虽然 ADALINE 感知器在学习过程方面是对 Rosenblatt 感知器的改进,但在分类能力方面我们并没有获得任何收益:我们仍然只能对事物的两个类别进行分类。
为了能够分类更多类别,我们需要将更多感知器链接在一起:神经网络。
这是下一篇文章的主题……
参考文献
均方误差
关于各种计算某物的平方
关于为什么使用均方误差之和
如果您想深入了解为什么我们使用平方误差和而不是误差绝对值的总和,以下是一些好的阅读材料。
关于凸优化(这是一个庞大的子领域)
最大值、最小值和斜率
维基百科关于最大值和最小值
维基百科关于斜率
对函数斜率的另一种深入探讨
极限、连续性和可微性
关于极限
使用 ε-δ 定义证明极限(这与使用 ε-δ 定义计算极限不同)
说“变为无穷大”是什么意思?
为什么当分母为零时,分子必须为零才能得到有限结果的数学推理。
关于可微性和导数
以下包含一个严格的数学证明,说明为什么连续性是可微性所必需的。
对证明的一些澄清
使用 ε-δ 定义对该证明的另一种看法
关于偏导数
更多关于方向导数
关于梯度
以下是对方向导数和梯度之间关系的非常容易理解的证明:方向导数
它确实利用了所谓的链式法则,我还没有讲到,但您可以在这里阅读:链式法则
一个类似的证明,但不太详细,可以在 方向导数和梯度的推导 和 Math 20C 多变量微积分 - 第 16 讲 中找到。
更多关于导数计算的规则:导数规则
矩阵
维基百科关于矩阵:矩阵
为什么采用这种奇怪的乘法定义方式?这与线性变换有关。
临界点、驻点和费马定理
更多关于驻点:微积分中驻点和临界点有什么区别?
如果您想深入了解 Hessian 矩阵是什么
- https://en.wikipedia.org/wiki/Hessian_matrix
- https://math.stackexchange.com/questions/481060/relation-bewteen-hessian-matrix-and-curvature
- https://math.stackexchange.com/questions/481334/how-does-hessian-matrix-describe-the-local-curvature
费马定理的证明
两种不同的证明方法
- 根据维基百科:费马驻点定理:证明
- 另一个(类似的)证明:费马定理(驻点)的证明
更多关于二阶导数检验和高阶导数检验
证明线性最小二乘法的凸性
梯度下降
一篇我认为正确说明梯度下降的文章:一种改进梯度下降随机梯度下降带重启动的方法
关于为什么减法是更新的正确操作的另一种看法
使用梯度下降学习
可以证明,在某些条件下,梯度下降保证收敛到最小值。请参阅以下参考文献。
ADALINE
维基百科关于 ADALINE:ADALINE
从信号处理的角度看 ADALINE:Adaline 和 Madaline
历史
- 2020 年 8 月 20 日:初始版本