我对机器学习和Python比较陌生。
我有一个系统,它由一个NN组成,其输出被馈送到一个未知的非线性函数F,例如一些硬件。想法是将NN训练为该未知非线性函数F的逆F ^(-1)。这意味着在F的输出上计算出损耗L。但是,反向传播不能直接用于计算因为F的梯度也不是已知的,所以梯度和更新NN权重。有什么方法可以使用未直接连接到NN的损失函数L来计算TensorFlow或PyTorch中的梯度吗?还是要承受其他软件(Matlab,C等)造成的损失,将其用于反向传播?
请让我知道我的问题不够具体。
答案 0 :(得分:2)
AFAIK,所有现代深度学习软件包(pytorch,tensorflow,keras等)都在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()