对于大学项目,我想训练一个(模拟的)机器人在给定位置和速度的情况下击球 . 首先要尝试的是策略渐变:我有一个参数轨迹生成器 . 对于每个训练位置,我通过我的网络提供位置,将轨迹发送到模拟器并获得奖励 . 我现在可以使用它作为损失,对渐变进行采样,反馈并更新网络的权重,以便下次更好 .
因此,目标是学习从位置到轨迹权重的映射 . 当使用像Theano和Tensorflow(或Keras)这样的全明星计算图库时,我遇到的问题是我不知道如何对该系统进行实际建模 . 我想首先使用标准的完全连接的层,然后输出是我的轨迹权重 . 但是,我如何实际计算损失,以便它可以使用backprop?
在自定义丢失函数中,我会忽略/不指定真实标签,运行模拟器并返回它给出的损失 . 但是根据我的阅读,你需要返回一个象征性的Theano / Tensorflow函数 . 我的损失非常复杂,所以我不想将它从模拟器转移到网络 . 我该如何实现呢?然后问题是区分这种损失,因为我可能需要采样以获得该梯度 .
1 回答
我前段时间遇到过类似的问题 .
有一个损失函数,它在很大程度上依赖于优化的C代码和第三方库 . 将此移植到张量流是不可能的 .
但我们仍然希望训练张量流图以从当前设置创建转向信号 .
Here is an ipython notebook which explains how to mix numerical and analytical derivatives https://nbviewer.jupyter.org/gist/lhk/5943fa09922693a0fbbbf8dc9d1b05c0
Here is a more detailed description of the idea behind it:
图的训练是一个优化问题,所以你肯定需要损失的导数 . 挑战在于将张量流中的分析导数与损失的数值导数混合 .
你需要这个设置
输入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,计算后向传递,更新参数