【问题标题】:TensorFlow / PyTorch: Gradient for loss which is measured externallyTensorFlow / PyTorch:外部测量的损失梯度
【发布时间】:2020-05-03 02:14:39
【问题描述】:

我对机器学习和 Python 比较陌生。

我有一个系统,它由一个 NN 组成,其输出被馈送到一个未知的非线性函数 F,例如一些硬件。这个想法是将NN训练为该未知非线性函数F的逆F^(-1)。这意味着在F的输出处计算损失L。但是,不能以直接的方式使用反向传播来计算梯度并更新 NN 权重,因为 F 的梯度也不知道。

有什么方法可以使用不直接连接到 NN 的损失函数 L 来计算 TensorFlow 或 PyTorch 中的梯度?或者要承担使用任何其他软件(Matlab、C 等)获得的损失,将其用于反向传播?

  • 据我所知,Keras keras.backend.gradients 只允许计算连接权重的梯度,否则梯度为零或 NoneType。
  • 我了解了 TensorFlow 中的 stop_gradient() 函数。但我不确定这是否是我想要的。它允许在反向传播期间不计算某些变量的梯度。但我认为操作 F 无论如何都不会被解释为变量。
  • 我能否定义任意损失函数(包括硬件测量)并将其用于 TensorFlow 中的反向传播,或者它是否也需要连接到图?

如果我的问题不够具体,请告诉我。

【问题讨论】:

    标签: tensorflow neural-network pytorch gradient backpropagation


    【解决方案1】:

    AFAIK,所有现代深度学习包( 等)都在使用gradient descent(及其许多变体)来训练网络。
    顾名思义,你不能在没有梯度的情况下进行梯度下降。

    但是,您可能会通过从稍微不同的角度看待问题来规避“给定”函数F 的“不可微分性”:
    您正在尝试学习一个模型 M 来“对抗”F 的效果。因此,您可以访问 F(但不能访问其梯度)和一组代表性输入 X={x_0, x_1, ... x_n}
    对于每个示例x_i,您可以计算y_i = F(x_i),您的最终目标是拥有一个模型M,给定y_i 将输出x_i
    因此,您可以将y_i 视为模型的输入,并计算产生它的M(y_i)x_i 之间的损失。这样您就不需要通过“黑匣子”F 计算梯度。

    伪代码如下所示:

    for x in examples:
      y = F(x)  # applying F on x - getting only output WITHOUT any gradients
      pred = M(y)  # apply the trainable model M to the output of F
      loss = ||x - pred||  # loss will propagate gradients through M and stop at F
      loss.backward()
    

    【讨论】:

    • 你的建议有效,我已经实现了,但它有一个缺点,限制了它的准确性。您建议在 F 的输出处放置一个 NN,即使用 y 作为输入,使用 x 作为标签。但是,在我的系统中,由于不同的原因,我需要在未知函数 F 之前而不是在它之后的 NN。如果我像在伪代码中一样训练 NN,然后将其放在 F 前面,我将交换非线性元素的顺序,如果 M 不完全是 F 的倒数,则系统性能会因为非交换属性而降低非线性算子。
    猜你喜欢
    • 1970-01-01
    • 2018-04-13
    • 2022-01-07
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2021-11-25
    相关资源
    最近更新 更多