1.演员评论模型
使用 tf.gradienttape,
loss_function = mse or huber or cross-entropy
y_true=constant
,
y_pred=my_network_output
, 例如y_pred = my_netword(input)
例如loss_actor = tf.losses.MSE(y_true, y_pred)
或其他类似的东西,比如
loss_actor = Huber(y_true, action_probs)
loss_actor = cross_entropy(y_true, y_pred)
意图, y_true = constant
, 是我的网络收敛到的
y_pred = my_network(input)
2.问题
归根结底,我把我的问题浓缩成下面
y_true,我用的是人工数据(假数据)
if n < 130:
self.ret = 0.1
elif n >= 130:
self.ret = -0.1
其中,n 从 124 开始,n 最终进入 inf
在这里,self.ret 是我的 y_true,我的标签
我想要,当我喂 self.ret 时y_true, = 0.1
,我的网络输出 [0.0, 1.0] 代表投资
当我喂 self.ret 时y_true, = (- 0.1)
,我的网络输出 [1.0, 0.0] 代表 Uninvest
3. 将网络数据作为随机输入
- 当我将网络输入作为随机数据提供时,此模型运行良好
- 当 n < 130 时,my_network 输出 [0.0, 1.0],代表投资
- 当 n > 130 时,my_network 输出 [1.0, 0.0],代表 uninvest
但是当我将网络输入作为真实的股票数据提供时,这个模型就出错了
- 当 n > 130 时,my_network 输出 [0.0, 1.0],永远,代表投资,但我想要 [1.0, 0.0],即取消投资
4. tf.gradienttape 的错误使用
我知道,问题在于我以错误的方式使用 tf.gradienttape
tf.gradienttape 没有正确计算梯度
但是,确切地说,我想知道如何将我的代码更改为正确的
我的代码是:
if n < 130:
self.ret = 0.1
elif n >= 130:
self.ret = -0.1
# n starts from 124, self.ret is y_true
with tf.GradientTape(persistent=True) as tape:
tape.watch(self.actor.trainable_variables)
#y_pred = action_probs = self.actor(self.get_input(n))[0]
action_probs = self.actor(self.get_input(n))[0] # i.e. y_pred
#''' # below use huber or mse as loss func
y_true = tf.nn.softmax([0.0, 1e2] * tf.stop_gradient(self.ret))
#loss_actor = tf.losses.MSE(y_true, action_probs)
huber = tf.keras.losses.Huber()
loss_actor = huber(y_true, action_probs)
#'''
''' # below use cross-entropy as loss func
r_t = self.ret
delta_t = 1.0
prediction = tf.keras.backend.clip(tf.nn.softmax([0.0, 1e2] * tf.stop_gradient(self.ret if NO_CRITIC else r_t)), eps, 1 - eps)
log_probabilities = action_probs * tf.keras.backend.log(prediction)
# self.ret or r_t is y_true
loss_actor = tf.keras.backend.sum(-log_probabilities * tf.stop_gradient(delta_t))
#'''
loss_actor_gradients = tape.gradient(loss_actor, self.actor.trainable_variables)
self.opt_actor.apply_gradients(zip(loss_actor_gradients, self.actor.trainable_variables))