对于一个大学项目,我想训练一个(模拟的)机器人在给定位置和速度的情况下击球。首先要尝试的是策略梯度:我有一个参数轨迹生成器。对于每个训练位置,我通过我的网络输入位置,将轨迹发送到模拟器并获得奖励。我现在可以用它作为损失,对梯度进行采样,反馈并更新我的网络的权重,这样下次它就会做得更好。
因此,我们的目标是学习从位置到轨迹权重的映射。当使用全明星计算图库,如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输入,计算反向传递,更新参数