是否适合找到最后一层激活函数的逆并将其应用于目标输出?

人工智能 神经网络 激活函数
2021-11-03 03:34:24

我有一个具有以下结构的神经网络: 目标输出的神经网络:0.8,-0.3

我期待神经网络的特定输出是我训练的目标值。假设上部输出节点的目标值为 0.8,下部输出节点的目标值为 -0.3。

前两层使用的激活函数是 ReLu 或 LeakyReLu,而最后一层使用 atan 作为激活函数。

对于反向传播,而不是调整值以使网络的输出接近 0.8,-0.3。如果我使用 atan 的反函数(它本身就是 tan)来获得“输出层的理想输入乘以权重并通过偏差调整”,是否合适。

0.8 和 -0.3 的棕褐色大约为 0.01396 和 -0.00524。

然后,我的算法将调整网络的权重和偏差,以使输出层的“预激活输出”——基本上是 (sum(output_layer_weight*output_layer's inputs)+output_layer_biases)——接近 0.01396 和 -0.00524。

这个合适吗

4个回答

您的更改的主要区别是允许您将损失函数应用于网络的不同部分。这可能会影响训练。

如果您保持相同的损失函数(例如 MSE),但将其应用于预先转换的值,那么您将改变网络的目标,也许是显着的。这是否是一件好事取决于您需要多少原始损失函数。但是,如果您的原始训练目标是正确的,那么它会导致不同的训练目标通常是一件坏事。如果您选择一个似乎更适合预变换表示的新的任意损失函数,这也是正确的。

如果您设计了一个“正确”的损失函数以使网络的目标保持不变,那么网络的行为将不会发生太大变化——可能根本不会发生变化。但是,在某些情况下,这可能会导致更稳定和/或更快的训练 - 它通常用于分类器以避免需要使用求幂,请参阅TensorFlow 中的tf.nn.softmax_cross_entropy_with_logits,它就是这样做的。

对于上述人工网络,这两种训练场景是相似的。

  • 训练以在应用最后一层的激活函数后收敛到理想输出向量
  • 训练收敛到通过应用形成的向量tan理想输出向量的每个分量的函数,当收敛发生在向量矩阵乘以最后一层的参数之后,最后一层的参数之前atan激活函数

它们之间的区别包括这些。

  • 梯度和相关代码的应用必须适应将反向传播的起始点修改到最终结果之前atan激活函数。
  • 如果两种场景使用相同的损失函数,损失函数的斜率和曲率会有所不同,因此收敛的准确性、速度和可靠性也会有所不同。

我认为你的想法会奏效......很好,但我不一定认为它有任何优势。我实际上还没有尝试过(这也是让您了解它是否有效的最佳方式!),所以我在这里主要是通过最初的想法和直觉。

无论如何,你的想法本质上是从你的学习算法(通常是反向传播)的角度“切断”神经网络的最后一层。无论最后一个隐藏层和输出层之间的权重如何,都将固定为其初始值。最后一个隐藏层实际上可以被视为一个“输出”层,因为你也有固定的目标,你想为它们收敛。

这是否使您的学习过程更好/更快/更容易,或更差/更慢/更难似乎在很大程度上取决于您的最后一个隐藏层和输出层之间的权重是如何初始化的。例如:

  • 如果这些权重被初始化为全零,那么您的“真实”输出层注定总是预测为零,因此您的问题将无法解决。
  • 如果这些权重被初始化以实现恒等函数,那么这将 100% 等同于如果你只是切断最后一层并在传统意义上训练它(即你实际上比你实际上少一层)做)。
  • 如果这些权重是随机初始化的,那么在我看来,您有一个由随机投影组成的后处理步骤。这样的随机投影可能有利于训练(随机投影可用于降维,或者与随后的非线性函数结合,将其他线性函数转换为非线性函数)。

我认为它通常不会比实际拥有一个额外的“真实”、可训练的层和非线性激活函数更好。我怀疑这样一个“不可训练”的额外层有时会比没有任何东西要好,但我认为它通常不会比拥有一个真正的、可训练的层更好。

请注意准确说明您的意思adjust weights and biases of the network so that the "pre-activated output" ... approaches ...

在训练神经网络时,我们会最小化损失函数。这个损失函数决定了0.01396与其他节点的偏差相比,偏差的重要性-0.00524通过向后转换目标标签,您还应该根据反向转换的标签来表达原始损失函数。


在某些情况下可以做的是将最后一层激活函数的输入与损失函数结合起来,并以代数方式简化结果表达式。

例如,这个概念在 Tensorflow 的tf.nn.sigmoid_cross_entropy_with_logits中实现。该函数可用于具有 sigmoid 激活函数和二元交叉熵损失的单个输出的情况(对于具有 softmax 激活函数的多个输出节点的情况也存在类似的函数)。

它不是首先通过 sigmoid 激活传递值,然后计算相对于目标标签的二进制交叉熵,而是结合两个表达式并使用等效但更简单的表达式。

如果你查看这个函数的文档,你会发现超越函数的数量(计算起来很昂贵)可以从

loss(x,z) = z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))

loss(x,z) = max(x, 0) - x * z + log(1 + exp(-abs(x)))

其中x是(sigmoid)非线性的输入(对应于图中绿色节点的输出),也称为“logits”,z是目标标签。