本专栏重点介绍强化学习技术的数学原理,并且采用Pytorch框架对常见的强化学习算法、案例进行实现,帮助读者理解并快速上手开发。同时,辅以各种机器学习、数据处理技术,扩充人工智能的底层知识。
🚀详情:《Pytorch深度强化学习》
根据不动点定理,最优策略和最优价值函数是唯一的(对该经典理论不熟悉的请看Pytorch深度强化学习1-4:策略改进定理与贝尔曼最优方程详细推导),通过优化价值函数间接计算最优策略的方法称为基于价值的强化学习(value-based)框架。设状态空间为 n n n维欧式空间 S = R n S=\mathbb{R} ^n S=Rn,每个维度代表状态的一个特征。此时状态-动作值函数记为
Q ( s , a ; θ ) Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right) Q(s,a;θ)
其中 s \boldsymbol{s} s是状态向量, a \boldsymbol{a} a是动作空间中的动作向量, θ \boldsymbol{\theta } θ是神经网络的参数向量。深度学习完成了从输入状态到输出状态-动作价值的映射
s → Q ( s , a ; θ ) [ Q ( s , a 1 ) Q ( s , a 2 ) ? Q ( s , a m ) ] T ?? ( a 1 , a 2 , ? ? , a m ∈ A ) \boldsymbol{s}\xrightarrow{Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right)}\left[ \begin{matrix} Q\left( \boldsymbol{s},a_1 \right)& Q\left( \boldsymbol{s},a_2 \right)& \cdots& Q\left( \boldsymbol{s},a_m \right)\\\end{matrix} \right] ^T\,\, \left( a_1,a_2,\cdots ,a_m\in A \right) sQ(s,a;θ)?[Q(s,a1?)?Q(s,a2?)???Q(s,am?)?]T(a1?,a2?,?,am?∈A)
相当于对无穷维Q-Table的一次隐式查表,对经典Q-learing算法不熟悉的请看Pytorch深度强化学习1-6:详解时序差分强化学习(SARSA、Q-Learning算法)、Pytorch深度强化学习案例:基于Q-Learning的机器人走迷宫。设目标价值函数为 Q ? Q^* Q?,若采用最小二乘误差,可得损失函数为
J ( θ ) = E [ 1 2 ( Q ? ( s , a ) ? Q ( s , a ; θ ) ) 2 ] J\left( \boldsymbol{\theta } \right) =\mathbb{E} \left[ \frac{1}{2}\left( Q^*\left( \boldsymbol{s},\boldsymbol{a} \right) -Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right) \right) ^2 \right] J(θ)=E[21?(Q?(s,a)?Q(s,a;θ))2]
采用梯度下降得到参数更新公式为
θ ← θ + α ( Q ? ( s , a ) ? Q ( s , a ; θ ) ) ? Q ( s , a ; θ ) ? θ \boldsymbol{\theta }\gets \boldsymbol{\theta }+\alpha \left( Q^*\left( \boldsymbol{s},\boldsymbol{a} \right) -Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right) \right) \frac{\partial Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right)}{\partial \boldsymbol{\theta }} θ←θ+α(Q?(s,a)?Q(s,a;θ))?θ?Q(s,a;θ)?
随着迭代进行, Q ( s , a ; θ ) Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right) Q(s,a;θ)将不断逼近 Q ? Q^* Q?,由 Q ( s , a ; θ ) Q\left( \boldsymbol{s},\boldsymbol{a};\boldsymbol{\theta } \right) Q(s,a;θ)进行的策略评估和策略改进也将迭代至最优。
Q-learning和深度Q学习(Deep Q-learning, DQN)是强化学习领域中两种重要的算法,它们在解决智能体与环境之间的决策问题方面具有相似之处,但也存在一些显著的异同。这里进行简要阐述以加深对二者的理解。
深度Q网络(Deep Q-Network, DQN)的核心原理是通过
拟合了高维状态空间,是Q-Learning算法的深度学习版本,算法流程如表所示
最简单的例子是使用全连接网络来构造DQN
class DQN(nn.Module):
def __init__(self, input_dim, output_dim):
super(DQN, self).__init__()
self.input_dim = input_dim
self.output_dim = output_dim
self.fc = nn.Sequential(
nn.Linear(self.input_dim[0], 128),
nn.ReLU(),
nn.Linear(128, 256),
nn.ReLU(),
nn.Linear(256, self.output_dim)
)
def __str__(self) -> str:
return "Fully Connected Deep Q-Value Network, DQN"
def forward(self, state):
qvals = self.fc(state)
return qvals
基于贝尔曼最优原理的损失计算如下
def computeLoss(self, batch):
states, actions, rewards, next_states, dones = batch
states = torch.FloatTensor(states).to(self.device)
actions = torch.LongTensor(actions).to(self.device)
rewards = torch.FloatTensor(rewards).to(self.device)
next_states = torch.FloatTensor(next_states).to(self.device)
dones = (1 - torch.FloatTensor(dones)).to(self.device)
# 根据实际动作提取Q(s,a)值
curr_Q = self.model(states).gather(1, actions.unsqueeze(1)).squeeze(1)
next_Q = self.target_model(next_states)
max_next_Q = torch.max(next_Q, 1)[0]
expected_Q = rewards.squeeze(1) + self.gamma * max_next_Q * dones
loss = self.criterion(curr_Q, expected_Q.detach())
return loss
基于经验回放池和目标网络的参数更新如下
def update(self, batch_size):
batch = self.replay_buffer.sample(batch_size)
loss = self.computeLoss(batch)
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
# 更新target网络
for target_param, param in zip(self.target_model.parameters(), self.model.parameters()):
target_param.data.copy_(self.tau * param + (1 - self.tau) * target_param)
# 退火
self.epsilon = self.epsilon + self.epsilon_delta \
if self.epsilon < self.epsilon_max else self.epsilon_max
基于DQN可以实现最基本的智能体,下面给出一些具体案例
完整代码联系下方博主名片获取
🔥 更多精彩专栏: