不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

本文将帮助你理解我们为什么需要学习率,以及它对于训练人工神经网络是否有用。

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

介绍

对于新手而言,学习人工神经网络中遇到的障碍之一是学习率。作者多次被问及学习率对人工神经网络(ANN)训练的影响。以及为什么我们要使用学习率?学习率的最大值是多少?在本文中,作者将尝试通过举例来展示如何利用学习率来训练ANN。在使用学习率之前,作者将先用Python代码来解释示例。

示例

一个非常简单的示例可以让我们摆脱一些不必要的因素,让我们只关注学习率。在示例中,单个数字输入将被应用于单层感知器。如果输入为250或更小,则其值将输出返回。如果输入大于250,那么它将被限制为250。图1显示了一个包含6个样本用于训练的表格。

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

ANN架构

所使用的ANN的体系结构如图2所示。只有输入和输出层。输入层只有一个神经元用于我们的单个输入。输出层只有一个神经元用于生成输出。输出层神经元负责将输入映射到正确的输出中。需要强调的是,输出层神经元也存在一个偏值,其权重为+1。输入的权重为W。

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

激活函数

本示例中使用的激活函数的公式和图形如图3所示。当输入小于或等于250时,输出将与输入相同。否则,它将被限制为250。

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

使用Python实现

实现整个网络的Python代码如下所示。我们将对这些内容进行讨论,直到尽可能把它简化为止,再然后将重点放在改变学习率,以了解它如何影响网络的训练。

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

第17行和第18行负责创建两个数组(inputs和desired_output),其中包含前一个表中显示的训练输入和输出数据。根据所使用的激活函数,每个输入都会有一个输出。

第16行创建网络权重数组。只有两个权重:一个用于偏差,另一个表示输入。它们被随机初始化为0.05的偏差和0.1的输入。

激活函数本身是使用第3行到第7行的activation_function(inpt)方法实现的。它支持参数函数的输入,并返回(一个)预期输出的值。因为在预测中可能有错误,所以我们需要测量这个错误来知道我们距离正确的预测有多远。出于这个原因,在第9行到第10行中实施了一个称为prediction_error(期望的,预期的)的方法,它支持两个输出:期望和实际的输出。对了,该方法只计算每个期望输出和实际输出之间的绝对差值。

如果有预测错误怎么办?在这种情况下,我们必须对网络进行更改。但究竟要改变什么?当然是网络的权重。为了更新网络权重,有一种方法称为update_weights(权重,预测值,idx),定义第13行到第14行。它接受三个输入:旧的权重,预测输出和具有错误预测的输入索引。用于更新权重的公式如图4所示。

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

该公式使用当前步骤(n)的权重来生成下一步(n + 1)的权重。 这个公式是我们将用来了解学习率是如何影响学习过程的。

最后,我们需要将所有这些连接在一起以进行网络学习。这是通过使用从第20行到第31行定义的training_loop(inpt,weights)方法完成的。它会进入一个训练循环。该循环用于将输入映射到其输出,并且使用预测误差最小的。

该循环执行三个操作:

1.输出预测。

2.误差计算。

3.更新权重。

在了解了该示例及其Python代码的概念之后,让我们开始展示如何使用学习率以获得最佳结果。

学习率

在前面讨论的例子中,第13行使用了学习率权重更新方程。首先,让我们假设还没有使用学习率的情况。公式如下:

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

让我们看看去掉学习率的效果。在训练循环的迭代中,网络具有以下输入(b = 0.05且W = 0.1,输入= 60,并且期望输出= 60)。

第25行中的激活函数的预期输出是activation_function(0.05(+1)+ 0.1(60))。预测的输出是6.05。

在第26行中,预测误差将通过获得期望和预测输出之间的差异来计算。误差为abs(60-6.05)= 53.95。

然后在第27行,权重将根据上述公式得到更新。新权重为[0.05,0.1] +(53.95)* 60 = [0.05,0.1] + 3237 = [3237.05,3327.1]。

看起来新的权重与以前的权重差别很大。每个权重增加了3,237,这太大了。但让我们继续做下一个预测。

在这次迭代中,网络将应用这些输入:(b = 3237.05,W = 3237.1,输入= 40,期望输出= 40)。预期的输出是activation_function((3237.05 + 3237.1(40))= 250。预测误差是abs(40-250)= 210。误差非常大。它大于先前的误差。因此我们必须再次更新权重。根据上面的公式,新权重为[3237.05,3237.1] +( - 210)* 40 = [3237.05,3237.1] + -8400 = [-5162.95,-5162.9]。

图5所示的表格总结了前三次迭代的结果。

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

随着我们进行更多的迭代,结果明显变得更糟。权重的大小正在迅速变化,有时还会随着符号的变化而变化。它们正从非常大的正值转向非常大的负值。我们怎样才能阻止这种权重的突然变化? 如何缩小权重的更新值?

这里需要补充的是,如果我们从前面的表中查看权重变化的值,会发现这个值是非常大的。这意味着网络以较快的速度改变其权重。这就像某人在短时间内做出了大动作。就好比,这个人在远东地区,然后在很短的时间之后,这个人出现在了最远的西部。而我们只需要让它变得慢一点。

如果我们能够缩小这个值,那么一切都会好起来。

回到生成这个值的代码部分,它看起来是由更新方程式产生的。 如图:

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

我们可以通过将其乘以诸如0.1的小值来缩放这部分。因此,与其在第一次迭代中生成3237.0作为更新值,不如将其减少到323.7。我们甚至可以通过将比例值减小到0.001来将这个值缩小到一个更小的值。使用0.001,该值将仅为3.327。

而这个比例值就是学习率。选择较小的学习率值会使权重更新更小,并避免其突然变化。因为当值变得更大时,变化就会更快并因此导致下面的计算难以进行。

学习率的最大值是多少?

没有价值就是学习率的最佳价值。学习率是一个超参数。超参数的值由实验确定。我们尝试不同的值并使用可以获得最佳结果的值。

测试网络

对于我们的问题,作者推断出.00001的值可以使其正常工作。以这种学习率训练网络后,我们可以进行一个测试。图6中的表格显示了4个新测试样本的预测结果。使用学习率后,结果要好得多。

不要再小瞧学习率了,用学习率来训练ANN告诉你它的价值

ann