强化学习
课程:Q-Learning强化学习(李宏毅)、深度强化学习
强化学习是一种允许你创造能从环境中交互学习的AI Agent的机器学习算法,其通过试错来学习。如上图所示,大脑代表AI Agent并在环境中活动。当每次行动过后,Agent接收到环境反馈。反馈包括回报Reward和环境的下个状态State,回报由模型设计者定义。如果类比人类学习自行车,可以将车从起始点到当前位置的距离定义为回报。
分类:
1)基于价值Value的强化学习算法 - Q-learning
基本思想:根据当前的状态,计算采取每个动作的价值,然后根据价值贪心地选择动作,即预测某个环境下所有Action的期望值(即Q值)
例如:Deep Q Network、Double DQN、Prioritised replay、Dueling Network、NatureDQN
2)基于策略梯度的强化学习算法 - Policy Gradients
基本思想:省略中间步骤,直接根据当前的状态来选择动作,即直接预测在某个环境下应该采取的Action
例如:Policy Network
一般来说,Q-learning方法只适合有少量离散取值的Action环境,而Policy Gradients方法适合有连续取值的Action环境。在与深度学习方法结合后,这两种算法就变成了Policy Network和DQN(Deep Q-learning Network)
对比:
(1)Policy Network可以处理连续的action,而DQN则只能处理离散问题,通过枚举的方式来实现,连续的action只能离散化后再处理。
(2)Policy Network通过输出的action概率值大小随机选择action,而DQN则通过贪婪选择法ε-greedy选择action。
(2)DQN的更新是一个一个的reward进行更新,即当前的reward只跟邻近的一个相关;Policy Network则将一个episode的reward全部保存起来,然后用discount的方式修正reward,标准化后进行更新。
深度强化学习
2013年,在DeepMind发表的论文Playing Atari with Deep Reinforcement Learning中,介绍了一种新算法——深度Q网络(DQN),展示了AI Agent如何在没有任何先验信息的情况下通过观察屏幕学习玩游戏。从而开启了所谓的“深度强化学习”新时代,其是混合了深度学习与强化学习的新算法。
在Q学习算法中,有一种函数被称为Q函数,它用来估计基于一个状态的回报。同样地,在DQN中,我们使用一个神经网络估计基于状态的回报函数。
使用Keras与Gym环境基于DQN玩CartPole游戏
Github:https://github.com/keon/deep-q-learning
Cart-Pole车杆游戏
CartPole是OpenAI gym中最简单的一个环境,CartPole的目的就是杆子平衡在移动的小车上。游戏规则很简单,游戏里面有一个小车,上有竖着一根杆子。小车需要左右移动来保持杆子竖直。如果杆子倾斜的角度大于15°,那么游戏结束。同时,小车也不能移出一定范围(中间到两边各2.4个单位长度)。其中,除了像素信息,还有四种信息可以用作状态,例如:杆子的角度、车在滑轨的位置。Agent可以通过施加左(0)或右(1)的动作,使小车移动。
Gym
Gym 是 OpenAI 发布的用于开发和比较强化学习算法的工具包。使用它我们可以让 AI 智能体做很多事情,比如行走、跑动,以及进行多种游戏。
# 安装Gym pip install gym
# 基于Gym进行游戏环境交互
next_state, reward, done, info = env.step(action)
其中,action可以选择0或1,输入环境中将会反馈结果。env是游戏环境类。done为标记游戏结束与否的布尔量。当前状态“state”,“action”,“next_state”与“reward”是用于训练Agent的数据。
使用Gym实现Cart-Pole
# -*- coding: utf-8 -*- import gym import numpy as np def try_gym(): # 使用gym创建一个CartPole环境 # 这个环境可以接收一个action,返回执行action后的观测值,奖励与游戏是否结束 env = gym.make('CartPole-v0') # 重置游戏环境 env.reset() # 游戏轮数 random_episodes = 0 # 每轮游戏的Reward总和 reward_sum = 0 count = 0 while random_episodes < 10: # 渲染显示游戏效果 env.render() # 随机生成一个action,即向左移动或者向右移动。 # 然后接收执行action之后的反馈值 observation, reward, done, _ = env.step(np.random.randint(0, 2)) reward_sum += reward count += 1 # 如果游戏结束,打印Reward总和,重置游戏 if done: random_episodes += 1 print("Reward for this episode was: {}, turns was: {}".format(reward_sum, count)) reward_sum = 0 count = 0 env.reset() if __name__ == '__main__': try_gym()
输出的是每一轮游戏从开始到结束得到的Reward的总和与操作次数
使用Keras实现简单神经网络
训练神经网络,从成对的输入与输出数据学习某种模式并且可以基于不可见的输入数据预测输出。
使用一个包含四种输入信息的输入层和三个隐藏层,以及两个节点的输出层 - 对应游戏中的两个按钮(0与1)
# Neural Net for Deep Q Learning # Sequential() creates the foundation of the layers. model = Sequential() # Dense is the basic form of a neural network layer # Input Layer 4 and Hidden Layer with 128 nodes model.add(Dense(64, input_dim=4, activation='tanh')) # Hidden layer with 128 nodes model.add(Dense(128, activation='tanh')) # Hidden layer with 128 nodes model.add(Dense(128, activation='tanh')) # Output Layer with 2 nodes model.add(Dense(2, activation='linear')) # Create the model based on the information above model.compile(loss='mse', optimizer=RMSprop(lr=self.learning_rate))
为了让模型可以基于环境数据理解与预测,需要传入数据。其中,fit()方法为模型提供“states”和“target_f”信息
model.fit(state, target_f, nb_epoch=1, verbose=0)
当模型调用predict()函数时,模型根据学习之前训练过的数据,来预测现在状态的回报函数
prediction = model.predict(state)
实现深度Q算法(DQN)
DQN算法最重要的特征是记忆(remember)与回顾(replay)方法
记忆:需要记录下先前的经验与观察值以便利用这些先前数据训练模型。将调用代表经验的数组数据memory和remember()函数来添加状态、动作、回报、下次状态到memory中
# memory列表
memory = [(state, action, reward, next_State)...]
# 存储
def remember(self, state, action, reward, next_state, done): self.memory.append((state, action, reward, next_state, done))
回放:基于存储在memory中的数据(经验)训练神经网络
# 从memory中抽出部分数据,给训练数据bathces batches = min(batch_size, len(self.memory)) # 打乱memory中的bathces的索引数,例如batchce为[1,5,2,7]- 样本在memory中的索引数为1,5,2,7 batches = np.random.choice(len(self.memory), batches)
# 为了使Agent在长期运行中表现得