强化学习是在行动和奖励的原则下训练和验证数据的方法之一,在强化学习的保护伞下有各种算法,SARSA是强化学习的一种算法,其缩写为状态行动奖励状态行动。所以在这篇文章中,让我们试着了解强化学习的SARSA算法。
目录
- SARSA算法
- SARSA与Q-learning算法有何不同?
- 如何实际使用SARSA?
- 通过图示分析SARSA的状态和奖赏
- 总结
SARSA算法

状态行动奖励状态行动(SARSA)是强化学习的算法之一,是Q-learning算法的改进版。SARSA算法区别于Q-learning算法的主要一点是,它不对下一阶段要执行的行动的奖励进行最大化,而是更新相应状态的Q值。
在代理的两种学习策略中,SARSA使用了ON-policy学习技术,代理从当前代理执行的行动集中学习。在SARSA算法中没有正在进行的最大操作,这使得它独立于以前的学习或贪婪的学习政策,如Q-学习算法。
因此,现在让我们了解SARSA与Q-learning算法有什么不同。
SARSA与Q-learning算法有什么不同?
| SARSA | Q-学习 |
| 在SARSA算法中,代理使用On-policy进行学习,代理从当前状态下的行动集和目标政策或将要执行的行动中学习。 | 在Q-learning算法中,代理使用非政策性学习技术,其中代理从以前的状态和从以前的一组行动中得到的奖励来学习要执行的行动。 |
| 代理人的学习通过使用当前状态下执行的一组行动而得到改善。 | 代理人的学习是通过执行贪婪的搜索来改善的,其中只考虑在该特定状态下的特定行动集所获得的最大奖励。 |
| 对于较新的操作状态,不考虑以前的状态和以前的奖励 | 对于较新的操作状态,会考虑以前的状态和以前的奖励。 |
如何实际使用SARSA?
为了实际探索SARSA,让我们设计一个学习策略,让代理人在每个状态下执行行动并获得奖励,遵循SARSA的基本操作原则,即不考虑以前的状态和行动获得的最大奖励。因此,让我们探讨如何实际使用SARSA,它可以用来模拟任何游戏应用或最佳解决方案。
让我们在一个用户定义的函数的帮助下创建一个简单的SARSA环境,其参数如下:
- 环境(env):为创建OpenAI环境而传递的参数
- 集数:代理的迭代次数,以使奖励最大化。
- 学习率(alpha):学习率
- 折扣系数:代理人选择最大化奖励
- Epsilon:0到1之间的随机行动
因此,在为SARSA创建一个用户定义的函数之前,让我们使用用户定义的函数创建一个代理,并声明一定的政策,以便从算法迭代的不同状态中学习。
让我们首先安装所需的库和强化学习的官方Github资源库:
!git clone https://github.com/dennybritz/reinforcement-learning/
%matplotlib inline
import gym
import itertools
import matplotlib
import numpy as np
import pandas as pd
import sys
import lib
if "../" not in sys.path:
sys.path.append("../")
from collections import defaultdict
from lib.envs.windy_gridworld import WindyGridworldEnv
from lib import plotting
matplotlib.style.use('ggplot')
现在让我们创建一个SARSA环境的实例:
env=WindyGridworldEnv()
现在使用这个SARSA实例,让我们为SARSA算法创建一个学习策略:
def make_epsilon_greedy_policy(Q, epsilon, nA): ## Creating a learning policy
def policy_fn(observation):
A = np.ones(nA, dtype=float) * epsilon / nA ## Number of actions performed
best_action = np.argmax(Q[observation]) ## Maximum reward received is retrieved using argamax
A[best_action] += (1.0 - epsilon) ## The best reward is subtracted from random actions
return A
return policy_fn
使用该学习策略,让我们在不同的状态和行动上训练SARSA算法,并收集奖励,让我们使用收集的奖励来训练代理的下一个状态和行动,使用下面的用户定义函数:
def sarsa(env, num_episodes, discount_factor=1.0, alpha=0.5, epsilon=0.1):
Q = defaultdict(lambda: np.zeros(env.action_space.n)) ## Actions to be taken up by the agent
stats = plotting.EpisodeStats(episode_lengths=np.zeros(num_episodes),
episode_rewards=np.zeros(num_episodes)) ## Providing the agent states and rewards
policy = make_epsilon_greedy_policy(Q, epsilon, env.action_space.n) ## providing the agent the learning policy
## Creating various paths for the agent
for i_episode in range(num_episodes):
# Print out which episode we're on, useful for debugging.
if (i_episode + 1) % 100 == 0:
print("\rEpisode {}/{}.".format(i_episode + 1, num_episodes), end="")
sys.stdout.flush()
# Reset the environment and pick the first action
state = env.reset()
action_probs = policy(state)
action = np.random.choice(np.arange(len(action_probs)), p=action_probs)
# One step in the environment
for t in itertools.count():
next_state, reward, done, _ = env.step(action) ## Taking a step
next_action_probs = policy(next_state) ## Picking the action
next_action = np.random.choice(np.arange(len(next_action_probs)), p=next_action_probs)
stats.episode_rewards[i_episode] += reward ## Collecting the reward received by the agent for the particular state
stats.episode_lengths[i_episode] = t
td_target = reward + discount_factor * Q[next_state][next_action] ## Using discount factor to maximize reward
td_delta = td_target - Q[state][action]
Q[state][action] += alpha * td_delta
if done:
break
action = next_action
state = next_state
return Q, stats
现在,由于代理被监控的步骤和行动,以及其行动所获得的奖励,让我们对代理进行所需次数的迭代训练:
Q,stats = sarsa(env, 500)

由于现在SARSA代理被迭代了所需的次数,让我们使用强化学习的官方GitHub仓库中的绘图模块来验证和可视化代理的各种统计措施,如在一个状态下执行某些行动所需的时间,以及代理在不同步骤中获得的奖励和其他统计措施。
通过图谱分析SARSA的状态和奖励
因此,根据所使用的学习策略,代理人学习的状态或情节可以通过lib模块的绘图库进行可视化,其中代理人在每个状态下的学习时间和获得奖励的时间可以被可视化:
plotting.plot_episode_stats(stats)

让我们试着逐一解释上述图表。
第一张图是解释代理人在一段时间内学习不同状态所消耗的时间,第二张图显示,随着代理人逐渐学习不同的状态,代理人所花的时间明显减少,第三张图显示,每一步所花的时间随着代理人的事件数量的增加而增加。
总结
这就是代理人如何在SARSA算法中操作,在每一组状态和行动中获得最大的回报,SARSA算法有能力在不知道以前状态和行动的情况下操作。SARSA算法完全根据当前的学习策略进行操作,不考虑任何偏见,只选择产生最大奖励的状态和行动来进入下一个状态。