离散空间中的强化学习
什么是强化学习(RL)?
强化学习(reinforcement learning),又称再励学习、评价学习,是一种重要的机器学习方法,在智能控制机器人及分析预测等领域有许多应用。
目标是通过让代理与环境进行交互(采取行动)并在途中收集奖励来教导代理完成任务。
请注意,这些奖励并不总是“奖励”,也可能是负面的,即您不需要它们。但问题是,在采取行动之前,你的代理不会知道这是一个坏的奖励还是一个好的奖励。
所以:
- 代理
- 一个环境
- 我们的代理可以处于的一组状态
- 我们的代理可以采取的一系列操作
让我们举一个冷冻湖游戏的例子,代理需要穿过湖泊,但湖泊在某些地方被薄冰覆盖,如果代理踩到它,它就会死亡!它因安全而获得0分,如果它死亡则获得-1,如果达到目标则获得+1。如果代理死亡,游戏将重新启动。
深蓝色是薄冰层
解决方案
我们定义了代理可以作为状态的每个块,以及它可以作为动作进入的每个方向。
策略被定义为一个函数,返回在给定状态下应该采取的动作A
我们代理的目的是使预期的未来回报最大化。
价值函数(Value Function):价值函数V(s)定义为从状态s开始并从状态s开始发挥最佳作用的期望回报
动作函数(Action Function):动作函数Q(s,a)定义为从状态起始开始采取动作a的期望效用,然后进行最优的动作
如果我们知道转移概率(transition probability)(T)和回报函数(reward function)(R)
T(s,a,s‘) =如果代理在s中采取行动a,则代理将在状态s'中行动的概率
R(s,a,s’) =当它在s中采取行动a时,s'得到的回报。
我们可以用bellman方程求出最优策略
V *和Q *是最佳值函数
基于模型的学习
解决RL问题的一种方法是通过基于经验学习模型(动态的),然后求解价值函数,就像模型是正确的一样。
我们可以直接评估每个状态的政策价值,而不是找到模型,即直接平均奖励以找到预期的奖励总和。
Q Learning
Q Learning是一种非策略性技术,它使用时间差异方法通过直接与环境交互来学习。这里是步骤:
样本被定义为一个元组,其中包含状态s'我们的代理人在从状态s采取动作a并接收奖励r之后去目的地。
在我们的状态和行动是离散的情况下(比如我们的冰湖游戏),我们可以定义一个Q表,告诉我们从给定状态我们可以采取的所有不同行动的累积预期奖励。
左边是我们的冰湖状态(区块)以及可以从状态(北,南,东,西)采取的行动
目标是终极状态,游戏在那里结束。
Q表将包含每个状态(1,2,...,9)每个行动的价值(北,南,东,西)
贴现率:由于当前奖励的价值超过了我们未来可能获得的奖励,因此未来的奖励可以通过贴现率Gamma(γ)来折现。
我们使用最大值是因为我们希望在遵循行为策略的同时收敛到贪婪的策略(我们的目标策略)。
最后,我们用我们的估计值和实际值的一小部分误差更新我们先前对Q(s,a)的估计。该分数称为学习率(在0和1之间)并保持低水平,以便我们不会超过目标。
import numpy as np
import gym
import random
import math
#environment
env = gym.make('FrozenLake-v0')
env.reset()
#In this frozen lake we have 16 states and at each state we have
#4 directions(actions) to take so are Q-table is of 16x4
Q_table = np.zeros([16,4])
#discount factor to scale future rewards gamma
gamma = 0.95
#learning rate alpha
alpha = 0.8
#number of episodes to train
total_episodes = 10000
# Exploration parameters
epsilon = 1.0 # Exploration rate
max_epsilon = 1.0 # Exploration probability at start
min_epsilon = 0.01 # Minimum exploration probability
decay_rate = 0.01 # Exponential decay rate for exploration prob
#maximum function
def maximum(list_of_values):
maximum = list_of_values[0]
for value in list_of_values[1:]:
if(value > maximum):
maximum = value
return maximum
#update Q_table function
def updateQTable(existing_table, new_state_observations, last_state, last_action):
#find the maximum Q value of the new state we reached among all the possible actions
new_state = new_state_observations[0]
reward_of_last_action = new_state_observations[1]
maxQ = maximum(existing_table[new_state, :])
existing_table[last_state, last_action] = (1-alpha)*existing_table[last_state, last_action] /
+ alpha*(new_state_observations[1] + gamma*maxQ)
for episodes_elapsed in range(0, total_episodes):
#print('******************NEW ROUND**************************')
#print('Round Number = ', episodes_elapsed)
env.reset()
#start the episode
episode_end = False
current_state = 0
while_count = 0
while(not episode_end):
while_count += 1
#finding the action to take next from present state
#generate a random number in [0,1)
# if random_number < epsilon => take random action
# else take an action given by max Q value at that state
random_number = random.uniform(0,1)
if(random_number <= epsilon):
#take random step
action = math.floor(random.uniform(0,4))
observations = env.step(action)
updateQTable(Q_table, observations, current_state, action)
current_state = observations[0]
episode_end = observations[2]
else:
#take step told by Q table
'''if two values are same this will always pick the action corresponding to the first value'''
action = np.argmax(Q_table[current_state, :])
observations = env.step(action)
updateQTable(Q_table, observations, current_state, action)
current_state = observations[0]
episode_end = observations[2]
#exploitation vs exploration epsilon-greedy technique
epsilon = min_epsilon + (max_epsilon - min_epsilon)*np.exp(-decay_rate*episodes_elapsed)
#rint(epsilon)
#print(while_count)
print(Q_table)
我们的Agent现在可以使用学习过的Q表来穿越湖泊并希望达到目标。