以下内容均为本人在实际项目中遇到问题后的思考和总结,可能对于和我一样的SAC算法新手来说会有帮助,对于已经完成过多个完整项目的老手来说其实可以直接pass,仅供参老,请酌情观看,如有问题请指出。
前言
SAC(Soft Actor-Critic)Method是一种强化学习算法,在使用策略梯度算法的同时,也考虑了最大熵原理,鼓励学习的策略在追求最大的优化值(即reward)的同时,也考虑了增加执行动作action时的探索性。
训练和测试则是强化学习中的两个关键步骤,在写测试的代码的时候,发现了SAC算法在测试时需要更改的几个要点。在此记录。
部分内容由ChatGPT4协助润色。
一、SAC算法训练和测试分别在做什么?
训练 (Training)
在训练阶段,SAC算法试图学习一个策略,在我们确定并且初始化了网络结构之后,使用网络结构对于我们的目标进行训练。该策略能使得从环境中获得的预期奖励最大化,同时保持策略的熵也尽可能大。训练阶段的主要目标是通过调整算法的参数使其学习到一个最优策略。
在SAC中,训练涉及到样本的收集、利用收集的样本来更新策略和价值网络。在整个过程中,SAC会尝试不断地调整其策略,以在环境中探索并获得更高的奖励。
在训练结束后,我们会保存agent在训练过程中所得到的最优模型,此模型会用于训练。
测试 (Testing)
测试阶段的主要目标是验证训练得到的策略是否能在新的、未曾见过的环境中表现得很好。在测试阶段,不再进行任何学习或参数更新,只是将训练阶段得到的策略应用于测试环境。
在SAC中,测试主要涉及到执行已经训练好的策略,并收集测试期间的奖励以评估策略的性能。测试阶段的关键在于看训练得到的策略是否能够泛化到新的环境中。
二、SAC算法训练和测试的区别是什么?
区别 | 代码角度的比较/更改 |
---|---|
训练和更新的过程 | 在训练的过程中,SAC神经网络需要在训练的过程中更新神经网络的各项参数,因此在这个过程中,梯度的更新是打开的。但是在测试中,因为我们的模型已经训练完毕,因此梯度更新应当关闭,以供使用最新的模型进行测试。 |
探索过程 | 训练过程会为测试过程探索并确认最佳的模型状态。因此,测试过程agent不需要再进行探索。 |
环境的重置 | 训练过程会有多轮的循环,但是测试的过程有且仅有一轮循环测试模型的结果。 |
表现(reward)的记录 | 训练个测试都需要记录表现,查看reward数值的变化。 |
模型的使用和保存 | 使用同样的算法,最优模型进行测试。 |
三、通过部分代码说明我们提到的要点
其实可以通过搜索detach()的方法来搜索一个算法中哪些函数的设计是使用已经更新完的模型的。因为detach()方法就是关闭梯度,我们梯度训练完后,不再需要更新。所以会看到action.detach()方法。
import gym
env = gym.make("Pendulum-v1") #测试在环境下的性能
state = env.reset()#初始化
cum_reward = 0
frames = []
for t in range(50000): #持续5000步循环
frames.append(env.render(mode='rgb_array'))
action = policy_net.get_action(state) #使用训练好的策略网络根据当前状态生成动作
state, reward, done, info = env.step(action.detach().numpy()) # detach and convert to numpy这里的detach()方法就是关闭梯度,因为我们梯度训练完后,不再需要更新
reward = reward.item() # convert reward from torch.Tensor to a float number
cum_reward += reward
if done:
break
env.close()
display_frames_as_gif(frames)