神经网络如何学习的
像下山一样,找到损失函数的最低点。
毫无不懂,神经网络是目前经常使用的最盛行的机器学习技术。所以我以为了解神经网络如何学习是一件十分无心义的事。
为了能够了解神经网络是如何启动学习的,让我们先看看上方的图片:
假设我们把每一层的输入和输入值示意为向量,把权重示意为矩阵,把误差示意为向量,那么我们就失掉了上述的一个神经网络的视图,它只是一系列向量函数的运行。也就是说,函数将向量作为输入,对它们启动一些转换,而后把变换后的向量输入。在上图中,每条线代表一个函数,它可以是一个矩阵乘法加上一个误差向量,也可以是一个激活函数。这些圆示意这些函数作用的向量。
例如,我们从输入向量开局,而后将其输入到第一个函数中,该函数用来计算其各重量的线性组合,而后我们将取得的向量作为输入。而后把这个向量作为激活函数的输入,如此类推,直到我们抵达序列中的最后一个函数。最后一个函数的输入就是神经网络的预测值。
到目前为止,我们曾经探讨过神经网络是如何失掉输入的,这正是我们感兴味的内容。我们知道神经网络只是将它的输入向量传递给一系列函数。然而这些函数要依赖于一些参数:权重和误差。
神经网络如何经过学习失掉这些参数来取得好的预测呢?
让我们回顾一下神经网络实践上是什么:实践上它只是一个函数,是由一个个小函数按顺序陈列组成的大函数。这个函数有一组参数,在一开局,我们并不知道这些参数应该是什么,我们仅仅是随机初始化它们。因此在一开局神经网络会给我们一些随机的值。那么我们如何改良他们呢?在尝试改良它们之前,我们首先须要一种评价神经网络性能的方法。假设我们没有方法权衡模型的好坏,那么我们应该如何改良模型的性能?
为此,我们须要设计一个函数,这个函数将神经网络的预测值和数据集中的实在标签作为输入,将一个代表神经网络性能的数字作为输入。而后我们就可以将学习疑问转化为求函数的最小值或最大值的提升疑问。在机器学习畛域,这个函数通常是用来权衡我们的预测有多蹩脚,因此被称为损失函数。我们的疑问就变成了找到使这个损失函数最小化的神经网络参数。
随机梯度降低算法
你或许很长于从微积分中求函数的最小值。关于这种疑问,通常取函数的梯度,令其等于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)。
综上所述,神经网络的学习环节只不过是一个提升疑问:我们要找到使损失函数最小化的参数。但这不是一件容易的事,有很多关于提升技术的书。而且,除了提升之外,关于给定的义务选用哪种神经网络结构也会发生疑问。
我宿愿这篇文章对你有协助,并十分感谢你的浏览。