我认为在这里区分用于隐藏层的激活函数和用于输出层的激活函数很有用。在许多模型中,这些激活是不一样的,虽然反向传播算法并不关心这一点,但我认为它在概念上非常重要。
典型的神经网络架构由一个输入“层”、一个或多个隐藏层和一个输出层组成。 (我将输入层放在引号中,因为该层通常没有任何关联的参数;它只是将输入合并到模型中的一种方式。)给定一个输入向量x,信息通过模型向前流动,激活每个依次隐藏层,最后激活输出层。
让我们考虑一个具有一个输入“层”、一个隐藏层和一个输出层的网络。该模型中的信息流为:
x --> h(x) = s(Wx + b) --> y(x) = r(Vh(x) + c)
在这里,我将隐藏层的输出表示为h(x),将输出层的输出表示为y(x)。每一层都构造为其输入的加权和,并结合一些偏移或偏差(这是隐藏层的affine transformation:Wx + b,输出层的Vh + c。此外,每一层的仿射输入变换由一个可能的非线性“激活函数”进一步转换:s(.) 用于隐藏层,r(.) 用于输出层。
示例:分类器
假设这个网络被用于二进制分类。如今,s 和 r 都使用 logistic function 非常普遍:s(z) = r(z) = (1 + e^-z)^-1,但出于不同的原因使用这种方式:
示例:回归
现在让我们假设您正在使用这样的网络进行回归。回归问题需要在开区间 (0, 1) 之外对输出进行建模是很常见的。在这些情况下,使用逻辑函数作为隐藏层s(z) = (1 + e^-z)^-1 的激活是非常常见的,但输出层是线性激活r(z) = z,所以y(x) = Vh(x) + c。使用这些激活函数的原因是:
基本上,这是一种有点冗长的说法,听起来您描述的方法对您的问题有好处 - 对隐藏层使用非线性激活,对输出使用线性激活。
反向传播
反向传播是最广泛使用的优化神经网络参数的方法。基本上反向传播是梯度下降;要使用它,我们需要根据模型中的参数(W、b、V 和 c)制定损失函数。
对于回归,通常使用的损失是均方误差 (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 的导数)。
无论如何,获取所有导数变得相当复杂,正如您可以看到的仅针对两层网络(或具有一个隐藏层的网络),但激活函数的导数只是应用的自然结果区分模型的整体损失时的链式法则。