深度学习(一)——MP神经元模型, BP算法, 神经元激活函数, Dropout

https://antkillerfarm.github.io/

前言

神经网络本质上不是什么新东西。十年前,我还在上学的时候,就接触过皮毛。然而那时这玩意更多的还是学术界的屠龙之术,工业界几乎没有涉及。

及至近日重新拾起,方才发现,这十年正是神经网络蓬勃发展,逐渐进入应用阶段的十年。各种概念层出不穷,远非昔日模样。

Deep Learning虽然在学术界的大牛看来,属于旧概念的炒作。然而由于神经网络本身的非线性和连接的复杂性,其中的概念的确比一般的浅层算法复杂的多,从这个角度来说,称其为Deep,也算有些道理。

这里最主要的参考文献包括:

《机器学习》,周志华著。

《Deep Learning Tutorial》,李宏毅著(台湾大学电机工程学助理教授)。

http://www.useit.com.cn/thread-13132-1-1.html

《Deep Learning》,Ian Goodfellow、Yoshua Bengio、Aaron Courville著。

原版:

http://www.deeplearningbook.org/

中文版:

https://github.com/exacity/deeplearningbook-chinese

注:这本书基于markdown文件,使用tex编译而成,可作为编写大型书的代码参考项目。
安装方法:
sudo apt install texlive-xetex texlive-lang-chinese texlive-science xindy
make

其他参考文献将在各相关部分列出。

Deep Learning圈子的主要人物:

这里写图片描述

注:Yann LeCun,1960年生,法国科学家。Pierre and Marie Curie University博士。Geoffrey Hinton是他博士后时代的导师。CNN的发明人。纽约大学教授,Facebook AI研究所主任。由于他的姓名发音非常东方化,因此被网友起了很多中文名如燕乐存、杨乐康等。2017.3,Yann访华期间正式公布中文名:杨立昆。

Léon Bottou,法国科学家,随机梯度下降算法的发明人。

Yoshua Bengio,1964年生,法国出生的加拿大科学家。深度学习的另一个宗师。

这三个法国佬,都是好基友。只不过Yann LeCun和Yoshua Bengio研究神经网络,而Léon Bottou研究SVM,学术上分属不同派系。

Geoffrey Everest Hinton,1947年生,英国出生的加拿大科学家,爱丁堡大学博士,多伦多大学教授。连接主义的代表人物,多层神经网络的宗师。英国皇家学会会员。

一般将Geoffrey Hinton、Yann LeCun和Yoshua Bengio并称为深度学习的三大宗师。

MP神经元模型

MP神经元模型是1943年,由Warren McCulloch和Walter Pitts提出的。

注:Warren Sturgis McCulloch,1898~1969,美国神经生理学和控制论科学家。哥伦比亚大学博士,先后执教于MIT、Yale、芝加哥大学。

Walter Harry Pitts, Jr.,1923~1969,美国计算神经学科学家。
这个人的经历,实在是非典型。家里贫穷,大约是读不起大学,15岁的时候,到芝加哥大学旁听Bertrand Russell的讲座。Russell很看重这个年轻人,但由于他只是访问学者,于是在回国之前,将Pitts介绍给Rudolf Carnap,后者为Pitts安排了一份在学校打杂的工作。这一打杂就是五六年时间,最后凭借论文,获得芝加哥大学的准学士学位(因为他始终都不是正式学籍的学生),这也是他一生唯一的学位。
但是如果看看Pitts的合作者的阵容,就知道Pitts水平之高了。他们是:Warren McCulloch、Jerome Lettvin、Norbert Wiener。

MP神经元模型如下图所示:

这里写图片描述

即:

y j = f ( ∑ i = 1 n w i j x i − θ j ) y_j=f\left(\sum _{i=1}^nw_{ij}x_i-\theta_j\right) yj=f(i=1nwijxiθj)

f被称为称为激活函数(Activation Function)或转移函数(Transfer Function),用以提供非线性表达能力。f的参数其实就是《机器学习(一)》中提到的逻辑回归。

生物神经元和MP神经元模型的对应关系如下表:

生物神经元MP神经元模型
神经元 j j j
输入信号 x i x_i xi
权值 w i j w_{ij} wij
输出信号 y j y_j yj
总和 ∑ \sum
膜电位 ∑ i = 1 n w i j x i \sum _{i=1}^nw_{ij}x_i i=1nwijxi
阈值 θ j \theta_j θj

从上图亦可看出,如果将阈值看作输入为-1.0的哑节点的连接权重,则权重和阈值可统一为权重。神经网络训练的过程,实际上就是根据样本调整权重和阈值的过程。

参考:

http://blog.csdn.net/u013007900/article/details/50066315

单层感知器 vs. 多层感知器

神经网络的层数越多,其表达力越丰富,如下表所示:

这里写图片描述

ANN简史

这里写图片描述

BP算法

误差逆传播(error BackPropagation)算法最早由Paul J. Werbos于1974年提出,然而此时正值ANN的低谷,未得到人们的重视。因此到了1986年时,由David Everett Rumelhart重新发明了该算法。

注:Paul J. Werbos,1947年生,哈佛大学博士。

David Everett Rumelhart,1942~2011,美国心理学家。斯坦福大学博士,先后执教于UCSD和斯坦福。美国科学院院士。

这里写图片描述

BP算法的核心思路:

1.利用前向传导公式,计算第n层输出值。

2.计算输出值和实际值的残差。

3.将残差梯度传递回第 n − 1 , n − 2 , … , 2 n-1,n-2,\dots,2 n1,n2,,2层,并修正各层参数。(即所谓的误差逆传播)

BP算法的推导过程教材已经写的很好了,这里只对要点做一个摘录。

链式法则

Chain Rules本来是微积分中,用于求一个复合函数导数的常用法则。这里用来进行残差梯度的逆传播。

由《机器学习(一)》的公式3可得:

Δ w h j = − η ∂ E k ∂ w h j \Delta w_{hj}=-\eta\frac{\partial E_k}{\partial w_{hj}} Δwhj=ηwhjEk

w h j w_{hj} whj先影响 β j \beta_j βj,再影响 y ^ j k \hat y_j^k y^jk,然后影响误差 E k E_k Ek,因此有:

∂ E k ∂ w h j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ⋅ ∂ β j ∂ w h j (1) \frac{\partial E_k}{\partial w_{hj}}=\frac{\partial E_k}{\partial \hat y_j^k}\cdot \frac{\partial \hat y_j^k}{\partial \beta_j}\cdot \frac{\partial \beta_j}{\partial w_{hj}}\tag{1} whjEk=y^jkEkβjy^jkwhjβj(1)

这里写图片描述

随机初始化

神经网络的参数的随机初始化的目的是使对称失效。否则的话,所有对称结点的权重都一致,也就无法区分并学习了。

BP算法的缺点

虽然传统的BP算法,理论上可以支持任意深度的神经网络。然而实际使用中,却很少能支持3层以上的神经网络。

这里写图片描述

如上图所示,sigmoid函数不是线性的,一个小的输出值的改变,对应了比较大的输入值改变。换句话说,就是输出值的梯度较大,而输入值的梯度较小。而梯度在基于梯度下降的优化问题中,是至关重要的。

随着层数的增多,反向传递的残差梯度会越来越小,这样的现象,被称作梯度消失(Vanishing Gradient)。它导致的结果是,虽然靠近输出端的神经网络已经训练好了,但输入端的神经网络仍处于随机状态。也就是说,靠近输入端的神经网络,有和没有都是一样的效果,完全体现不了深度神经网络的优越性。

和梯度消失相反的概念是梯度爆炸(Vanishing Explode),也就是神经网络无法收敛。

神经元激活函数

tanh函数

除了阶跃函数和Sigmoid函数之外,常用的神经元激活函数,还有双曲正切函数(tanh函数):

f ( z ) = tanh ⁡ ( x ) = sinh ⁡ ( x ) cosh ⁡ ( x ) = e x − e − x e x + e − x f(z)=\tanh(x)=\frac{\sinh(x)}{\cosh(x)}=\frac{e^x-e^{-x}}{e^x+e^{-x}} f(z)=tanh(x)=cosh(x)sinh(x)=ex+exexex

其导数为:

f ′ ( z ) = 1 − ( f ( z ) ) 2 f'(z)=1-(f(z))^2 f(z)=1(f(z))2

这里写图片描述

上图是sigmoid函数(蓝)和tanh函数(绿)的曲线图。

这里写图片描述

上图是sigmoid函数(蓝)和tanh函数(绿)的梯度曲线图。从中可以看出tanh函数的梯度比sigmoid函数大,因此有利于残差梯度的反向传递,这是tanh函数优于sigmoid函数的地方。但是总的来说,由于两者曲线类似,因此tanh函数仍被归类于sigmoid函数族中。

下图是一些sigmoid函数族的曲线图:

这里写图片描述

有关sigmoid函数和tanh函数的权威论述,参见Yann LeCun的论文:

http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf

稀疏性

从数学上来看,非线性的Sigmoid函数对中央区的信号增益较大,对两侧区的信号增益小,在信号的特征空间映射上,有很好的效果。

从神经科学上来看,中央区酷似神经元的兴奋态,两侧区酷似神经元的抑制态,因而在神经网络学习方面,可以将重点特征推向中央区,将非重点特征推向两侧区。

无论是哪种解释,看起来都比早期的线性激活函数 y = x y=x y=x,阶跃激活函数高明了不少。

2001年,Attwell等人基于大脑能量消耗的观察学习上,推测神经元编码工作方式具有稀疏性和分布性。

2003年,Lennie等人估测大脑同时被激活的神经元只有1~4%,进一步表明神经元工作的稀疏性。

从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。

从这个角度来看,在经验规则的初始化W之后,传统的Sigmoid系函数同时近乎有一半的神经元被激活,这不符合神经科学的研究,而且会给深度网络训练带来巨大问题。

参考:

http://www.cnblogs.com/neopenx/p/4453161.html

https://en.wikipedia.org/wiki/Activation_function

ReLU

ReLU(Rectified Linear Units)激活函数的定义如下:

f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)

其函数曲线如下图中的蓝线所示:

这里写图片描述

从上图可以看出,ReLU相对于Sigmoid,在解决了梯度消失问题的同时,也增加了神经网络的稀疏性,因此ReLU的收敛速度远高于Sigmod,并成为目前最常用的激活函数。

由于ReLU的曲线不是连续可导的,因此有的时候,会用SoftPlus函数(上图中的绿线)替代。其定义为:

f ( x ) = ln ⁡ ( 1 + e x ) f(x) = \ln(1 + e^x) f(x)=ln(1+ex)

除此之外,ReLU函数族还包括Leaky ReLU、PReLU、RReLU、ELU等。

Dropout

Dropout是神经网络中解决过拟合问题的一种常见方法。

它的具体做法是:

这里写图片描述

1.每次训练时,随机隐藏部分隐层神经元。

2.根据样本值,修改未隐藏的神经元的参数。隐藏的神经元的参数保持不变。

3.下次训练时,重新随机选择需要隐藏的神经元。

由于神经网络的非线性,Dropout的理论证明尚属空白,这里只有一些直观解释。

1.dropout掉不同的隐藏神经元就类似在训练不同的网络,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。这实际上就是bagging的思想。

2.因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这会迫使网络去学习更加鲁棒的特征。换句话说,假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式(鲁棒性)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/67673.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单个人工神经元模型示意图,人体神经元模型制作

人工神经元的基本构成 人脑的神经元模型如图8.6所示。图中一个神经元由细胞核、一个轴突、多个树突、突触组成。生物电信号从树突传入,经过细胞核处理,从轴突输出一个电脉冲信号。 神经元通过树突与轴突之间的突触与其他神经元相连构成一个复杂的大规模…

神经元的细胞体内有什么,神经元的细胞体在哪里

神经元细胞体位于哪里? 谷歌人工智能写作项目:神经网络伪原创 你知道神经元在我们身体的哪个部位吗? 神经元的基本结构包括细胞体和突起.神经元的突起一般包括一条长而分枝少的轴突和数条 短而呈树状分枝的树突.轴突以及套在外面的髓鞘,叫做神经纤维.…

03 神经元多输入

神经元多输入 上一篇博客介绍了二分类的逻辑回归模型。如果我们想要多分类的逻辑回归模型,我们该怎么做呢? 很显然,我们在只有一个神经元的时候可以做二分类的问题。如果我们想要多分类的话,直接加神经元的个数就好了,…

人脑部神经网络分布特点,人脑部神经网络分布图

人的大脑的怎么分配的 大脑(Brain)包括左、右两个半球及连接两个半球的中间部分,即第三脑室前端的终板。大脑半球被覆灰质,称大脑皮质,其深方为白质,称为髓质。髓质内的灰质核团为基底神经节。在大脑两半球间由巨束纤维—相连。 …

人体内数量最多的神经元,人体内有多少个神经元

人体内平均有多少神经元? 。 约含有140亿个神经元胞体虽然神经元形态与功能多种多样,但结构上大致都可分成胞体(cellbody,orsoma)和突起(neurite)两部分.突起又分树突(dendrite)和…

【计量经济学】【高教版】第二次作业

第二次作业: 教材:伍德里奇。计量经济学导论:现代观点(第五版)。 第三章习题:必做 1,2,5,6,11,选做13 第四章习题:必做2,3,4,5,8,选做9,10,11 第三章 1.多元线性回归模型的基本假设是什么?在证明最小二乘估计量的无偏性和有效性的过程中,哪些基本假设起…

【计量经济学】【高教版】第一次作业(7、8、10)

第二次 7.假设有人做了如下的回归: y i = β 0 ^ + β 1 ^ x i + e i y_i=\widehat{\beta_0}+\widehat{\beta_1}x_i+e_i yi​=β0​ ​+β1​ ​xi​+ei​ 其中, y i , x i y_i,x_i yi​,xi​分别为 Y i , X i Y_i,X_i Yi​,Xi​关于各自均值的离差。问 β 0 ^ 和 β 1 ^ \…

软件工程经济学作业5-7

1.什么是生产函数? 其主要特征是什么? 答:生 产函数是指一定时期内生产要素的数量与某种组合同其所能出产的最大产量之间存在的函数关系。 生产函数通常满足以下三个特征: (1 ) 资本 与劳动力的边际产出总是为正值, 在…

2020年12月程序员工资统计,平均14222元(转载)

2020年12月全国招收程序员394699人。2020年12月全国程序员平均工资14222元,工资中位数12500元,其中96%的人的工资介于3250元到62500元。 从图上看,工资是真的降了,吓得我瑟瑟发抖。希望明年涨回来。 城市 排名city平均工资最低工资…

每日一题-13(员工薪水中位数)

题13: 根据下表,在不使用任何内置的SQL函数的情况下编写SQL查询来查找每个公司的薪水中位数。 解题思路:题目要求是不使用任何内置的SQL函数,因此使用HAVING的妙用。 (1)先做自连接,之后根据ID…

《2020年全球程序员收入报告》字节跳动高居全球第七,年薪中位数高达40万美元!

速读2分钟,今天看到一份特别有意思的报告,是 《2020 年全球程序员收入报告》 。 大家谨慎观看,我感觉大家看完这份报告,在感受到拖后腿之后,容易丧心病狂,产生病态的嫉妒心理。 日前,Levels.f…

上半年薪资统计,数据岗中位数接近20K!

大家应该都和我一样,经常看到类似于《XXX入职大厂数据分析师,年薪50W》之类的标题。 数据分析师的薪资真的有这么夸张吗?我特意去查了下数据: (数据来源:职友集) 最近的数据显示,全国…

2021年3月程序员工资统计,平均15189元,又涨了

2021年3月采集数据124176条。2021年3月全国程序员平均工资15189元,工资中位数12500元,其中95%的人的工资介于5250元到37500元。 工资K线图: 这个月涨了一点点,一点点也是涨呀。 程序员的工资虽然不高,但是涨幅还是超…

2019年一线城市程序员工资大调查

转载声明:转载不得篡改文章内容。必须注明出处,必须注明Github源代码地址。 保留要求转载者删除文章的权力。 欢迎转载,提供本文markdown: https://github.com/juwikuang/china_job_survey/blob/master/articles/2019年一线城市…

2020年1月全国程序员工资统计,平均工资13632元。

趋势 2020年1月,中国大陆程序员平均工资13632员,比上个月增加。具体趋势如图: 各主要程序员城市工资变化 城市 北京,上海,深圳,杭州,广州四地的工资最高。 city平均工资最低工资中位数最高…

2020年9月程序员工资统计,平均14469元

目录 平均工资主要城市工资Java程序员按职能 统一回复,我9月1日爬的数据,当然是9月的程序员工资了。总不能说是8月的吧。 平均工资 2020年9月全国招收程序员352733人。2020年9月全国程序员平均工资14469元,工资中位数12500元,其…

2020年11月程序员工资统计,平均14327元

2020年11月全国招收程序员340579人。2020年11月全国程序员平均工资14327元,工资中位数12500元,其中96%的人的工资介于3000元到85000元。 工资好像又降低了,吓得我瑟瑟发抖。《权力的游戏》里面的一句话又回荡在我的耳边:winter is…

2020年8月程序员工资统计,平均14401元,下跌势头止住了

统一回复,我8月1日爬的数据,当然是8月的程序员工资了。总不能说是7月的吧。 平均工资 2020年8月全国招收程序员346036人。2020年8月全国程序员平均工资14401元,工资中位数12500元,其中95%的人的工资介于5250元到35000元。 主要城…

2020年6月程序员工资统计,平均14404元,又跌了,扎心

本文已过时 都7月了,你该看7月的数据去了: 2020年7月中国编程语言排行榜 2020年7月程序员工资统计,平均14357元,又跌了,扎心 见了鬼 本月的平均收入为14404, 本文的articleId为106503404,真…

字节主管工程师年薪中位数 56.4 万美元,排世界第 7,2022 全球程序员收入报告出炉!...

整理 | 朱珂欣 出品 | CSDN程序人生(ID:coder_life) 在科技迅速发展的时代,各行业对程序员的需求持续增长,程序员作科技市场的“重要基石”,薪资一直是非常“能打”的存在。 近日,美国科技公…