关于机器学习:神经网络如何学习的

32次阅读

共计 3231 个字符,预计需要花费 9 分钟才能阅读完成。

简介: 毫无疑问,神经网络是目前应用的最风行的机器学习技术。所以我认为理解神经网络如何学习是一件十分有意义的事。

像下山一样,找到损失函数的最低点。

毫无疑问,神经网络是目前应用的最风行的机器学习技术。所以我认为理解神经网络如何学习是一件十分有意义的事。

为了可能了解神经网络是如何进行学习的,让咱们先看看上面的图片:

如果咱们把每一层的输出和输入值示意为向量,把权重示意为矩阵,把误差示意为向量,那么咱们就失去了上述的一个神经网络的视图,它只是一系列向量函数的利用。也就是说,函数将向量作为输出,对它们进行一些转换,而后把变换后的向量输入。在上图中,每条线代表一个函数,它能够是一个矩阵乘法加上一个误差向量,也能够是一个激活函数。这些圆示意这些函数作用的向量。

例如,咱们从输出向量开始,而后将其输出到第一个函数中,该函数用来计算其各重量的线性组合,而后咱们将取得的向量作为输入。而后把这个向量作为激活函数的输出,如此类推,直到咱们达到序列中的最初一个函数。最初一个函数的输入就是神经网络的预测值。

到目前为止,咱们曾经探讨过神经网络是如何失去输入的,这正是咱们感兴趣的内容。咱们晓得神经网络只是将它的输出向量传递给一系列函数。然而这些函数要依赖于一些参数:权重和误差。

神经网络如何通过学习失去这些参数来取得好的预测呢?

让咱们回忆一下神经网络实际上是什么:实际上它只是一个函数,是由一个个小函数按顺序排列组成的大函数。这个函数有一组参数,在一开始,咱们并不知道这些参数应该是什么,咱们仅仅是随机初始化它们。因而在一开始神经网络会给咱们一些随机的值。那么咱们如何改良他们呢? 在尝试改良它们之前,咱们首先须要一种评估神经网络性能的办法。如果咱们没有方法掂量模型的好坏,那么咱们应该如何改良模型的性能?

为此,咱们须要设计一个函数,这个函数将神经网络的预测值和数据集中的实在标签作为输出,将一个代表神经网络性能的数字作为输入。而后咱们就能够将学习问题转化为求函数的最小值或最大值的优化问题。在机器学习畛域,这个函数通常是用来掂量咱们的预测有多蹩脚,因而被称为损失函数。咱们的问题就变成了找到使这个损失函数最小化的神经网络参数。

随机梯度降落算法

你可能很善于从微积分中求函数的最小值。对于这种问题,通常取函数的梯度,令其等于 0,求出所有的解(也称为临界点),而后从中抉择使函数值最小的那一个。这就是全局最小值。咱们能做同样的事件来最小化咱们的损失函数吗? 事实上是行不通的,次要的问题是神经网络的损失函数并不像微积分课本中常见的那样简洁明了。它是一个极其简单的函数,有数千个、几十万个甚至数百万个参数。有时甚至不可能找到一个解决问题的收敛解。这个问题通常是通过迭代的办法来解决的,这些办法并不试图找到一个间接的解,而是从一个随机的解开始,并在每次迭代中尝试改良一点。最终,通过大量的迭代,咱们将失去一个相当好的解决方案。

其中一种迭代办法是梯度降落法。你可能晓得,一个函数的梯度给出了最陡的回升方向,如果咱们取梯度的负值,它会给咱们最陡降落的方向,也就是咱们能够在这个方向上最快地达到最小值。因而,在每一次迭代 (也能够将其称作一次训练轮次) 时,咱们计算损失函数的梯度,并从旧参数中减去它 (乘以一个称为学习率的因子) 以失去神经网络的新参数。

其中 θ(theta)示意蕴含神经网络所有参数的向量。

在规范梯度降落法中,梯度是将整个数据集思考进来并进行计算的。通常这是不可取的,因为该计算可能是低廉的。在实践中,数据集被随机分成多个块,这些块被称为批。对每个批进行更新。这种办法就叫做随机梯度降落。

下面的更新规定在每一步只思考在以后地位计算的梯度。这样,在损失函数曲面上静止的点的轨迹对任何变动都很敏感。有时咱们可能想让这条轨迹更持重。为此,咱们应用了一个受物理学启发的概念:动量。咱们的想法是,当咱们进行更新时,也思考到以前的更新,这会累积成一个变量 Δθ。如果在同一个方向上进行更多的更新,那么咱们将 ” 更快 ” 地朝这个方向后退,并且不会因为任何小的扰动而扭转咱们的轨迹。把它设想成速度。

其中 α 是非负因子,它能够决定旧梯度到底能够奉献多少值。当它为 0 时,咱们不应用动量。

反向流传算法

咱们如何计算梯度呢? 回忆一下神经网络和损失函数,它们只是一个函数的组合。那么如何计算复合函数的偏导数呢? 咱们能够应用链式法则。让咱们看看上面的图片:

如果咱们要计算损失函数对第一层权重参数的偏导数: 咱们首先让第一个线性表达式对权重参数求偏导, 而后用这个后果乘高低一个函数 (也就是激活函数) 对于它后面函数输入内容的偏导数,始终执行这个操作, 直到咱们乘上损失函数对于最初一个激活函数的偏导数。那如果咱们想要计算对第二层的权重参数求的导数呢? 咱们必须做同样的过程,然而这次咱们从第二个线性组合函数对权重参数求导数开始,而后,咱们要乘的其余项在计算第一层权重的导数时也呈现了。所以,与其一遍又一遍地计算这些术语,咱们将从后向前计算,因而得名为反向流传算法。

咱们将首先计算出损失函数对于神经网络输入层的偏导数,而后通过放弃导数的运行乘积将这些导数反向流传到第一层。须要留神的是,咱们有两种导数:一种是函数对于它输出内容的导数。咱们把它们乘以导数的乘积,目标是跟踪神经网络从输入层到以后层神经元节点的误差。第二类导数是对于参数的,这类导数是咱们用来优化参数的。咱们不把它与其它导数的乘积相乘,相同,咱们将它们存储为梯度的一部分,稍后咱们将应用它来更新参数。

所以,在反向流传时,当咱们遇到没有可学习参数的函数时(比方激活函数),咱们只取第一种的导数,只是为了反向流传误差。然而, 当咱们遇到的函数有可学的参数(如线性组合, 有权重和偏差),那么咱们取这两种导数: 第一种是用误差流传的输出,第二种是加权和偏差,并将它们作为梯度的一部分来存储。整个过程,咱们从损失函数开始,直到咱们达到第一层,在这一层咱们没有任何想要增加到梯度中的可学习参数。这就是反向流传算法。

Softmax 激活和穿插熵损失函数

分类工作中,最初一层罕用的激活函数是 softmax 函数。

softmax 函数将其输出向量转换为概率分布。从上图中能够看到 softmax 的输入的向量元素都是正的,它们的和是 1。当咱们应用 softmax 激活时,咱们在神经网络最初一层创立与数据集中类数量相等的节点,并且 softmax 激活函数将给出在可能的类上的概率分布。因而,神经网络的输入将会把输出向量属于每一个可能类的概率输入给咱们,咱们抉择概率最高的类作为神经网络的预测。

当把 softmax 函数作为输入层的激活函数时,通常应用穿插熵损失作为损失函数。穿插熵损失掂量两个概率分布的类似水平。咱们能够将输出值 x 的实在标签示意为一个概率分布:其中实在类标签的概率为 1,其余类标签的概率为 0。标签的这种示意也被称为一个热编码。而后咱们用穿插熵来掂量网络的预测概率分布与实在概率分布的靠近水平。

其中 y 是真标签的一个热编码,y hat 是预测的概率分布,yi,yi hat 是这些向量的元素。

如果预测的概率分布靠近实在标签的一个热编码,那么损失函数的值将靠近于 0。否则如果它们相差很大,损失函数的值可能会无限大。

均方误差损失函数

softmax 激活和穿插熵损失次要用于分类工作,而神经网络只需在最初一层应用适当的损失函数和激活函数就能够很容易地适应回归工作。例如,如果咱们没有类标签作为根据,咱们有一个咱们想要近似的数字列表,咱们能够应用均方误差 (简称 MSE) 损失函数。通常,当咱们应用 MSE 损失函数时,咱们在最初一层应用身份激活(即 f(x)=x)。

综上所述,神经网络的学习过程只不过是一个优化问题:咱们要找到使损失函数最小化的参数。但这不是一件容易的事,有很多对于优化技术的书。而且,除了优化之外,对于给定的工作抉择哪种神经网络构造也会呈现问题。

我心愿这篇文章对你有帮忙,并非常感激你的浏览。

本文作者:deephub

正文完
 0