前馈神经网络线性函数

Feed-Forward Neural Network Linear Function

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

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

我想要输出两个十进制数,通常介于 -xx.xx 到 +xx.xx 之间,但有时可以达到数百位。

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

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

我的问题是:

  1. 我应该只使用 f(x) = x 作为我的线性函数吗?这个常用吗?或者我应该用 f(x) = ax + b 这样的函数对系数进行更多实验?

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

谢谢!

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

反向传播在训练期间完成(即更新神经网络的权重),如果 f(x)=x,它只会更新偏置神经元。还有几种类型的反向传播算法,其中 'Standard back-propagation' 更常用。您可以在 Google.

上轻松找到该算法

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

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

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

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

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

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

在这里,我将隐藏层的输出表示为h(x),将输出层的输出表示为y(x)。每个层都构造为其输入的加权和,并结合一些偏移量或偏差(这是一个affine transformation:隐藏层的Wx + b,输出层的Vh + c。另外,每一层的仿射输入变换进一步由一个可能的非线性"activation function"变换:隐藏层s(.),输出层r(.)

示例:分类器

让我们假设这个网络被用于二进制分类。如今,sr 都使用 logistic function 非常普遍:s(z) = r(z) = (1 + e^-z)^-1,但出于不同的原因以这种方式使用它们:

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

  • 对于输出层,logistic函数保证了模型的输出y(x)可以看作是一个伯努利随机变量的概率

示例:回归

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

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

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

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

反向传播

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

这里我们使用链式法则将损失的导数扩展到包括网络输出的导数。这个扩展过程一直持续 "backward" 通过模型,直到无法进一步应用链规则扩展。

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

无论如何,对所有的导数进行求导变得相当复杂,正如你可以看到只有一个两层网络(或一个隐藏层的网络),但激活函数的导数只是一个自然结果在区分模型的整体损失时应用链式法则。