You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Actor-Critic模型用tf.GradientTape训练时真实股票数据拟合错误如何修正

问题根源与修复方案

核心错误点

  • 交叉熵损失计算逻辑完全颠倒,将真实标签和模型输出的位置写反,导致梯度更新方向完全错误
  • y_true生成使用过大的系数1e2,softmax输出趋近硬标签,搭配MSE/Huber损失时容易出现梯度消失,真实数据特征复杂度远高于随机测试数据,模型无法学习n>=130对应的规则
  • 冗余的GradientTape配置:手动watch可训练参数、persistent=True未释放,虽不直接导致错误但会增加异常风险

修改方案

  1. 修正损失计算逻辑:
    交叉熵损失必须是真实标签乘以模型输出的对数,不能颠倒两者位置
  2. 调整y_true生成逻辑,直接生成硬标签,避免大系数导致的数值不稳定
  3. 移除无用的GradientTape配置,默认即可跟踪可训练变量梯度,不需要persistent就去掉该参数
  4. 确认actor网络输出为归一化的概率值(即最后一层带softmax激活),如果输出是logits,直接使用内置的交叉熵损失函数更稳定

修复后的核心代码

import tensorflow as tf
eps = 1e-8

if n < 130:
    self.ret = 0.1
    # 直接生成对应标签,不需要复杂的softmax计算
    y_true = tf.constant([0.0, 1.0], dtype=tf.float32)
else:
    self.ret = -0.1
    y_true = tf.constant([1.0, 0.0], dtype=tf.float32)

with tf.GradientTape() as tape:
    # 不需要手动watch可训练变量,tape默认跟踪
    action_probs = self.actor(self.get_input(n))[0]
    # 选择损失函数,优先用交叉熵,更适合分类任务
    # 方案1:交叉熵损失(推荐)
    loss_actor = -tf.reduce_sum(y_true * tf.math.log(tf.clip_by_value(action_probs, eps, 1-eps)))
    
    # 方案2:Huber损失(如果要保留原有逻辑)
    # huber = tf.keras.losses.Huber()
    # loss_actor = huber(y_true, action_probs)
    
    # 方案3:MSE损失
    # loss_actor = tf.losses.MSE(y_true, action_probs)

loss_actor_gradients = tape.gradient(loss_actor, self.actor.trainable_variables)
# 可以加梯度裁剪避免梯度爆炸,适配真实股票数据的波动
loss_actor_gradients, _ = tf.clip_by_global_norm(loss_actor_gradients, 5.0)
self.opt_actor.apply_gradients(zip(loss_actor_gradients, self.actor.trainable_variables))

额外优化建议

  • 增加训练时的batch维度,不要单样本训练,真实数据单样本噪声大,batch训练稳定性更高
  • 检查get_input(n)返回的真实股票特征是否做了归一化,和随机测试数据的数值分布是否一致,避免特征偏移导致模型泛化失效
  • 可以在n>=130阶段适当调高学习率,或者增加该阶段样本的采样权重,避免前期样本主导模型参数

内容的提问来源于stack exchange,提问作者Yu Bo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 13:24:01