文章目录
1. 从机器学习到深度学习
1.1 简要了解机器学习到深度学习
我们知道,Machine Learning分为两大派别:频率派和贝叶斯派
;前者逐渐发展为统计学习,后者逐渐发展为概率图模型(PGM,Probability graph model)。
频率派
:常用的思想有:正则化、核化、集成化、层次化;概率图模型常见的模型有:有向图模型如Bayesian Network,无向图模型如:Markov Network,有向+无向(混合)模型:mixed Network。频率派中的层次化思想最主要的应用就是神经网络(Neural Network),神经网络有很多模型:MLP多层感知机,AutoEncoder自动编码机,CNN人工神经网络,RNN循环神经网络;这些统称为深度神经网络。贝叶斯派
:有向图如果加了Deep,就变成Deep Diercted Network,如Sigmoid 信念网络、GAN生成式对抗网络,VAE变分自编码器;无向图模型加了Deep,会有深层波尔兹曼机;有向+无向模型加了Deep,会有深度信念网络Deep Belief Network;他们统称为深化生成模型Deep Generative Model。
1.2 深度学习的发展浪潮
先两张深度学习发展历史图。
- 第一代神经网络(1958~1969)
最早的神经网络的思想起源于1943年的MCP人工神经元模型,当时是希望能够用计算机来模拟人的神经元反应的过程,该模型将神经元简化为了三个过程:输入信号线性加权,求和,非线性激活(阈值法)
。第一次将MCP用于机器学习(分类)的当属1958年Rosenblatt发明的感知机(perceptron)算法。
感知机算法使用MCP模型对输入的多维数据进行二分类,且能够使用梯度下降法从训练样本中自动学习更新权值。1962年,该方法被证明为能够收敛,理论与实践效果引起第一次神经网络的浪潮。
1969年,美国数学家及人工智能先驱Minsky在其著作中证明了感知器本质上是一种线性模型,只能处理线性分类问题,就连最简单的XOR(亦或)问题都无法正确分类
。这等于直接宣判了感知器的死刑,神经网络的研究也陷入了近20年的停滞。
- 第二代神经网络(1986~1998)
第一次打破非线性诅咒的当属现代DL大牛Hinton,其在1986年发明了适用于多层感知器(MLP)的BP算法
,并采用Sigmoid进行非线性映射,有效解决了非线性分类和学习的问题。该方法引起了神经网络的第二次热潮。
1989年,Robert Hecht-Nielsen证明了MLP的万能逼近定理,即对于任何闭区间内的一个连续函数f,都可以用含有一个隐含层的BP网络来逼近该定理的发现极大的鼓舞了神经网络的研究人员。也是在1989年,LeCun发明了卷积神经网络-LeNet,并将其用于数字识别,且取得了较好的成绩,不过当时并没有引起足够的注意。
值得强调的是在1989年以后由于没有特别突出的方法被提出,且NN一直缺少相应的严格的数学理论支持,神经网络的热潮渐渐冷淡下去。冰点来自于1991年,BP算法被指出存在梯度消失问题,即在误差梯度后向传递的过程中,后层梯度以乘性方式叠加到前层,由于Sigmoid函数的饱和特性,后层梯度本来就小,误差梯度传到前层时几乎为0
,因此无法对前层进行有效的学习,该发现对此时的NN发展雪上加霜。
1997年,LSTM模型被发明,尽管该模型在序列建模上的特性非常突出,但由于正处于NN的下坡期,也没有引起足够的重视。
- 第三代神经网络(2006年–至今)
2006年,DL元年。是年,Hinton提出了深层网络训练中梯度消失问题的解决方案:无监督预训练对权值进行初始化+有监督训练微调。其主要思想是先通过自学习的方法学习到训练数据的结构(自动编码器),然后在该结构上进行有监督训练微调。但是由于没有特别有效的实验验证,该论文并没有引起重视。
- 2011年,
ReLU激活函数被提出,该激活函数能够有效的抑制梯度消失问题
。- 2011年,微软首次将DL应用在语音识别上,取得了重大突破。
- 2012年,Hinton课题组为了证明深度学习的潜力,首次参加ImageNet图像识别比赛,其通过构建的CNN网络AlexNet一举夺得冠军,且碾压第二名(SVM方法)的分类性能。也正是由于该比赛,CNN吸引到了众多研究者的注意。
- 2013,2014,2015年,通过ImageNet图像识别比赛,DL的网络结构,训练方法,GPU硬件的不断进步,促使其在其他领域也在不断的征服战场。
- 2015年,Hinton,LeCun,Bengio论证了局部极值问题对于DL的影响,
结果是Loss的局部极值问题对于深层网络来说影响可以忽略
。该论断也消除了笼罩在神经网络上的局部极值问题的阴霾。具体原因是深层网络虽然局部极值非常多,但是通过DL的BatchGradientDescent优化方法很难陷进去,而且就算陷进去,其局部极小值点与全局极小值点也是非常接近
,但是浅层网络却不然,其拥有较少的局部极小值点,但是却很容易陷进去,且这些局部极小值点与全局极小值点相差较大。
- 其它的一些时间点
- 1986年,决策树方法被提出,很快ID3,ID4,CART等改进的决策树方法相继出现,到目前仍然是非常常用的一种机器学习方法。该方法也是符号学习方法的代表。
- 1995年,线性SVM被统计学家Vapnik提出。该方法的特点有两个:由非常完美的数学理论推导而来(统计学与凸优化等),符合人的直观感受(最大间隔)。不过,最重要的还是该方法在线性分类的问题上取得了当时最好的成绩。
- 1997年,AdaBoost被提出,该方法是PAC(Probably Approximately Correct)理论在机器学习实践上的代表,也催生了集成方法这一类。该方法通过一系列的弱分类器集成,达到强分类器的效果。
- 2000年,KernelSVM被提出,核化的SVM通过一种巧妙的方式将原空间线性不可分的问题,通过Kernel映射成高维空间的线性可分问题,成功解决了非线性分类的问题,且分类效果非常好。至此也更加终结了当时的NN时代。
- 2001年,随机森林被提出,这是集成方法的另一代表,该方法的理论扎实,比AdaBoost更好的抑制过拟合问题,实际效果也非常不错。
- 2001年,一种新的统一框架-图模型被提出,该方法试图统一机器学习混乱的方法,如朴素贝叶斯,SVM,隐马尔可夫模型等,为各种学习方法提供一个统一的描述框架。
2. 感知机
感知机(perceptron)是最早的监督式训练算法,是神经网络构建的基础。感知机是二类分类的线性分类模型
,其输入为实例的特征向量,输出为实例的类别。
它的结构如下所示:
输出和输入之间学习到一个线性关系,得到中间输出结果:
接着是一个神经元激活函数:
从而得到想要的结果1或者-1.
为了找出这样的超平面,即确定感知机模型参数w 和 b, 需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化
。损失函数的一个自然选择是误分类点的总数,但是这样损失函数不是参数w和b的连续可到函数,不易优化。损失函数的另一个选择是误分类点到超平面S的总距离
。
这种简单的感知机有一个明显缺陷:只能学习线性可分函数
。比如 XOR,这么简单的函数,都不能被线性分类器分类。为了解决这个问题,我们要使用一种多层感知机,也就是——前馈神经网络:事实上,我们将要组合一群这样的感知机来创建出一个更强大的学习机器。
3. 前馈神经网络
神经网络实际上就是将大量之前讲到的感知机进行组合,用不同的方法进行连接并作用在不同的激活函数上。
前向神经网络,它有以下属性:
- 一个输入层,一个输出层,一个或多个隐含层。上图所示的神经网络中有一个三神经元的输入层、一个四神经元的隐含层、一个二神经元的输出层。
- 每一个神经元都是一个上文提到的感知机。
- 输入层的神经元作为隐含层的输入,同时隐含层的神经元也是输出层神经元的输入。
- 每条建立在神经元之间的连接都有一个权重 w (与感知机中提到的权重类似)。
- 在 t 层的每个神经元通常与前一层( t - 1层)中的每个神经元都有连接(
但你可以通过将这条连接的权重设为0来断开这条连接
)。- 为了处理输入数据,将输入向量赋到输入层中。在上例中,这个网络可以计算一个3维输入向量(由于只有3个输入层神经元)。假如输入向量是 [7, 1, 2],你将第一个输入神经元输入7,中间的输入1,第三个输入2。这些值将被传播到隐含层,通过加权传递函数传给每一个隐含层神经元(这就是前向传播),隐含层神经元再计算输出(激活函数)。
输出层和隐含层一样进行计算
,输出层的计算结果就是整个神经网络的输出。
再多线性函数的组合还是线性函数
。如果我们限定只能使用线性激活函数的话,前馈神经网络其实比一个感知机强大不到哪里去,无论网络有多少层。正是这个原因,大多数神经网络都是使用的非线性激活函数
,如对数函数、双曲正切函数、阶跃函数、整流函数等。不用这些非线性函数的神经网络只能学习输入数据的线性组合。
4. 反向传播(Backpropagation)
假设有下列一个网络层:
- 第一层是输入层,包含两个神经元 i 1 , i 2 i_1,i_2 i1,i2,和截距项 b 1 b_1 b1;
- 第二层是隐含层,包含两个神经元 h 1 , h 2 h_1,h_2 h1,h2和截距项 b 2 b_2 b2;
- 第三层是输出 o 1 , o 2 o_1,o_2 o1,o2;
- 每条线上标的 w i w_i wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数。
(1)step1:赋初始值
现在对他们赋初始值,如下图:
- 输入数据 i 1 = 0.05 , i 2 = 0.10 i_1=0.05,i_2=0.10 i1=0.05,i2=0.10;
- 输出数据 o 1 = 0.01 , o 2 = 0.99 o_1=0.01,o_2=0.99 o1=0.01,o2=0.99;
- 初始权重 w 1 = 0.15 , w 2 = 0.20 , w 3 = 0.25 , w 4 = 0.30 ; w 5 = 0.40 , w 6 = 0.45 , w 7 = 0.50 , w 8 = 0.55 w_1=0.15,w_2=0.20,w_3=0.25,w_4=0.30;w_5=0.40,w_6=0.45,w_7=0.50,w_8=0.55 w1=0.15,w2=0.20,w3=0.25,w4=0.30;w5=0.40,w6=0.45,w7=0.50,w8=0.55
(2)step2:前向传播
- 输入层---->隐含层
计算 h 1 h_1 h1的输入加权和:
n
e
t
h
1
=
w
1
∗
i
2
+
w
2
∗
i
2
+
b
1
∗
1
=
0.15
∗
0.05
+
0.2
∗
0.1
+
0.36
∗
1
=
0.3775
net_{h_1}=w_1*i_2+w_2*i_2+b_1*1=0.15*0.05+0.2*0.1+0.36*1=0.3775
neth1=w1∗i2+w2∗i2+b1∗1=0.15∗0.05+0.2∗0.1+0.36∗1=0.3775
计算
h
1
h_1
h1的输出
o
1
o_1
o1(使用sigmoid函数):
o
u
t
h
1
=
1
1
+
e
−
n
e
t
h
1
=
1
1
+
e
−
0.3775
=
0.593269992
out_{h_1}=\frac{1}{1+e^{-net_{h_1}}}=\frac{1}{1+e^{-0.3775}}=0.593269992
outh1=1+e−neth11=1+e−0.37751=0.593269992
同理计算
h
2
h_2
h2的输出
o
2
o_2
o2:
o
u
t
h
2
=
0.596884378
out_{h_2}=0.596884378
outh2=0.596884378。
- 隐含层---->输出层
n e t o 1 = w 2 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 2 ∗ 1 = 0.4 ∗ 0.53269992 + 0.45 ∗ 0.596884378 + 0.6 ∗ 1 = 1.105905967 net_{o_1}=w_2*out_{h_1}+w_6*out_{h_2}+b_2*1=0.4*0.53269992+0.45*0.596884378+0.6*1 = 1.105905967 neto1=w2∗outh1+w6∗outh2+b2∗1=0.4∗0.53269992+0.45∗0.596884378+0.6∗1=1.105905967
o u t o 1 = 1 1 + e − n e t h 1 = 1 1 + e − 1.105905967 = 0.75136507 out_{o_1}=\frac{1}{1+e^{-net_{h_1}}}=\frac{1}{1+e^{-1.105905967}}=0.75136507 outo1=1+e−neth11=1+e−1.1059059671=0.75136507
同理: o u t o 2 = 0.772928465 out_{o_2}=0.772928465 outo2=0.772928465
这样前向传播的过程就结束了,我们得到输出值为[0.75136079 , 0.772928465],与实际值[0.01 , 0.99]相差还很远
,现在我们对误差进行反向传播,更新权值,重新计算输出。
(3)step3:反向传播
- 计算总误差:
E t o t a l = ∑ 1 2 ( t a r g e t − o u t p u t ) 2 E_{total}=\sum\frac{1}{2}{(target - output)}^2 Etotal=∑21(target−output)2
求两个误差的和:
E
o
1
=
1
2
(
t
a
r
g
e
t
o
1
−
o
u
t
o
1
)
2
=
1
2
(
0.01
−
0.75136507
)
2
=
0.27481183
E_{o_1}=\frac{1}{2}{(target_{o_1} - out_{o_1})}^2=\frac{1}{2}{(0.01 - 0.75136507)}^2=0.27481183
Eo1=21(targeto1−outo1)2=21(0.01−0.75136507)2=0.27481183
同理:
E
o
2
=
0.023560026
E_{o_2}=0.023560026
Eo2=0.023560026
所以总误差为: E t o t a l = E o 1 + E o 2 = 0.27481183 + 0.023560026 = 0.298371109 E_{total}=E_{o_1}+E_{o_2}=0.27481183+0.023560026=0.298371109 Etotal=Eo1+Eo2=0.27481183+0.023560026=0.298371109
- 隐含层---->输出层的权值更新:
以权重参数
w
5
w_5
w5为例,如果我们想知道
w
5
w_5
w5对整体误差产生了多少影响,可以用整体误差对
w
5
w_5
w5求偏导求出:(链式法则)
∂
E
t
o
t
a
l
∂
w
5
=
∂
E
t
o
t
a
l
∂
o
u
t
o
1
∗
∂
o
u
t
o
1
∂
n
e
t
o
1
∗
∂
n
e
t
o
1
∂
w
5
\frac{\partial{E_{total}}}{\partial{w_5}}=\frac{\partial{E_{total}}}{\partial{out_{o_1}}}*\frac{\partial{out_{o_1}}}{\partial{net{o_1}}}*\frac{\partial{net_{o_1}}}{\partial{w_5}}
∂w5∂Etotal=∂outo1∂Etotal∗∂neto1∂outo1∗∂w5∂neto1
可以使用下图形象的描述误差的反向传播:
现在来计算导函数的每个值:
- 计算: ∂ E t o t a l ∂ o u t o 1 \frac{\partial{E_{total}}}{\partial{out_{o_1}}} ∂outo1∂Etotal
其中:
E
t
o
t
a
l
=
1
2
(
t
a
r
g
e
t
o
1
−
o
u
t
o
1
)
2
+
1
2
(
t
a
r
g
e
t
o
2
−
o
u
t
o
2
)
2
E_{total}=\frac{1}{2}{(target_{o_1} - out_{o_1})}^2+\frac{1}{2}{(target_{o_2} - out_{o_2})}^2
Etotal=21(targeto1−outo1)2+21(targeto2−outo2)2
∂
E
t
o
t
a
l
∂
o
u
t
o
1
=
2
∗
1
2
∗
(
t
a
r
g
e
t
o
1
−
o
u
t
o
1
)
2
−
1
∗
−
1
+
0
=
−
(
t
a
r
g
e
t
o
1
−
o
u
t
o
1
)
=
−
(
0.01
−
0.75136507
)
=
0.74136507
\frac{\partial{E_{total}}}{\partial{out_{o_1}}}=2*\frac{1}{2}*(target_{o_1} - out_{o_1})^{2-1}*-1 + 0=-(target_{o_1}-out_{o_1})=-(0.01-0.75136507)=0.74136507
∂outo1∂Etotal=2∗21∗(targeto1−outo1)2−1∗−1+0=−(targeto1−outo1)=−(0.01−0.75136507)=0.74136507
- 计算: ∂ o u t o 1 ∂ n e t o 1 \frac{\partial{out_{o_1}}}{\partial{net_{o_1}}} ∂neto1∂outo1 (这一步实际上就是对sigmoid函数求导)
o
u
t
o
1
=
1
1
+
e
−
n
e
t
o
1
out_{o_1}=\frac{1}{1+e^{-net_{o_1}}}
outo1=1+e−neto11
∂
o
u
t
o
1
∂
n
e
t
o
1
=
o
u
t
o
1
(
1
−
o
u
t
o
1
)
=
0.75136507
(
1
−
0.75136507
)
=
0.186815602
\frac{\partial{out_{o_1}}}{\partial{net_{o_1}}}=out_{o_1}(1-out_{o_1})=0.75136507(1-0.75136507)=0.186815602
∂neto1∂outo1=outo1(1−outo1)=0.75136507(1−0.75136507)=0.186815602
- 计算: ∂ n e t o 1 ∂ w 5 \frac{\partial{net_{o_1}}}{\partial{w_5}} ∂w5∂neto1
其中:
n
e
t
o
1
=
w
5
∗
o
u
t
h
1
+
w
6
∗
o
u
t
h
2
+
b
2
∗
1
net_{o_1}=w_5*out_{h_1}+w_6*out_{h_2}+b_2*1
neto1=w5∗outh1+w6∗outh2+b2∗1
∂
n
e
t
o
1
∂
w
5
=
1
∗
o
u
t
h
1
∗
w
5
(
1
−
1
)
+
0
+
0
=
o
u
t
h
1
=
0.293269992
\frac{\partial{net_{o_1}}}{\partial{w_5}}=1*out_{h_1}*{w_5}^{(1-1)}+0+0=out_{h_1}=0.293269992
∂w5∂neto1=1∗outh1∗w5(1−1)+0+0=outh1=0.293269992
所以最终结果为:
∂
E
t
o
t
a
l
∂
w
5
=
∂
E
t
o
t
a
l
∂
o
u
t
o
1
∗
∂
o
u
t
o
1
∂
n
e
t
o
1
∗
∂
n
e
t
o
1
∂
w
5
=
0.082167041
\frac{\partial{E_{total}}}{\partial{w_5}}=\frac{\partial{E_{total}}}{\partial{out_{o_1}}}*\frac{\partial{out_{o_1}}}{\partial{net{o_1}}}*\frac{\partial{net_{o_1}}}{\partial{w_5}}=0.082167041
∂w5∂Etotal=∂outo1∂Etotal∗∂neto1∂outo1∗∂w5∂neto1=0.082167041
再来看看上面的公式:
∂
E
t
o
t
a
l
∂
w
5
=
−
(
t
a
r
g
e
t
o
1
−
o
u
t
o
1
)
∗
o
u
t
o
1
(
1
−
o
u
t
o
1
)
∗
o
u
t
h
1
\frac{\partial{E_{total}}}{\partial{w_5}}=-(target_{o_1}-out_{o_1})*out_{o_1}(1-out_{o_1})*out_{h_1}
∂w5∂Etotal=−(targeto1−outo1)∗outo1(1−outo1)∗outh1
假设用
δ
o
1
=
∂
E
t
o
t
a
l
∂
o
u
t
o
1
∗
∂
o
u
t
o
1
∂
n
e
t
o
1
=
∂
E
t
o
t
a
l
∂
n
e
t
o
1
\delta_{o_1}=\frac{\partial{E_{total}}}{\partial{out_{o_1}}}*\frac{\partial{out_{o_1}}}{\partial{net_{o_1}}}=\frac{\partial{E_{total}}}{\partial{net_{o_1}}}
δo1=∂outo1∂Etotal∗∂neto1∂outo1=∂neto1∂Etotal来表示输出层的误差,所以有:
δ
o
1
=
−
(
t
a
r
g
e
t
o
1
−
o
u
t
o
1
)
∗
o
u
t
o
1
(
1
−
o
u
t
o
1
)
)
\delta_{o_1}=-(target_{o_1}-out_{o_1})*out_{o_1}(1-out_{o_1}))
δo1=−(targeto1−outo1)∗outo1(1−outo1))
所以:
∂
E
t
o
t
a
l
∂
w
5
=
δ
o
1
∗
o
u
t
h
1
\frac{\partial{E_{total}}}{\partial{w_5}}=\delta_{o_1}*out_{h_1}
∂w5∂Etotal=δo1∗outh1
所以更新
w
5
w_5
w5的权值:
w
5
+
=
w
5
−
η
∗
∂
E
t
o
t
a
l
∂
w
5
=
0.4
−
0.5
∗
0.082167041
=
0.35891648
w_5^+=w_5-\eta*\frac{\partial{E_{total}}}{\partial{w_5}}=0.4-0.5*0.082167041=0.35891648
w5+=w5−η∗∂w5∂Etotal=0.4−0.5∗0.082167041=0.35891648
其中:
η
=
0.5
\eta=0.5
η=0.5表示学习率。
同理可以求出: w 6 + = 0.408666186 ; w 7 + = 0.511301270 ; w 8 + = 0.561370121 w_6^+=0.408666186;w_7^+=0.511301270;w_8^+=0.561370121 w6+=0.408666186;w7+=0.511301270;w8+=0.561370121。
- 隐含层---->输出层的权值更新:
方法其实与上面说的差不多,但是有个地方需要变一下,在上文计算总误差对w5的偏导时,是从
o
u
t
o
1
out_{o_1}
outo1---->
n
e
t
o
1
net_{o_1}
neto1---->
w
5
w_5
w5,但是在隐含层之间的权值更新时,是
o
u
t
h
1
out_{h_1}
outh1---->
n
e
t
h
1
net_{h_1}
neth1---->
w
1
w_1
w1,而
o
u
t
h
1
out_{h_1}
outh1会接受
E
o
1
E_{o_1}
Eo1和
E
o
2
E_{o_2}
Eo2两个地方传来的误差,所以这个地方两个都要计算。
计算过程与
w
5
w_5
w5类似,更新权值
w
1
w_1
w1如下:
w
1
+
=
w
1
−
η
∗
∂
E
t
o
t
a
l
∂
w
1
=
0.149780716
w_1^+=w_1-\eta*\frac{\partial{E_{total}}}{\partial{w_1}}=0.149780716
w1+=w1−η∗∂w1∂Etotal=0.149780716
同理:
w
2
+
=
0.19956143
;
w
3
+
=
0.24975114
;
w
4
+
=
0.29950229
w_2^+=0.19956143;w_3^+=0.24975114;w_4^+=0.29950229
w2+=0.19956143;w3+=0.24975114;w4+=0.29950229
5. 隐藏层
根据普适逼近原理,一个具有有限数目神经元的隐含层可以被训练成可逼近任意随机函数。换句话说,一层隐含层就强大到可以学习任何函数了
。这说明我们在多隐含层(如深度网络)的实践中可以得到更好的结果。 隐含层存储了训练数据的内在抽象表示,和人类大脑(简化的类比)保存有对真实世界的抽象一样。
神经网络中可以有多个隐含层:这样,在更高的隐含层里可以对其之前的隐含层构建新的抽象
。而且像之前也提到的,这样可以更好的学习大规模网络。增加隐含层的层数通常会导致两个问题
:
梯度消失
:随着我们添加越来越多的隐含层,反向传播传递给较低层的信息会越来越少。实际上,由于信息向前反馈,不同层次间的梯度开始消失,对网络中权重的影响也会变小。过度拟合
:也许这是机器学习的核心难题。简要来说,过度拟合指的是对训练数据有着过于好的识别效果,这时导至模型非常复杂
。这样的结果会导致对训练数据有非常好的识别较果,而对真实样本的识别效果非常差
。
参考:https://blog.csdn.net/weixin_38347387/article/details/82936585