+ (expected_results[idx] -\... perceptron_output) * x)... bias_weight = bias_weight + ((expected_results[idx] -\... perceptron_output) * 1) ⇽--- 偏置权重也会随着输入一同更新... weights = np.array(new_weights)... print('{} correct answers out of 4, for iteration {}'\... .format(correct_answers, iteration_num))3 correct answers out of 4, for iteration 02 correct answers out of 4, for iteration 13 correct answers out of 4, for iteration 24 correct answers out of 4, for iteration 34 correct answers out of 4, for iteration 4[size=0.667em]哈哈!这个感知机真是个好先生。经过外部循环更新权重,感知机从数据集中学习了阅历。在第一次迭代后,它比随机猜测(正确率为1/4)多得到了两个正确结果(正确率为3/4)。
[size=0.667em]在第二次迭代中,它过度修正了权重(更改了太多),然后经过调整权重来回溯结果。当第四次迭代完成后,它曾经完美地学习了这些关系。随后的迭代将不再更新网络,由于每个样本的误差为0,所以不会再对权重做调整。
[size=0.667em]这就是所谓的收敛。当一个模型的误差函数达到了最小值,或者波动在一个值上,该模型就被称为收敛。有时分能够没有这么侥幸。有时神经网络在寻觅最优权值时不断波动以满足一批数据的互相关系,但无法收敛。在5.8节中,大家将看到目的函数(objective function)或损失函数(loss function)如何影响神经网络对最优权重的选择。
4.下一步
[size=0.667em]基本感知机有一个固有缺陷,那就是,假如数据不是线性可分的,或者数据之间的关系不能用线性关系来描画,模型将无法收敛,也将不具有任何有效预测的才能,由于它无法准确地预测目的变量。
[size=0.667em]早期的实验在仅基于样本图像及其类别来停止图像分类的学习上获得了成功。这个概念在早期很激动人心,但很快遭到了来自明斯基(Minsky)和佩珀特(Papert)的考验[6],他们指出感知机在分类方面有严重的局限性,他们证明了假如数据样本不能线性可分为独立的组,那么感知机将无法学习如何对输入数据停止分类。
[size=0.667em]线性可分的数据点(如图5-4所示)对感知机来说是没有成绩的,而存在类别交叉的数据将导致单神经元感知机原地踏步,学习预测的结果将不比随机猜测好,表现得就像是在随机抛硬币。在图5-5中我们就无法在两个类(分别用点和叉表示)之间画一条分割线。
[attach]458800[/attach]
[size=0.667em]图5-4 线性可分的数据
[attach]458801[/attach]
[size=0.667em]图5-5 非线性可分的数据
[size=0.667em]感知机会用线性方程来描画数据集的特征与数据集中的目的变量之间的关系,这就是线性回归,但是感知机无法描画非线性方程或者非线性关系。
[size=0.667em]
[size=0.667em]部分极小值与全局极小值
[size=0.667em]当一个感知机收敛时,可以说它找到了一个描画数据与目的变量之间关系的线性方程。但是,这并不能阐明这个描画性线性方程有多好,或者说代价有多“小”。假如有多个处理方案,即存在着多个能够的极小代价,它只会确定一个由权重初始值决议的、特定的极小值。这被称为部分极小值,由于它是在权重末尾的地方附近找到的最优值(最小的代价)。它能够不是全局极小值,由于全局极小值需求搜索一切能够的权重值。在大多数状况下,无法确定能否找到了全局极小值。
[size=0.667em]
[size=0.667em]很多数据值之间的关系不是线性的,也没有好的线性回归或线性方程可以描画这些关系。许多数据集不能用直线或平面来线性分割。由于世界上的大多数数据不能由直线或平面来清楚地分开,明斯基和佩珀特发表的“证明”让感知机被置之不理。
[size=0.667em]但是有关感知机的想法并不会就此消亡。Rumelhardt McClelland的合作成果[7](Geoffrey Hinton也参与其中)展现了可以运用多层感知机的组合来处理异或(XOR)成绩[8],此后感知机再次浮出水面。之前,大家运用单层感知机处理的或(OR)成绩属于比较简单的成绩,也没有用到多层反向传播。Rumelhardt McClelland的关键打破是发现了一种方法,该方法可以为每个感知机适当地分配误差。他们运用的是一种叫反向传播的传统思想,经过这种跨越多个神经元层的反向传播思想,第一个古代神经网络诞生了。
[size=0.667em]基本感知机有一个固有的缺陷,即假如数据不是线性可分的,则模型不会收敛到具有有效预测才能的解。
[size=0.667em]留意
[size=0.667em]代码清单5-3中的代码经过一个单层感知机处理了或成绩。代码清单5-1代码中感知机学到的0和1组成的表格是二元逻辑或的输入结果。异或成绩稍微改变了一下该数据表,以此来教感知机如何模拟一个独占的逻辑或门。假如改变一下最后一个示例的正确结果,将1(真)改为0(假),从而将其转换为逻辑异或,这个成绩就会变得困难许多。在不向神经网络添加额外神经元的状况下,每类(0或1)样本将是非线性可分的。在二维特征向量空间中,这些类彼此呈对角线分布(相似于图5-5),所以无法经过画一条直线来区分出数据样本1(逻辑真)和0(逻辑假)。
[size=0.667em]虽然神经网络可以处理复杂的非线性成绩,但是那时计算成本太高,用两个感知机和一堆花哨的反向传播数学算法来处理异或成绩被以为是对宝贵计算资源的极大糜费,由于这个成绩只需求用一个逻辑门或一行代码就能处理。理想证明,它们不合适被广泛运用,所以只能再次回到学术界和超级计算机实验的角落。由此开启了第二次“人工智能寒冬”,这种状况从1990年持续到2010年左右[9]。后来,随着计算才能、反向传播算法和原始数据(例如猫和狗的标注图像[10])的发展,昂贵的计算算法和有限的数据集都不再是妨碍。第三次神经网络时代末尾了。
[size=0.667em]下面我们来看看他们发现了什么。
5.第二次人工智能寒冬的出现
[size=0.667em]和大多数伟大的思想一样,好的思想最终都会浮出水面。人们发现只需对感知机背后的基本思想停止扩展,就可以克制之前的那些限制。将多个感知机集合到一同,并将数据输入一个(或多个)感知机中,并且以这些感知机的输入作为输入,传递到更多的感知机,最后将输入与希冀值停止比较,这个系统(神经网络)便可以学习更复杂的形式,克制了类的线性不可分的应战,如异或成绩。其中的关键是:如何更新后面各层中的权重?
[size=0.667em]接上去我们暂停一下,将这个过程的一个重要部分方式化。到目前为止,我们曾经讨论了误差和感知机的预测结果与真实结果的偏离程度。测量这个误差是由代价函数或损失函数来完成的。正如我们看到的,代价函数量化了对于输入“成绩”(x)网络应该输入的正确答案与实践输入值(y)之间的差距。损失函数则表示网络输入错误答案的次数以及错误总量。公式5-2是代价函数的一个例子,表示真实值与模型预测值之间的误差:
[attach]458802[/attach]
[size=0.667em]公式5-2 真实值与预测值之间的误差
[size=0.667em]训练感知机或者神经网络的目的是最小化一切输入样本数据的代价函数。
[attach]458803[/attach]
[size=0.667em]公式5-3 希望最小化的代价函数
[size=0.667em]接上去大家会看到还有一些其他种类的代价函数,如均方误差,这些通常曾经在神经网络框架中定义好了,大家无须本人去决议哪些是最好的代价函数。需求牢记的是,最终目的是将数据集上的代价函数最小化,这样此处给出的其他概念才有意义。
6.反向传播算法
[size=0.667em]辛顿(Hinton)和他的同事提出一种用多层感知机同时处理一个目的的方法。这个方法可以处理线性不可分成绩。经过该方法,他们可以像拟合线性函数那样去拟合非线性函数。
[size=0.667em]但是如何更新这些不同感知机的权重呢?形成误差的缘由是什么?假设两个感知机彼此相邻,并接收相反的输入,无论怎样处理输入(衔接、求和、相乘),当我们试图将误差传播回到初始权重的时分,它们(输入)都将是输入的函数(两边是相反的),所以它们每一步的更新量都是一样的,感知机不会有不同的结果。这里的多个感知机将是冗余的。它们的权重一样,神经网络也不会学到更多东西。
[size=0.667em]大家再来想象一下,假如将一个感知机作为第二个感知机的输入,是不是更令人困惑了,这到底是在做什么?
[size=0.667em]反向传播可以处理这个成绩,但首先需求稍微调整一下感知机。记住,权重是根据它们对全体误差的贡献来更新的。但是假如权重对应的输入成为另一个感知机的输入,那么从第二个感知机末尾,我们对误差的看法就变得有些模糊了。
[size=0.667em]如图5-6所示,权重w1i经过下一层的权重(w1j)和(w2j)来影响误差,因此我们需求一种方法来计算w1i对误差的贡献,这个方法就是反向传播。
[attach]458804[/attach]
[size=0.667em]图5-6 包含隐藏权重的神经网络
[size=0.667em]如今是时分中止运用“感知机”这个术语了,由于之后大家将改变每个神经元权重的更新方式。从这里末尾,我们提到的神经元将更通用也更弱小,它包含了感知机。在很多文献中神经元也被称为单元或节点,在大多数状况下,这些术语是可以互换的。
[size=0.667em]一切类型的神经网络都是由一组神经元和神经元之间的衔接组成的。我们常常把它们组织成层级结构,不过这不是必需的。假如在神经网络的结构中,将一个神经元的输入作为另一个神经元的输入,就意味着出现了隐藏神经元或者隐藏层,而不再只是单纯的输入层、输入层。
[size=0.667em]图5-7中展现的是一个全衔接网络,图中没有展现出一切的衔接,在全衔接网络中,每个输入元素都与下一层的各个神经元相连,每个衔接都有相应的权重。因此,在一个以四维向量为输入、有5个神经元的全衔接神经网络中,一共有20个权重(5个神经元各衔接4个权重)。
[size=0.667em]感知机的每个输入都有一个权重,第二层神经元的权重不是分配给原始输入的,而是分配给来自第一层的各个输入。从这里我们可以看到计算第一层权重对总体误差的影响的难度。第一层权重对误差的影响并不是只来自某个单独权重,而是经过下一层中每个神经元的权重来产生的。虽然反向传播算法本身的推导和数学细节非常风趣,但超出了本书的范围,我们对此只做一个简单的概述,使大家不至于对神经网络这个黑盒一无所知。
[size=0.667em]反向传播是误差反向传播的缩写,描画了如何根据输入、输入和希冀值来更新权重。传播,或者说前向传播,是指输入数据经过网络“向前”活动,并以此计算出输入对应的输入。要停止反向传播,首先需求将感知机的激活函数更改为稍微复杂一点儿的函数。
[attach]458805[/attach]
[size=0.667em]图5-7 全衔接神经网络
[size=0.667em]到目前为止,大家不断在运用阶跃函数作为人工神经元的激活函数。但是接上去会发现,反向传播需求一个非线性延续可微的激活函数[11],如公式5-4中常用的sigmoid函数所示,如今每个神经元都会输入介于两个值(如0和1)之间的值:
[attach]458806[/attach]
[size=0.667em]公式5-4 sigmoid函数
[size=0.667em]
[size=0.667em]为什么激活函数需是非线性的
[size=0.667em]由于需求让神经元可以模拟特征向量和目的变量之间的非线性关系。假如神经元只是将输入与权重相乘然后做加和,那么输入必然是输入的线性函数,这个模型连最简单的非线性关系都无法表示。
[size=0.667em]之前运用的神经元阈值函数是一个非线性阶跃函数。所以实际上只需有足够多的神经元就可以用来训练非线性关系模型。
[size=0.667em]这就是非线性激活函数的优势,它使神经网络可以建立非线性关系模型。一个延续可微的非线性函数,如sigmoid,可以将误差平滑地反向传播到多层神经元上,从而加速训练进程。sigmoid神经元的学习速度很快。
[size=0.667em]还有许多其他的激活函数,如双曲正切函数和修正线性单元函数,它们各有优劣,适用于不同的神经网络结构,大家将在之后的章节中学习。
[size=0.667em]为什么要求可微呢?假如可以计算出这个函数的导数,就能对函数中的各个变量求偏导数。这里的关键是“各个变量”,这样就能经过接收到的输入来更新权重!
7.求导
[size=0.667em]首先用平方误差作为代价函数来计算网络的误差,如公式5-5所示[12]:
[attach]458807[/attach]
[size=0.667em]公式5-5 均方误差
[size=0.667em]然后应用微积分链式法则计算复合函数的导数,如公式5-6所示。网络本身只不过是函数的复合(点积之后的非线性激活函数)。
[attach]458808[/attach]
[size=0.667em]公式5-6 链式法则
[size=0.667em]接上去可以用这个公式计算每个神经元上激活函数的导数。经过这个方法可以计算出各个权重对最终误差的贡献,从而停止适当的调整。
[size=0.667em]假如该层是输入层,借助于可微的激活函数,权重的更新比较简单,对于第j个输入,误差的导数如下[13]:
[attach]458809[/attach]
[size=0.667em]公式5-7 误差导数
[size=0.667em]假如要更新隐藏层的权重,则会稍微复杂一点儿,如公式5-8所示:
[attach]458810[/attach]
[size=0.667em]公式5-8 前一层的导数
[size=0.667em]在公式5-7中,函数f(x)表示实践结果向量,f(x)j表示该向量第j个地位上的值,yi、yj是倒数第二层第i个节点和输入第j个节点的输入,衔接这两个节点的权重为wij,误差代价函数对wij求导的结果相当于用α(学习率)乘以前一层的输入再乘当前一层代价函数的导数。公式5-8中δl表示L层第l个节点上的误差项,前一层第j个节点到L层一切的节点停止加权求和[14]。
[size=0.667em]重要的是要明白何时更新权重。在计算每一层中权重的更新时,需求依赖网络在前向传播中的当前形状。一旦计算出误差,我们就可以得到网络中各个权重的更新值,但照旧需求回到网络的起始节点才能去做更新。否则,假如在网络末端更新权重,后面计算的导数将不再是对于本输入的正确的梯度。另外,也可以将权重在每个训练样本上的变化值记录上去,其间不做任何更新,等训练结束后再一同更新,我们将在5.1.6节中讨论这项内容。
[size=0.667em]接上去将全部数据输入网络中停止训练,得到每个输入对应的误差,然后将这些误差反向传播至每个权重,根据误差的总体变化来更新每个权重。当网络处理完全部的训练数据后,误差的反向传播也随之完成,我们将这个过程称为神经网络的一个训练周期(epoch)。我们可以将数据集一遍又一遍地输入网络来优化权重。但是要留意,网络能够会对训练集过拟合,导致对训练集外部的新数据无法做出有效的预测。
[size=0.667em]在公式5-7和公式5-8中,α表示学习率。它决议了在一个训练周期或一批数据中权重中误差的修正量。通常在一个训练周期内α保持不变,但也有一些复杂的训练算法会对α停止自顺应调整,以加快训练速度并确保收敛。假如α过大,很能够会矫枉过正,使下一次误差变得更大,导致权重离目的更远。假如α设置太小会使模型收敛过慢,更蹩脚的是,能够会堕入误差曲面的部分极小值。
[size=0.833em]本文摘自《自然言语处理实战 应用Python了解、分析和生成文本》
[attach]458811[/attach]
[size=0.667em]在本书中,读者不只会学习这些系统的外部工作原理,还会学习相关的实际和实际技能,并创建本人的算法或模型。基本计算机迷信概念无缝地转换为方法和实际的坚实基础。从一些久经考验的经典方法(如TF-IDF)末尾,再深化到NLP相关的深层神经网络,作者带领读者对于自然言语处理的核心方法开启了一段明晰的体验之旅。
[size=0.667em]言语是人类建立共识的基础。人们之间交流的不只要理想,还无情感。经过言语,人们获得了阅历范畴之外的知识,并经过分享这些阅历来构建了解的过程。经过本书,大家将会深化了解自然言语处理技术的原理,有朝一日能够创建出能经过言语来了解人类的系统。
作者: no_shadow 时间: 2020-10-17 10:10
分享了
作者: heromxs 时间: 2020-10-18 13:39
给你我的小心心
作者: 说谎。 时间: 2020-10-19 08:26
大人,此事必有蹊跷!
作者: 哟西hgnd 时间: 2020-10-19 19:16
路过
欢迎光临 智客公社 (http://bbs.cnaiplus.com/) |
Powered by Discuz! X3.4 |