定义
Q-learning
是最优动作-价值的方法中的一种。主要的思想,算法预测一个状态-动作对的值,然后将该预测值与稍后观察到的累计奖励进行比较并更新算法的参数,以便下次做出更好的预测。一句话,神经网络预测给定状态下每个动作的期望奖励,观察实际奖励,并相应地更新网络。

贴现因子
也称折现系数或折现参数,是一个介于0-1之间的数,用于将未来的现金流量折算成现值。 当利率为r时,一个承诺在T年之后支付R美元的现值就是R美元除以(1+r)^T。 因此,即使没有通货膨胀,将来的1美元的价值也小于现在的1美元的价值。必须按某一数额贴现,该数额取决于利率的高低和收到货币的时间长短。 其中的1/ (1+r) T被称为未来T时期的货币的贴现因子。 贴现因子在数值上可以理解为贴现率,它表示的是1个份额经过一段时间后所等同的如今份额。一个月后的200美元,和现在的100美元的关系就是,0.5*200=100。然后再过一个月,也就是两个月和现在100美元比的话就是,100/0.5^2=400,也就是等价于两个月后给400
为什么要有贴现因子:对未来的奖励和现在的奖励对比,未来的奖励高,那肯定先选未来的,虽然先选后选,整体奖励是相等的,但效果却不一样,较近的奖励通常比较远的奖励更有价值。
学习率
超参数,控制算法从每步中学习的速度,值比较小,则每步只会有较小的更新
Q函数
接收一个状态和动作,并返回在该状态下采取该动作产生价值(期望奖励)。
Q-learning的改造Q函数,Q函数接收一个状态,返回输出所有动作对应的期望奖励的向量,这样做的好处是可以直接选择最高预测值的动作。
损失函数
也被称为目标函数,是衡量模型预测值与真实值之间差异的一种重要工具。在编译一个神经网络模型时,损失函数和优化器是两个必不可少的要素。
损失函数的具体形式是一个非负实值函数,通常使用L(Y, f(x))来表示,其中Y代表真实值,f(x)代表模型的预测值。损失函数的值越小,代表模型的预测值越接近真实值,因此模型的鲁棒性就越好。
在机器学习中,有各种各样的损失函数可供选择。例如,均方差损失(Mean Squared Loss)和平均绝对误差损失(Mean Absolute Error Loss)是适用于回归问题的两种常见损失函数。
MSE = Σ(yi - f(xi))^2 / n,均方差损失函数的值越小,代表模型的预测值越接近真实值,因此模型的鲁棒性就越好。此外,均方差损失函数还可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
超参数
在机器学习模型中,一般存在两类参数。一类是模型参数,这类参数需要从数据中学习和估计得到,比如线性回归直线的加权系数(斜率)及其偏差项(截距)。另一类则是超参数。
超参数是一种手工可配置的设置,具有未知的特性,即它不是一个已知常量。它是需要人为根据已有或现有的经验来指定“正确”的值,而不是通过系统学习得到的。具体来说,超参数是模型外部的配置,其值无法从数据中估计。它们通常用于帮助估计模型参数,由人工指定,并且经常被调整以适应特定的预测建模问题。
例如,在神经网络中,学习率就是一个典型的超参数。与模型参数不同,超参数不需要数据来驱动调整,而是在训练前或者训练中人为进行调整的参数。
超参数的重要性不容忽视,合理的超参数设置可以显著提高模型的性能。然而,确定最佳超参数值的过程往往需要反复试验和搜索。虽然我们无法知道给定问题的模型超参数的最佳值,但我们可以使用经验法则,在其他问题上使用复制值,或通过反复试验来搜索最佳值。
ReLu
全称是Rectified Linear Unit,是一种激活函数,用来连接上一层的输出和下一层的输入,如下,就是一个取最大值的函数,如果输入大于0,直接返回作为输入提供的值;如果输入是0或更小,返回值0。
- def rectified(x):
- return max(0.0, x)
实践
Gridworld游戏,Gridworld需要的库,也就是书中的库位置,在github中
先测试下,是否可以正常运行,书中使用的是交互式,直接运行需要像如下,加上print显示返回值,或者改写下display、reward函数
- from Gridworld import Gridworld
- game = Gridworld(size=4, mode='static')
- #这里加上print
- print(game.display())
- print(game.reward())
不加print的话,就改写的地方如下图
game.board.render_np()输出当前4个状态的4x4矩阵(第一个矩阵编码了玩家位置P,第二个编码目标位置+,第三个编码坑的位置-,第四个编码墙的位置W)
视频讲解