前馈神经网络线性函数

时间:2015-08-20 02:30:19

标签: c++ neural-network backpropagation

我是ANN的完全新手。通过在线阅读文章后,我在C ++中实现了一个FF神经网络。在构造函数的参数中,这些是重要的参数:

  1. 隐藏层数
  2. 每个层的节点数(输入,隐藏,输出)
  3. 每个隐藏图层和输出图层的激活功能
  4. 我想要一个两位十进制数的输出,通常介于-xx.xx到+ xx.xx之间的任何位置,但有时可以达到数百。

    我想我会使用一个隐藏层并使用sigmoid函数。输出层将是线性函数,因此该值不会被限制为[-1,1]。

    我在网上搜索了许多关于激活函数的初学者资源,但大多数只是提到了log-sigmoid /双曲正切和其他非线性函数。我对线性函数的使用感到非常困惑。

    我的问题是:

    1. 我应该使用f(x)= x作为我的线性函数吗?这是常用的吗?或者我应该尝试使用像f(x)= ax + b?

    2. 这样的函数的系数
    3. 当我进行反向传播时,到目前为止我所阅读的所有内容都提到了使用激活函数的导数来计算增量。如果使用线性函数,这是如何工作的?如果我使用f(x)= x,则导数应为1.因此,我的实现使用1来计算误差并调整权重,就像使用非线性激活函数一样。我完全走错了方向吗?我完全感到困惑,因为我读到的所有资源都没有提到这一点。

    4. 谢谢!

3 个答案:

答案 0 :(得分:1)

我认为在这里区分用于隐藏层的激活函数和用于输出层的激活函数是有用的。在许多模型中,这些激活并不相同,虽然backprop算法并不关心它,但我认为它在概念上非常重要。

规范神经网络架构由输入"层组成,"一个或多个隐藏层和输出层。 (我将输入图层放在吓唬引号中,因为此图层通常没有任何关联参数;它只是将输入合并到模型中的一种方式。)给定输入向量x,信息向前流动通过模型,依次激活每个隐藏层,最后激活输出层。

让我们考虑一个带有一个输入"层的网络,"一个隐藏层和一个输出层。此模型中的信息流是:

x  -->  h(x) = s(Wx + b)  -->  y(x) = r(Vh(x) + c)

在这里,我将隐藏图层的输出表示为h(x),输出图层的输出表示为y(x)。每个图层构造为其输入的加权和,并结合一些偏移或偏差(隐藏图层为affine transformationWx + b,输出图层为Vh + c。 ,每个图层的仿射输入变换进一步由隐藏层的非线性激活函数":s(.)和输出图层的r(.)进行转换。

示例:分类器

假设此网络用于二进制分类。如今对srs(z) = r(z) = (1 + e^-z)^-1使用logistic function非常常见,但出于不同原因使用这种方式:

  • 对于隐藏图层,使用逻辑函数会导致模型的内部表示h(x)成为x的非线性函数。这使得模型比使用线性激活s(z) = z更具代表性。

  • 对于输出层,逻辑函数确保模型的输出y(x)可以被视为伯努利随机变量的概率。

示例:回归

现在让我们假设您正在使用这样的网络进行回归。回归问题需要在开放区间(0,1)之外建模输出,这是很常见的。在这些情况下,使用逻辑函数激活隐藏图层s(z) = (1 + e^-z)^-1非常常见,但输出图层线性激活r(z) = z,因此y(x) = Vh(x) + c。使用这些激活功能的原因是:

  • 对于隐藏层,使用非线性激活为模型提供更具代表性的能力 - 就像上面的分类器模型一样。

  • 对于输出图层,线性激活可确保模型可以实现任何范围的输出值。本质上,模型的输出是隐藏层所代表的任何内容的基本仿射变换(缩放,旋转,倾斜和/或平移)。

基本上,这是一种有点冗长的方式,说它听起来像你描述的方法对你的问题有好处 - 对隐藏层使用非线性激活,对输出使用线性激活。

Backprop

反向传播是最广泛使用的优化神经网络参数的方法。基本上backprop是梯度下降;要使用它,我们需要制定一个损失,该损失是我们模型中参数的函数(WbVc)。< / p>

对于回归,通常使用的损失是均方误差(MSE):

L(W, b, V, c) = 1/n * sum i = 1..n (y(X[i]) - t[i])^2

在此,我假设我们可以访问由n输入X[i]和相应目标值t[i]组成的训练数据集。网络输出y计算为其输入X[i]的函数,结果与t[i]进行比较 - 任何差异都被平方并累积到总损失中。

为了优化模型的参数,我们需要得到损失的导数并将其设置为零。因此,从这种损失的衍生物中得到类似的东西:

dL/dW = 1/n sum i = 1..n 2(y(X[i]) - t[i]) y'(X[i])

在这里,我们使用链式规则扩展损失的导数,以包括网络输出的衍生物。这种扩张过程一直在继续&#34;落后&#34;通过模型直到链规则扩展无法再进一步应用。

然而,您可以从这里开始看到输出函数派生的应用。对于回归模型y(x) = Vh(x) + c,所以y'(x) = Vh'(x)。所以:

dL/dW = 1/n sum i = 1..n 2(y(X[i]) - t[i]) Vh'(X[i])

但是h(x) = s(Wx + b)所以h'(x) = xs'(Wx + b)(请记住,我们在W方面采取衍生工具)。

无论如何,取得所有衍生品变得相当复杂,正如你所看到的只是一个双层网络(或一个隐藏层的网络),但激活函数的衍生物只是应用的自然结果链式规则,同时区分模型的整体损失。

答案 1 :(得分:0)

f(x) = x是一个非常基本的激活函数,并不常用,因为它不能用于模拟复杂模式,这在大多数数据问题中更常见。常用的激活函数是sigmoid,双曲正切,log逻辑,RBF(高斯)和Elliot等。对我来说,双曲正切在很多场合都运作良好,我总是用那个开始我的初始模型设置。函数f(x)= ax + b与具有偏差和权重的线性函数相同。如果您使用任何随机函数进行激活,您可能无法获得明智的结果。

在训练期间完成反向传播(即更新神经网络的权重),并且在f(x)= x的情况下,它将仅更新偏置神经元。还有几种类型的反向传播算法,具有标准的反向传播算法。更常用的。您可以在Google上轻松找到该算法。

答案 2 :(得分:0)

定义一个可逆函数f(x),以便-1f_inv(y)。任何选择都可行,因为此功能应用于受过训练的网络部分之外。

这也意味着您不会计算权重与原始训练值的导数,而只是计算比例训练值。对于线性映射,这是无关紧要的(如df/dx=a),但它可能会导致非线性映射的结果略有不同。一般来说,这是好还是坏都是不可能的。