上一节我们介绍了什么叫增强式学习,它的模型值得我们印刻在脑海里:
我们要打造一个Agent,也就是智能机器人,它运作在一个给定环境中。它每次与环境互动时都有给定种选择,同时它可以获得当前环境的状态,Agent如果在有限种选择中选择了“正确”的选择,那么环境就会给它一个正回馈,如果做出了错误选择 ,环境就会给它负反馈。
问题在于Agent如何根据当前环境状况让自己做出的选择以最大概率获得正回馈呢?这就是增强式学习的核心所在,我们必须给Agent一套原则或算法,让它懂得如何根据当前环境的变化做选择,而且这套算法要能够不断进化,随着算法运行得越多,算法能根据环境的回馈不断调整自己,然后算法能抽取出从当前环境状况找到最佳选择的规律。
我们注意到增强式学习与以往神经网络不同之处。以前的神经网络要想提升准确率,一个前提就是不断增加输入数据量。而增强式学习不同,它不需要输入更多数据,它只要增加与环境互动的次数,从互动结果中直接学习,不需要额外数据是增强式学习强大之处。
本节我们研究一种叫基于策略的学习法。假设在一个模拟环境中,Agent有5种选择,如果它没有学习能力,那么无论环境如何变化,它都只会在5种选择中随意选择一种。假设一次episode需要agent作出100次选择,那么我们预计每种选择大概有20次。当然20只是预测值,在具体一次episode中,某种选择肯定不是恰好20次。我们用下面代码模拟一下类似情况:
import numpy as np
counts = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
for i in range(100):
choice = np.random.choice([1, 2, 3, 4, 5])
counts[choice] += 1
print(counts)
运行代码会发现,每一种选择都不可能正好是20次,当如果把上面代码运行多次,那么每种选择的次数评价起来会是20次左右。接下来我们进行一种简单的环境模拟,我们模拟两个agent从1到5中选择,每人选择100次然后加总,最后结果大的获胜:
def simulate_game(policy):
player_1_choices = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
player_1_total = 0
player_2_choices = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
player_2_total = 0
for i in range(100):
player_1_choice = np.random.choice([1,2,3,4,5], p = policy)
player_1_choices[player_1_choice] += 1
player_1_total += player_1_choice
player_2_choice = np.random.choice([1,2,3,4,5], p = policy)
player_2_choices[player_2_choice] += 1
player_2_total += player_2_choice
if player_1_total > player_2_total:
winner_choices = player_1_choices
loser_choices = player_2_choices
else:
winner_choices = player_2_choices
loser_choices = player_1_choices
return (winner_choices, loser_choices)
policy = [0.2, 0.2, 0.2, 0.2, 0.2]
print(simulate_game(policy))
多运行几次上面代码就会看到,winner就是能多次挑选到大数值的player,例如我运行后结果如下: ({1: 21, 2: 14, 3: 19, 4: 26, 5: 20}, {1: 20, 2: 25, 3: 21, 4: 18, 5: 16}) 不难理解在这样的环境里,选1是坏选择,选5才是好选择。如果代码中的Player拥有学习能力的话,它就能从反馈中发现每种选择的好坏,例如它会发现自己选择1多的时候负反馈也多,选5多的时候正反馈也多,于是它就会主动增加选择5的几率。
代码中的player可以基于如下政策调整比率。首先随机选择,然后根据结果调整。如果一次模拟下来发现自己的选择得到了胜利,那么它下次就就增加本次选择中选取次数最多的那个数值,如果失败了,它下次就减少选取次数最多的那个数值,如此反复足够多后,player就会不自觉的多选择5少选择1,这就是基于政策的学习算法核心所在。
上面展示的学习算法还不足以应用到围棋这么复杂的情景。首先上面模拟中player并没有根据环境的当前状态去做选择,同时如何对“环境”进行分析是一个非常棘手的问题。在围棋中所谓“环境”就是棋盘上棋子的分布,如何把棋盘布局与落子方式关联起来就需要使用神经网络进行计算。
我们已经知道,在神经网络中,我们通过修改连接链路的权重来改进网络的输出结果,链路的修改方法就是梯度下降法。以前我们总是修改权重,使得网络的输出与给定结果尽可能的接近,现在不一样,我们要在给定策略条件下,通过分析当前棋盘情况去修改链路权重,这种做法就叫基于政策的梯度下降法。
接下来我们将通过代码的方式,逐步实现整个AlphaGo系统,在模块实现时我们会突出相应的学习算法,很多抽象或难理解的概念无法用语言来表述清楚,但是落实到代码上时反而能变得具体和生动,从而更好理解,因此对计算机技术而言,实践永远是最好的学习方法!
更多详细内容请点击阅读原文链接