0

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))
4

0 回答 0