【增强学习】Sarsa
2017-09-27 23:11
211 查看
增强学习之Sarsa
代码下载: github https://github.com/gutouyu/ReinforcementLearning增强学习算法Sarsa(state-action-reward-state_-action_)。和QLearning非常相似。Sarsa是一种On policy的算法(整个循环都是在一个路径上),state_ action_ 在Q_table更新的时候就已经确定了。QLearning是off policy,state_,action_在Q_Table更新的时候,还没有确定。
1. 算法思想
Sarsa和QLearning非常相似,不同的只是Sarsa在更新Q_Table的时候,说到做到,它总是会选择比较大的Q(s2,a2),不但更新s1的时候是这样,选择的时候也是这样。也就是说,Sarsa同样是在更新Q_table,与QLearning不同之处在于:
Sarsa在当前
state已经想好了对应的
action,而且也想好了下一个
state_和
action_.而QLearning必须要等到进入了下一个状态
state_才能想好对应的
action_
Sarsa更新Q(s,a)的时候是根据下一个Q(s_ ,a_) 而QLearning是依据maxQ(s_ ,a_ )
2. 实现
所有代码,github可以下载主循环
# 有100条命来让Agent学习,如果还没有学会,game over for episode in xrange(100): # Init observation/state observation = env.reset() # Sarsa根据observation选取一个action action = RL.choose_action(str(observation)) while True: # Sarsa执行action,得到下一个observation observation_ observation_, reward, done = env.step(action) # 执行了这一步的action之后,还要再选出下一步要执行的action,才能用于上一步的学习 action_ = RL.choose_action(str(observation_)) # 学习 RL.learn(str(observation), action, reward, str(observation_), action_) # 更新observation action observation = observation_ action = action_ # 死掉了(掉进黑块)就重新来 if done: break
状态、表格初始化
def __init__(self, actions, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9): self.actions = actions # a list self.lr = learning_rate self.gamma = reward_decay self.epsilon = e_greedy self.q_table = pd.DataFrame(columns=self.actions)
根据observation选择action,采用的是epsilon-greedy。也就是说会以小概率的情况去进行探索,大部分的情况会选择最好的action
def choose_action(self, observation): self.check_state_exist(observation) # action selection if np.random.uniform() < self.epsilon: # choose best action state_action = self.q_table.ix[observation, :] # 防止两个值相等的action总是选择其中一个,要随机选择 state_action = state_action.reindex(np.random.permutation(state_action.index)) action = state_action.argmax() else: # choose random action action = np.random.choice(self.actions) return action
根据当前的observation action和下一步即将采取的observation_ action_ 以及得到的reward来进行学习
def learn(self, s, a, r, s_, a_): """ Sarsa是已经知道了下一步要采取的action,而且他也肯定会采取这个action。所以他的学习是直接基于下一次的action的。 """ self.check_state_exist(s_) q_predict = self.q_table.ix[s, a] if s_ != 'terminal': q_target = r + self.gamma * self.q_table.ix[s_,a_] # Sarsa使用下一次采取的action来更新 else: q_target = r # next state is terminal self.q_table.ix[s, a] += self.lr * (q_target - q_predict) # update
检查状态state是否已经存在,如果之前不存在就加入到SarsaTable中
def check_state_exist(self, state): if state not in self.q_table.index: # append new state to q table self.q_table = self.q_table.append( pd.Series( [0] * len(self.actions), index=self.q_table.columns, name=state ) )
3. 总结
Sarsa相比于QLearning要胆小很多。他每走一步都要特别怕,特别小心,都尽可能的避免掉进坑里。但是他也会以小概率采取不是那么好的action,因为我们是epislon-greedy.属于On policy。QLearning要大胆很多,他为了达到目的,中间不管才多少坑,都不在乎。属于Off policy。
相关文章推荐
- 增强学习(Reinforcement Learning)
- 深度增强学习David Silver(七)——Policy Gradient
- java9学习之常用工具增强<二>
- 机器学习方法篇(23)------增强学习入门
- 增强学习(三)----- MDP的动态规划解法
- 学习笔记-增强学习
- Atlas学习手记(22):使用行为增强用户界面(二):Floating Behavior
- 冈萨雷斯数字图像处理学习4:频率域图像增强1
- 机器学习 cs229学习笔记6(增强学习 reinforcement learning,MDP)
- 增强学习(Reinforcement Learning and Control)
- 增强学习(三)----- MDP的动态规划解法
- 深度增强学习漫谈 从DQN到
- SAP成都研究院马洪波:提升学习力,增强竞争力,收获一生乐趣
- Spring学习,AOP增强类型
- Deep Reinforcement Learning 深度增强学习资源
- 深度增强学习前沿算法思想
- 增强学习(四) ----- 蒙特卡罗方法(Monte Carlo Methods)
- Java学习日记-2.2 增强后的switch-case
- 增强学习Reinforcement Learning经典算法梳理3:TD方法
- Spring学习----------Spring AOP之增强介绍