我正在尝试实现线性函数逼近,以使用q学习来解决MountainCar。我知道由于最优策略的螺旋状形状,无法用线性函数完美地近似这种环境,但是我得到的行为却很奇怪。
我不明白为什么奖励会上升,直到达到似乎收敛的水平,然后开始下降
请找到我随附的代码。如果有人能告诉我我做错了什么,我会感到非常高兴。
初始化
import gym import random import os import pandas as pd import numpy as np import matplotlib.pyplot as plt
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/96/three.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.2/dat.gui.min.js"></script>
<canvas id="c"></canvas>
Q-Learning代理
class Agent:
def __init__(self, gamma: float, epsilon: float, alpha:float, n_actions: int, n_steps:int=1):
self.n_steps=n_steps
self.gamma=gamma
self.epsilon=epsilon
self.alpha=alpha
self.n_actions=n_actions
self.state_action_values={}
self.state_values={}
self.w=None
def get_next_action(self, state):
raise NotImplementedError
def update(self, state, action: int, reward, state_prime):
raise NotImplementedError
def reset(self):
# Optional argument
pass
执行
class FunctionApproximationQLearning(Agent):
def __init__(self, gamma, epsilon, alpha, n_actions, n_features):
super().__init__(gamma, epsilon, alpha, n_actions)
self.w = np.zeros((n_features, n_actions))
def get_next_action(self, x):
if random.random()>self.epsilon:
return np.argmax(self._lr_predict(x))
else:
return np.random.choice(range(self.n_actions))
def update(self, state, action, reward, state_prime, done):
if not done:
td_target = reward + self.gamma*np.max(self._lr_predict(state_prime))
else:
td_target = reward
# Target definition
target = self._lr_predict(state)
target[action] = td_target
# Function approximation
self._lr_fit(state, target)
def _lr_predict(self, x):
# x should be (1, n_features)
#x = np.concatenate([x, [1]])
return x @ self.w
def _lr_fit(self, x, target):
pred = self._lr_predict(x)
#x = np.concatenate([x, [1]])
if len(x.shape)==1:
x = np.expand_dims(x, 0)
if len(target.shape)==1:
target = np.expand_dims(target,1)
self.w += self.alpha*((np.array(target)-np.expand_dims(pred, 1))@x ).transpose()
答案 0 :(得分:2)
让我知道我是否错了,但是您似乎正在尝试使用线性函数逼近器,直接将状态变量(例如汽车位置和速度)用作特征。在这种情况下,不仅不可能完美地近似值函数,而且不可能近似于最佳值函数。因此,尽管您的数字似乎暗示了某种趋同,但我敢肯定事实并非如此。
二维玩具环境(例如MountainCar)的一个很好的功能是您可以绘制近似的Q值函数。在萨顿与巴托(Sutton&Barto)的书(chapter 8, Figure 8.10)中,您可以通过学习过程找到“成本成本”功能(可从Q值轻松获得)。如您所见,该函数与轿厢位置和速度高度非线性。我的建议是绘制相同的成本函数,并验证它们是否与本书中显示的相似。
在Q学习中使用线性函数逼近器通常需要(在非常特殊的情况下除外)计算一组特征,因此逼近器相对于提取的特征是线性的,而不是原始特征。通过这种方式,您可以近似非线性函数(当然,相对于原始状态变量)。同样,可以在Sutton&Barto的书section 8.3中找到对该概念的扩展解释。