神经网络是一种由多个层组成的机器学习模型,这些层会执行矩阵-向量乘法,然后应用一个非线性激活函数,神经网络的矩阵是模型的可学习参数,通常称为神经网络的权重。
书本中用到最重要的图是线图,线图类似于流程图,它表示沿着线进入流程中的输入数据流,其中流程以方框表示。任何能够称为线图的东西必须能够在任何抽象层次上进行详细查看且保持类型兼容。优秀线图的目标是,我们可以通过在高层次上查看一个算法或机器学习模型来获取整体蓝图,然后可以将其逐渐放大,直到线图详细到我们可以几乎完全基于图的知识来真正实现算法。
之后书中用了一个解决多臂老虎机问题的案例来引入马尔可夫决策过程。
多臂老虎机问题可以描述为我们希望获悉基于之前轮次采取动作的期望奖励。用数学描述为你向函数提供一个动作(假设处于轮次k),它返回采取该动作时的期望奖励。
称为价值函数,用于表示某物的价值,它是一个动作-价值函数,通常称为Q函数。
第一次开始玩游戏时,我们需要玩游戏并观察各台老虎机上的奖励,我们称这种策略为探索;与之对应的是利用,就是使用现有的关于哪台老虎机可能产生最高奖励的知识,并一直玩这台老虎机。我们需要使用探索和利用的合理平衡来最大化奖励。
我们将上述函数Q作用于所有可能的动作,得到平均奖励最高的动作,但是该方法没办法去做一个不为我们所知的动作。这种简单地选择目前为止所知的最佳杠杆的方法称为贪婪方法。
而ε贪婪算法就解决了这个问题。这样就可以根据概率ε随机选择一个动作a,而其余时间(概率1-ε)将基于当前从过去游戏中所知的信息选择最佳杠杆。之后就是代码实现:
import numpy as np
from scipy import stats
import random
import matplotlib.pyplot as plt
def get_reward(prob, n=10):#奖励函数,表示随机生成的数与期望值比较,大于期望加1。
reward = 0
for i in range(n):
if random.random() < prob:
reward += 1
return reward
def update_record(record,action,r):#更新记录,通过前k次的平均奖励与次数乘积与k+1次的值求和再除以k+1得到新的平均值
new_r = (record[action,0] * record[action,1] + r) / (record[action,0] +
1)
record[action,0] += 1
record[action,1] = new_r
return record
def get_best_arm(record):#计算最佳动作
arm_index = np.argmax(record[:,1],axis=0)
return arm_index
fig, ax = plt.subplots(1,1)
ax.set_xlabel("Plays")
ax.set_ylabel("Avg Reward")
n=10
record = np.zeros((n,2))
probs = np.random.rand(n)
eps = 0.2
rewards = [0]
for i in range(500):
if random.random() > eps:
choice = get_best_arm(record)
else:
choice = np.random.randint(10)
r = get_reward(probs[choice])
record = update_record(record,choice,r)
mean_reward = ((i+1) * rewards[-1] + r)/(i+2)
rewards.append(mean_reward)
ax.scatter(np.arange(len(rewards)),rewards)
可以看出平均奖励确实有所提高。
随后讲了Softmax选择策略,该动作选择比ε贪婪算法能够更快的收敛到一个最优策略。
之后介绍了一下pytorch,并用他创建模型完成老虎机训练。
马尔可夫性质:神经网络引导我们在不参考任先验状态的情况下选择给定状态下的最佳动作。我们只需向其提供当前状态,神经网络就会为每个可能的动作产生期望的奖励。我们把具有马尔可夫性质的游戏称为马尔可夫决策过程(MDP)
之后介绍了价值函数与策略函数。
|