TensorFlow / PyTorch:外部测量的损耗梯度

时间:2020-01-16 09:08:42

标签: tensorflow neural-network pytorch gradient backpropagation

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

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

有什么方法可以使用未直接连接到NN的损失函数L来计算TensorFlow或PyTorch中的梯度吗?还是要承受其他软件(Matlab,C等)造成的损失,将其用于反向传播?

  • 据我所知,Keras keras.backend.gradients仅允许计算连接权重的梯度,否则该梯度将为零或NoneType。
  • 我阅读了TensorFlow中的stop_gradient()函数。但是我不确定这是否是我想要的。它允许在反向传播期间不计算某些变量的梯度。但是我认为操作F始终不能解释为变量。
  • 我可以定义任意损失函数(包括硬件测量值)并将其用于TensorFlow中的反向传播吗?还是需要将其连接到图形?

请让我知道我的问题不够具体。

1 个答案:

答案 0 :(得分:2)

AFAIK,所有现代深度学习软件包(等)都在gradient descent(及其许多变体)上进行中继以训练网络。< br /> 顾名思义,您不能没有梯度就进行梯度下降。

但是,您可以从稍微不同的角度看问题,从而规避“给定”功能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()