作者 | Chintan Trivedi
来源 | Medium
编辑 | 代码医生团队
欢迎来到数学和代码turorial系列的第一部分。展示如何实施一种称为近端策略优化(PPO)的强化学习算法,用于教授AI代理如何踢足球/足球。在本教程结束时,将了解如何在演员评论框架中应用on-policy学习方法,以便学习导航任何游戏环境。将在PPO算法的上下文中看到这些术语的含义,并在Keras的帮助下在Python中实现它们。所以首先开始安装游戏环境。
注意:此整个系列的代码可在下面链接的GitHub存储库中找到。
https://github.com/ChintanTrivedi/rl-bot-football?source=post_page-----d53f9afffbf6----------------------
设置Google Football Environment
谷歌足球环境发布RL研究
在本教程中使用Google Football Environment,但可以使用任何游戏环境,只需确保它在python中支持OpenAI的Gym API。请注意在编写本教程时,足球环境目前仅支持Linux平台。
https://github.com/google-research/football
首先创建一个名为footballenv并激活它的虚拟环境。
virtualenv footballenv
source footballenv / bin / activate
现在安装此项目所需的系统依赖项和python包。确保选择适合系统的正确的gfootball CPU / GPU版本。
sudo apt-get install git cmake build-essential libgl1-mesa-dev
libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-gfx-dev libboost-all-dev libdirectfb-dev libst-dev mesa-utils xvfb x11vnc libsqlite3-dev glee-dev libsdl-sge-dev python3-pip
pip3 install gfootball [tf_gpu] == 1.0
pip3 install keras
运行足球环境
现在安装了游戏,尝试测试它是否在系统上正确运行。
典型的强化学习设置通过让AI代理与我们的环境进行交互来实现。代理商观察state环境的当前状况,并根据一些人policy做出决定采取特定措施action。然后将此动作转发回向前移动的环境step。这生成一个reward指示在正在播放的游戏的上下文中所采取的动作是正面还是负面的。使用此奖励作为反馈,代理人试图找出如何修改其现有政策以便在将来获得更好的奖励。
典型的RL代理
现在继续实施这个,以便与这个足球环境进行交互的随机动作AI代理。创建一个名为的新python文件,train.py并使用之前创建的虚拟环境执行以下操作。
import gfootball.env as football_env
env = football_env.create_environment(env_name='academy_empty_goal', representation='pixels', render=True)
state = env.reset()
while True:
observation, reward, done, info = env.step(env.action_space.sample())
if done:
env.reset()
这env为academy_empty_goal玩家在半线产生并且必须在右侧的空目标中得分的场景创建了一个环境对象。representation='pixels'意味着代理将观察到的状态是在屏幕上呈现的帧的RGB图像的形式。如果看到屏幕上的玩家在游戏中采取随机动作,恭喜,一切都设置正确,可以开始实施PPO算法了!
以下是视频格式中的相同安装步骤,如果您更喜欢的话。
近端策略优化(PPO)
PPO算法由OpenAI团队在2017年引入,并迅速成为篡夺Deep-Q学习方法的最流行的RL方法之一。它涉及收集与环境相互作用的一小批经验,并使用该批次更新其决策政策。使用此批处理更新策略后,将丢弃体验并使用新更新的策略收集较新的批处理。这就是为什么它是一种“政策上学习”方法,其中收集的经验样本仅对更新当前政策一次有用。
PPO的关键贡献是确保政策的新更新不会像以前的政策那样改变太多。这导致训练的差异较小,但代价是偏差,但确保训练更顺畅,并确保代理人不会走上一条无法恢复的道路,采取毫无意义的行动。因此,让我们继续将我们的AI代理分解为更多细节,并了解它如何定义和更新其策略。
Actor-Critic方法
将对PPO代理使用Actor-Critic方法。它使用两种模型,包括Deep Neural Nets,一种叫做Actor,另一种叫做Critic。
PPO代理
Actor model
在Actor model执行学习采取什么行动环境的特定状态观察下的任务。在例子中,它将游戏的RGB图像作为输入,并提供特定的动作,如拍摄或传递作为输出。
Actor model
先实现这一点。
def get_model_actor_image(input_dims, output_dims):
state_input = Input(shape=input_dims)
n_actions = output_dims
# Use MobileNet feature extractor to process input image
feature_extractor = MobileNetV2(include_top=False, weights='imagenet')
for layer in feature_extractor.layers:
layer.trainable = False
# Classification block
x = Flatten(name='flatten')(feature_extractor(state_input))
x = Dense(1024, activation='relu', name='fc1')(x)
out_actions = Dense(, activation='softmax', name='predictions')(x)
# Define model
model = Model(inputs=[state_input],outputs=[out_actions])
model.compile(optimizer=Adam(lr=1e-4), loss='mse')
return model
在这里,首先定义state_input神经网络的输入形状,这是RGB图像的形状。n_actions是在这个足球环境中可用的动作总数,它将是神经网络的输出节点总数。
正在使用预训练的MobileNet CNN的前几层来处理输入图像。也正在使这些图层的参数不可训练,因为不想改变它们的权重。仅训练添加在此特征提取器顶部的分类层以预测正确的动作。将这些层组合为Keras Model并使用均方误差丢失进行编译(目前,这将在本教程后面更改为自定义PPO丢失)。
Critic model
将演员预测的动作发送到足球环境并观察比赛中发生的事情。如果由于行动而发生积极的事情,比如对目标进行评分,那么环境会以奖励的形式发回积极的回应。如果由于行为而发生了自己的目标,那么会得到负面的回报。这个奖励是由Critic model。
Critic model
Critic模型的工作是学习评估Actor采取的行动是否导致环境处于更好的状态,并将其反馈给Actor,因此得名。它输出一个实数,表示在先前状态下采取的动作的等级(Q值)。通过比较从评论家获得的评级,演员可以将其当前政策与新政策进行比较,并决定如何改进自己以采取更好的行动。
实施批评家。
def get_model_critic_image(input_dims):
state_input = Input(shape=input_dims)
# Use MobileNet feature extractor to process input image
feature_extractor = MobileNetV2(include_top=False, weights='imagenet')
for layer in feature_extractor.layers:
layer.trainable = False
# Classification block
x = Flatten(name='flatten')(feature_extractor(state_input))
x = Dense(1024, activation='relu', name='fc1')(x)
out_actions = Dense(1, activation='tanh')(x)
# Define model
model = Model(inputs=[state_input], outputs=[out_actions])
model.compile(optimizer=Adam(lr=1e-4), loss='mse')
return model
如您所见,Critic神经网络的结构几乎与Actor相同。唯一的主要区别是,Critic的最后一层输出一个实数。因此,使用的激活是tanh,softmax因为不需要像Actor这样的概率分布。
现在,PPO算法中的一个重要步骤是使用两个模型贯穿整个循环,执行固定数量的步骤,称为PPO步骤。基本上,正在与environemt进行一定数量的步骤互动,并收集将用于训练的状态,行动,奖励等。
把它们捆绑在一起
现在已经定义了两个模型,可以使用它们与足球环境进行交互,以获得固定数量的步骤并收集经验。在拥有足够大量的此类样本后,这些经验将用于更新模型的政策。这是如何实现循环收集这样的样本体验。
import gfootball.env as football_env
import numpy as np
import keras.backend as K
from keras.layers import Input, Dense, Flatten
from keras.models import Model
from keras.optimizers import Adam
from keras.applications.mobilenet_v2 import MobileNetV2
def get_model_actor_image(input_dims):
state_input = Input(shape=input_dims)
feature_extractor = MobileNetV2(weights='imagenet', include_top=False)
for layer in feature_extractor.layers:
layer.trainable = False
x = Flatten(name='flatten')(feature_extractor(state_input))
x = Dense(1024, activation='relu', name='fc1')(x)
out_actions = Dense(n_actions, activation='softmax', name='predictions')(x)
model = Model(inputs=[state_input], outputs=[out_actions])
model.compile(optimizer=Adam(lr=1e-4), loss='mse')
return model
def get_model_critic_image(input_dims):
state_input = Input(shape=input_dims)
feature_extractor = MobileNetV2(weights='imagenet', include_top=False)
for layer in feature_extractor.layers:
layer.trainable = False
x = Flatten(name='flatten')(feature_extractor(state_input))
x = Dense(1024, activation='relu', name='fc1')(x)
out_actions = Dense(1, activation='tanh', name='predictions')(x)
model = Model(inputs=[state_input], outputs=[out_actions])
model.compile(optimizer=Adam(lr=1e-4), loss='mse')
return model
env = football_env.create_environment(env_name='academy_empty_goal', representation='pixels', render=True)
state = env.reset()
state_dims = env.observation_space.shape
print(state_dims)
n_actions = env.action_space.n
print(n_actions)
ppo_steps = 128
states = []
actions = []
values = []
masks = []
rewards = []
actions_probs = []
actions_onehot = []
model_actor = get_model_actor_image(input_dims=state_dims)
model_critic = get_model_critic_image(input_dims=state_dims)
for itr in range(ppo_steps):
state_input = K.expand_dims(state, 0)
action_dist = model_actor.predict([state_input], steps=1)
q_value = model_critic.predict([state_input], steps=1)
action = np.random.choice(n_actions, p=action_dist[0, :])
action_onehot = np.zeros(n_actions)
action_onehot[action] = 1
observation, reward, done, info = env.step(action)
mask = not done
states.append(state)
actions.append(action)
actions_onehot.append(action_onehot)
values.append(q_value)
masks.append(mask)
rewards.append(reward)
actions_probs.append(action_dist)
state = observation
if done:
env.reset()
env.close()
正如在上面的代码中所看到的,已经定义了一些python列表对象,这些对象用于存储诸如观察状态,操作,奖励等信息,当与环境进行交互时ppo_steps。这给了一批128个样本经验,这些经验将在以后用于训练Actor和Critic神经网络。
以下两个视频逐行解释此代码,并在游戏屏幕上显示最终结果。
这就是本教程的这一部分。在Linux系统上安装了Google Football Environment,并实现了与此环境交互的基本框架。接下来,定义了Actor和Critic模型,并使用它们与此游戏进行交互并收集样本体验。