本文为Python之 AI人工智能初学者指南第三章。
在第一章中,MDP强化学习项目产生了一个结果作为输出矩阵,在第二章 像机器那样思考中,麦卡洛克-皮特斯神经元系统产生了一个回报矩阵输入。但是,这两个函数的中间或最终结果需要不断地度量。好的度量解决了给定问题的重要部分,因为决策依赖于它们。可靠的决策由可靠的运算制定。本章的目的是介绍度量方法。
人类智能的主要功能,决策制定,依赖于评估状况的能力。没有对利弊的权衡以及参数因素的考虑是无没做出决策的。
人类很为自己的预判评估能力而自豪。但是在很多情况下,机器都能做到更好。棋类代表着人类思考战略的尊严。在很多电影中棋盘都象征着人类的智慧。
如今,没有任何模糊玩家可以占用最好的模糊引擎。棋类引擎的一个最显著的核心能力正是评估函数,它对很多参数的考虑比人类更为精确。
本章集中讲解评估和度量的主要概念,它们是深度学习梯度下降驱动模型的铺垫,在后续章节中会进行讲解。
本章中将涵盖如下主题:
- 学习会话阶段的评估
- 数字收敛度量
- 交叉熵收敛概念简介
- 决策树监督学习评估方法
- 决策树监督学习预测模型
- 如何对自己构建的现实生活问题应用评估工具
技术准备
- 推荐使用Python3.6
- 与Python 3.6兼容的NumPy
- 带有TensorBoard的TensorFlow
- Python中使用的Graphviz 2.28
问题参见GitHub的Chapter03:
- Q_learning_convergence.py
- Decision_Tree_Priority_classifier.py
观看如下视频来查看代码实时操作:
决定度量什么以及如何度量
在第二章 像机器那样思考中,麦卡洛克-皮特斯神经元系统在以下过程中生成了一个带有独热函数的向量。
lv = \(\begin{bmatrix}0.0002\\0.2\\0.9\\0.0001\\0.4\\0.6\\\end{bmatrix}\) → softmax(lv) → \(\begin{bmatrix}0.111\\0.135\\0.273\\0.111\\0.165\\0.202\\\end{bmatrix}\) → 独热函数 → \(\begin{bmatrix}0\\0\\1\\0\\0\\0\\\end{bmatrix}\) → R → \(\begin{bmatrix}0\\0\\100\\0\\0\\0\\\end{bmatrix}\)
R,回报向量,代表强化学习项目的输入,需要进行度量。
本章处理一种为构建基于公司数据的回报矩阵的方法设计。它依赖于所提供的数据、权重和偏差。在引入基于感知机的深度学习前馈神经网络时(第四章 成为一个打破惯例的创新者),系统无法通过一个训练集来满足。系统通过反向传播算法有一个学习训练集的自然倾向。在这种情况下,一组公司数据是不够的。
在现实生活的公司项目中,只有到产生成千上万条结果时系统都会生效。有些案例中,集团仅在上百个带有数百条数据的数据集进行过测试来验证场景的精确性之后才会批准系统的建立。每个数据集代表一个场景顾问可以处理一些参数脚本。顾问引入由系统测试并进行了度量的参数场景。在每个神经元带有多达200个参数的系统中,顾问会需要在生产环境中保留好几年。在第四章 成为一个打破惯例的创新者中,系统会无需顾问而独立存在。即便在这时,还会时常需要顾问来管理超参数。真实的系统中,具有高金融价值时会一直需要保有质量控制。
因此度量要应用于总体,而不仅仅是针对单个或几个数据集。此外,你会本能地倾向于控制参数并促使模型过拟合而让场景显得真实到虚幻。
除回报矩阵外,第一章中的强化学习项目有一个学习参数λ = 0.8,如以下代码所示:
1 2 3 4 |
# Gamma : 它是一种惩罚形式或学习的不确定性 # 如果值是1,回报会过高 # 通过这种方式系统知道它正在学习 gamma = 0.8 |
λ学习参数本身需要进行紧密监控,因为它向系统中引入了不确定性。这表示学习过程永远是一种概率而确定值。大家可能会想不直接去掉这个参数呢。悖论是如果去除的话反而会导致全局更大的不确定性。λ的值越接近于1,结果过拟合的可能性就越大。过拟合表示你在迫使用系统在它学习得还不够好时就让认为自己已经很好了。这就像老师一直给全班的所有同学打高分。老师就会让学习评分的评估过程变得过拟合,没有人知识学生是否学到了东西。
增强学习项目的结果需要在它们经过不同阶段时进行度量。学习过程本身的范围也必须进行度量。在如下代码中,范围设置为50000来确保学习过程可达成目标。
1 2 3 4 5 |
for i in range(50000): current_state = ql.random.randint(0, int(Q.shape[0])) PossibleAction = possible_actions(current_state) action = ActionChoice(PossibleAction) reward(current_state,action,gamma) |
所有的这些度量对于所获得的结果有深度的影响。
收敛
构建系统非常有意思。查找让系统出错的因子则是另一番天地了。
至此所呈现的模型可进行如下的总结:
lv = \(\begin{bmatrix}0.0002\\0.2\\0.9\\0.0001\\0.4\\0.6\\\end{bmatrix}\) → softmax(lv) → \(\begin{bmatrix}0.111\\0.135\\0.273\\0.111\\0.165\\0.202\\\end{bmatrix}\) → 独热函数 → \(\begin{bmatrix}0\\0\\1\\0\\0\\0\\\end{bmatrix}\) → R → \(\begin{bmatrix}0\\0\\100\\0\\0\\0\\\end{bmatrix}\) → gamma → Q → 结果
从lv到R,整个过程创建了强化学习项目(第一章 成为一个随机应变的思考者)所需的回报矩阵(第二章 像机器那样思考),通过读取 R(回报矩阵)到获取结果。Gamma是学习参数,Q是Q学习函数,结果为第一章中所讲到的Q的状态。
参数将进行如下的度量:
- 公司的输入数据。网上所能找到的训练集如MNIST是出于效率而设计的。这些已就绪的数据集通常包含一些噪音(不可靠数据)来让其更为真实。同样的过程也应在公司原生数据中实现。唯一的问题是你无法从某处下载公司数据集。而是需要去构建数据集。
- 将要应用的权重和偏差。
- 激活函数(回归函数或其它函数)。
- 在独热过程之后所做的选择。
- 学习参数。
- 通过收敛所做的片段管理。
最好的启动方式依赖于对系统收敛质量的度量,即整个流程的最后一步。
如果系统提供了良好的收敛,它将会避免反复回头检查各项的烦恼。
隐式收敛
在本章Reinforcement_Learning_Q_function.py文件的最后一部分中,实现了一个50,000的 range 函数。
背后的思想是设置一个片断数量来让收敛达到确定的级别。在以下的代码中,range (50000)是一个常量。
1 2 3 4 5 |
for i in range(50000): current_state = ql.random.randint(0, int(Q.shape[0])) PossibleAction = possible_actions(current_state) action = ActionChoice(PossibleAction) reward(current_state,action,gamma) |
本例中的收敛将定义的点是,无论系统运行多久,Q结果矩阵都不再发生改变。
通过设置range为50000,你可以进行测试和验证。只要回报矩阵保持同质,这都会生效。如果回报矩阵在不同场景下区别非常大,这个模型就会产生不稳定的结果。
小贴士:尝试使用不同的range运行该函数。减少range到结果不再优化的程度。
数值-控制收敛
这种方法通过目标结果可证实是省时的,假定结果提前存在的话。以这种方式训练强化学习项目验证该过程。
在以下的源代码中,引入了一个直觉的交叉熵函数(参见第九章 让你的神经元投入使用了解更多有关交叉熵的知识)。
交叉熵指的是能量。其主要概念如下:
- 能量表示一个分布和另一个分布之间的区别
- 它会让系统持续训练
- 在有大量训练需要完成时,能量级别高
- 在训练达到其环节的尾声时,能量级别低
- 在以下的代码中,交叉熵值(CEV)度量目标矩阵和片断矩阵之间的差
- 交叉熵通常在必要时以更为复杂的形式进行度量(参见第九章 让你的神经元投入使用以及第十章 将仿生学应用到人工智能中)
在以下的代码中,一个基本函数提供了充分的结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
for i in range(50000): current_state = ql.random.randint(0, int(Q.shape[0])) PossibleAction = possible_actions(current_state) action = ActionChoice(PossibleAction) reward(current_state,action,gamma) if Q.sum()>0: #print("convergent episode:",i,"Q.Sum",Q.sum(),"numerical convergent value e-1:",Q.sum()-sum) #print("convergent episode:",i,"numerical convergent value:",cegQ.sum()) CEV=-(math.log(Q.sum())-math.log(ceg)) print("convergent episode:",i,"numerical convergent value:",CEV) sum=Q.sum() if(Q.sum()-3992==0): print("Final convergent episode:",i,"numerical convergent value:",ceg-Q.sum()) break; #break on average (the process is random) before 50000 |
以上程序在50,000次样本训练前就会停止。这是因为,在本章所描述的模型中(参见前面的代码片断),系统在到达了一个可接收的CEV收敛值时就会停止。
1 2 3 4 5 6 |
convergent episode: 1573 numerical convergent value: -0.0 convergent episode: 1574 numerical convergent value: -0.0 convergent episode: 1575 numerical convergent value: -0.0 convergent episode: 1576 numerical convergent value: -0.0 convergent episode: 1577 numerical convergent value: -0.0 Final convergent episode: 1577 numerical convergent value: 0.0 |
程序在第1577个片断时停止。因为决策过程是随机的,不会连续两次获得同一个数字。此外,也提前知道了并且是3992。这在已设置了预置目标的封闭环境中是可能的。但通常不是现实的状况,但它用于描述收敛的概念。后面的各章会探讨达到收敛的更好方式,如梯度下降。
这个Python程序可通过下面链接获取:
应用机器思维解决人类问题
一个高效的管理者有很高的评估商。机器在象棋和不断增长的领域中则更为优秀。现在的问题是跟上机器的学习进度。
-Denis Rothman
象棋游戏中的位置评估
对业务问题应用评估和收敛过程
使用监督学习来评估结果质量
总结
更新中…