Reference:
Neural Network and Learning Machines: International Edition, 3/e (Author: Haykin, ISBN:9780131293762)
人脑是专用计算机,通过神经元中的链接对经验进行存储;而计算机属于通用计算机,通过设计逻辑算法实现程序。因此结构不同,导致了人脑能够轻易实现 人脸识别,语音辨别等等 不是通过纯逻辑实现的事,因此通用计算机为了能够达到与大脑类似的效果,需要对大脑模型进行模拟,从而实现类似的功能。
大脑的基本结构
大脑由神经元组成,每个神经元由 细胞本体,树突和轴突三部分所组成。 不同神经元之间的信号由轴突输入神经元,经过细胞本体,然后通过树突然后传递到下一个细胞中。(化学信号-电信号-化学信号)
神经元网络的基本特征
- 一个神经元同时是 多个神经元的受体,也可以将信号传递给多个其他的细胞。(另外细胞也并非单向传递)
- 神经元的信号是多个细胞信息输入的叠加(信息有正有负,也就是有激活也有抑制)(因为突触是有激励因子,也有抑制因子)
- 神经元的信号输入和输出并不呈现线性关系。首先存在一定的阈值,当信号超过一定的阈值之后就会快速上升。 简单来看可以看作 sign 函数,输入之和超过一定阈值之后就会激活神经元。
- 神经元更高强度的兴奋不是有更高的输入造成的,而是由更高频率的有效刺激造成的。
通过大脑结构构建基本神经元模型
- 一个神经元有多个输入,然后有一个输出。
- 输入信号来自于不同的神经元,有不同的权重,可正可负(激励型和抑制型)。
- 神经元本身的输入可以简单看作两个结果: 激励状态 和 未被激励状态。(0和1)
因此可以将神经元简单看作两个过程:
过程一: v ( x ⃗ ) = w ⃗ T x ⃗ + b v(\vec x) =\vec w^T \vec x + b v(x)=wTx+b
其中, i n p u t : x ⃗ = [ x 1 , x 2 , … , x n ] T , w e i g h t s : w ⃗ = [ w 1 , w 2 , … , w n ] , b : t h r e s h o l d { input: \vec x = [x_1,x_2, \dots, x_n]^T, weights: \vec w =[ w_1,w_2, \dots, w_n], b: threshold } input:x=[x1,x2,…,xn]T,weights:w=[w1,w2,…,wn],b:threshold
过程二: y = φ ( v ) y = \varphi(v) y=φ(v)
其中, φ = s i g n { \varphi = sign} φ=sign, 存在激活函数,当 v > = 0 , y = 1 ; v < 0 , y = 0 { v>=0, y =1; v<0, y=0 } v>=0,y=1;v<0,y=0
因此最终的函数可以表示为:
y = φ ( w ⃗ T x ⃗ + b ) y = \varphi( \vec w^T \vec x +b ) y=φ(wTx+b)
因为 阶跃函数不是连续函数,因此最终的函数也不是连续函数,而是单纯两个值的输出。
当我们将激活函数换成其他的函数,比如
sigmoid function: φ ( v ) = 1 1 + e − a v {\varphi (v) = \frac{1}{1+e^{-av}}} φ(v)=1+e−av1
tanh function: φ ( v ) = e x − e − x e x + e − x { \varphi(v) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}} φ(v)=ex+e−xex−e−x
连续并且可导,那么该神经元结果就是连续并且可导的。
Perceptron
一个神经元在初期被称为感受器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)才能用感受器实现,而且只要是线性可分,感受器一定能够实现。
如何得到想要的权重
- 对于低维度的点来说,我们可以直接肉眼观察,然后得到边界线和权重。
- 对于高维度的分类问题,我们只能通过learning来实现。
问题定义
我们有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
分析问题
首先我们定义几个相关变量:
- d ⃗ = [ d 1 , d 2 , … , d n ] T \vec d = [d_1,d_2, \dots,d_n]^T d=[d1,d2,…,dn]T
- X = [ x ⃗ 1 , x ⃗ 2 , … , x ⃗ n ] X=[\vec x_1, \vec x_2, \dots, \vec x_n] X=[x1,x2,…,xn]
- e ⃗ = d ⃗ − X T ⋅ w ⃗ \vec e = \vec d - X^T \cdot \vec w e=d−XT⋅w
-
E
(
w
⃗
)
=
1
2
e
⃗
T
e
⃗
E(\vec w) =\frac{1}{2} \vec e^T \vec e
E(w)=21eTe
其中 X 的维度是 (m,n),其中 m是变量的维度, n是数据点的数量。
然后,我们为了得到最优解,我们必须求解cost function梯度为零的点:
▽ ( E ( w ⃗ ) ) = 0 ▽ w ⃗ ( E ( w ⃗ ) ) = e ⃗ T ⋅ ( − X T ) ( d ⃗ T − w ⃗ T X ) X T = 0 w ⃗ T X X T = d ⃗ X T X X T w ⃗ = X d ⃗ T w ⃗ = ( X X T ) − 1 X d ⃗ T \begin{aligned} \bigtriangledown ( E(\vec w) ) &= 0 \\ \bigtriangledown_{\vec w} ( E(\vec w) ) &= \vec e^T \cdot (-X^T) \\ (\vec d^T - \vec w^T X) X^T &= 0 \\ \vec w^T X X^T &= \vec d X^T \\ X X^T \vec w &=X \vec d^T \\ \vec w &= (X X^T)^{-1}X \vec d^T \\ \end{aligned} ▽(E(w))▽w(E(w))(dT−wTX)XTwTXXTXXTww=0=eT⋅(−XT)=0=dXT=XdT=(XXT)−1XdT
其中 ( X X T ) − 1 (X X^T)^{-1} (XXT)−1 也就是 X的伪逆。该方程对于维度较低时较为有用,但是对于较多的数据时,对内存要求比较高。因此,对于较多的数据,可以使用以下的方式: learning。
Learning
我们将
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)
Multi-layer Perceptron
由于单个感受器只能实现已一条直线的模拟,只能完成对于线性可分的问题的解答,或者对于线性关系尽心拟合,难以完成更加复杂的问题求解,甚至连XOR都难以模拟。因此,出现了多个神经元相连结的神经元网络。
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函数等等。
LMS 方法
我们仍然将其看成一个优化问题:
需要解决的问题: 我们目前神经网络中的权重都是随机生成的,我们需要通过输出结果和我们的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的下一层。
Back Propagation
第三层权重更新
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
Back Propagation
我们可以看到,对于每一个数据点
[
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)
这样每次权重的更新 都是之前所有误差项的加权平均。 越往后的误差项,权重越高。这样的更新相当于增加了惯性项。 同时权重的更新并不只是一个点数据的影响,而是之前所有点数据的影响:这样的梯度方向相当于能够使得之前所有的点误差减小,因此能够使得结果更加的稳定。
更新停止的几种方式:
- 总误差小于阈值
- 总的迭代次数到了一定值
- 误差的平均值的变化趋于0
- 权重的变化趋于0
神经网络如何设计
目的: 神经网络作为黑箱,能够模拟各种连续的非线性函数,但是我们在期望神经网络能够较好模拟训练集的同时,也具有泛化(generalization)的能力,希望其能够在测试集(非训练集)上有较好的性能,而不是过度拟合。
因此,我们在对神经网络的结构进行设计时,需要考虑到神经网络的参数多少,尽量使用较少的神经元(较少的参数)实现我们想要的曲线拟合。同时还需要对神经网络的输入输出进行一定的规定,以实现更好的结果。
输入正则化处理
- 对于不同物理含义的输入,我们应该将其范围限制在[-1,1]或者相近的范围内。另外,输入的范围设置为有正有负,则能够保证 权重不朝一个方向更新。
- 我们应该保证输入量中 数值的距离相同。对于26个字母,我们应该使用 [ 0 , 0 , … , 1 ] T [0,0,\dots,1]^T [0,0,…,1]T这样的方式对其进行表示。
如何选择合适的神经元数量
尝试与选择:
- 选择小尺寸的神经元网络,然后扩大神经元的尺寸。
- 选择大尺寸的神经元网络,然后减少神经元的尺寸。
另外对于单隐藏层的神经网络,对低维度的函数进行模拟的时候,我们可以根据模拟函数的段数选择神经元的数量。
对于单隐藏层的神经网络,我们选择分段线性的激活函数:
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
Singular Value Decomposition (SVD)
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)