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

强化学习Agent测试异常求助:训练达标但测试时陷入循环

DQN模型训练正常但测试时陷入直行循环问题排查

问题背景

在10×10网格环境中构建DQN强化学习模型,训练阶段智能体能到达目标,但测试时会持续朝一个方向直行,碰撞墙壁/障碍物后仍重复该行为,陷入循环。奖励函数基于当前位置与目标的距离,远离目标或碰撞会施加惩罚。模型类代码如下:

class DQNTrainer:
    def __init__(self, states, actions, visualize=True, load_model=False):
        self.states = states
        self.actions = actions
        self.model = self.create_model()
        if load_model:
            self.load_model()
        self.agent = self.create_agent()
        self.env = None
        self.visualize = visualize

    def create_model(self):
        model = Sequential()
        model.add(Flatten(input_shape=(1, self.states, self.states)))
        model.add(Dense(128, activation="relu", kernel_regularizer=l1(0.01)))  # Add L1 regularization
        model.add(Dense(128, activation="relu", kernel_regularizer=l1(0.01)))
        model.add(Dense(64, activation="relu", kernel_regularizer=l1(0.01)))
        model.add(Dense(self.actions, activation="linear"))
        return model

    def create_agent(self):
        policy = LinearAnnealedPolicy(EpsGreedyQPolicy(), 
                                  attr='eps', 
                                  value_max=1.0, 
                                  value_min=0.1, 
                                  value_test=0.01, 
                                  nb_steps=10000)
        return DQNAgent(
            model=self.model,
            memory=SequentialMemory(limit=20000, window_length=1),
            policy=policy,
            #policy = EpsGreedyQPolicy(0.1),
            nb_actions=self.actions,
            nb_steps_warmup=500,
            target_model_update=0.005,
            gamma=0.99
        )

    def compile_agent(self):
        self.agent.compile(optimizer=Adam(learning_rate=0.0005), 
                           metrics=['mean_absolute_error'])

    def fit(self, env, nb_steps):
        self.env = env
        self.agent.fit(self.env, nb_steps=nb_steps, visualize=self.visualize, verbose=1)

    def train(self, env, nb_steps):
        self.compile_agent()
        self.fit(env, nb_steps)
        return True

    def save_model(self):
        self.model.save_weights('pathplanner.h5', overwrite=True)

    def load_model(self):
        try:
            self.model.load_weights('pathplanner.h5')
            print("Model Loading Successful")
        except Exception as e:
            print(f"Error loading model: {e}")

可能的原因与解决方案

1. 测试阶段探索策略未切换到纯贪心

你设置的LinearAnnealedPolicy中value_test=0.01仍保留了微小的随机探索概率,但测试时应完全使用贪心策略,避免随机动作干扰。另外需确认测试时是否正确触发了测试模式:

  • 解决:测试前手动切换到纯贪心策略:
    self.agent.policy = EpsGreedyQPolicy(eps=0.0)
    

2. 奖励函数设计存在缺陷

基于距离的奖励可能让智能体陷入局部最优:比如朝着目标方向的奖励梯度持续为正,撞墙的惩罚不足以抵消该奖励,导致智能体重复撞墙动作。

  • 优化方案:
    • 提升撞墙惩罚权重:比如撞墙时给予-10的惩罚,远大于距离变化的奖惩(如距离减少+1、增加-1)。
    • 增加目标到达的大额正奖励:比如到达目标时给予+100的奖励,强化正确行为的优先级。
    • 加入步数惩罚:每步给予-0.1的惩罚,迫使智能体尽快到达目标,避免无意义循环。

3. 正则化强度过高导致欠拟合

你使用的L1正则化系数(0.01)强度过高,可能压制了模型的学习能力,导致无法学习到复杂的路径决策逻辑:

  • 解决:降低L1系数至0.001,或暂时移除正则化,观察模型表现。若仍欠拟合,可调整网络结构(如减少一层Dense,或降低神经元数量)。

4. 训练参数需微调

  • 目标网络更新速率:target_model_update=0.005的软更新速率过慢,可能导致目标网络跟不上主网络的变化,影响训练稳定性。可尝试改为硬更新,比如每1000步更新一次(target_model_update=1000)。
  • 学习率:0.0005的学习率偏慢,可尝试调整为0.001,加快模型学习速度。
  • 预热步数:若训练总步数较少,nb_steps_warmup=500可能导致智能体未充分探索就开始学习,可适当减少该值。

5. 状态表示需验证

确认输入状态是否包含所有关键信息:智能体位置、目标位置、障碍物位置是否都正确编码到(1, states, states)的输入中。若状态缺失关键信息,模型无法做出合理决策。

测试验证建议

  • 测试前打印每个动作的Q值,若某个动作的Q值远高于其他动作,说明模型认为该动作是最优解,需回到奖励函数和训练过程排查问题。
  • 增加测试日志:记录每一步的状态、动作、奖励,分析智能体的决策逻辑。

内容的提问来源于stack exchange,提问作者Dawn of Justize

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:22:34