神经网络的个人理解
介绍
在机器学习的基础知识学习过程当中,学习了一下神经网络,然后就机器学习方面的神经网络和卷积神经网络方面写一下自己的个人理解,顺便总结一下。
神经网络
一、神经元模型
神经元是神经网络当中最基本的模型。在生物神经网络中每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变其他神经元内的电位;如果这些神经元的电位超过了 个“阔值” ,那么它就会被激活 “兴奋“起来,也同样会向其他神经元发送化学物质。
在机器学习当中,人们将这个模型抽象出来,就产生了机器学习当中的神经元模型,如下图, x i x_i xi就是其他神经元的输入(相当于神经物质), ω i \omega_i ωi为权值,神经网络主要学习的就是这个权值, θ \theta θ为对应的阈值,超过这个阈值就向其他神经元发送化学物质,而这个 f f f是激活函数,用于判断是否发送化学物质,产生的值为0或者1(0不发送,1就发送), f f f可以理解为输入 ∑ i = 1 n ω i x i − θ \sum_{i=1}^{n}\omega_ix_i-\theta ∑i=1nωixi−θ输出0或者1的函数。
所有一个神经元的输入为
x
i
x_i
xi,输出为0或者1(个人认为可以简单这样理解),计算公式如下:
y
=
f
(
∑
i
=
1
n
ω
i
x
i
−
θ
)
y=f(\sum_{i=1}^{n}\omega_ix_i-\theta)
y=f(i=1∑nωixi−θ)
相关趣事:
1943年,心理学家McCulloch和数学家Pitts参考了生物神经元的结构,发表了抽象的神经元模型MP,1943年发布的MP模型,虽然简单,但已经建立了神经网络大厦的地基。但是,MP模型中,权重的值都是预先设置的,因此不能学习。1949年心理学家Hebb提出了Hebb学习率,认为人脑神经细胞的突触(也就是连接)上的强度上可以变化的。于是计算科学家们开始考虑用调整权值的方法来让机器学习。这为后面的学习算法奠定了基础。
二、激活函数
神经元最终是通过激活函数的处理产生神经元的输出,最开始的时候激活函数的模型为 s g n ( x ) sgn(x) sgn(x)(如下图a,其实在数学课上见过很多次这个函数),刚好符合我们的要求,当 ( ∑ i = 1 n ω i x i − θ ) > 0 (\sum_{i=1}^{n}\omega_ix_i-\theta)>0 (∑i=1nωixi−θ)>0时,输出1否则输出0。可是这个函数的缺点是不可导,这在数学上性质就很不好,所以人们就用另外一个性质优秀的函数代替了它,就是 s i g m o i d ( x ) sigmoid(x) sigmoid(x)函数(如下图b,记住这个函数后面会用到)。
除了这两个函数之外,还有许多其他的常用的激活函数,如: t a n h : f ( x ) = t a n h ( x ) 、 R e L U : f ( x ) = m a x ( x , 0 ) 、 s o f t m a x : f ( x ) = l o g ( 1 + e x p ( x ) ) tanh:f(x)=tanh(x)、ReLU:f(x)=max(x,0)、softmax:f(x)=log(1+exp(x)) tanh:f(x)=tanh(x)、ReLU:f(x)=max(x,0)、softmax:f(x)=log(1+exp(x))
三、感知机
由于一个神经元的功能太过鸡肋,所以在1958年,计算科学家Rosenblatt提出了提出了两层神经元组成的神经网络,取名为“感知机”。
感知机由两层神经元组成,输入层接收外界输入信息后传给输出层,输出层是M-P神经元。感知器是当时首个可以学习的人工神经网络,当时Rosenblatt现场演示了其学习识别简单图像的过程,在当时的社会引起了轰动。
感知机可以解决线性问题,如:
- “与”问题( x 1 x_1 x1^ x 2 x_2 x2),令参数 ω 1 = 1 , ω 2 = 1 , θ = 2 \omega_1=1,\omega_2=1,\theta=2 ω1=1,ω2=1,θ=2,则有 y = f ( 1 ∗ x 1 + 1 ∗ x 2 − 2 ) y=f(1*x_1+1*x_2-2) y=f(1∗x1+1∗x2−2),当且仅当 x 1 = x 2 = 1 x_1=x_2=1 x1=x2=1时,才有 y = 1 y=1 y=1
- "或"问题( x 1 x_1 x1|| x 2 x_2 x2),令参数 ω 1 = 1 , ω 2 = 1 , θ = 0.5 \omega_1=1,\omega_2=1,\theta=0.5 ω1=1,ω2=1,θ=0.5,则有 y = f ( 1 ∗ x 1 + 1 ∗ x 2 − 0.5 ) y=f(1*x_1+1*x_2-0.5) y=f(1∗x1+1∗x2−0.5),当且仅当 x 1 = 1 或 者 x 2 = 1 x_1=1或者x_2=1 x1=1或者x2=1时,有 y = 1 y=1 y=1
- “非问题”(~ x 1 x_1 x1),令参数 ω 1 = − 0.6 , ω 2 = 0 , θ = − 0.5 \omega_1=-0.6,\omega_2=0,\theta=-0.5 ω1=−0.6,ω2=0,θ=−0.5,则有 y = f ( − 0.6 ∗ x 1 + 0 ∗ x 2 + 0.5 ) y=f(-0.6*x_1+0*x_2+0.5) y=f(−0.6∗x1+0∗x2+0.5),当 x 1 = 1 , y = 0 x_1=1,y=0 x1=1,y=0;当 x 1 = 0 , y = 1 x_1=0,y=1 x1=0,y=1
感知机可以解决线性问题,可以这也理解,看下图
可以发现 z = g ( ω i , j ∗ a i ) z=g(\omega_{i,j}*a_i) z=g(ωi,j∗ai),是以矩阵形式呈现的,和机器学习前面学的线性模型的表达式一样,所以感知机其实可以认为是一个线性模型。
相关历史趣事:
1958年,计算科学家Rosenblatt提出了由两层神经元组成的神经网络。他给它起了一个名字:“感知器”(Perceptron)(有的文献翻译成“感知机”)。
感知器是当时首个可以学习的人工神经网络。Rosenblatt现场演示了其学习识别简单图像的过程,在当时的社会引起了轰动。人们认为已经发现了智能的奥秘,许多学者和科研机构纷纷投入到神经网络的研究中。美国军方大力资助了神经网络的研究,并认为神经网络比“原子弹工程”更重要。这段时间直到1969年才结束,这个时期可以看作神经网络的第一次高潮。
但是,Minsky在1969年出版了一本叫《Perceptron》的书,里面用详细的数学证明了感知器的弱点,尤其是感知器对XOR(异或)这样的简单分类任务都无法解决。由于Minsky的巨大影响力以及书中呈现的悲观态度,让很多学者和实验室纷纷放弃了神经网络的研究。神经网络的研究陷入了冰河期。这个时期又被称为“AI winter”。接近10年以后,对于两层神经网络的研究才带来神经网络的复苏。
四、多层神经网络和BP算法
1.多层神经网络
由于感知机对非线性问题的乏力,为了解决非线性问题,就提出了多层神经网络。多层神经网络:输入层和输出层之间加一层神经元(隐含层),隐含层和输出层神经元都拥有激活函数的功能神经元,并且有理论证明,两层神经网络可以无限逼近任意连续函数。
出现多层神经网络的原因是误差逆传播算法的出现。误差传播算法(error BackPropagation,简称BP)算法,被成为迄今为止最成功的神经网络算法,在现实任务中使用神经网络时,大多数时在使用BP算法进行训练。
2.BP算法
给定训练集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , x i ∈ R d , y i ∈ R d D=\left\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\right\},x_i\in R^d,y_i\in R^d D={(x1,y1),(x2,y2),...,(xm,ym)},xi∈Rd,yi∈Rd
假设一个神经网络有 d d d个输入神经元、 l l l个输出神经元, q q q个隐含神经元(可以参考下图)
设输出层第 j j j个神经元的阈值用 θ i \theta_i θi表示,隐含层第 h h h个神经元阈值用 γ h \gamma_h γh表示
输入层第 i i i个神经元和隐含层第 h h h个神经元之间权重为 υ i h \upsilon_{ih} υih;隐含层第 h h h个神经元和输出层第 j j j个神经元之间权重为 ω h j \omega_{hj} ωhj
记隐含层第 h h h个神经元的输入为 α h = ∑ i = 1 d υ i h x i \alpha_h=\sum_{i=1}^{d}{\upsilon_{ih}x_i} αh=∑i=1dυihxi;输出层第 j j j个神经元接收的输入为 β j = ∑ h = 1 q ω h j b h \beta_j=\sum_{h=1}^{q}{\omega_{hj}b_h} βj=∑h=1qωhjbh(其中 b h b_h bh为隐含层第 h h h个神经元的输出)
然后假设隐藏层和输出层都使用 s i g m o i d ( x ) sigmoid(x) sigmoid(x)函数作为激活函数,因为该函数有可导的性质,该函数的导数为 f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f\prime(x)=f(x)(1-f(x)) f′(x)=f(x)(1−f(x))
对于其中的训练例子 ( x k , y k ) (x_k,y_k) (xk,yk),假设神经网络的输出为 y ^ k = ( y ^ 1 k , y ^ 2 k , . . . , y ^ l k ) \hat y_k=(\hat y_1^k,\hat y_2^k,...,\hat y_l^k) y^k=(y^1k,y^2k,...,y^lk),即 y ^ l k = f ( β j − θ j ) \hat y_l^k=f(\beta_j-\theta_j) y^lk=f(βj−θj)
可以得到均方误差 E k = 1 2 ( y ^ j k − y j k ) 2 E_k=\frac{1}{2}(\hat y^k_j-y^k_j)^2 Ek=21(y^jk−yjk)2,并且有 ( d + l + 1 ) ∗ q + l (d+l+1)*q+l (d+l+1)∗q+l个参数需要确定。
以其中权重参数 ω h j \omega_{hj} ωhj为例,它的更新估计式: ω ← ω + Δ ω \omega\leftarrow\omega+\Delta\omega ω←ω+Δω,其中 Δ ω = − η ∂ E k ∂ ω h j \Delta\omega=-\eta\frac{ \partial E_k}{\partial \omega_{hj}} Δω=−η∂ωhj∂Ek(就是求偏导,其中 η \eta η为学习率)
式子: ∂ E k ∂ ω h j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ⋅ ∂ β j ∂ ω h j \frac{ \partial E_k}{\partial \omega_{hj}}=\frac{\partial E_k}{\partial \hat y^k_j}\cdot\frac{\partial \hat y^k_j}{\partial \beta_j}\cdot\frac{\partial \beta_j}{\partial \omega_{hj}} ∂ωhj∂Ek=∂y^jk∂Ek⋅∂βj∂y^jk⋅∂ωhj∂βj
可以知道
∂
β
j
∂
ω
h
j
=
b
h
\frac{\partial \beta_j}{\partial \omega_{hj}}=b_h
∂ωhj∂βj=bh,然后设
g
i
=
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
g_i=\frac{\partial E_k}{\partial \hat y^k_j}\cdot \frac{\partial \hat y^k_j}{\partial \beta_j}
gi=∂y^jk∂Ek⋅∂βj∂y^jk
由于
E
k
=
1
2
(
y
^
j
k
−
y
j
k
)
2
E_k=\frac{1}{2}(\hat y^k_j-y^k_j)^2
Ek=21(y^jk−yjk)2以及
y
^
l
k
=
f
(
β
j
−
θ
j
)
\hat y_l^k=f(\beta_j-\theta_j)
y^lk=f(βj−θj),所以有
g
i
=
(
y
^
j
k
−
y
j
k
)
⋅
f
′
(
β
j
−
θ
j
)
g_i=(\hat y^k_j-y^k_j)\cdot f\prime(\beta_j-\theta_j)
gi=(y^jk−yjk)⋅f′(βj−θj)
再由激活函数
f
(
x
)
f(x)
f(x)为
s
i
g
m
o
i
d
(
x
)
sigmoid(x)
sigmoid(x)函数,所以导数
f
′
(
x
)
=
f
(
x
)
(
1
−
f
(
x
)
)
f\prime(x)=f(x)(1-f(x))
f′(x)=f(x)(1−f(x)),则:
g
i
=
y
^
j
k
(
1
−
y
^
j
k
)
(
y
j
k
−
y
^
j
k
)
g_i=\hat y^k_j(1-\hat y^k_j)(y^k_j-\hat y^k_j)
gi=y^jk(1−y^jk)(yjk−y^jk)
这样我们就得到了
Δ
ω
=
η
g
i
b
h
\Delta\omega=\eta g_ib_h
Δω=ηgibh
同理我们可以得到其他的参数值,如:
Δ
θ
j
=
−
η
g
i
\Delta \theta_j=-\eta g_i
Δθj=−ηgi、
Δ
υ
i
h
=
η
e
h
x
i
\Delta \upsilon_{ih}=\eta e_h x_i
Δυih=ηehxi、
Δ
γ
h
=
−
η
e
h
\Delta \gamma_h=-\eta e_h
Δγh=−ηeh,其中
e
h
=
b
h
(
1
−
b
h
)
∑
j
=
1
l
ω
h
j
g
i
e_h=b_h(1-b_h)\sum_{j=1}^{l}{\omega_{hj}gi}
eh=bh(1−bh)∑j=1lωhjgi
上面只是简单的说明了一下在神经网络过程中,参数大概是怎么计算出来的,在正真的编程的时候其实这些过程都不需要我们自己实现,一般的深度学习框架都帮我们实现了。
3.过拟合问题
由于神经网络强大的表示能力,经常会出现过拟合问题,一般解决方法由两种:
-
“早停”:将数据分为训练集和验证集,训练集计算梯度、更新权值和阈值,验证集用来估计误差
-
“正则化”:其思想是在误差目标函数中增加一个用于描述网路复炸程度的部分,例如连接权值和阈值的平方和,如下图,其中λϵ(0,1),用于对经验误差与网络复杂度进行折中。
相关历史趣事:
1986年,Rumelhar和Hinton等人提出了反向传播(Backpropagation,BP)算法,解决了两层神经网络所需要的复杂计算量问题,从而带动了业界使用两层神经网络研究的热潮。但是不幸的是,当时的神经网络任然存在很多问题,比如训练时间长、优化困难等。值得注意的是这个时候的Hinton还比较年轻,30年以后,正是他重新定义了神经网络,带来了神经网络复苏的又一春。
90年代中期,由Vapnik等人发明的SVM(Support Vector Machines,支持向量机)算法诞生,很快就在若干个方面体现出了对比神经网络的优势:无需调参;高效;全局最优解。基于以上种种理由,SVM迅速打败了神经网络算法成为主流,神经网络的研究再次陷入了冰河期。
直到2006年,Hinton在《Science》和相关期刊上发表了论文,首次提出了“深度信念网络”的概念,同时他给多层神经网络相关的学习方法赋予了一个新名词–“深度学习”,就在这之后,关于深度神经网络的研究与应用不断涌现。
2019年3月27日 ——ACM宣布,深度学习的三位创造者Yoshua Bengio, Yann LeCun, 以及Geoffrey Hinton获得了2019年的图灵奖。
Hinton老爷子的照片:
总结
简单的讲解了一下神经网络的基本概念,并没有涉及CNN、RNN等相关的东西。然后自己用pytorch写了一下这个神经网络识别手写数据集:点这里
参考:
《机器学习》–周志华