时间差分法与Q学习算法

带有离散动作的强化学习问题通常可以建模为马尔可夫决策过程,但如果我们得代理最初不知道转移概率和奖励是多少, 它必须至少经历一次每个状态和每个过渡一次才能知道奖励,并且如果要对过渡概率进行合理的估计,则必须多次经历。

时间差分算法(TD Learning)与值迭代算法非常相似,但进行了调整,以考虑到代理仅部分了解游戏内容的事实。 通常,我们假设代理最初仅知道可能的状态和动作,仅此而已。 代理使用探索策略(例如,纯随机策略)来探索游戏场景,并且随着探索的进行,TD学习算法会根据实际观察到的转变和奖励来更新状态值的估计值(*)
V k + 1 ( s ) ← ( 1 − α ) V k ( s ) + α ( r + γ V k ( s ′ ) ) o r V k + 1 ( s ) ← V k ( s ) + α δ k ( s , r , s ′ )  with  δ k ( s , r , s ′ ) = r + γ V k ( s ′ ) − V k ( s ) … … ( ∗ ) V_{k+1}(s)\leftarrow(1-\alpha)V_k(s)+\alpha(r+\gamma{V_k(s^{'})})\\or\\V_{k+1}(s)\leftarrow{V_k(s)+\alpha\delta_k(s,r,s^{'})} \\\text{ with }\delta_k(s,r,s^{'})=r+\gamma{V_k(s^{'})-V_k(s)}……(*) Vk+1(s)(1α)Vk(s)+α(r+γVk(s))orVk+1(s)Vk(s)+αδk(s,r,s) with δk(s,r,s)=r+γVk(s)Vk(s)()

  • α为学习率
  • r+γVk(s)为TD目标
  • δk为TD偏差

对于每个状态s,此算法跟踪代理离开该状态时获得的立即奖励r的,以及预期在以后获得的奖励Vk(s)(假设其行为最佳)。

由此可以得出Q学习算法,Q学习算法是对Q值迭代算法的一种变形,适用于过渡概率和奖励最初未知的情况。 Q-Learning的工作方式是观看代理的活动(例如,随机进行),并逐步改善其对Q值的估算(**)。 一旦具有准确的Q值估算值(或足够接近),则最佳策略就是选择具有最高Q值的操作(即贪婪策略)。
Q k + 1 ( s , a ) ← ( 1 − α ) Q k ( s , a ) + α ( r + γ m a x a ′ Q k ( s ′ , a ′ ) ) … … ( ∗ ∗ ) Q_{k+1}(s,a)\leftarrow(1-\alpha)Q_{k}(s,a)+\alpha({r+\gamma{max_{a^{'}}Q_k(s^{'},a^{'}}}))……(**) Qk+1(s,a)(1α)Qk(s,a)+α(r+γmaxaQk(s,a))()
对于每个状态动作对(s,a),此算法都会跟踪代理通过状态a离开状态s时所获得的报酬r,以及预期获得的折现未来报酬之和。 为了估算此总和,我们假设下一个状态s’的Q值估算值为最大值,因为我们假设目标策略从那时起将以最佳方式运行。

def policy_random(state,possible_actions):
    return np.random.choice(possible_actions[state])

def QLearning(n_states,n_acitons,env,possible_actions,alpha=0.01,gamma=0.99,n_steps=200000):			 	exploration_policy = policy_random
	q_values = np.full((n_states, n_actions), -np.inf)
	for state, actions in enumerate(possible_actions):
	    q_values[state][actions]=0

	for step in range(n_steps):
	    action = exploration_policy(env.state,possible_actions)
	    state = env.state
	    next_state, reward = env.step(action)
	    next_value = np.max(q_values[next_state]) # greedy policy
	    q_values[state, action] = (1-alpha)*q_values[state, action] + alpha*(reward + gamma * next_value)
	retern q_values
	 

示例:

transition_probabilities = [
        [[0.7, 0.3, 0.0], [1.0, 0.0, 0.0], [0.8, 0.2, 0.0]], # in s0, if action a0 then proba 0.7 to state s0 and 0.3 to state s1, etc.
        [[0.0, 1.0, 0.0], None, [0.0, 0.0, 1.0]],
        [None, [0.8, 0.1, 0.1], None],
    ]
rewards = [
        [[+10, 0, 0], [0, 0, 0], [0, 0, 0]],
        [[0, 0, 0], [0, 0, 0], [0, 0, -50]],
        [[0, 0, 0], [+40, 0, 0], [0, 0, 0]],
    ]
possible_actions = [[0, 1, 2], [0, 2], [1]]

class MDPEnvironment(object):
    def __init__(self, start_state=0):
        self.start_state=start_state
        self.reset()
    def reset(self):
        self.total_rewards = 0
        self.state = self.start_state
    def step(self, action):
        next_state = np.random.choice(range(3), p=transition_probabilities[self.state][action])
        reward = rewards[self.state][action][next_state]
        self.state = next_state
        self.total_rewards += reward
        return self.state, reward

env = MDPEnvironment()
q_values =QLearning(3,3,env,possible_actions)

猜你喜欢

转载自blog.csdn.net/qq_39573785/article/details/104008554