每个节点的值究竟是如何确定的?整个网络的公式是一样的吗?

人工智能 神经网络
2021-11-08 02:35:04

当谈到神经网络时,通常只解释它们所做的抽象任务,例如检测图像中的数字。我从根本上不明白引擎盖下发生了什么。

有向图似乎有一个共同的结构,每个节点都有值。一些节点是输入节点。可以设置它们的值。然后根据沿图边缘的值计算后续节点的值,直到设置输出节点的值,这可以解释为结果。

每个节点的值究竟是如何确定的?我假设某个公式与每个节点相关联,该公式将所有传入节点作为输入来计算节点的值。使用什么公式?整个网络的公式是否相同?

然后我听说必须训练一个网络。我假设这样的训练将是为用于确定节点值的公式的系数分配值的过程。那是对的吗?

通俗地说,使神经网络工作的基本原理是什么?

3个回答

我将过度简化 ANN 以指出它们是如何工作的。示例可能不是 100% 准确的。

在最简单的形式中,网络使用从基本事实中提取的先验信息进行训练。这基本上意味着 ANN 使用输入和输出之间的关系。

例如,如果您要对灌木和树木进行分类,输入之一可能是高度,另一个可能是树的宽度。现在,如果您只有输入和输出层,增加高度意味着增加对象成为树的机会。因此,输入高度将具有与树木输出相关的正权重和与灌木输出相关的负权重。然而,随着植物变宽,它成为灌木的机会也会增加。较高的灌木比较短的灌木更宽。因此,输入权重将具有与灌木输出相关的正权重。最后,成为一棵树的机会不受宽度的影响,因此输入和输出之间的权重接近于 0。该网络将像线性判别分类器一样有效地工作。

现在,您可以使用一种学习算法来尝试调整权重,以便在提供一系列输入时输出正确,而不是手动分配权重。理想情况下,这个训练算法应该达到我们在前面的例子中得出的结论。大多数训练算法都是递归的。他们多次提供输入,简单来说,他们通过增加权重来奖励正确的路径,并惩罚导致错误答案的路径。

当系统中使用隐藏层时,它们将能够在更高的程度上关联输入。因此,随着层数的增加,ANN 可以更好地学习输入集。然而,这并不意味着它会变得更好。如果 ANN 过拟合输入集,它将受到数据集中随机噪声的影响。这个问题通常被称为记忆。有一些学习算法试图最小化记忆并最大化泛化能力。但最终,训练样本的数量应该足够高,这样 ANN 就不会过度拟合数据。

我会尝试做一些直观的事情;神经网络中的每个节点称为神经元。要了解神经网络背后发生的事情,您只需要真正了解单个神经元。

现在每个神经元都有一组输入(其他神经元;它们也可能是整个网络的输入),并且每个输入都有一个与之相关的权重。每次使用网络时,每个神经元都会将其输出计算为通过某个门的输入的加权和(“激活函数”,一种旨在获得特定行为的数学函数。例如,sigmoid AF 接受任意大小的输入并将其转换为 [0, 1] 范围内的输出。)显然,这是从神经网络的输入驱动的,因此在用作其输入的所有神经元都完成相同操作之前,没有神经元正在计算其输出。

当您引用节点的值时;没有单一的价值。每个神经元都有几个与之相关的权重,因为它可能是其他几个神经元的输入,并且每个神经元都为其分配不同的权重。取而代之的是,最好将神经网络视为带有特定激活函数标记的节点(神经元)和带有特定权重标记的边(输入/输出连接)的有向图。虽然神经网络中使用的结构和激活函数是拓扑设计的问题,但有许多算法可用于为特定拓扑设计 ANN。

最常用的(可能也是最容易解释的)是反向传播。在伪外行术语中,我们从网络中所有边缘的随机权重开始。然后,我们为训练集(一组已知的输入/输出对)计算网络的输出。通过仔细选择激活函数,可以区分关于神经网络权重的误差(计算类似于预期输出减去每个输入/输出对的 ANN 的实际输出)。这允许我们计算每个权重的梯度;我们可以移动权重以减少训练集上的误差的方向。通过这样做直到我们找到一个最优值(所有运动都会增加误差的点),我们可以为那个特定的 ANN 找到一些“好的”权重配置。

这里有一个很好的 BP 教程http://www.cse.unsw.edu.au/~cs9417ml/MLP2/BackPropagation.html与之相关的图表很好地解释了我的观点: 在此处输入图像描述

根据我的经验,这是一个初学者。

对于一个简单的神经网络,例如:

  • 2 个节点,用字母i和表示j
  • x表示节点的输出,
  • w表示连接两个节点的权重。

给定节点的输出具有以下形式。

在此处输入图像描述

可以翻译

将激活函数 (lambda) 应用于前一层每个节点的值与将它们连接到当前节点的权重的乘积之和。

这个激活函数可以是

在此处输入图像描述

(这个特殊函数称为sigmoid函数。)

如果您在 GeoGebra 中输入该函数,您将得到以下曲线

在此处输入图像描述

显然,这个激活函数接受任何输入并输出一个介于 0 和 1 之间的唯一数字。由于函数变得越来越大,因此保留了顺序。

在训练阶段,当网络到达终止时,我们计算网络的总误差,它类似于训练集中的输出与我们从网络获得的输出之间的差异。

显然,每次输出提高时,该值都会降低。

对于网络的每个权重,都会计算一个梯度。这个梯度是一个数字,可以理解为在权重上添加一个小数字对总误差的影响。

这个梯度可以从网络结构派生的公式中计算出来,也可以像尝试将权重相加一样简单地计算出来,看看会发生什么。

  • 如果梯度是正的,这意味着增加权重会增加总误差,我们应该减去,
  • 如果梯度为负,则意味着增加权重会导致较小的总误差,我们应该增加。

通过大量重复此操作,总误差将达到最小值。

最后一件事我不知道,不要忘记在这个过程的迭代之间切换输入。如果你不这样做,你的网络只会针对它处理的最后一个项目进行适当的训练。

我希望这有一点帮助。请在评论中写下您的建议。正如您可能猜到的那样,我不是以英语为母语的人。

我推荐阅读 Michael Taylor的《Neural Networks, A Visual Introduction For Beginners 》。