资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
机器学习小白入门指引如何开始学习机器学习?面临的最大困难就是机器学习背后的数学原理。必须知道的第一个事情是同一个问题会有不同的解决方案。同一个问题可能会 有 3 个解决方案。本文将介绍的第一个解决方案是遗传编程和进化算法。0.神经网络 的基础神经网络不是很难理解。对新手来说比较难描述。因为每个人都在使用数学来 解释神经网络,那我想在这里会用不同的方法来描述它。下面我们谈论一个简 单的神经网络,它的结构包括三个不同的“类别”:输入层,隐藏层和输出层。图 1 神经网络基本架构输入层通常代表传感器,其中输入数组的每个值的范围是从 0.0 到 1.0。输出层 代表对问题的解,取值可能为真假二值,也可能是位置矢量(例如游戏中,操 作对象的 x/y/z 坐标值)。神经网络可以用来拟合复杂函数,已经复杂的分类决策问题(达到 Bayesian 解决方案的限制,但以后会出现)。神经网络是无知的,他们只能理解从 0.0 到 1.0 的值,这意味着我们必须为其编写适配器,以便它能够理解它的含义, 适配器在现实世界中通常称为“策略”,它除了将值转换为 0 和 1 之外,不会做 其他事情。例如,当我们想要在乒乓球游戏中预测桨的移动位置时,我们可以 使用这样的代码:let input = 0, 0, 0 ; / x,y,zinput0 = entity.position.x / screen.width;input1 = entity.position.y / screen.height;input2 = 0; / we dont have a z position, have we?let answer = neural_network.compute(input);if (answer0 0.5) entity.moveUpwards(); else entity.moveDownwards();现在我们知道一个神经网络可以计算输入,输出是/否离散结果,或者连续值。 神经网络每层包含多个神经元。简单的前馈网络以每个神经元与前一层中的每 个神经元(从左到右走)相连接的方式建立。这些连接使用用来描述数据流的流向,每个连接线对应一个权重。这里的重要 部分是输入神经元没有连接到上一层,因此 compute( )函数必须对输入神经元 做出反馈,根据输入数组的值直接获得结果。所谓的激活函数,是用来描述前 后两层中,互相联系的神经元的转换关系。这里激活函数的概念有点模糊,因 为每个人都有自己的见解。当然,你需要知道的是,它只是一个简单的函数, 其响应形式如下:图 2 激活函数 Sigmoid 的响应const _sigmoid = function(value) return (1 / (1 + Math.exp(-1 * value) / 1); ;总之,你只需要知道激活函数是模拟神经元如何工作的一种方法。激活函数在 现实中只是取一个值并将其转换为另一个值。它的行为方式类似于动画世界中 的每一帧之间的转换。快速进步首先意味着神经元可以快速学习,缓慢步进意味着神经元过度拟合收 敛更慢。过度拟合和讨论是一个更复杂的话题,但我直截了当地忽略它,以节 省时间和混乱。1.遗传编程和进化遗传编程的核心思想是使用基因组的形式来表示网络结构。遗传编程的巨大优 势是,当遗传编程与进化算法相结合时,它可以非常快地获得很好的网络结构。 一个基本的进化算法总是包含三个不同的周期:训练、评价、繁殖,重复以上 过程。图 3 进化算法过程进化算法的执行过程如下:STEP1 种群初始化:对种群的个体赋随机值,这样您就可以快速获得一个结 果。当然,使用随机值来求最优解是有点漫无目的。STEP2 适应度评价:适应度是评估循环过程中每个个体过程值,用来评估个 体接近最优解的程度。例如,在超级马里奥游戏中,与左的距离、分数、杀敌 数等可以用作适应度。STEP3 个体选择,种群中适应度高的个体被选入交配池,获得与其他适应度 高的个体交叉繁殖的机会,从而产生新的个体,加入子代种群。交叉算子的操 作类似于人类繁殖的过程,父、母两条染色体相互交换基因片段,当然“儿子” 个体会更像父亲,而“女儿”个体更像母亲。变异算子的主要作用是保持种群的 多样性,防止种群陷入局部最优,所以其一般被设计为一种随机变换。图 4 个体交叉示意图STEP4 判断是否达到最大迭代次数,若否,则跳至 STEP2。交叉算法通常在两个基因的截断点处进行交换,子个体各获得一部分,如女儿 获得父母基因的比例分别为 70% / 30%,儿子获得父母基因的比例分别是 30% /70%。let dna_split = (Math.random() * mum_genome.length) | 0; let daughter = new Genome(); let son = new Genome();for (let d = 0; ddna_split) sond = mum_genomed;daughterd = dad_genomed; else daughterd = mum_genomed;sond = dad_genomed;我们可以用 1 个基因的取值代表神经网络权重的值。这意味着神经网络的权重 中的每个可能的取值可以看做是对等的基因个体。图 5 用基因来表示神经网络中神经元的权重进化算法的典型问题是,当在时间尺度上进行观察时,会出现即使迭代时间再 长,求解的结果并不会改善太多,趋近于饱和状态。这主要是因为突变率太高, 无法求得最优解。高变异率虽然可以让收敛速度更快,然而,迭代时间长了之 后,高变异率可能会导致丢失全局最优解。如果你想做一个简单的基于进化算法的人工智能演示,你可以用流行的浏览器 打开下面的链接,是一个叫 Flappy Plane 演示程序。图 6 Flappy Plane 演示程序正如你可能看到的,总会有一个时间点,进化算法会收敛,适应度趋于饱和, 神经网络不会再进化到一个更完美的状态。没有反向传播法的话,单纯靠随机 化序列是无法得到最优解的,除非有足够多的时间来迭代,可能至死我们也无 法得到最优解。NEAT(基于增强拓扑神经网络)和 HyperNEAT 解决这个问题的思路是通过迭代 过程中,通过分析网络的表现和突变来改变网络。例如,每个基因组可以自我 评估适应度,只有“更好”的基因组存活,而较差适应度的基因会被记下来,用 于随机化。2.NEATNEAT 是一个利器,很难用一种简单的方式解释。如果你看过 SethBling 的 Mari/o 演示,你可能已经知道了这个概念。我可以推荐现在观看这段视频,以 便您能更好地理解我在下面的解释。需要了解的基本概念是:NEAT 是一个用来观察神经网络的性能和分析他们的 行为的算法。如果行为分析认为该神经网络的表现更好,那么该基因被选择, 进入交配池。如果表现不好的话,基因(或基因组)将被标记为失活。NEAT 更多应用用于 ANNS(自适应神经网络),而不是典型的神经网络,因为 ANNS 能在外部信息的基础上改变内部结构。ANN 的思路是白手起家,从 0 个 神经元开始,让算法找到神经网络的完美结构,由于神经元的连接可以被随机 去除和创建,所以通过观察网络表现,我们可以得知在哪里产生神经元,会加 快便我们获得最优解的速度。图 7 自适应神经网络示意图NEAT 使用 CPPN (组成模式生成网络) 作为行为评估模块,它基本上是一个 (可能是加强的)神经网络,学习输入和神经网络性能的关系,它的优点是可 以记住 ANN 的结构,在给定足够时间的条件下,总能找到解。行为分析可以减少不必要的随机化结构,我们能更好地自动猜测未来“最可能的” 值。图 8 CPPN 分析神经网络/个体,并将行为类似的分为一类在典型的 NEAT 场景中,交配池由代表网络结构的基因个体组成,它是一个多 个体的概念。这些个体总是相互竞争,总是试图用“适者生存”的规则来选选择 子代的个体,让他们的 DNA 能延续,成为神经网络权重。图 9 多个体系统通过适应度排序代理,并确定优势个体多个体系统中的优势个体是可以进入交配池,以填充下一个进化循环的种群。 下一个循环的交配池通常包含以下三种类型:1. 20%幸存者(最高适应度个体的交叉繁育得到的子代);2. 20%突变体(在原个体基础上随机突变神经网络);3. 60%子代个体(最高适应度的个体与其他个体的交配繁育得到的子代);下一步下一篇文章可能会介绍反向传播和增强学习,以及将这两种算法与进化算法进 行比较。请记住:它们不是独立互斥的概念,进化算法是可以结合增强型神经 网络一起使用。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号