我们是两个对强化学习感兴趣的法国机械工程专业的学生,他们试图将 Q-learning 应用于一个项目的旋转倒立摆。我们观看了 David Silver 的“youtube 课程”并阅读了 Sutton & Barto 的章节,基本理论很简单……但我们还没有看到我们的钟摆有任何积极的结果。
这是我们构建的旋转倒立摆的图片和我们最新测试的图表,显示了每集的平均奖励(绿色)。运行 python 代码的计算机与 Arduino 换向,后者又控制步进电机。我们有一个旋转编码器,它可以为我们提供摆的角度(我们也可以从中计算角速度)。
作为第一步,我们选择在离散的二维状态空间(角位置和速度)中使用 Q 学习。我们让我们的系统运行了好几个小时,没有任何改进的迹象。我们已经尝试改变算法的参数、可能的动作、状态的数量及其划分等。此外,我们的系统往往会变热,因此我们将学习分为大约 200 个步骤的片段,然后是一个短暂的休息时间。为了提高速度和精度,我们在每集结束时批量更新 Q 值。
这是我们的更新功能:
# Get Q values from database
Q_dict = agent.getAllQ()
E_dict = {}
# Set E_dict to 0 for all state-action pairs
for s,a in a_StateActionPairs:
E_dict[s + a] = 0
# Q Algorithm
# For every step
for i_r in episode_record:
state, action, new_state, new_action, greedy_action, R = i_r
# Get Q for current step and calculate target
Q = Q_dict[(state, action)]
target = R + GAMMA*Q_dict[(new_state,greedy_action)]
# Update E for visited state
E_dict[(state, action)] += 1
# Update Q for every state-action pair
for s,a in a_StateActionPairs:
updatedQ = Q_dict[(s,a)]+ALPHA*E_dict[(s,a)]*(target-Q)
Q_dict[(s,a)] = updatedQ
# Set E to 0 if new_action was chosen at random (epsilon-greedy)
if greedy_action == new_action:
E_dict[(s,a)] *= GAMMA*LAMBDA
else:
E_dict[(s,a)] = 0
# Update database
agent.setAllQ(Q_dict)
log.info('Qvalues updated')
这是代码的“主要”部分:Github(https://github.com/Blabby/inverted-pendulum/blob/master/QAlgo.py)
这里我们关于为什么测试不成功的一些假设: - 系统运行时间不够长 - 我们的探索(e-greedy)不适应问题 - 超参数未优化 - 我们的物理系统太不可预测
有人有将强化学习应用于物理系统的经验吗?我们遇到了障碍,正在寻求帮助和/或想法。