提问者:小点点

Feed-前向神经网络线性函数


我是ANN的一个彻头彻尾的新手,在网上通读文章后,我用C实现了一个FF神经网络。在构造函数的参数中,这些是重要的参数:

  1. 隐藏图层数
  2. 每一层的节点数(输入、隐藏、输出)
  3. 每个隐藏层和输出层的激活函数

我想要两个十进制数的输出,通常范围从-xx. xx到xx.xx,但有时可以达到数百。

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

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

我的问题是:

>

  • 我应该只使用f(x)=x作为我的线性函数吗?这常用吗?或者我应该更多地尝试具有函数如f(x)=ax b的系数?

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

    谢谢!


  • 共3个答案

    匿名用户

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

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

    让我们考虑一个具有一个输入“层”、一个隐藏层和一个输出层的网络。该模型中的信息流是:

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

    在这里,我已经将隐藏层的输出表示为h(x),将输出层的输出表示为y(x)。每一层都被构造为其输入的加权和,并结合一些偏移或偏差(这是一个仿射变换:Wx b用于隐藏层,Vh c用于输出层。此外,每一层的仿射输入变换都被一个可能的非线性“激活函数”进一步转换:s(.)用于隐藏层,r(.)用于输出层。

    假设这个网络被用于二分类。如今,对sr使用逻辑函数非常普遍:s(z)=r(z)=(1 e^-z)^-1,但它们的使用方式不同:

    >

  • 对于隐藏层,使用逻辑函数会导致模型的内部表示h(x)x的非线性函数。这比使用线性激活s(z)=z赋予模型更多的表示能力。

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

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

    >

  • 对于隐藏层,使用非线性激活赋予模型更多的表示能力——就像上面的分类器模型一样。

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

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

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

    对于回归,通常使用的损失是均方误差(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])
    

    在这里,我们使用链式规则来扩展损失的导数,以包括网络输出的导数。这个扩展过程一直在模型中“向后”继续,直到链式规则扩展无法进一步应用。

    然而,这是您开始看到输出函数导数应用的地方。对于回归模型,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取导数)。

    无论如何,获取所有导数变得相当复杂,正如您可以看到的那样,只有两层网络(或具有一个隐藏层的网络),但激活函数的导数只是应用链规则同时区分模型整体损失的自然结果。

  • 匿名用户

    f(x)=x是一个非常基本的激活函数,不常用,因为它不能用于对复杂模式进行建模,而复杂模式在大多数数据问题中更常见。常用的激活函数有sigmoid、双曲正切、log logistic、RBF(Gaussian)和Elliot等。对我来说,双曲正切在许多情况下都很有效,我总是从那个开始我的初始模型设置。函数f(x)=ax b与带有偏差和权重的线性函数相同。如果您使用任何随机函数进行激活,您可能无法获得合理的结果。

    反向传播是在训练过程中完成的(即更新神经网络的权重),如果f(x)=x,它只会更新偏置神经元。还有几种类型的反向传播算法,更常用的是“标准反向传播”。你可以在谷歌上轻松找到该算法。

    匿名用户

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

    这也意味着您不计算权重与原始训练值的导数,而只计算与缩放训练值的导数。对于线性映射,这无关紧要(因为df/dx=a),但对于非线性映射,这可能会导致结果的微小差异。一般说来,这是好是坏是不可能的。