强化学习实验

本文通过一个猫鼠游戏的实例,详细介绍了强化学习的原理、困难、方法,并提供了在Anaconda环境下安装TensorFlow与Spyder IDE的步骤。实验中,通过调整参数观察智能鼠标从非智能到智能的进化过程,揭示了强化学习的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.实验标题

强化学习实验

二.实验目的

了解并学习与强化学习有关的基本知识与实验方法。

三.强化学习的原理和思想

一.Reinforcement Learning的概念
机器学习可以分为三类,分别是 supervised learning,unsupervised learning 和reinforcement learning。而强化学习与其他机器学习不同之处为:


没有教师信号,也没有label。只有reward,其实reward就相当于label。
反馈有延时,不是能立即返回。
相当于输入数据是序列数据。
agent执行的动作会影响之后的数据。


强化学习的关键要素有:environment,reward,action 和 observation(state)。有了这些要素我们就能建立一个强化学习模型。强化学习解决的问题是,针对一个具体问题得到一个最优的policy,使得在该策略下获得的reward最大。所谓的policy其实就是一系列action。也就是sequential data。 
强化学习可用下图来刻画,都是要先从要完成的任务提取一个环境,从中抽象出状态(state) 、动作(action)、以及执行该动作所接受的瞬时奖赏(reward)。
 


二.Supervised Learning vs. Reinforcement Learning
 
拿下围棋来举例,监督学习的思路是,人类在给出training set的时候,每个training data包含了一个残局,已经告诉它在这样的情况下应该怎样下棋。但是这样的缺陷是,有些情况连人类都不知道正确的是什么(比如下围棋中最厉害的棋手也不能保证下一步的子是最优的)。这种策略类似于学校里学生向老师学习,但是不可能超过老师。
而强化学习的思路是,人类不会教他怎么下棋,但是它会和人类来下棋,当完成一盘棋的时候,如果赢了,就会得到一个positive reward,输了就会得到一份negative的reward。Agent的目标是,最大化reward。但是尽管赢了,它也是不知道过去的哪步是好的,哪几部是不好的。这种策略类似于人在社会上学习,你知道结果,但是你可能很难确定你哪几步做得好,哪几步做得不好,这是一种从经验中学习的过程。在下围棋这个task中,training是通过和人对战,但是由于需要大量的training,一般是通过两个agent互战来实现的。


三.Reinforcement Learning的困难之处
 
概括的讲就是强化学习需要agent有远见,不能仅仅只考虑这一步的最优解,而应考虑这个过程的最优解。


四.Reinforcement Learning Approach的分类
 
我只了解了policy based approach,即通过training获得一个rational的actor。以下简要介绍。
Value based Approach 中一个很有名的是Q-learning,这个我目前还不会。


五.Policy Based Reinforcement Learning Approach
Actor在下图中就是那个将observation映射到action的函数π,而reward就是用来从a set of functions中选出一个满意的actor。
 
我们可以使用神经网络来作为函数集合,以电玩space invader为例,输入就是一张图片,输出是每个操作的可能性。注意这里的输出是stochastic的,意味着在训练完成后,reward高的操作会更有可能执行,但是reward低的操作也有一定几率执行,而不是说每次都只会选择expect reward最高的动作执行。
 
在之前的监督学习中,我们判断actor的好坏是通过实际给出几个example,判断hypothesis和真实的target的error的大小而确定的,error较小的为更好的actor。

而在强化学习中,判断一个actor的好坏是通过让它执行一系列的action,通过加总的reward来评估actor的好坏,reward越大越好。而且,由于环境是不确定的,同样举space invader游戏的例子,也就是同样的actor在不同的游戏次数下,可能会碰见不同的外星人,这个是由游戏自身的随机性决定的。因此,同样的π_θ (s)会产生不同的R_θ,因此需要重复运行同一款游戏获得一个期望值R_θ。
 
定义为一系列的{observation, action, reward}的序列(从游戏开始到结束)。R()为总的reward。如下:
 
由于我们之前说过,NN的输出是一个vector of probability of each op,因此Actor的输出与最后产生的动作之间具有不确定性,而且环境也是stochastic的,所以即使拿到一个π_θ,游戏的进行过程也是随机的,有些过程,如:飞船第一次就被外星人打死了,完全不会闪躲,这在一个“good”的actor下发生概率不高,而飞船成功躲过第一次外星人的袭击,过了很久才被射死的几率会更高。P(|)就反映了这个几率。
由于游戏是连续的,可能的有无穷多个,我们不可能一一去计算每种情况的几率P(|)也无法计算完,一个比较合理的方案是,让Agent重复玩这个游戏N次,记录下每次Agent的trajectory ,因此R_θ可以近似为每次抽样的获得的reward的平均,由于P(|)高的trajectory会更常在sample中出现,P(|)低的trajectory会更不常在sample中出现,因此这是一个很好的对R_θ的近似。
 
形式化的说,我们希望找到的目标θ^*,本质上就是找到一个能让〖R〗_θ最大的θ^*。
 
使用梯度上升法就可以求解。(可以把这个〖R〗_θ理解成强化学习的cost function)
 
因此,之后所有的步骤都是希望解决下面这一行的问题:
 
又因为R()是给出一盘完整的游戏的过程,他能拿到几分,这由游戏设计者确定的(或者指定奖赏策略的人确定的),这和θ无关,因此可以改写成:
 
实际上,就算算法完全不知道R()的运算过程也没关系,只要放进去一个能拿到结果就行了(can be treated as a black box),事实上,如果游戏的奖赏有随机性,比如说抢红包这种,你永远也别想打开这个黑盒子。
经过一系列的化简,加上转换成可实际求值的sample策略,结果如下:
------(*)
现在,我们的目标就是求出logP(τ^n |)。
我们先算P(τ|):
思考一下,当拿到状态s(t),下一步的动作a(t)只取决于θ和s(t),做完动作之后,我们根据s(t)和a(t)会得到下一个状态(也即观察到的observ
### 关于Python强化学习实验的资料与示例 #### 强化学习简介 强化学习是一种通过试错来让智能体学会如何采取行动的学习方法。它广泛应用于游戏、机器人控制等领域[^1]。 #### 开发工具概述 以下是几个常用的强化学习开发工具及其特点: - **PyTorch**: 这是一个基于Python的开源深度学习框架,因其灵活性和易用性而受到欢迎,在强化学习项目的开发中表现优异[^1]。 - **TensorFlow**: Google推出的深度学习框架,同样支持强化学习的应用场景,拥有强大的社区支持和资源。 - **OpenAI Gym**: 提供了一个标准接口,允许开发者测试并比较不同的强化学习算法。它是初学者入门的好选择。 - **Stable Baselines**: 构建在PyTorch和TensorFlow之上,封装了许多经典强化学习算法,简化了其实现过程。 - **Ray**: 支持分布式计算,特别适用于大规模数据集或复杂环境下的强化学习任务[^1]。 #### 示例代码:简单Q-Learning实现 下面展示的是一个使用`numpy`库完成的经典Q-learning算法的小例子,该算法是强化学习的基础之一。 ```python import numpy as np class QLearningAgent: def __init__(self, states_count, actions_count, learning_rate=0.1, discount_factor=0.99, exploration_rate=1.0): self.q_table = np.zeros((states_count, actions_count)) self.learning_rate = learning_rate self.discount_factor = discount_factor self.exploration_rate = exploration_rate def choose_action(self, state, possible_actions): if np.random.rand() < self.exploration_rate: action_index = np.random.choice(len(possible_actions)) else: q_values_of_state = self.q_table[state] max_q_value = np.max(q_values_of_state) best_actions_indices = [i for i, value in enumerate(q_values_of_state) if value == max_q_value] action_index = np.random.choice(best_actions_indices) return possible_actions[action_index] def learn(self, state, action, reward, next_state): current_q = self.q_table[state][action] future_max_q = np.max(self.q_table[next_state]) new_q = (1 - self.learning_rate) * current_q + \ self.learning_rate * (reward + self.discount_factor * future_max_q) self.q_table[state][action] = new_q # Gradually reduce the exploration rate to favor exploitation over time. if self.exploration_rate > 0.01: self.exploration_rate *= 0.995 ``` 此代码定义了一个简单的QLearning代理类,其中包含了状态空间大小、动作数量以及其他超参数初始化的功能。还实现了两个主要函数——一个是用于选取下一步操作的选择策略;另一个则是更新Q表值的学习机制[^2]。 #### 论文推荐 对于希望深入了解强化学习理论和技术的人来说,《基于多动作深度强化学习的柔性车间调度研究》一文中提到的研究成果可能非常有启发意义。文章探讨了利用DRL解决特定工业领域内的优化难题的可能性,并给出了相应的Python代码实现方案[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值