‘壹’ sigmoid函数、tanh函数和relu函数对比
之前碰到的一个笔试题,当时做答时总感觉不太全面,现总结记录如下:
题目:画出relu函数和sigmoid函数的曲线以及一阶导数图像,并进行对比。在此记录:
(a) sigmoid函数公式: y = 1 / (1+e^(-x)) 一阶导数: y' = y(1-y)
(b) 曲线图像可自行查阅,网上有很多
(c) 从三方面解释sigmoid函数:
》图像本身 :sigmoid函数值域为(0,1),当x逼近+∞或者-∞也即在饱和区域时,导数接近于零。只有在合适的区域,导数才具有一定明显的值;图像不是奇函数,即关于原点不对称。
》Forward Propagation :sigmoid函数引入了非线性因素,使得隐藏层的效果开始凸显,即不是简单的线性输入和输出,即区别于原始的感知机。
》Back Propagation :sigmoid的导数涉及到了除法,不可避免的会出现计算量较大的情况;sigmoid函数的导数在饱和区域时,导数较小,容易出现梯度消失(梯度弥散)的情况:即如果在一个DNN中,靠近输出层的梯度较大,参数更新快,会快速收敛,而靠近输入层时,由于梯度会慢慢变小,参数会更新较慢。
(a)tanh函数公式: y = (e^x - e^(-x)) / (e^x + e^(-x)) 一阶导数 y' = (1+y)(1-y)
(b)曲线图像同上所述:请自行查阅
(c)从和sigmoid函数对比的角度解释tanh函数:
》图像本身 :tanh函数关于原点对称(与sigmoid的区别就是值域不同(-1,1)),tanh可是使得a的取值( z = wx +b, a = tanh(z) )有正有负,而sigmoid使得取值只能为正,这样是不好的,参见知乎:
https://www.hu.com/question/50396271?from=profile_question_card
》Back Propagation :并未解决sigmoid函数中的梯度消失的问题,计算量大的问题同样存在
(a)relu函数公式: y = max(0,x) 一阶导数: x>0: y' = 1; x<0: y' = 0
(b)曲线图像同上所述:请自行查阅
(c)从和sigmoid函数以及tanh函数做对比的角度解释relu函数:
》图像本身 :relu函数只有在自变量大于0的情况下,才会有值
》Forward Propagation & Back Propagation :正是由于relu函数简单,relu函数在进行计算时会比较快;而且relu函数使得一部分输入直接为0,这样使得一些输入神经元直接失效,就会造成网络的稀疏性,可以在一定程度上缓解过拟合;同时由于导数为常量,在一定程度上解决了梯度消失的问题。
注1:梯度爆炸:即权值W设置初始值不合适(或者是误差梯度积累),导致权值愈来愈大,造成网络的不稳定。
注2:relu函数如何实现非线性的:参考:
https://blog.csdn.net/tianguiyuyu/article/details/79875641
以后会多多增加图片的。
慢慢来-jony j
‘贰’ 神经网络如何外推:从前馈网络到图网络
How Neural Networks Extrapolate: From Feedforward to Graph Neural Networks
ICLR2021最高分论文 https://arxiv.org/abs/2009.11848
52页论文,正文占9页,主要都是附录,不过附录里很多图片(一页就一两张图),排除这些一页一图的,只有40页
我们研究用梯度下降法训练的神经网络如何外推,也就是说,它们在训练分布的支持之外学习什么。以前的工作报告了使用神经网络进行外推时混合的实证结果:虽然前馈神经网络,即多层感知器(MLP)在某些简单任务中外推效果不好,但图形神经网络(GNN)——带有MLP模块的结构化网络——在更复杂的任务中取得了一些成功。为了得到理论解释,我们确定了MLPs和GNNs外推良好的条件。首先,我们量化了ReLU-MLPs从原点沿任意方向快速收敛到线性函数的观测结果,这意味着ReLU-MLPs不能外推大多数非线性函数。但是,当训练分布足够“多样化”时,他们可以证明学习线性目标函数。其次,在分析GNNs的成功和局限性时,这些结果提出了一个假设,我们提供了理论和经验证据:GNNs在将算法任务外推到新数据(例如。,较大的图或边权重)依赖于编码体系结构或特征中特定于任务的非线性。我们的理论分析建立在过度参数化网络与神经切线核的联系上。根据经验,我们的理论适用于不同的培训环境
1简介
人类在许多任务中推断得很好。例如,我们可以对任意大的数应用算术。人们可能想知道,神经网络是否也能做到这一点,并将其推广到任意远离训练数据的示例中(Lake et al.,2017)。奇怪的是,以前的工作报告混合外推结果与神经网络。早期的工作表明,前馈神经网络,又称多层感知器(MLPs),在学习简单多项式函数时不能很好地进行外推(Barnard&Wessels,1992;Haley&Soloway,1992年)。然而,最近的研究表明,图神经网络(GNNs)(Scarselli et al.,2009)是一类具有MLP构建块的结构化网络,在具有挑战性的算法任务中,如预测物理系统的时间演化(Battaglia et al.,2016),可以推广到比训练图大得多的图,学习图形算法(Velickovic et al.,2020),求解数学方程(Lample&Charton,2020)。
为了解释这个难题,我们正式研究了梯度下降(GD)训练的神经网络是如何外推的,即它们在训练分布的支持之外学习什么。我们说,如果一个神经网络在训练分布之外学习了一个任务,它就能很好地进行外推。乍一看,似乎神经网络可以在训练分布之外任意行为,因为它们具有高容量(Zhang et al.,2017),并且是通用逼近器(Cybenko,1989;Funahashi,1989年;Hornik等人,1989年;库尔科娃,1992年)。然而,神经网络受到梯度下降训练的限制(Hardt等人,2016;Soudry等人,2018年)。在我们的分析中,我们通过类比过参数化神经网络的训练动态和通过神经切线核(NTK)的核回归,明确考虑了这种隐式偏差(Jacot等人,2018)。
从前馈网络、最简单的神经网络和更复杂的体系结构(如GNNs)的构建块开始,我们建立了由GD训练的具有ReLU激活的过参数mlp的预测从原点沿任意方向收敛到线性函数。我们证明了两层网络的收敛速度,并从经验上观察到收敛经常发生在训练数据附近(图1),这表明ReLU-MLPs不能很好地外推大多数非线性任务。我们强调,我们的结果并不是基于ReLU网络具有有限多个线性区域的事实(Arora et al.,2018;Hanin&Rolnick,2019年;Hein等人,2019年)。虽然有有限多个线性区域意味着ReLU MLPs最终会变为线性,但MLPs是否会学习到接近训练分布的正确目标函数并没有说明。相比之下,我们的结果是非渐近的,并且量化了MLPs将学习什么样的函数接近于训练分布。其次,我们确定了mlp外推良好的条件:任务是线性的,训练分布的几何结构是充分“多样化”的。据我们所知,我们的结果是这种前馈神经网络的第一个外推结果。
然后,我们将我们对前馈神经网络的见解与GNNs联系起来,以解释GNNs在某些算法任务中外推得好的原因。先前的工作报告了可以通过动态规划(DP)解决的任务的成功外推(Bellman,1966),其计算结构与GNNs一致(Xu等人,2020)。DP更新通常可以分解为非线性和线性步骤。因此,我们假设GD训练的GNN可以在DP任务中很好地外推,如果我们在架构和输入表示中编码适当的非线性(图2)。重要的是,编码非线性可能不需要GNNs插值,因为MLP模块可以很容易地学习训练分布中的许多非线性函数(Cybenko,1989;Hornik等人,1989年;Xu等人,2020),但GNNs正确外推至关重要。我们使用图NTK(Du等人,2019b)证明了简化情况下的这一假设。在经验上,我们验证了三个DP任务的假设:最大度、最短路径和n体问题。我们证明了具有适当结构、输入表示和训练分布的GNNs可以很好地预测具有未知大小、结构、边权值和节点特征的图。我们的理论解释了以往工作的经验成功,并指出了它们的局限性:成功的外推依赖于编码任务特定的非线性,这需要领域知识或广泛的模型搜索。从更广泛的角度来看,我们的见解超越了GNNs,并广泛应用于其他神经网络。
总之,我们研究神经网络如何外推。首先,由GD训练的ReLU-mlp以O(1/t)的速率沿原点方向收敛为线性函数。其次,为了解释为什么GNNs在一些算法任务中可以很好地外推,我们证明了ReLU-MLPs在线性任务中可以很好地外推,从而引出一个假设:当适当的非线性被编码到结构和特征中时,神经网络可以很好地外推。我们用一个简化的例子证明了这个假设,并为更一般的情况提供了经验支持。
1.1相关工作
早期的工作显示了MLP不能很好地外推的示例任务,例如学习简单多项式(Barnard&Wessels,1992;Haley&Soloway,1992年)。相反,我们展示了ReLU MLPs如何外推的一般模式,并确定MLPs外推良好的条件。最近的工作研究了在NTK和平均场两种情况下,梯度下降对MLP产生的隐性偏差(Bietti和Mairal,2019;Chizat&Bach,2018年;Song等人,2018年)。与我们的结果相关,一些工作表明MLP预测收敛于“简单”分段线性函数,例如,具有很少的线性区域(Hanin&Rolnick,2019;Maennel等人,2018年;Savarese等人,2019年;威廉姆斯等人,2019年)。我们的工作不同之处在于,这些工作都没有明确研究外推法,有些只关注一维输入。最近的研究还表明,在NTK区域的高维环境中,MLP在某些标度极限下至多是一个渐近线性预测因子(Ba等人,2020;Ghorbani等人,2019年)。我们研究不同的设置(外推),我们的分析是非渐近性质,不依赖于随机矩阵理论。
先前的工作通过在较大的图上进行测试来探索GNN外推(Battaglia et al.,2018;Santoro等人,2018年;萨克斯顿等人,2019年;Velickovic等人,2020年)。我们是第一个从理论上研究GNN外推法的人,我们完成了外推法的概念,包括看不见的特征和结构。
2准备工作
3前馈神经网络如何外推
前馈网络是最简单的神经网络和更复杂的体系结构(如GNNs)的构建块,因此我们首先研究它们在GD训练时是如何外推的。在本文中,我们假设ReLU激活。第3.3节包含其他激活的初步结果。
3.1 RELU MLP的线性外推行为
通过架构,ReLU网络学习分段线性函数,但是在训练数据的支持之外,这些区域究竟是什么样的呢?图1举例说明了当GD对各种非线性函数进行训练时,ReLU MLP如何进行外推。这些例子表明,在训练支持之外,预测很快就会沿着原点的方向线性化。我们通过线性回归对MLPs的预测进行了系统的验证:决定系数(R2)总是大于0.99(附录C.2)。也就是说,ReLU MLPs几乎立即在训练数据范围之外“线性化”。
我们使用GD通过神经切线核(NTK)训练的神经网络的隐式偏差来形式化这个观察:GD训练的过参数化网络的优化轨迹等价于具有特定神经切线核的核回归的轨迹,在一系列被称为“NTK制度”的假设下(Jacot等人,2018年)。我们在这里提供了一个非正式的定义;更多详情,请参阅Jacot等人(2018)和附录A。
定义2。
(非正式)在NTK区域训练的神经网络是无限宽的,以一定的比例随机初始化,并且由GD以无穷小的步长训练。
先前的工作通过NTK分析过参数化神经网络的优化和分布泛化(Allen-Zhu等人,2019a;b类;Arora等人,2019a;b类;曹顾,2019;杜等人,2019c;一个;李亮,2018;日田和铃木,2021年)。相反,我们分析外推。
定理1将我们从图1中观察到的结果形式化:在训练数据范围之外,沿着原点的任何方向tv,两层ReLU MLP的预测迅速收敛为速率为O(1/t)的线性函数。线性系数β收敛速度中的常数项依赖于训练数据和方向v。证据见附录B.1
定理1
ReLU网络具有有限多个线性区域(Arora等人,2018;汉宁和罗尔尼克,2019),因此他们的预测最终成为线性。相反,定理1是一个更细粒度的分析MLP如何外推,并提供了收敛速度。虽然定理1假设两层网络处于NTK状态,但实验证实,线性外推行为发生在具有不同深度、宽度、学习速率和批量大小的网络上(附录C.1和C.2)。我们的证明技术也可能扩展到更深层次的网络。
图4a提供了一个更积极的结果:MLP在许多不同的超参数上很好地外推了线性目标函数。虽然学习线性函数一开始似乎非常有限,但在第4节中,这一见解将有助于解释GNN在非线性实际任务中的外推特性。在此之前,我们首先从理论上分析了MLPs外推的好时机。
3.2当RELU MLPS可证明外推井
图4a显示,当目标函数为线性时,MLP可以很好地外推。然而,这并不总是正确的。在本节中,我们展示了成功的外推依赖于训练数据的几何结构。直观地说,训练分布必须足够“多样化”,以便进行正确的推断
我们提供了两个条件,将训练数据的几何结构与外推联系起来。引理1指出,过参数化的mlp只需二维例子就可以学习线性目标函数。
实验:训练数据的几何结构影响外推。
定理2中的条件形式化了一种直觉,即训练分布必须是“多样的”,才能成功地进行外推,例如,D包括所有方向。从经验上讲,当满足定理2的条件时(图4b中的“all”),外推误差确实很小。相反,当训练示例仅限于某些方向时,外推误差要大得多(图4b和图3)。
与之前的工作相关,定理2提出了为什么虚假相关性可能会损害外推,补充了因果关系论点(Arjovsky et al.,2019;Peters等人,2016年;Rojas Carulla等人,2018年)。当训练数据具有虚假相关性时,某些特征组合丢失;e、 例如,骆驼可能只出现在沙漠中的图像收集。因此,定理2的条件不再成立,模型可能外推错误。定理2也类似于线性模型的可辨识条件,但更为严格。如果训练数据具有全(特征)秩,我们可以唯一地识别一个线性函数。mlp更具表现力,因此识别线性目标函数需要附加约束。
综上所述,我们分析了ReLU-MLPs是如何外推的,并提供了两个启示:(1)MLPs由于其线性外推而不能外推大多数非线性任务(定理1);当目标函数是线性函数时,如果训练分布是“多样的”(定理2),mlp可以很好地外推。在下一节中,这些结果将帮助我们理解更复杂的网络是如何外推的。
3.3具有其他激活功能的MLPS
在继续讨论GNNs之前,我们通过对其他激活函数tanh的实验来完成MLPs的描述σ(x) =tanh(x),余弦σ(x) =cos(x)(Lapedes&Farber,1987年;McCaughan,1997年;Sopena和Alquezar,1994),和σ(x) =x2(杜和李,2018;Livni等人,2014年)。详情见附录C.4。当激活函数和目标函数相似时,MLPs外推效果较好;e、 例如,当学习tanh时,tanh激活可以很好地推断,但不能推断其他功能(图5)。而且,每个激活函数都有不同的局限性。要用tanh激活外推tanh函数,训练数据范围必须足够宽。当学习具有二次激活的二次函数时,只有两层网络可以很好地进行外推,而更多的层可以得到更高阶的多项式。对于高维数据,余弦激活很难优化,因此我们只考虑一维/二维余弦目标函数。
4图形神经网络如何外推
上面,我们看到非线性任务中的外推对于MLP来说是困难的。尽管存在这一局限性,GNNs在一些非线性算法任务中表现出了很好的外推能力,如直观物理(Battaglia et al.,2016;Janner等人,2019),图算法(Battaglia等人,2018;Velickovic等人,2020)和符号数学(Lample&Charton,2020)。为了解决这个差异,我们建立在MLP结果的基础上,研究GD训练的GNNs是如何外推的。
4.1假设:线性算法对齐有助于外推
我们从一个例子开始:训练GNNs来解决最短路径问题。对于这项任务,先前的工作观察到,具有最小聚集的改进GNN架构可以推广到比训练集中的图更大的图(Battaglia et al.,2018;Velickovic等人,2020):
我们首先提供一个直观的解释(图2a)。最短路径可通过Bellman-Ford(BF)算法(Bellman,1958)求解,并进行以下更新
其中w(v,u)是边(v,u)的权重,d[k][u]是k步内到节点u的最短距离。这两个方程可以很容易地对齐:如果GNNs的MLP模块学习一个线性函数d[k],那么它将模拟BF算法−1] [v]+w(v,u)。由于mlp可以外推线性任务,这种“对齐”可以解释为什么GNNs可以在这个任务中很好地外推。
为了进行比较,我们可以解释为什么我们不希望GNN使用更常用的和聚合(Eqn。1) 在这项任务中推断得很好。对于和聚合,MLP模块需要学习一个非线性函数来模拟BF算法,但定理1表明,它们不会在训练支持之外外推大多数非线性函数。
我们可以将上述直觉推广到其他算法任务。许多GNNs外推良好的任务可以通过动态规划(DP)来解决(Bellman,1966),这是一种具有类似GNNs(Eqn)的递归结构的算法范式。1) (Xu等人,2020年)。
定义3。动态规划(DP)是一个带有更新的递归过程
其中答案[k][s]是迭代k和状态s索引的子问题的解决方案,DP Update是一个任务特定的更新函数,它基于上一次迭代解决子问题。从更广泛的角度出发,我们假设:如果我们将适当的非线性编码到模型结构和输入表示中,使MLP模块只需要学习接近线性的步骤,那么所得到的神经网络就可以很好地外推。
假设1。
我们的假设建立在(Xu等人,2020)的算法对齐框架之上,该框架指出,如果模块“对齐”以便于学习(可能是非线性)函数,则神经网络插值良好。成功的外推更难:模块需要与线性函数对齐。
线性算法对准的应用。
一般来说,线性算法对准不局限于GNN,广泛应用于神经网络。为了满足这种情况,我们可以在结构或输入表示中编码适当的非线性操作(图2)。使用GNNs学习DP算法是在体系结构中编码非线性的一个例子(Battaglia等人,2018;Corso等人,2020年)。另一个例子是对体系结构中的日志和exp变换进行编码,以帮助外推算术任务中的乘法(Trask等人,2018;Madsen&Johansen,2020年)。神经符号程序进一步发展,并对符号操作库进行编码,以帮助推断(Johnson等人,2017年;Mao等人,2019年;易等,2018年)。
对于某些任务,更改输入表示可能更容易(图2b)。有时,我们可以将目标函数f分解为f=g◦ 将h嵌入特征嵌入h和一个简单的目标函数g中,我们的模型可以很好地推断。我们可以通过使用领域知识通过专门的特征或特征转换获得h(Lample&Charton,2020;Webb等人,2020年),或通过X\D中未标记的未标记的未标记的分发数据的表示学习(例如,BERT)(Chen等人,2020年);Devlin等人,2019年;胡等,2020;Mikolov等人,2013b;Peters等人,2018年)。这为表示如何帮助在不同应用领域进行外推提供了新的视角。例如,在自然语言处理中,预处理表示(Mikolov等人,2013a;Wu&Dredze,2019)和使用领域知识进行特征转换(袁等,2020年;Zhang等人,2019)帮助模型在语言之间进行概括,这是一种特殊的外推。在定量金融中,确定正确的“因素”或特征对于深入学习模型至关重要,因为金融市场可能经常处于外推制度中(Banz,1981;法兰西,1993年;罗斯,1976)。
线性算法对齐解释了文献中成功的外推,并指出外推一般更难:编码适当的非线性通常需要领域专家或模型搜索。其次,我们为我们的假设提供理论和实证支持。
4.2理论和经验支持
我们验证了我们对三个DP任务的假设:最大度、最短路径和n-体问题,并证明了最大度假设。我们强调了图结构在外推中的作用。
理论分析。
我们从一个简单而基本的任务开始:学习一个图的最大度,一个DP的特例。作为定理1的推论,常用的基于和的GNN(Eqn。1) 无法很好地推断(证据见附录B.4)。
推论1。
具有和聚集和和和读出的GNNs在最大程度上不能很好地外推。为了实现线性算法对齐,我们可以对读出器中唯一的非线性max函数进行编码。定理3证实了具有最大读数的GNN在这个任务中可以很好地外推。
定理3并不是紧跟定理2,因为GNNs中的MLP模块只接受间接的监视。我们分析图NTK(Du等人,2019b)来证明附录B.5中的定理3。虽然定理3假设相同的节点特征,但我们在经验上观察到相同和不相同特征的相似结果(附录中的图16)。
条件的解释。
定理3中的条件类似于定理2中的条件。这两个定理都需要不同的训练数据,用定理3中的图结构或定理2中的方向来度量。在定理3中,如果所有训练图都具有相同的最大或最小节点度,例如,当训练数据来自以下族之一时,违反了该条件:路径、C-正则图(具有C度的正则图)、圈和阶梯。
实验:有助于推断的架构。
我们用两个DP任务来验证我们的理论分析:最大度和最短路径(详见附录C.5和C.6)。而以前的工作只测试不同大小的图(Battaglia et al.,2018;Velickovic等人,2020),我们还测试了具有不可见结构、边权重和节点特征的图。结果支持了我们的理论。对于最大度,具有最大读数的GNNs优于具有和读数的GNNs(图6a),证实了推论1和定理3。对于最短路径,具有最小读数和最小聚集的GNN优于具有和读数的GNN(图6a)。
实验证实了训练图结构的重要性(图7)。有趣的是,这两个任务支持不同的图结构。对于最大度,如定理3所预测的,当训练在树、完全图、扩张图和一般图上时,GNNs外推效果很好,当训练在4-正则图、圈图或梯形图上时,外推误差更大。对于最短路径,当我们改变训练图的稀疏性时,外推误差遵循U形曲线(附录中的图7b和图18)。直觉上,在稀疏或稠密图上训练的模型可能学习退化解。
实验:有助于推断的表征。
最后,我们展示了一个很好的输入表示帮助外推。我们研究了n体问题(Battaglia等人,2016;Watters等人,2017年)(附录C.7),即预测重力系统中n个物体的时间演化。根据之前的工作,输入是一个完整的图形,其中节点是对象(Battaglia等人,2016)。
5与其他分布外设置的连接
我们讨论几个相关的设置。直观地说,从我们上述结果的观点来看,相关设置中的方法可以通过1)学习超出训练数据范围的有用非线性和2)将相关测试数据映射到训练数据范围来改进外推。
领域适应研究对特定目标领域的泛化(Ben-David等人,2010;Blitzer等人,2008年;Mansour等人,2009年)。典型的策略会调整训练过程:例如,使用来自目标域的未标记样本来对齐目标和源分布(Ganin等人,2016;赵等,2018)。在训练期间使用目标域数据可能会导致有用的非线性,并可能通过匹配目标和源分布来减轻外推,尽管学习映射的正确性取决于标签分布(Zhao等人,2019)。
对大量未标记数据的自监督学习可以学习超出标记训练数据范围的有用非线性(Chen et al.,2020;Devlin等人,2019年;He等人,2020年;Peters等人,2018年)。因此,我们的结果提出了一个解释,为什么像BERT这样的预训练表示可以提高分布外鲁棒性(Hendrycks et al.,2020)。此外,自监督学习可以将语义相似的数据映射到相似的表示,因此映射后的一些域外实例可能会落入训练分布中。
不变模型旨在学习在多个训练分布中尊重特定不变性的特征(Arjovsky et al.,2019;Rojas Carulla等人,2018年;周等人,2021)。如果模型真的学习到了这些不变性,这可能发生在线性情况下,当存在混杂或反因果变量时(Ahuja等人,2021;Rosenfeld等人,2021),这可能从本质上增加了训练数据范围,因为模型可以忽略不变特征的变化。
分布鲁棒性考虑了数据分布的小干扰,并确保模型在这些干扰下表现良好(Goh&Sim,2010;Sagawa等人,2020年;Sinha等人,2018年;Staib&Jegelka,2019年)。相反,我们看的是更多的全局扰动。尽管如此,人们还是希望,有助于外推的修改通常也能提高对局部扰动的鲁棒性。
6结论
本文是一个初步的步骤,正式了解如何神经网络训练梯度下降外推。我们确定了MLPs和GNNs按期望外推的条件。我们还提出了一种解释,说明GNNs在复杂的算法任务中是如何能够很好地进行外推的:在架构和特性中编码适当的非线性可以帮助外推。我们的结果和假设与本文和文献中的实证结果一致
‘叁’ python报错 ...construct 100-D input array ...
看报错信息:
1.range函数传入的参数得是整形数,不能是浮点型数据。你应该是想写的:for step in range(1,10),但是你写的是:for step in range(1.10),【1,10】和【1.10】区别很大,多半是把逗号打错成点号了
2.然后for循环下的代码要缩进四个空格
3.然后input本来是一个关键词,原则上关键词不要再作为变量重新赋值,不是不可以,尽量别这么干
‘肆’ 深度前馈网络
看过西瓜书和李航的《统计学习方法》,对机器学习的基本算法算是有了初步的理解。机器学习的算法和思想固然重要,在实际中也有很多应用场景,但在超大数据集的表现上,深度学习才是当下效果最好的工具。可惜的是,花书这样一本经典着作的中文版翻译和机翻差不多水平,因此看的时候只能放慢速度。闲言少叙,下面是第六章的学习记录。
深度前馈网络(deep feedforward network) ,也叫作前馈神经网络(feedforward neural network)或者多层感知机(multilayer perceptron, MLP),是典型的深度学习模型。 前馈网络的目标是近似某个函数 。例如,对于分类器, 将输入 映射到一个类别 。前馈网络定义了一个映射 ,并且学习参数 的值使它能够得到最佳的函数近似。
下面我们把“深度前馈网络”这个词拆开来看:
那么深度前馈网络的各层之间有什么区别呢?从功能来讲,训练样本直接指明了 输出层 在每一点x上必须做什么,它必须产生一个接近 y 的值。但训练数据并没有给出其它层中的所需的输出,所以这些层被称为 隐藏层(hidden layer) 。
一种理解前馈网络的方式是从线性模型开始,并考虑如何克服它的局限性。如果各层的函数 都是线性函数,那么复合后的函数依然是线性的,此时我们的网络模型等价于线性模型。为了提高模型的表示能力,我们需要将各层的 设置为非线性的,从而得到一个非线性映射 。我们可以认为 提供了一组描述 的特征,或者认为它提供了 的一个新的表示。
设计和训练神经网络与使用梯度下降训练其他任何机器学习模型并没有太大不同。神经网络和线性模型等算法的最大区别,在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得 非凸 。这意味着神经网络的训练通常使用迭代的、基于梯度的优化, 仅仅使得代价函数达到一个非常小的值 ;而不是像用于训练线性回归模型的线性方程求解器或者用于训练逻辑回归或 SVM 的凸优化算法那样保证全局收敛。
用于非凸损失函数的随机梯度下降没有这种收敛性保证,并且 对参数的初始值很敏感。对于前馈神经网络,将所有的权重值初始化为小随机数是很重要的。偏置可以初始化为零或者小的正值。
大多数现代的神经网络使用最大似然来训练。这意味着代价函数就是负的对数似然,它与训练数据和模型分布间的 交叉熵 等价。这个代价函数表示为
使用最大似然来导出代价函数的方法的一个优势是,它减轻了为每个模型设计代价函数的负担。明确一个模型 则自动地确定了一个代价函数 。
用于实现最大似然估计的交叉熵代价函数有一个不同寻常的特性,那就是当它被应用于实践中经常遇到的模型时,它 通常没有最小值。 如果模型可以控制输出分布的密度(例如,通过学习高斯输出分布的方差参数),那么它可能对正确的训练集输出赋予极其高的密度,这将导致交叉熵趋向负无穷。 正则化技术提供了一些不同的方法来修正学习问题,使得模型不会通过这种方式来获得无限制的收益。
一种简单的输出单元是基于仿射变换的输出单元,仿射变换不具有非线性。这些单元往往被直接称为 线性单元 。给定特征 ,线性输出层产生一个向量 ,线性输出层经常被用来 产生条件高斯分布的均值 :
最大化其对数似然此时等价于最小化均方误差。
许多任务需要预测二值型变量 的值。具有两个类的分类问题可以归结为这种形式。此时最大似然的方法是定义 在 条件下的 Bernoulli 分布。为保证模型给出了错误答案时,总能有一个较大的梯度。可以使用 sigmoid输出单元 结合最大似然来实现。sigmoid 输出单元定义为:
这种在对数空间里预测概率的方法可以很自然地使用最大似然学习。因为用于最大似然的代价函数是 ,代价函数中的 抵消了 中的 。如果没有这个效果,sigmoid 的饱和性会阻止基于梯度的学习做出好的改进。因此, 最大似然几乎总是训练 输出单元的优选方法。
当我们想要表示一个具有 n 个可能取值的离散型随机变量的分布时,我们可以使用 函数。它可以看作是 函数的扩展。
函数最常用作分类器的输出,来表示 个不同类上的概率分布。比较少见的是, 函数可以在模型内部使用,例如如果我们想要在某个内部变量的 个不同选项中进行选择。 函数的形式为:
和 一样,当使用最大化对数似然训练 来输出目标值 时,使用指数函数工作地非常好。
隐藏单元的设计是一个非常活跃的研究领域,并且还没有许多明确的指导性理论原则。
整流线性单元(Rectified Linear Unit, ReLU)是隐藏单元极好的默认选择。许多其他类型的隐藏单元也是可用的。决定何时使用哪种类型的隐藏单元是困难的事(尽管整流线性单元通常是一个可接受的选择)。我们这里描述对于每种隐藏单元的一些基本直觉。这些直觉可以用来建议我们何时来尝试一些单元。 通常不可能预先预测出哪种隐藏单元工作得最好。设计过程充满了试验和错误,先直觉认为某种隐藏单元可能表现良好,然后用它组成神经网络进行训练,最后用验证集来评估它的性能。
大多数的隐藏单元都接受输入向量 x,计算仿射变换 ,然后使用一个逐元素的非线性函数 。大多数隐藏单元的区别仅仅在于激活函数 的形式。
整流线性单元使用激活函数:
整流线性单元通常作用于仿射变换之上:
当初始化仿射变换的参数时,可以将 b 的所有元素设置成一个小的正值,例如 0.1。这使得整流线性单元很可能初始时就对训练集中的大多数输入呈现激活状态,并且允许导数通过。
整流线性单元的一个缺陷是它们不能通过基于梯度的方法学习那些使它们激活为零的样本。整流线性单元的各种扩展保证了它们能在各个位置都接收到梯度。
整流线性单元的三个扩展基于当 时使用一个非零的斜率 :
绝对值整流(absolute value rectification) 固定 来得到: ,它用于图像中的对象识别 (Jarrett et al., 2009a); 渗漏整流线性单元(Leaky ReLU) (Maas et al., 2013) 将 固定成一个类似 0.01 的小值; 参数化整流线性单元(parametric ReLU) 将 作为学习的参数 (He et al., 2015)。
maxout 单元(maxout unit) (Goodfellow et al., 2013a) 进一步扩展了整流线性单元。maxout单元将 划分为每组有 个值的组,而不是使用作用于每个元素的函数 。每个maxout单元则输出每组中的最大元素:
这里 是组 的输入索引集 。因为激活函数中有了max操作,所以整个maxout网络也是一种非线性的变换。
maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合,而maxout又是取k个隐隐含层节点的最大值,这些”隐隐含层"节点也是线性的,所以在不同的取值范围下,最大值也可以看做是分段线性的(分段的个数与k值有关)。
整流线性单元和它们的这些扩展都是基于一个原则,那就是如果它们的行为更接近线性,那么模型更容易优化。
在引入整流线性单元之前,大多数神经网络使用 logistic sigmoid 激活函数:
或者是双曲正切激活函数:
这些激活函数紧密相关,因为:
我们已经看过 sigmoid 单元作为输出单元用来预测二值型变量取值为 1 的概率。与分段线性单元不同,sigmoid 单元在其大部分定义域内都饱和——当 z 取绝对值很大的正值时,它们饱和到一个高值,当 z 取绝对值很大的负值时,它们饱和到一个低值,并且仅仅当 z 接近 0 时它们才对输入强烈敏感。sigmoid 单元的广泛饱和性会使得基于梯度的学习变得非常困难。因为这个原因,现在不鼓励将它们用作前馈网络中的隐藏单元。当使用一个合适的代价函数来抵消 sigmoid 的饱和性时,它们作为输出单元可以与基于梯度的学习相兼容。
当必须要使用 sigmoid 激活函数时,双曲正切激活函数通常要比 logistic sigmoid 函数表现更好。在 而 的意义上,它更像是单位函数。因为 tanh 在 0 附近与单位函数类似。
架构(architecture) 一词是指网络的整体结构: 它应该具有多少单元,以及这些单元应该如何连接。
在链式架构中,主要的架构考虑是选择网络的深度和每一层的宽度。我将会看到,即使只有一个隐藏层的网络也足够适应训练集。 更深层的网络通常能够对每一层使用更少的单元数和更少的参数,并且经常容易泛化到测试集,但是通常也更难以优化。 对于一个具体的任务,理想的网络架构必须通过实验,观测在验证集上的误差来找到。
万能近似定理(universal approximation theorem)
一个前馈神经网络如果具有线性输出层和至少一层具有任何一种 ‘‘挤压’’ 性质的激活函数(例如logistic sigmoid激活函数)的隐藏层,只要给予网络足够数量的隐藏单元,它可以 以任意的精度来近似任何从一个有限维空间到另一个有限维空间的 Borel 可测函数 。前馈网络的导数也可以任意好地来近似函数的导数 (Hornik et al., 1990)。
万能近似定理意味着无论我们试图学习什么函数,我们知道一个大的MLP一定能够表示这个函数。
然而,我们不能保证训练算法能够学得这个函数。即使 MLP能够表示该函数,学习也可能因两个不同的原因而失败。 首先,用于训练的优化算法可能找不到用于期望函数的参数值。其次,训练算法可能由于过拟合而选择了错误的函数。
总之,具有单层的前馈网络足以表示任何函数,但是网络层可能大得不可实现,并且可能无法正确地学习和泛化。在很多情况下,使用更深的模型能够减少表示期望函数所需的单元的数量,并且可以减少泛化误差。
存在一些函数族能够在网络的深度大于某个值d时被高效地近似,而当深度被限制到小于或等于d时需要一个远远大于之前的模型。在很多情况下,浅层模型所需的隐藏单元的数量是n的指数级。
Montufar et al. (2014) 的主要定理指出, 具有 个输入深度为 每个隐藏层具有 个单元的深度整流网络可以描述的线性区域的数量是 :
根据经验,更深的模型似乎确实在广泛的任务中泛化得更好。
目前为止,我们都将神经网络描述成层的简单链式结构,主要的考虑因素是网络的深度和每层的宽度。在实践中,神经网络显示出相当的多样性。
一般的,层不需要连接在链中,尽管这是最常见的做法。许多架构构建了一个主链,但随后又添加了额外的架构特性,例如从层 i 到层 i + 2 或者更高层的 跳跃连接 。这些跳跃连接使得梯度更容易从输出层流向更接近输入的层。
架构设计考虑的另外一个关键点是如何将层与层之间连接起来。默认的神经网络层采用矩阵 W 描述的线性变换,每个输入单元连接到每个输出单元。许多专用网络具有较少的连接,使得输入层中的每个单元仅连接到输出层单元的一个小子集。这些用于 减少连接数量 的策略减少了参数的数量以及用于评估网络的计算量,但通常高度依赖于问题。
当我们使用前馈神经网络接收输入 并产生输出 时,信息通过网络向前流动。输入 提供初始信息,然后传播到每一层的隐藏单元,最终产生输出 。这称之为 前向传播(forward propagation) 。在训练过程中,前向传播可以持续向前直到它产生一个标量代价函数 。 反向传播(back propagation) 算法 (Rumelhart et al., 1986c),经常简称为backprop,允许来自代价函数的信息通过网络向后流动,以便计算梯度。
将计算形式化为图形的方法有很多。这里,我们使用图中的每一个节点来表示一个变量。变量可以是标量、向量、矩阵、张量、或者甚至是另一类型的变量。为了形式化我们的图形,我们还需引入操作(operation)这一概念。操作是指一个或多个变量的简单函数。我们的图形语言伴随着一组被允许的操作。我们可以通过将多个操作复合在一起来描述更为复杂的函数。
如果变量 y 是变量 x 通过一个操作计算得到的,那么我们画一条从 x 到 y 的有向边。我们有时用操作的名称来注释输出的节点,当上下文很明确时,有时也会省略这个标注。计算图的实例如下:
使用符号到符号的方法计算导数的示例如下。在这种方法中,反向传播算法不需要访问任何实际的特定数值。相反,它将节点添加到计算图中来描述如何计算这些导数。通用图形求值引擎可以在随后计算任何特定数值的导数。 本例从表示 的图开始,运行反向传播算法,指导它构造表达式 对应的图。
这部分花书上讲了很多内容……我看得有些失去耐心……可能是讲得太细致了吧……我对反向传播算法的认识很简单,就是一个链式法则,一层一层计算梯度然后向后传播。这里根据之前上课时候的课件内容做下简单回顾:
总之反向传播算法的要点就是 以恰当的顺序计算梯度,从而充分利用链式法则来提高计算效率 。我个人认为理解BP的最佳方式就是自己画个图手推一遍。
‘伍’ 一文读懂神经网络
要说近几年最引人注目的技术,无疑的,非人工智能莫属。无论你是否身处科技互联网行业,随处可见人工智能的身影:从 AlphaGo 击败世界围棋冠军,到无人驾驶概念的兴起,再到科技巨头 All in AI,以及各大高校向社会输送海量的人工智能专业的毕业生。以至于人们开始萌生一个想法:新的革命就要来了,我们的世界将再次发生一次巨变;而后开始焦虑:我的工作是否会被机器取代?我该如何才能抓住这次革命?
人工智能背后的核心技术是深度神经网络(Deep Neural Network),大概是一年前这个时候,我正在回老家的高铁上学习 3Blue1Brown 的 Neural Network 系列视频课程,短短 4 集 60 多分钟的时间,就把神经网络从 High Level 到推导细节说得清清楚楚,当时的我除了获得新知的兴奋之外,还有一点新的认知,算是给头脑中的革命性的技术泼了盆冷水:神经网络可以解决一些复杂的、以前很难通过写程序来完成的任务——例如图像、语音识别等,但它的实现机制告诉我,神经网络依然没有达到生物级别的智能,短期内期待它来取代人也是不可能的。
一年后的今天,依然在这个春运的时间点,将我对神经网络的理解写下来,算是对这部分知识的一个学习笔记,运气好的话,还可以让不了解神经网络的同学了解起来。
维基网络这样解释 神经网络 :
这个定义比较宽泛,你甚至还可以用它来定义其它的机器学习算法,例如之前我们一起学习的逻辑回归和 GBDT 决策树。下面我们具体一点,下图是一个逻辑回归的示意图:
其中 x1 和 x2 表示输入,w1 和 w2 是模型的参数,z 是一个线性函数:
接着我们对 z 做一个 sigmod 变换(图中蓝色圆),得到输出 y:
其实,上面的逻辑回归就可以看成是一个只有 1 层 输入层 , 1 层 输出层 的神经网络,图中容纳数字的圈儿被称作 神经元 ;其中,层与层之间的连接 w1、w2 以及 b,是这个 神经网络的参数 ,层之间如果每个神经元之间都保持着连接,这样的层被称为 全连接层 (Full Connection Layer),或 稠密层 (Dense Layer);此外,sigmoid 函数又被称作 激活函数 (Activation Function),除了 sigmoid 外,常用的激活函数还有 ReLU、tanh 函数等,这些函数都起到将线性函数进行非线性变换的作用。我们还剩下一个重要的概念: 隐藏层 ,它需要把 2 个以上的逻辑回归叠加起来加以说明:
如上图所示,除输入层和输出层以外,其他的层都叫做 隐藏层 。如果我们多叠加几层,这个神经网络又可以被称作 深度神经网络 (Deep Neural Network),有同学可能会问多少层才算“深”呢?这个没有绝对的定论,个人认为 3 层以上就算吧:)
以上,便是神经网络,以及神经网络中包含的概念,可见,神经网络并不特别,广义上讲,它就是
可见,神经网络和人脑神经也没有任何关联,如果我们说起它的另一个名字—— 多层感知机(Mutilayer Perceptron) ,就更不会觉得有多么玄乎了,多层感知机创造于 80 年代,可为什么直到 30 年后的今天才爆发呢?你想得没错,因为改了个名字……开个玩笑;实际上深度学习这项技术也经历过很长一段时间的黑暗低谷期,直到人们开始利用 GPU 来极大的提升训练模型的速度,以及几个标志性的事件:如 AlphaGo战胜李世石、Google 开源 TensorFlow 框架等等,感兴趣的同学可以翻一下这里的历史。
就拿上图中的 3 个逻辑回归组成的神经网络作为例子,它和普通的逻辑回归比起来,有什么优势呢?我们先来看下单逻辑回归有什么劣势,对于某些情况来说,逻辑回归可能永远无法使其分类,如下面数据:
这 4 个样本画在坐标系中如下图所示
因为逻辑回归的决策边界(Decision Boundary)是一条直线,所以上图中的两个分类,无论你怎么做,都无法找到一条直线将它们分开,但如果借助神经网络,就可以做到这一点。
由 3 个逻辑回归组成的网络(这里先忽略 bias)如下:
观察整个网络的计算过程,在进入输出层之前,该网络所做的计算实际上是:
即把输入先做了一次线性变换(Linear Transformation),得到 [z1, z2] ,再把 [z1, z2] 做了一个非线性变换(sigmoid),得到 [x1', x2'] ,(线性变换的概念可以参考 这个视频 )。从这里开始,后面的操作就和一个普通的逻辑回归没有任何差别了,所以它们的差异在于: 我们的数据在输入到模型之前,先做了一层特征变换处理(Feature Transformation,有时又叫做特征抽取 Feature Extraction),使之前不可能被分类的数据变得可以分类了 。
我们继续来看下特征变换的效果,假设 为 ,带入上述公式,算出 4 个样本对应的 [x1', x2'] 如下:
再将变换后的 4 个点绘制在坐标系中:
显然,在做了特征变换之后,这两个分类就可以很容易的被一条决策边界分开了。
所以, 神经网络的优势在于,它可以帮助我们自动的完成特征变换或特征提取 ,尤其对于声音、图像等复杂问题,因为在面对这些问题时,人们很难清晰明确的告诉你,哪些特征是有用的。
在解决特征变换的同时,神经网络也引入了新的问题,就是我们需要设计各式各样的网络结构来针对性的应对不同的场景,例如使用卷积神经网络(CNN)来处理图像、使用长短期记忆网络(LSTM)来处理序列问题、使用生成式对抗网络(GAN)来写诗和作图等,就连去年自然语言处理(NLP)中取得突破性进展的 Transformer/Bert 也是一种特定的网络结构。所以, 学好神经网络,对理解其他更高级的网络结构也是有帮助的 。
上面说了,神经网络可以看作一个非线性函数,该函数的参数是连接神经元的所有的 Weights 和 Biases,该函数可以简写为 f(W, B) ,以手写数字识别的任务作为例子:识别 MNIST 数据集 中的数字,数据集(MNIST 数据集是深度学习中的 HelloWorld)包含上万张不同的人写的数字图片,共有 0-9 十种数字,每张图片为 28*28=784 个像素,我们设计一个这样的网络来完成该任务:
把该网络函数所具备的属性补齐:
接下来的问题是,这个函数是如何产生的?这个问题本质上问的是这些参数的值是怎么确定的。
在机器学习中,有另一个函数 c 来衡量 f 的好坏,c 的参数是一堆数据集,你输入给 c 一批 Weights 和 Biases,c 输出 Bad 或 Good,当结果是 Bad 时,你需要继续调整 f 的 Weights 和 Biases,再次输入给 c,如此往复,直到 c 给出 Good 为止,这个 c 就是损失函数 Cost Function(或 Loss Function)。在手写数字识别的列子中,c 可以描述如下:
可见,要完成手写数字识别任务,只需要调整这 12730 个参数,让损失函数输出一个足够小的值即可,推而广之,绝大部分神经网络、机器学习的问题,都可以看成是定义损失函数、以及参数调优的问题。
在手写识别任务中,我们既可以使用交叉熵(Cross Entropy)损失函数,也可以使用 MSE(Mean Squared Error)作为损失函数,接下来,就剩下如何调优参数了。
神经网络的参数调优也没有使用特别的技术,依然是大家刚接触机器学习,就学到的梯度下降算法,梯度下降解决了上面迭代过程中的遗留问题——当损失函数给出 Bad 结果时,如何调整参数,能让 Loss 减少得最快。
梯度可以理解为:
把 Loss 对应到 H,12730 个参数对应到 (x,y),则 Loss 对所有参数的梯度可以表示为下面向量,该向量的长度为 12730:
$$
abla L(w,b) = left[
frac{partial L}{partial w_1},
frac{partial L}{partial w_2},...,
frac{partial L}{partial b_{26}}
ight] ^ op
$$
所以,每次迭代过程可以概括为
用梯度来调整参数的式子如下(为了简化,这里省略了 bias):
上式中, 是学习率,意为每次朝下降最快的方向前进一小步,避免优化过头(Overshoot)。
由于神经网络参数繁多,所以需要更高效的计算梯度的算法,于是,反向传播算法(Backpropagation)呼之欲出。
在学习反向传播算法之前,我们先复习一下微积分中的链式法则(Chain Rule):设 g = u(h) , h = f(x) 是两个可导函数,x 的一个很小的变化 △x 会使 h 产生一个很小的变化 △h,从而 g 也产生一个较小的变化 △g,现要求 △g/△x,可以使用链式法则:
有了以上基础,理解反向传播算法就简单了。
假设我们的演示网络只有 2 层,输入输出都只有 2 个神经元,如下图所示:
其中 是输入, 是输出, 是样本的目标值,这里使用的损失函数 L 为 MSE;图中的上标 (1) 或 (2) 分别表示参数属于第 (1) 层或第 (2) 层,下标 1 或 2 分别表示该层的第 1 或 第 2 个神经元。
现在我们来计算 和 ,掌握了这 2 个参数的偏导数计算之后,整个梯度的计算就掌握了。
所谓反向传播算法,指的是从右向左来计算每个参数的偏导数,先计算 ,根据链式法则
对左边项用链式法则展开
又 是输出值, 可以直接通过 MSE 的导数算出:
而 ,则 就是 sigmoid 函数的导数在 处的值,即
于是 就算出来了:
再来看 这一项,因为
所以
注意:上面式子对于所有的 和 都成立,且结果非常直观,即 对 的偏导为左边的输入 的大小;同时,这里还隐含着另一层意思:需要调整哪个 来影响 ,才能使 Loss 下降得最快,从该式子可以看出,当然是先调整较大的 值所对应的 ,效果才最显着 。
于是,最后一层参数 的偏导数就算出来了
我们再来算上一层的 ,根据链式法则 :
继续展开左边这一项
你发现没有,这几乎和计算最后一层一摸一样,但需要注意的是,这里的 对 Loss 造成的影响有多条路径,于是对于只有 2 个输出的本例来说:
上式中, 都已经在最后一层算出,下面我们来看下 ,因为
于是
同理
注意:这里也引申出梯度下降的调参直觉:即要使 Loss 下降得最快,优先调整 weight 值比较大的 weight。
至此, 也算出来了
观察上式, 所谓每个参数的偏导数,通过反向传播算法,都可以转换成线性加权(Weighted Sum)计算 ,归纳如下:
式子中 n 代表分类数,(l) 表示第 l 层,i 表示第 l 层的第 i 个神经元。 既然反向传播就是一个线性加权,那整个神经网络就可以借助于 GPU 的矩阵并行计算了 。
最后,当你明白了神经网络的原理,是不是越发的认为,它就是在做一堆的微积分运算,当然,作为能证明一个人是否学过微积分,神经网络还是值得学一下的。Just kidding ..
本文我们通过
这四点,全面的学习了神经网络这个知识点,希望本文能给你带来帮助。
参考:
‘陆’ 电池片高低电压搞错会造成明暗片吗
以太阳能为代表的新能源在近些年得到了广泛的研究和应用,特别是光伏发电技术。光伏太阳能的核心组件是光伏电池组件,除了电池材料自身存在的缺陷,生产时对电池片的多次加工也可能导致电池片的损坏,如过焊片、黑斑片、隐裂片等缺陷问题,加上安装和使用过程中的机械损伤,都会影响组件的转化效率和使用寿命。在实际应用中,更会对光伏发电系统自身的安全构成威胁。因此,研究光伏组件的缺陷检测显得尤为重要。
目前电池组件缺陷检测的技术主要有[1]:红外成像技术、光致发光成像技术、(ELectrofluorescence,EL)成像。EL成像是用于光伏组件缺陷检测的非接触式成像技术,根据硅材料的电致发光原理进行检测。给晶体硅电池组件加上正向偏压,组件会发出一定波长的光,电荷耦合器件图像传感器(CCD)可以捕捉到这个波长范围的光并在电脑上成像。但电池组件存在缺陷会减弱其发光强度,所以可以根据EL图像中电池发光强度的不同来判断电池组件是否存在缺陷。
在以往的研究中,2012年TSIA D M等[2]提出了利用独立分量分析(ICA)基图像识别缺陷的监督学习方法,该方法在80个太阳电池单元的测试样本上平均识别率为93.4%。2014年ANWAR S A和ABDULLAH M Z提出了检测多晶电池微裂纹的算法[3],即基于各向异性扩散和形状分类的图像分割方法,在600张图像上检测微裂纹的精度上达到88%。深度学习特别是卷积神经网络(Convolutional Neural Network,CNN)在图像识别[4]和检测上备受重视。2018年DEITSCH S等提出自动检测单一光伏电池EL图像缺陷的方法[5],分别用支持向量机和卷积神经网络进行训练及预测,平均准确率分别达到了82.44%和88.42%。另外,随着深度学习的网络结构趋于更深,增加了训练及实际应用的时间,因此,对网络模型的压缩的研究显得尤为重要[6]。
本文针对传统缺陷识别算法的不足,通过深度学习算法对EL图像进行分类,进而识别出有缺陷和没有缺陷的电池片。经过实验证明,改进的VGG16[7]网络具有很好的准确率,并且大幅降低了神经网络由于层数过多而带来的大量运算,缩减后的模型有更大的实用性。
1 实验数据及预处理
实验数据来自于BUERHOP-LUTZ C等人公开的数据集[8],该数据集提供了从光伏组件的高分辨率电致发光图像中提取的太阳能电池图像。图片来自于44个不同的PV模块,其中18个模块为单晶型,26个为多晶型。图片可以拆分为2 624个300×300像素的电池单元的EL图像。这些图像包含了常见的内外缺陷,如黑心片、黑斑片、短路黑片、过焊片、断栅片、明暗片、隐裂等类型,如图1所示,出现的这些缺陷会对太阳电池组件的转换效率和使用寿命造成严重影响。
原数据集中将单晶和多晶的电池单元进行注释,并且按照缺陷的概率对每张图片进行标注,统计样本的总数以及各类样本分立情况,发现各类样本数目相差较大,样本分布的不平衡将导致训练后模型对各类别识别出现偏差。为了减少分布不平衡的差异,本文首先将概率为0%和33.33%的图片作为无缺陷的正样本,66.67%和100%的图片作为有缺陷的负样本,因此得到的样本分布如图2所示。
本文所使用的神经网络模型需要224 pixel×224 pixel大小的输入图像,由于给定数据集EL图像大小都是300 pixel×300 pixel,在输入前需要对通过压缩来得到符合大小的图片。对于样本分布不平衡问题,本文使用了数据增强方法。采用的第一种数据增强方法是随机水平和垂直翻转图像;第二种方法是对原始图像随机旋转一定角度(不超过2°),旋转所使用的插值方法为双三次插值;第三种方法是调整图像的亮度和对比度,因为光照强度的变化会对成像结果造成很大影响。在预处理阶段还对输入图片进行了去噪处理。
2 基于VGGNet的缺陷识别分类网络
神经网络在20世纪就已经被发现,经过十多年的发展,研究人员提出了各种不同的网络结构,从AlexNet到VGGNet、GoogLeNet和ResNet,随着网络深度和宽度的增加以及不同功能层的引入,其在图像识别的准确率不断提高。一方面,当增加网络层数后,网络可以进行更加复杂的特征提取,理论上可以取得更好的结果。但随着网络深度的增加,会出现退化的问题,由于深层网络存在着梯度消失或者爆炸的问题,深度学习模型很难训练。因此,设计一个实用的EL图像缺陷识别分类网络,需要结合理论分析和实验验证。
卷积神经网络作为一种特殊的深层的神经网络模型,它的核心思想是将局部感知、权值共享以及下采样结合起来,通过深度神经网络的逐层计算来学习图像的像素特征、低级特征、高级特征直至类别的隐式表达关系。2014年SIMONYAN K等人提出VGG网络,探索了CNN的深度与其性能之间的关系,成功地构筑了16~19层深的神经网络,输入为224×224×3的图片,经过卷积和池化的处理输出图像所属类别的概率[7],在具有1 000多个类别一百多万张图片的ImageNet数据集上取得了当时很好的效果。因此不少分类问题采用的卷积神经网络都以此为基础。
原始的VGG16网络结构如图3所示,由5组卷积层、3层全连接层、softmax输出层构成,每组卷积层之间使用max-pooling(最大化池)分开,所有隐层的激活单元都采用ReLU函数做非线性变换,用以加快网络收敛。图中,3×3 conv,64等表示卷积核尺寸为3×3,通道数为64的卷积层;pool/2表示滑动步长为2的池化层(这里为最大池化);fc 4096表示通道数为4096的全连接层;softmax表示softmax函数。对于每一组卷积操作,都包含多个特别小的3×3卷积核构成的卷积层,采用小卷积核既可以减少参数,又增加了非线性映射,从而增强网络的拟合效果。滑动步长为1,采用边界填充的方式,使得每个卷积层的输入/输出特征图的像素不变。池化层采用2×2的池化核。每一组的通道数从64开始扩大2倍,分别为64、128、256、512、512,使得更多的信息可以被提取出来。之后的3个全连接层通道数分别为4 096、4 096、1 000,最后通过softmax层得到图片属于每个类别的概率。在以下研究中,将最后的3层全连接层替换为卷积核为7×7和1×1的卷积层,通道数分别为4 096、4 096和2。
3 实验及其分析
3.1 网络训练方法
实验所用计算机内存为8 GB,使用英伟达GTX 1060显卡加速模型训练,显存为6 GB。软件环境为Ubuntu 16.04 LTS 64位系统,选用Python作为编程语言,采用TensorFlow深度学习开源框架,CUDA版本为9.0。
实验选取图片总数的80%进行训练,20%用来测试,即训练集图片数量为2 099,测试集数量为525。采用批量训练的方法,将训练集和测试集分成多个批次(batch),每个批次的大小为16或32,在对每一个batch训练完之后,对所有的测试集图片进行测试,迭代的次数记为steps。采用随机梯度下降算法作为优化器,学习率在训练中控制着参数的更新速度,这里使用指数衰减学习率,初始学习率为0.005,衰减速度为1 000,学习率衰减系数为0.9。训练得到的损失和准确率如图4所示。
通过大量实验,发现CNN在缺陷识别上有不错的效果,为了进一步提高分类的性能及减少训练所需的时间,下面将对不同的dropout概率和损失函数进行讨论,以期望得到更优的模型。
3.2 不同损失函数下的识别准确率
损失函数用来估量模型的预测值与真实值的相差程度,这里比较了两种常见的损失函数Hinge loss和Softmax loss。Hinge loss又称为折页损失函数,其函数表达式为:
其中,L为损失,t=[t1,t2,…,tN]T表示目标值;y=[y1,y2,…,yN]T,表示预测值输出;1≤j≤N,N为输出节点的数量。
这两种损失函数随着迭代次数变化的曲线如图5所示。在训练的初始阶段,Softmax loss要小于Hinge loss,但其下降的速度比较缓慢;训练200次以后Hinge loss迅速减小,说明模型收敛得更快,并且模型的鲁棒性更好。从这里可以看出,在电致发光图像缺陷识别的数据集上,二分类的Hinge loss具有更好的效果。
3.3 不同Dropout概率下的识别准确率
在数据集有限的情况下,通常使用dropout来缓解过拟合的发生,在一定程度上起到正则化的效果。它是指在标准的BP神经网络基础之上,使BP网络的隐藏层激活值以一定的比例变为0,即按照一定的比例,随机地让一部分隐藏层节点失效。存在dropout的神经网络计算过程如下:
图6给出了在不同dropout概率时对缺陷识别的准确率,从图中可以看出,当dropout概率在0.3时准确率最高。在训练的过程中,概率越小,网络的参数较多,对于训练集样本不足够大情况下,容易出现过拟合的现象;概率越小,由于所训练的神经网络节点数不足,并不能有效地拟合训练数据,导致最终的识别准确率下降,所以找到合适的概率对于模型的训练效果至关重要。
3.4 不同网络结构的识别效果分析
基于VGG16的卷积神经网络虽然在现有数据集上取得了良好的限制,但训练时间过长,通过对dropout概率的研究也表明网络中存在着冗余参数,因此为了提高训练的速度,本文对网络进行缩减,计算不同网络层数时的参数总量,记录下训练时的时间以及在测试集上的准确率,如表1所示。
表1中,结构1为完整的VGG16网络;结构2将每组卷积的卷积层个数减少为1、1、2、2、2,通道数不变;结构3将每组卷积的卷积层个数改为2、2、4、4、4,通道数不变,用来作对比;结构4将每组卷积的卷积层个数改为2、2、2、2、2,通道数不变;结构5~6每组卷积的个数均为1,结构4的通道数为64、128、256、512、512、4096、4096、2,结构5的通道数为32、64、128、256、256、2048、2048、2,结构6的通道数为16、32、64、128、128、1024、1024、2。
从表1中可以看出网络的参数主要集中在全连接层,在将全连接层的神经元节点数目缩减之后,训练的时间大大缩减。卷积操作承担着图像特征提取的任务,卷积层数量的缩减虽然会稍微降低识别的结果,但是能大大加速模型的训练速度,这对于工业上的电致发光图像缺陷识别有重要意义。
4 结论
本文提出将卷积神经网络用于太阳电池单元电致发光图像缺陷识别,它能够很好地提取电池片的缺陷,进行正确的分类。在2 624张样本上,用全卷积VGG16网络进行训练,经过大量的参数调节,识别的准确率达到93.95%。在此基础上本文研究了模型压缩后的训练速率以及识别准确率,得出在减少网络层数之后,模型的训练速率大大加快,并且不会使准确率明显下降。下一步的研究中,将在简化网络结构的基础上,提高模型性能和识别准确率,以便用于实际的电池片缺陷识别当中。
参考文献
[1] 施光辉,崔亚楠,刘小娇,等.电致发光(EL)在光伏电池组件缺陷检测中的应用[J].云南师范大学学报(自然科学版),2016,36(2):17-21.
[2] TSAI D M,WU S C,LI W C.Defect detection of solar cells in electroluminescence images using Fourier image reconstruction [J].Solar Energy Materials and Solar Cells,2012,99(none):250-262.
[3] ANWAR S A,ABDULLAH M Z.Micro-crack detection of multicrystalline solar cells featuring an improved anisotropic diffusion filter and image segmentation technique[J].Eurasip Journal on Image & Video Processing,2014,2014(1):1-17.
[4] 许少尉,陈思宇.基于深度学习的图像分类方法[J].电子技术应用,2018,44(6):116-119.
[5] DEITSCH S,CHRISTLEIN V,BERGER S,et al.Automatic classification of defective photovoltaic mole cells in electroluminescence images[J].arXiv preprint arXiv:1807.02894,2018.
[6] 马治楠,韩云杰,彭琳钰,等.基于深层卷积神经网络的剪枝优化[J].电子技术应用,2018,44(12):119-122,126.
[7] SIMONYAN K,ZISSERMAN A.Very deep convolutional networks for large-scale image recognition[J].arXiv preprint arXiv:1409.1556,2014.
[8] BUERHOP-LUTZ C,DEITSCH S,MAIER A F,et al.A benchmark for visual identification of defective solar cells in electroluminescence imagery[C].35th European PV Solar Energy Conference and Exhibition
‘柒’ c++难道不支持指针
二维数组不是用二级指针去指的,应该用数组指针 int n[3][4]; int (*p)[4] = n; 当然你认为这样看起来不舒服,完全可以用一级指针去指 int *p = &n[0][0]; 访问时使用p[i*4+j]访问下标为i、j的元素,这里的4为数组的列数,比如p[1*4+2]为1行2列的元素=7
希望采纳
‘捌’ C语言里的char, if, el, se, for,relurn,drawtxt,rect是什么
感觉你是不是写错了好多?
是else。和return。具体还是看一些C语言的入门书吧。或者教学视频