Keras / TensorFlow

时间:2016-08-11 12:39:27

标签: neural-network tensorflow theano keras gradient-descent

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

因此,目标是学习从位置到轨迹权重的映射。当使用像Theano和Tensorflow(或Keras)这样的全明星计算图库时,我遇到的问题是我不知道如何对该系统进行实际建模。我想首先使用标准的完全连接的层,然后输出是我的轨迹权重。但是,我如何实际计算损失,以便它可以使用backprop?

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

1 个答案:

答案 0 :(得分:0)

我前段时间遇到了类似的问题。

有一个损失函数,它很大程度上依赖于优化的C代码和第三方库。 将此移植到张量流是不可能的。

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

这是一个 ipython笔记本解释了如何混合数值和分析衍生物 https://nbviewer.jupyter.org/gist/lhk/5943fa09922693a0fbbbf8dc9d1b05c0

以下是其背后理念的更详细说明:

图表的训练是一个优化问题,所以你肯定需要损失的衍生物。 挑战在于将张量流中的分析导数与损失的数值导数相混合。

您需要此设置

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

训练张量流图与反向传播一起使用。 对于图中的每个参数X,计算以下导数

dL / dX = dL / dP * dP / dX

第二部分,dP / dX只需设置张量流图就可以免费使用。但我们仍然需要损失的衍生物。

现在有一个技巧。

我们希望tensorflow根据正确的梯度dL / dP * dP / dX更新X. 但是我们无法得到张量流来计算dL / dP,因为它不是张量流图。

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

其衍生物是dP~ / dX = dP / dX * C

因此,如果我们将C设置为dL / dP,我们将得到正确的梯度。

我们只需要用数值梯度估算C.

这是算法:

  • 设置图表,将输出乘以常数C
  • 为常量提供1,计算正向通道,得到预测P
  • 计算P
  • 的损失
  • 计算P
  • 的数值导数
  • 将数值导数作为C,计算后向传递,更新参数