Neural Network and Learning Machines: International Edition, 3/e (Author: Haykin, ISBN:9780131293762)
人脑是专用计算机,通过神经元中的链接对经验进行存储;而计算机属于通用计算机,通过设计逻辑算法实现程序。因此结构不同,导致了人脑能够轻易实现 人脸识别,语音辨别等等 不是通过纯逻辑实现的事,因此通用计算机为了能够达到与大脑类似的效果,需要对大脑模型进行模拟,从而实现类似的功能。
大脑由神经元组成,每个神经元由 细胞本体,树突和轴突三部分所组成。 不同神经元之间的信号由轴突输入神经元,经过细胞本体,然后通过树突然后传递到下一个细胞中。(化学信号-电信号-化学信号)
一个神经元在初期被称为感受器perceptron,对感受器的理解是对神经元网路理解的基础。
因为感受器的输出为0和1,因此可以作为感受器,实现标签的分类。 当 w ⃗ T x ⃗ > = 0 {\vec w^T \vec x >=0} wTx>=0,标签结果为一类; 当 w ⃗ T x ⃗ < 0 { \vec w^T \vec x <0 } wTx<0,标签结果为另外一类。因此我们可以看到 感受器实际上是一个线性二分类器。通过创造出一条直线或者一个超平面,实现不同标签的分类。 线性可分的问题(linearly separable)才能用感受器实现,而且只要是线性可分,感受器一定能够实现。
我们有m个点,对于每一个点 x ⃗ i = [ 1 , x 1 , x 2 , … , x n − 1 ] {\vec x_i = [1, x_1,x_2, \dots, x_{n-1}]} xi=[1,x1,x2,…,xn−1],然后有想要的标签 d i { d_i } di。
我们随机定义了权重 w ⃗ = [ b , w 1 , w 2 , … , w n − 1 ] {\vec w = [b,w_1,w_2, \dots, w_{n-1}]} w=[b,w1,w2,…,wn−1]。
我们想要实现, 对于每一个点,都能实现 φ ( w ⃗ T x ⃗ i ) = d i { \varphi(\vec w^T \vec x_i) = d_i } φ(wTxi)=di.
对于m个点,假设存在一组 w ⃗ {\vec w} w能够实现所有点的正确划分。
对于 d i = 1 {d_i = 1} di=1的点来说,如果划分错误,使得 w ⃗ T x ⃗ < 0 {\vec w^T \vec x <0} wTx<0,我们应该更新权重 w ⃗ n = w ⃗ n − 1 + Δ w ⃗ {\vec w_n = \vec w_{n-1} + \Delta \vec w} wn=wn−1+Δw。 Δ w \Delta w Δw 应该能使得 w ⃗ t x ⃗ {\vec w^t \vec x} wtx 整体值变大。 所以 Δ w ⃗ = η x ⃗ ( η > 0 ) { \Delta \vec w = \eta \vec x (\eta>0) } Δw=ηx(η>0)
对于 d i = 0 {d_i=0} di=0的点来说,如果划分错误,我们应该更新权重,使得结果朝着 w ⃗ T x ⃗ { \vec w^T \vec x } wTx减小。所以 Δ w ⃗ = − η x {\Delta \vec w = - \eta x} Δw=−ηx
我们定义 误差error: e = d i − w ⃗ T x ⃗ i {e = d_i - \vec w^T \vec x_i} e=di−wTxi
那么我们将结果上述结果合起来: Δ w ⃗ = η e x ⃗ {\Delta \vec w = \eta e \vec x} Δw=ηex
η {\eta} η作为权重,能够改变每一步的更新速率。
确定学习速率 η {\eta} η
随机生成权重 w ⃗ {\vec w} w
for x i , d i {x_i, d_i} xi,di in all points
计算 e = d i − w ⃗ T x ⃗ { e = d_i - \vec w^T \vec x } e=di−wTx
然后更新权重: w n = w n − 1 + η e x ⃗ { w_n = w_{n-1} + \eta e \vec x } wn=wn−1+ηex
对于线性可分的问题,我们可以等到零误差(所有标签全都正确),再停止结果。 对于线性不可分的问题,我们可以计算一定的循环次数,然后停止。
Perceptron Convergence Theorem: (Rosenblatt, 1962)
此文章证明了感受器对于线性可分的问题必然会收敛。
回归问题难以实现对于所有点的正确标记,因此我们通常将其视为优化问题,所有点的误差之和最少:
E ( w ⃗ ) = 1 2 ∑ n i = 1 e ( i ) 2 = 1 2 ∑ i = 1 n [ d ( i ) − y ( i ) ] 2 {E(\vec w) =\frac{1}{2} \sum_n^{i=1}e(i)^2 =\frac{1}{2} \sum^n_{i=1}[d(i)-y(i)]^2 } E(w)=21∑ni=1e(i)2=21∑i=1n[d(i)−y(i)]2
首先我们定义几个相关变量:
我们将 E ( w ⃗ ) E(\vec w) E(w)看作连续可微分的函数,那么我们每次更新 w ⃗ \vec w w都朝着 使得 E ( w ⃗ ) E(\vec w) E(w)下降最快的方向变化,就能找到局部最优点。
因此,我们每次更新 w ⃗ \vec w w的公式就是:
w ⃗ n = w ⃗ n − 1 − η ▽ w ⃗ E ( w ⃗ ) w ⃗ n = w ⃗ n − 1 + η e ( n ) x ⃗ ( n ) \begin{aligned} \vec w_n &= \vec w_{n-1} - \eta \bigtriangledown_{\vec w}E(\vec w) \\ \vec w_n &= \vec w_{n-1} + \eta e(n) \vec x(n) \end{aligned} wnwn=wn−1−η▽wE(w)=wn−1+ηe(n)x(n)
其中, e ( n ) = d ( n ) − w ⃗ T x ⃗ ( n ) e(n)=d(n)-\vec w^T \vec x(n) e(n)=d(n)−wTx(n)
由于单个感受器只能实现已一条直线的模拟,只能完成对于线性可分的问题的解答,或者对于线性关系尽心拟合,难以完成更加复杂的问题求解,甚至连XOR都难以模拟。因此,出现了多个神经元相连结的神经元网络。
对于XOR问题,单个感受器是无法进行模拟的。
input 1 | input 2 | output |
---|---|---|
x 1 x_1 x1 | x 2 x_2 x2 | y y y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
因为感受器只能生成一条边界线,无法生成两条。
如果我们使用两个输出,而不是单个输出:
此时我们发现XOR问题中 (0,1) 和 (1,0 )变成了一个点,实现了空间位置的转变,变成了可以线性可分的问题。 此时,将这两个输出作为输入,连接在一个感受器(神经元)上,就可以实现XOR问题的模拟。
我们在考虑神经网络的层数时,不考虑输入层,只考虑隐藏层和输出层。一个全连接层和一个激活层组成了一个神经网络层。 对于每一层的全连接层,都是 w ⃗ x ⃗ + b \vec w \vec x+b wx+b。对于激活层,我们则可以根据我们的需要进行修改,比如RELU,sigmoid function, atanh函数等等。
我们仍然将其看成一个优化问题:
需要解决的问题: 我们目前神经网络中的权重都是随机生成的,我们需要通过输出结果和我们的label( d )之间的误差e,对权重进行更新,减小生成的误差。
对于每一个数据点所产生的误差:
E ( i ) = 1 2 ∑ j = 1 n 3 e j ( i ) 2 = 1 2 ∑ j = 1 n 3 [ d j ( i ) − x o u t , j ( 3 ) ( i ) ] 2 E(i) = \frac{1}{2}\sum_{j=1}^{n_3} e_j(i)^2=\frac{1}{2}\sum_{j=1}^{n_3}[d_j(i)- x_{out,j}^{(3)}(i)]^2 E(i)=21j=1∑n3ej(i)2=21j=1∑n3[dj(i)−xout,j(3)(i)]2
对于同时对一批数据点进行处理:
E = 1 2 ∑ i m ∑ j = 1 n 3 e j ( i ) 2 E =\frac{1}{2} \sum_{i}^{m} \sum_{j=1}^{n_3} e_j(i)^2 E=21i∑mj=1∑n3ej(i)2
我们对每个点进行分别处理,而不采取批处理,因为批处理容易陷入局部最优;对数据进行分别处理,则有助于增加noise,能够跳出局部最优,因此对每个点单独进行处理则比较好。
我们再使用梯度下降法:
Δ w j i ( s ) ( n ) = − η [ ∂ E ( n ) ∂ w j i ( s ) ( n ) ] T \Delta w_{ji}^{(s)}(n) = - \eta [ \frac{\partial E(n)}{\partial w_{ji}^{(s)}(n)}]^T Δwji(s)(n)=−η[∂wji(s)(n)∂E(n)]T
其中,s对应第一,二,三层;j是i的下一层。
v j ( 3 ) = ∑ i n 2 w j i ( 3 ) x o u t , i ( 2 ) x o u t , j ( 3 ) = φ ( 3 ) [ v j ( 3 ) ] e r r o r : e j ( n ) = d j ( n ) − x o u t , j ( 3 ) \begin{aligned} v^{(3)}_j &=\sum_i^{n_2}w^{(3)}_{ji} x_{out,i}^{(2)} \\ x_{out,j}^{(3)} &=\varphi^{(3)}[ v_{j}^{(3)} ] \\ error: e_j(n) &= d_j(n)-x_{out,j}^{(3)} \end{aligned} vj(3)xout,j(3)error:ej(n)=i∑n2wji(3)xout,i(2)=φ(3)[vj(3)]=dj(n)−xout,j(3)
我们根据链式法则,可以对第三层权重进行更新:
∂ E ∂ w j i ( 3 ) = ∂ E ∂ e j ( n ) ∂ e j ( n ) ∂ x o u t , j ( 3 ) ∂ x o u t , j ( 3 ) ∂ v j ( 3 ) ∂ v j 3 ( ) ∂ w j i ( 3 ) = e j ( n ) ⋅ ( − 1 ) ⋅ φ ( 3 ) ′ [ v j ( 3 ) ] ⋅ x o u t , i ( 2 ) = − e j ( n ) φ ( 3 ) ′ [ v j ( 3 ) ] x o u t , i ( 2 ) \begin{aligned} \frac{\partial E}{\partial w^{(3)}_{ji}} &= \frac{\partial E}{\partial e_j(n)} \frac{\partial e_j(n)}{\partial x^{(3)}_{out,j}} \frac{\partial x^{(3)}_{out,j}}{\partial v_j^{(3)}}\frac{\partial v_j^{3()}}{\partial w^{(3)}_{ji}} \\ &=e_j(n) \cdot (-1)\cdot \varphi^{(3)'}[v_j^{(3)}] \cdot x^{(2)}_{out,i} \\ &= -e_j(n)\varphi^{(3)'}[v^{(3)}_j]x^{(2)}_{out,i} \end{aligned} ∂wji(3)∂E=∂ej(n)∂E∂xout,j(3)∂ej(n)∂vj(3)∂xout,j(3)∂wji(3)∂vj3()=ej(n)⋅(−1)⋅φ(3)′[vj(3)]⋅xout,i(2)=−ej(n)φ(3)′[vj(3)]xout,i(2)
另外,我们可以定义 δ j ( 3 ) ( n ) = e j ( n ) φ ( 3 ) ′ [ v j ( 3 ) ] \delta^{(3)}_j(n)=e_j(n)\varphi^{(3)'}[v_j^{(3)}] δj(3)(n)=ej(n)φ(3)′[vj(3)],则上式可以写成
∂ E ∂ w j i ( 3 ) = − δ j ( 3 ) ( n ) x o u t , i ( 2 ) ( n ) \frac{\partial E}{\partial w^{(3)}_{ji}}=-\delta_j^{(3)}(n)x^{(2)}_{out,i}(n) ∂wji(3)∂E=−δj(3)(n)xout,i(2)(n)
因此我们可以得到第三层权重的更新公式:
w j i ( 3 ) ( n + 1 ) = w j i ( 3 ) ( n ) + η δ j ( 3 ) ( n ) x o u t , i ( 2 ) ( n ) w_{ji}^{(3)}(n+1) = w_{ji}^{(3)}(n)+ \eta \delta_j^{(3)}(n)x_{out,i}^{(2)}(n) wji(3)(n+1)=wji(3)(n)+ηδj(3)(n)xout,i(2)(n)
其中 δ j ( 3 ) \delta_j^{(3)} δj(3)可以看作输出误差, x o u t , i ( 2 ) ( n ) x_{out,i}^{(2)}(n) xout,i(2)(n)可以看作输入信号。
我们采用和上述同样的方式,采用链式法则求解。
∂ E ∂ w j , k ( 2 ) = ∂ E ∂ x o u t , i ( 3 ) ∂ x o u t , i ( 3 ) ∂ v i ( 3 ) ∂ v i ( 3 ) ∂ x o u t , j ( 2 ) ∂ x o u t , j ( 2 ) ∂ v j ( 2 ) ∂ v j ( 2 ) ∂ w j , k ( 2 ) = − e i ( n ) φ ( 3 ) ′ [ v i ( 3 ) ] w i , j ( 2 ) φ ( 2 ) ′ [ v j ( 2 ) ] x o u t , k ( 1 ) = − δ i ( 3 ) w i , j ( 2 ) φ ( 2 ) ′ [ v j ( 2 ) ] x o u t , k ( 1 ) \begin{aligned} \frac{\partial E}{\partial w_{j,k}^{(2)}} &=\frac{\partial E}{\partial x^{(3)}_{out,i}} \frac{\partial x^{(3)}_{out,i}}{ \partial v_i^{(3)}} \frac{ \partial v_i^{(3)}}{\partial x_{out,j}^{(2)}}\frac{ \partial x_{out,j}^{(2)} }{ \partial v_{j}^{(2)} } \frac{\partial v_{j}^{(2)}}{\partial w_{j,k}^{(2)} } \\ &=-e_{i}(n) \varphi^{(3)'}[ v_i^{(3)} ]w^{(2)}_{i,j} \varphi^{(2)'}[ v_j^{(2)}] x^{(1)}_{out,k} \\ &= -\delta_i^{(3)}w^{(2)}_{i,j}\varphi^{(2)'}[v_j^{(2)}]x_{out,k}^{(1)} \end{aligned} ∂wj,k(2)∂E=∂xout,i(3)∂E∂vi(3)∂xout,i(3)∂xout,j(2)∂vi(3)∂vj(2)∂xout,j(2)∂wj,k(2)∂vj(2)=−ei(n)φ(3)′[vi(3)]wi,j(2)φ(2)′[vj(2)]xout,k(1)=−δi(3)wi,j(2)φ(2)′[vj(2)]xout,k(1)
但是我们可以看到上式的i是一个不定量,因为我们在对 w j , k ( 2 ) w_{j,k}^{(2)} wj,k(2)进行求导的时候,我们没有包含i的信息。而且 w j , k ( 2 ) w_{j,k}^{(2)} wj,k(2)对于第三层中的所有输出都会有影响,因此实际上这里的链式法则应该对i进行求和!
∂ E ∂ w j , k ( 2 ) = − ∑ i n 3 [ δ i ( 3 ) w i , j ( 3 ) ] φ ( 2 ) ′ [ v j ( 2 ) ] x o u t , k ( 1 ) \begin{aligned} \frac{\partial E}{\partial w_{j,k}^{(2)}} =- \sum_i^{n_3} [ \delta_i^{(3)}w^{(3)}_{i,j}]\varphi^{(2)'}[v_j^{(2)}]x_{out,k}^{(1)} \end{aligned} ∂wj,k(2)∂E=−i∑n3[δi(3)wi,j(3)]φ(2)′[vj(2)]xout,k(1)
此时,我们定义一个变量: δ j ( 2 ) = ∑ i n 3 [ δ i ( 3 ) w i , j ( 3 ) ] φ ( 2 ) ′ [ v j ( 2 ) ] \delta_j^{(2)}=\sum_i^{n_3} [ \delta_i^{(3)}w^{(3)}_{i,j}]\varphi^{(2)'}[v_j^{(2)}] δj(2)=∑in3[δi(3)wi,j(3)]φ(2)′[vj(2)]
那么第二层的权重可以写作:
Δ w j , k ( 2 ) = − δ j ( 2 ) x o u t , k ( 1 ) \Delta w_{j,k}^{(2)} = - \delta_{j}^{(2)}x_{out,k}^{(1)} Δwj,k(2)=−δj(2)xout,k(1)
同样的形式,我们可以写成:
δ k ( 1 ) = ∑ j n 2 [ δ j ( 2 ) w j k ( 2 ) ] φ ( 1 ) ′ [ v k ( 1 ) ] Δ w k , l ( 1 ) = − δ k ( 1 ) x l \begin{aligned} \delta_k^{(1)} &=\sum_j^{n_2}[\delta^{(2)}_j w^{(2)}_{jk}] \varphi^{(1)'}[v^{(1)}_k]\\ \Delta w^{(1)}_{k,l} &= -\delta_k^{(1)}x_{l} \\ \end{aligned} δk(1)Δwk,l(1)=j∑n2[δj(2)wjk(2)]φ(1)′[vk(1)]=−δk(1)xl
我们可以看到,对于每一个数据点 [ x 1 ( n ) , x 2 ( n ) , … , x m ( n ) ] T [x_1(n), x_2(n), \dots, x_m(n)]^T [x1(n),x2(n),…,xm(n)]T,我们可以正向传递得到最后的结果,然后根据正向得到的 δ i ( 3 ) \delta_i^{(3)} δi(3)反向去求解 δ j ( 2 ) \delta_j^{(2)} δj(2),根据 δ j ( 2 ) \delta_j^{(2)} δj(2)求解之前的 δ k ( 1 ) \delta_k^{(1)} δk(1),根据不同层的 δ \delta δ对不同层的权重进行更新。
Δ w j i ( s ) ( k ) = α Δ w j i ( s ) ( k − 1 ) + η ( s ) δ j ( s ) ( k ) x o u t , i ( s − 1 ) ( k ) = α 2 Δ w j i ( s ) ( k − 2 ) + η ( s ) [ α δ j ( s ) ( k − 1 ) x o u t , i ( s − 1 ) ( k − 1 ) + δ j ( s ) ( k ) x o u t , i ( s − 1 ) ( k ) ] = η ( s ) ∑ t = 0 k α k − t δ j ( s ) ( t ) x o u t , i ( s − 1 ) ( t ) \begin{aligned} \Delta w_{ji}^{(s)}(k) &= \alpha \Delta w_{ji}^{(s)}(k-1)+ \eta^{(s)}\delta_j^{(s)}(k)x^{(s-1)}_{out,i}(k) \\ &= \alpha^2 \Delta w_{ji}^{(s)}(k-2) + \eta^{(s)}[ \alpha \delta_j^{(s)}(k-1)x^{(s-1)}_{out,i}(k-1) +\delta_j^{(s)}(k)x^{(s-1)}_{out,i}(k) ] \\ &=\eta^{(s)}\sum_{t=0}^{k} \alpha^{k-t}\delta_j^{(s)}(t) x_{out,i}^{(s-1)}(t) \end{aligned} Δwji(s)(k)=αΔwji(s)(k−1)+η(s)δj(s)(k)xout,i(s−1)(k)=α2Δwji(s)(k−2)+η(s)[αδj(s)(k−1)xout,i(s−1)(k−1)+δj(s)(k)xout,i(s−1)(k)]=η(s)t=0∑kαk−tδj(s)(t)xout,i(s−1)(t)
这样每次权重的更新 都是之前所有误差项的加权平均。 越往后的误差项,权重越高。这样的更新相当于增加了惯性项。 同时权重的更新并不只是一个点数据的影响,而是之前所有点数据的影响:这样的梯度方向相当于能够使得之前所有的点误差减小,因此能够使得结果更加的稳定。
目的: 神经网络作为黑箱,能够模拟各种连续的非线性函数,但是我们在期望神经网络能够较好模拟训练集的同时,也具有泛化(generalization)的能力,希望其能够在测试集(非训练集)上有较好的性能,而不是过度拟合。
因此,我们在对神经网络的结构进行设计时,需要考虑到神经网络的参数多少,尽量使用较少的神经元(较少的参数)实现我们想要的曲线拟合。同时还需要对神经网络的输入输出进行一定的规定,以实现更好的结果。
尝试与选择:
对于单隐藏层的神经网络,我们选择分段线性的激活函数:
y ( x ) = w ( 2 ) φ [ v ] + b ( 2 ) y(x) = w^{(2)} \varphi[v]+b^{(2)} y(x)=w(2)φ[v]+b(2)
对于每一个隐藏层的神经元,都可以实现在一段空间内线性增长或下降,同时不影响其他的空间。
因此,对于低维度的函数模拟时,函数有几段,我们可以初步使用几个神经元进行模拟,然后在此基础上进行修改神经元数目。
另外,我们可以不使用分段线性函数,而使用tanh 或者sigmoid函数,可以实现中间部分线性,两侧光滑的效果。
对于单层神经元就可以实现函数的分段拟合,我们为什么需要多层神经元呢:
因为使用多层神经元可以减少神经元总数的使用。多层的神经元能够更好的模拟函数,尤其是对于多个函数相加的情况。使用多层神经元,最后一层隐藏层的神经元数量等于 多种函数的数量,每一个隐藏层实现一个函数的模拟。
但是多层神经元对函数的模拟会出现波动。
另外,我们可以引入 E w E_w Ew来限制神经网络中权重的大小。因为权重越大,对于函数的增益越大,越容易造成函数的较大波动。 我们可以引入对于较大权重的惩罚 E w E_w Ew.
E w = ∑ i = 1 N ( w i ( 2 ) w i ( 1 ) ) 2 E_w=\sum_{i=1}^{N}(w^{(2)}_i w^{(1)}_i)^2 Ew=∑i=1N(wi(2)wi(1))2
H N × n = U N × N Σ N × n V n × n T H_{N \times n}=U_{N \times N} \Sigma_{N \times n}V^{T}_{n \times n} HN×n=UN×NΣN×nVn×nT
其中 U N × N U_{N \times N} UN×N 和 V n × n V_{n \times n} Vn×n都是正交矩阵,因此 Σ \Sigma Σ和H 的秩相同。但是 σ 1 , σ 2 , … , σ k \sigma_1,\sigma_2,\dots,\sigma_k σ1,σ2,…,σk中可能存在近似于0的值,也可以看作为0.因此矩阵的有效秩会小于k。
对于最后一层隐藏层含有m个神经元的神经网络,如果有n个数据点,那么每一个数据点,传入神经网络在最后一层隐藏层会生成 [ x 1 ( i ) , x 2 ( i ) , … , x m ( i ) ] [x_1(i),x_2(i),\dots,x_m(i)] [x1(i),x2(i),…,xm(i)]的行向量,从而对于所有的n个数据,一共生成H矩阵,维度为 n × m n \times m n×m。 当m较大时,就会出现 矩阵的秩小于m的情况,此时说明了神经元出现了闲置的情况,因此应该减少神经元的数量。
对于特征值 σ \sigma σ的大小都是相对的,因此在确定有效秩时,一般常采用以下两个公式:
LInk: Neural Network Fundamentals (2)