点击关注我哦
一篇文章带你了解函数声明时的优雅操作
一、引言
这是我计划的系列优化算法的第1部分,该算法特别用于机器学习和神经网络中的“训练”。在这篇文章中,将介绍Gradient Descent(GD)及其小变化。之后将介绍其他流行的算法,例如:
SGD with momentum
RMSprop
Adam
Genetic Algorithm
下面从的神经网络介绍开始,将解释什么是Loss函数以及“训练”神经网络或任何其他机器学习模型的含义。
二、让我们定义一个神经网络
人工神经网络(ANN)的灵感来自大脑中实际发生的事情。尽管这些类比很松散,但人工神经网络与其生物学的“父母”有几处相似之处。它们由一些神经元组成。因此,让我们看一下单个神经元。
单个感知器
我在上面绘制的神经元将两个数字作为输入。每个输入数字我们将表示为xₖ,其中k代表输入索引。对于每个输入xₖ,神经元分配另一个数字wₖ。由这些数字组成的向量wₖ被称为权重向量。这些权重使每个神经元都变得独特。它们在测试过程中是固定的,但是在培训过程中,我们将更改这些数字以“调整”网络。我将在后面的文章中讨论。正如我上面所说,神经元是一种功能。但是那是什么功能呢?它是权重和输入的线性组合,并在其顶部具有某种非线性函数。让我进一步解释。让我们看一下第一部分-线性部分。
权重和输入的线性组合
上面的公式是我所说的线性组合。我们将接受输入,将它们乘以相应的权重,然后将所有内容相加。结果是一个数字。最后一部分-在其顶部应用某种非线性函数。实际上,当今使用的最流行的非线性甚至比称为整流线性单位(ReLU)的线性函数还要容易。公式如下:
校正的线性单位公式
如果我们的数字大于零,那么我们将按原样使用该数字;如果它小于零,那么我们将采用零。应用于神经元顶部线性的此非线性函数称为**函数。我们必须具有某种非线性函数的原因将在稍后阐明。综上所述,神经元是一个函数,它需要一定数量的输入并输出一个数字-它的**。上面的神经元的最终公式是:
将两个数字作为输入的神经元
如果我们以狗与猫为例,我们将把图像作为输入传递给神经元。在计算机中存储图像的方式是将其表示为数字数组,每个数字表示给定像素的亮度。因此,将其传递给神经元的方法是获取2D数组(在彩色图像的情况下为3D),将其连续展平以获取1D向量并将所有这些数字传递给神经元。
现在是时候定义一个神经网络了。神经网络也是数学函数。它是由一堆相互连接的神经元定义的。一个神经元的输出用作其他神经元的输入。
简单的神经网络
上面定义的网络有5个神经元。这些神经元堆叠在3个完全连接的层中,也就是说,一层中的每个神经元都与下一层中的每个神经元相连。网络中有多少层,每层中有多少神经元以及它们如何连接-所有这些选择都定义了一种架构网络。由2个神经元组成的第一层称为输入层。从某种意义上说,它们不执行任何计算,因此实际上这层神经元并不是我之前所描述的神经元。它们仅用于表示网络的输入。
非线性的需要来自以下事实:我们将神经元连接在一起,并且线性函数之上的线性函数本身就是线性函数。因此,如果没有在每个神经元中应用非线性函数,则神经网络将是线性函数,因此不会比单个神经元强大。最后要注意的是,我们通常希望0到1之间的数字作为输出神经网络的输出,因此我们将其视为概率。例如,在dogs-vs-cats中,我们可以将接近零的数字视为猫,而将接近1的数字视为猫。
为此,我们将对我们的最后一个神经元应用不同的**功能。关于此函数,需要了解的是它返回一个0到1的数字,正是我们想要的。综上所述,我们已经准备好定义一个与我上面绘制的网络相对应的函数:
功能,定义出神经网络
w的上标表示神经元的索引。w的下标表示输入的索引。结果,我们有了某种函数,该函数需要一些数字并输出另一个介于0和1之间的数字。实际上,该函数具有什么公式并不重要,重要的是我们有一些参数化的复杂非线性函数从某种意义上说,权重可以通过更改权重来更改。
三、损失函数
在开始谈论训练之前,剩下唯一要定义的就是损失函数。损失函数是一种函数,它告诉我们神经网络在完成某项任务时的性能如何。以每个训练示例为例,通过网络获取数字,然后从我们要获取的实际数字中减去该数字并平方(因为负数与正数一样差)。
y代表我们想从网络中获得的数字,其中y^实际通过网络传递示例获得的数字i培训示例的索引。让我们再次以dogs-vs-cats为例。我们有一个狗和猫的图片数据集,如果是狗则标为1,如果是猫则标为0。该标签对应于y-这是我们将图像传递给网络时要从网络获取的数字。为了计算损失函数,我们将遍历数据集中的每个训练示例,计算y对于该示例,然后计算上面定义的函数。如果损失函数很大,则我们的网络表现不佳,我们希望数量尽可能少。我们可以重写此公式,将y更改为网络的实际功能,以更深入地了解损失函数与神经网络的联系。