神经网络- Keras/TensorFlow中的非符号损失



对于一个大学项目,我想训练一个(模拟的)机器人在给定位置和速度的情况下击球。首先要尝试的是策略梯度:我有一个参数轨迹生成器。对于每个训练位置,我通过我的网络输入位置,将轨迹发送到模拟器并获得奖励。我现在可以用它作为损失,对梯度进行采样,反馈并更新我的网络的权重,这样下次它就会做得更好。

因此,我们的目标是学习从位置到轨迹权重的映射。当使用全明星计算图库,如Theano和Tensorflow(或Keras)时,我有一个问题,我不知道如何实际建模该系统。我想先有标准的全连接层,然后输出轨迹权值。但是我如何计算损失以便它可以使用反向支撑呢?

在自定义损失函数中,我会忽略/不指定真实标签,运行模拟器并返回它给出的损失。但从我读到的,你需要返回一个Theano/Tensorflow函数,这是象征性的。我的损失相当复杂,所以我不想把它从模拟器转移到网络。我该如何实现呢?接下来的问题是如何区分损失,因为我可能需要采样来获得梯度。

我以前也遇到过类似的问题。

有一个损失函数,它严重依赖于优化的C代码和第三方库。无法将其移植到tensorflow。

但是我们仍然想训练一个张sorflow图来从当前设置中创建转向信号。

https://nbviewer.jupyter.org/gist/lhk/5943fa09922693a0fbbbf8dc9d1b05c0

下面是对其背后思想的更详细的描述:

图的训练是一个优化问题,所以你肯定需要对损失求导。挑战在于将tensorflow中的解析导数和损失的数值导数混合在一起。

你需要这个设置

    输入我
  • 输出P
  • 图G将I映射到P, P = G(I)
  • 添加与P形状相同的常数,P = C * G(I)
  • 损失函数L

训练tensorflow图与反向传播工作。对于图中的每个参数X,计算如下导数

dL/dX = dL/dP * dP/dX

第二部分,dP/dX是免费的通过建立张sorflow图。但是我们仍然需要对损失求导。

现在有一个技巧

我们希望tensorflow基于正确的梯度dL/dP * dP/dX来更新X但是我们不能用tensorflow来计算dL/dP,因为那不是一个tensorflow图。

我们将使用p ~ = p * C,

的导数是dP~/dX = dP/dX * C

所以如果我们设置C为dL/dP,我们就得到了正确的梯度。

我们只需要用数值梯度来估计C。

算法如下:

  • 设置你的图形,用常数C乘以输出
  • 输入1为常数,计算前向通,得到预测P
  • 计算P
  • 的损失
  • 计算P
  • 数值导数
  • 将数值导数作为C输入,计算反向传递,更新参数

相关内容

  • 没有找到相关文章

最新更新