浅谈在Q-learning中加入nn网络
现在想实现一个基础的强化学习CartPole
。我要使用c语言完成整个项目,方便后续部署到开发板(也许方便吧)。
现在已经完成:
- 模拟cart(车)和pole(杆)的运动部分,根据
位置
,速度
,角度
,角速度
四个特征量来动态更新,使用静态结构体变量在程序中全局的共享和访问这些值。 - 可视化部分,选用2D游戏引擎库
allegro
,通过创建矩形框模拟车和杆。 - Agent部分,强化学习的核心,我需要不断根据状态给出指令,并根据新的状态和指令进行学习,接下来我将详细讨论这部分内容。
首先要明确一个问题,要在强化学习的框架下增加一些深度学习任务。
强化学习RL算法,我选择的是Q-learning
。
Q-learning算法的目标就是通过不断地更新和优化Q值,使智能体(Agent)可以在不知道环境奖励模型的情况下,学习到最优策略,以最大化积累奖励。
Q值:是一个用于衡量在特定状态下采取某个动作的预期累积回报(累积奖励)的函数,通常用Q(s,a)
表示。s表示当前状态,a是智能体采取的动作。Q值表示了在当前状态下采取动作a所能获得的长期累积奖励的期望值。具体来说,Q值告诉智能体,在当前状态s下,如果选择a为执行动作,那么它可以期望获得多少累积奖励,包括当前的即时奖励和未来的奖励。
重启一个问题:我们该如何获得当下的指令呢?
采用ε-greedy 策略
选择动作,随机一个数[0,1]出来帮助我们选择策略,if((double)rand()/RAND_MAX < EPSILON)
,其中EPSILON
是该策略的探索率:
- 如果随机数小于
EPSILON
,则随机选择一个动作。 - 如果随机数大于等于
EPSILON
,则使用神经网络估计的Q值来选择最佳动作。
在利用Q值选择动作的时候,我们利用了神经网络,我采用的是bpnn,三层的全连接层网络。它的作用是用来估计Q值。
输入层输入状态
,我想给每个特征添加权重来区分重要程度,简单分析,角度应该是重要的影响因素。
输入层应该有两个输出,因为我们的动作只有左移
和右移
两项,所以我们只需要输出对应的两个估计Q值。但是这并非属于二分类问题,在选择激活函数时尝试使用ReLU
来进行回归任务的激活函数。
接下来讨论如何计算Q值
Q(s,a) = (1 - α) * Q(s, a) + α * [r + γ * max(Q(s', a'))]
α 是学习率,用于控制每次更新的步长。
r 是智能体在状态 s 下执行动作 a 后获得的即时奖励。
γ 是折扣因子,用于考虑未来奖励的重要性。
s' 是智能体执行动作 a 后转移到的下一个状态。
a' 是在下一个状态 s' 下采取的动作。
让我们重新理清思路,我们的步骤如下:
1.处在某状态s;
2.Agent使用其Q值估计函数(bpnn)来估计s下采取的每种动作的Q值;
3.Agent根据ε-greedy策略选择动作,通常选择具有最大Q值的动作;
4.Agent执行所选动作,与环境交互,并观察下一个状态;
5.Agent根据观察到的奖励以及下一个状态,计算target;
6.Agent使用target来更新Q值估计函数(bpnn),即更新权重矩阵(梯度下降),提高策略的性能;
7.重复上述步骤,不断改进策略提高累积奖励。
具体项目会在完工后放到本人Github仓库中。现在博客仅作思路分析。