神经网络理论
感知机
感知机由两层神经元组成。
用数学描述感知机:
定义一个增广向量
x
⃗
\vec{x}
x
{
x
⃗
=
[
x
1
]
,
y
=
+
1
x
⃗
=
[
−
x
−
1
]
,
y
=
−
1
\begin{cases} \vec{x}=\left[\begin{array}{cc} x\\ 1 \end{array}\right]&,\quad y=+1\\\\ \vec{x}=\left[\begin{array}{cc} -x\\ -1 \end{array}\right]&,\quad y=-1 \end{cases}
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x=[x1]x=[−x−1],y=+1,y=−1
定义增广向量
ω
=
[
ω
b
]
\omega=[\begin{array}{cc}\omega \\ b\end{array}]
ω=[ωb],这样,就可以将问题
{
ω
T
x
+
b
≥
0
,
y
i
=
+
1
ω
T
x
+
b
<
0
,
y
i
=
−
1
\begin{cases} \omega^Tx+b\ge0,\quad y_i=+1\\\\ \omega^Tx+b<0,\quad y_i=-1 \end{cases}
⎩⎪⎨⎪⎧ωTx+b≥0,yi=+1ωTx+b<0,yi=−1
简化为"找 ω \omega ω,使 ω T x i ⃗ ≥ 0 \omega^T\vec{x_i}\ge0 ωTxi≥0"。
则感知机算法流程为:
输入训练样本集
x
⃗
=
{
x
1
⃗
,
x
2
⃗
,
⋯
,
x
N
⃗
}
\vec{x}=\{\vec{x_1},\vec{x_2},\cdots,\vec{x_N}\}
x={x1,x2,⋯,xN}
随机初始化
ω
\omega
ω
repeat:挑一个
x
i
⃗
\vec{x_i}
xi,若
ω
T
x
i
⃗
<
0
\omega^T\vec{x_i}<0
ωTxi<0,则
ω
=
ω
+
x
i
⃗
\omega=\omega+\vec{x_i}
ω=ω+xi
until:对
∀
x
i
⃗
\forall \vec{x_i}
∀xi都有
ω
T
x
i
⃗
>
0
\omega^T\vec{x_i}>0
ωTxi>0成立
感知机算法收敛定理:输入 { x i ⃗ } , i = 1 ∼ N \{\vec{x_i}\},i=1\sim N {xi},i=1∼N,若该样本集线性可分,则感知机算法经过有限步后,一定能得到一个 ω \omega ω,使 ω T x i ⃗ > 0 , i = 1 ∼ N \omega^T\vec{x_i}>0,i=1\sim N ωTxi>0,i=1∼N
证明:不失一般性,设能将样本集正确划分的超平面系数为
ω
\omega
ω,且
∣
∣
ω
∣
∣
||\omega||
∣∣ω∣∣=1,第k步得到的超平面是
ω
k
\omega_k
ωk,且
∃
x
i
⃗
\exists\vec{x_i}
∃xi,使
ω
k
T
x
i
⃗
<
0
\omega_k^T\vec{x_i}<0
ωkTxi<0,根据感知机算法有:
∣
∣
ω
k
+
1
−
a
ω
∣
∣
2
=
∣
∣
ω
k
+
x
i
⃗
−
a
ω
∣
∣
2
=
∣
∣
(
ω
k
−
a
ω
)
+
x
i
⃗
∣
∣
2
=
∣
∣
ω
k
−
a
ω
∣
∣
2
+
∣
∣
x
i
⃗
∣
∣
2
+
2
ω
k
T
x
i
⃗
−
2
a
ω
T
x
i
⃗
∵
ω
T
x
i
⃗
>
0
∴
∃
a
使
−
2
a
ω
T
x
i
⃗
<
0
即
∃
a
使
∣
∣
ω
k
+
1
−
a
ω
∣
∣
2
<
∣
∣
ω
k
−
a
ω
∣
∣
2
∴
经
过
足
够
多
次
的
迭
代
,
ω
k
+
1
与
ω
的
距
离
会
趋
近
于
0
\begin{aligned} ||\omega_{k+1}-a\omega||^2&=||\omega_k+\vec{x_i}-a\omega||^2\\ &=||(\omega_k-a\omega)+\vec{x_i}||^2\\ &=||\omega_k-a\omega||^2+||\vec{x_i}||^2+2\omega_k^T\vec{x_i}-2a\omega^T\vec{x_i} \end{aligned} \\ \begin{aligned} \\ &\because \omega^T\vec{x_i}>0\\ &\therefore \exists a使-2a\omega^T\vec{x_i}<0\\ &即\exists a使||\omega_{k+1}-a\omega||^2<||\omega_k-a\omega||^2\\ &\therefore经过足够多次的迭代,\omega_{k+1}与\omega的距离会趋近于0 \end{aligned}
∣∣ωk+1−aω∣∣2=∣∣ωk+xi−aω∣∣2=∣∣(ωk−aω)+xi∣∣2=∣∣ωk−aω∣∣2+∣∣xi∣∣2+2ωkTxi−2aωTxi∵ωTxi>0∴∃a使−2aωTxi<0即∃a使∣∣ωk+1−aω∣∣2<∣∣ωk−aω∣∣2∴经过足够多次的迭代,ωk+1与ω的距离会趋近于0
如果在每次迭代后 ω k + 1 \omega_{k+1} ωk+1与 ω \omega ω距离的缩小量是无穷小,那么依然不能说明感知机算法一定收敛。
为了进一步说明感知机算法必收敛,设 β = m a x { ∣ ∣ x i ⃗ ∣ ∣ } , γ = m i n ( ω T x i ⃗ ) , i = 1 ∼ N \beta=max\{||\vec{x_i}||\},\gamma=min(\omega^T\vec{x_i}),i=1\sim N β=max{∣∣xi∣∣},γ=min(ωTxi),i=1∼N,取 a = β 2 + 1 2 γ a=\frac{\beta^2+1}{2\gamma} a=2γβ2+1,则有 ∣ ∣ ω k + 1 − a ω ∣ ∣ 2 < ∣ ∣ ω k − a ω ∣ ∣ 2 − 1 ||\omega_{k+1}-a\omega||^2<||\omega_k-a\omega||^2-1 ∣∣ωk+1−aω∣∣2<∣∣ωk−aω∣∣2−1,取 d = ∣ ∣ ω 0 − a ω ∣ ∣ d=||\omega_0-a\omega|| d=∣∣ω0−aω∣∣,则至多经过 d 2 d^2 d2步, ω 0 \omega_0 ω0将会收敛至 ω \omega ω。
多层感知机
多层感知机必须激活,如果没有激活函数,那么将与一层的 y = ω T x + b y=\omega^Tx+b y=ωTx+b没有区别。这是因为,如果模型是线性的,将所有的括号展开后,式子将形如 y = ω T x + b y=\omega^Tx+b y=ωTx+b,这意味着,多层训练好的参数加到一起与一层的参数是基本相等的。这样做不仅没有提升感知机的效果,反而白白的增加了参数使得计算量增大。
如果选用阶跃函数作为激活函数,则可以处理所有非线性问题。
定理:三层神经网络可以模拟所有决策面。
证明:
如图所示,多边形内为一类,多边形外为另一类。可以建立7个超平面将两类分开,也就是对应神经网络中第一层的七个神经元;对于每个超平面,在超平面上方输出结果为正,在超平面下方输出结果为负,通过阶跃函数激活,第二层的输入将为0/1;由于一共有两个图形,因此第二层应有两个神经元,分别对应于三角形和四边形,根据第二层输入的不同的0/1组合,判断该样本点是否在三角形或四边形内;第三层要做出判断该样本点为哪一类,由于是二分类,因此一个神经元就够。具体结构如图所示:
显然这种构造网络结构的方式是“一般”的,把坐标系中每个图形的边数加在一起就是第一层的神经元个数,因为需要这么多超平面就可以划分出一样效果的区域(如果是圆就是无数条直线);坐标系中有几个图形第二层就有多少个神经元(若只有一个图形,则感知机层数两层就够了);分成几类第三层就有多少个神经元(二分类问题除外,一个神经元就够了,两个神经元也可以但没必要)。
对于多分类问题,设共有N类,N>2,则最后一层有N个神经元,经过激活后输出为一个只有0和1的向量,因此为了实际标签能够指导训练,需要将实际标签也改成一个只有0和1的向量,即只有表示这个类别的位置为1,其余位置全为0。
损失函数
损失函数是一个用以量化模型输出与真实值差距的函数。
回归问题常用均方误差(Mean Square Error)作为损失函数
E
=
1
2
∣
∣
q
i
−
p
i
∣
∣
2
E=\frac{1}{2}||q_i-p_i||^2
E=21∣∣qi−pi∣∣2
分类问题常用交叉熵(Cross Entropy)作为损失函数
E
=
−
∑
i
=
1
N
p
i
l
o
g
2
(
q
i
)
E=-\sum_{i=1}^{N}p_ilog_2(qi)
E=−i=1∑Npilog2(qi)
其中 p i p_i pi为真实标签/值, q i q_i qi为预测标签/值。
交叉熵中的log常以2或e为底。
爬山法
梯度下降求局部极值(Gradient Descent Method)。
1.随机初始化
ω
0
\omega_0
ω0;
2.若
d
f
(
ω
)
d
ω
∣
ω
k
=
0
\frac{df(\omega)}{d\omega}|_{\omega_k}=0
dωdf(ω)∣ωk=0,退出;否则
ω
k
+
1
=
ω
k
−
α
d
f
(
ω
)
d
ω
∣
ω
k
\omega_{k+1}=\omega_k-\alpha\frac{df(\omega)}{d\omega}|_{\omega_k}
ωk+1=ωk−αdωdf(ω)∣ωk。
其中, α \alpha α为学习率,若学习率过高,可能会反复越过极值点,导致无法收敛;若学习率过低,虽然能找到局部最低点,但是训练速度过于缓慢。
常用的激活函数
由于在使用BP算法求极值的时候需要求导,而阶跃函数的导数为0,因此需要用其他非线性函数替代它,这些非线性函数的导数很好求,且能和阶跃函数达到一样的效果,不会影响感知机的性能。
s i g m o i d φ ( x ) = 1 1 + e − x φ ′ ( x ) = φ ( x ) [ 1 − φ ( x ) ] t a n h φ ( x ) = e x − e − x e x + e − x φ ′ ( x ) = 1 − φ 2 ( x ) R e L U φ ( x ) = m a x ( 0 , x ) φ ′ ( x ) = { 1 , x > 0 0 , x ≤ 0 L e a k y R e L U φ ( x ) = m a x ( β x , x ) φ ′ ( x ) = { 1 , x > 0 β , x ≤ 0 \begin{aligned} sigmoid\qquad &\varphi(x)=\frac{1}{1+e^{-x}}\\ &\varphi^{'}(x)=\varphi(x)[1-\varphi(x)]\\\\ tanh\qquad &\varphi(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}\\ &\varphi^{'}(x)=1-\varphi^2(x)\\\\ ReLU\qquad &\varphi(x)=max(0,x)\\ &\varphi^{'}(x)=\begin{cases} 1,\quad x>0\\ 0,\quad x\le0 \end{cases}\\\\ Leaky\quad ReLU\qquad &\varphi(x)=max(\beta x,x)\\ &\varphi^{'}(x)=\begin{cases} 1,\quad x>0\\ \beta,\quad x\le0 \end{cases} \end{aligned} sigmoidtanhReLULeakyReLUφ(x)=1+e−x1φ′(x)=φ(x)[1−φ(x)]φ(x)=ex+e−xex−e−xφ′(x)=1−φ2(x)φ(x)=max(0,x)φ′(x)={1,x>00,x≤0φ(x)=max(βx,x)φ′(x)={1,x>0β,x≤0
分类任务采用sigmoid激活,回归任务采用tanh激活。
引入ReLU的原因:
1.采用sigmoid、tanh等函数,正向传播时计算量大;而ReLU的计算量较小。
2.网络特别深时,sigmoid函数反向传播时,很容易就会出现梯度消失的情况。
3.ReLU会使一部分神经元的输出为0,使网络产生了稀疏性,减少了参数的相互依存关系,缓解了过拟合问题的发生。
后向传播算法(Back Propagation,BP)
1.随机初始化
(
ω
,
b
)
(\omega,b)
(ω,b);
2.输入训练样本(X,Y),代入网络(前向传播),可求出所有的节点数值;
3.使用链式法则分别对
ω
,
b
\omega,b
ω,b求偏导
4.更新:
ω
(
n
e
w
)
=
ω
(
o
l
d
)
−
α
∂
E
∂
ω
∣
ω
(
o
l
d
)
b
(
n
e
w
)
=
b
(
o
l
d
)
−
α
∂
E
∂
b
∣
b
(
o
l
d
)
\begin{aligned} \omega^{(new)}&=\omega^{(old)}-\alpha\frac{\partial E}{\partial\omega}|_{\omega^{(old)}}\\ b^{(new)}&=b^{(old)}-\alpha\frac{\partial E}{\partial b}|_{b^{(old)}} \end{aligned}
ω(new)b(new)=ω(old)−α∂ω∂E∣ω(old)=b(old)−α∂b∂E∣b(old)
推导:
设激活函数为
φ
(
x
)
\varphi(x)
φ(x);
网络共有n层;
a
(
h
)
,
b
(
h
)
,
z
(
h
)
a^{(h)},b^{(h)},z^{(h)}
a(h),b(h),z(h)是第h层的向量,分量个数与第h层的神经元个数
n
h
n^h
nh一致;
a
i
(
h
)
,
b
i
(
h
)
,
z
i
(
h
)
a_i^{(h)},b_i^{(h)},z_i^{(h)}
ai(h),bi(h),zi(h)表示第h层的第i个分量;
y
y
y表示预测值,
y
^
\hat{y}
y^表示真实值;
y
i
y_i
yi表示
y
y
y的第
i
i
i个分量,
y
i
^
\hat{y_i}
yi^表示
y
^
\hat{y}
y^的第
i
i
i个分量,则神经网络可以写成:
ω ( 1 ) T x + b ( 1 ) = z ( 1 ) → φ ( x ) a ( 1 ) = φ ( z ( 1 ) ) ⟶ ω ( 2 ) T a ( 1 ) + b ( 2 ) = z ( 2 ) → φ ( x ) a ( 2 ) = φ ( z ( 2 ) ) ⟶ ⋯ ⟶ ω ( n ) T a ( n − 1 ) + b ( n ) = z ( n ) → φ ( x ) y = a ( n ) = φ ( z ( n ) ) \begin{aligned} &\omega^{(1)T}x+b^{(1)}=z^{(1)}\xrightarrow{\varphi(x)}a^{(1)}=\varphi(z^{(1)})\longrightarrow\\ &\omega^{(2)T}a^{(1)}+b^{(2)}=z^{(2)}\xrightarrow{\varphi(x)}a^{(2)}=\varphi(z^{(2)})\longrightarrow\cdots\longrightarrow\\ &\omega^{(n)T}a^{(n-1)}+b^{(n)}=z^{(n)}\xrightarrow{\varphi(x)}y=a^{(n)}=\varphi(z^{(n)}) \end{aligned} ω(1)Tx+b(1)=z(1)φ(x)a(1)=φ(z(1))⟶ω(2)Ta(1)+b(2)=z(2)φ(x)a(2)=φ(z(2))⟶⋯⟶ω(n)Ta(n−1)+b(n)=z(n)φ(x)y=a(n)=φ(z(n))
设
E
=
1
2
∣
∣
y
−
y
^
∣
∣
2
,
δ
i
(
k
)
=
∂
E
∂
z
i
(
k
)
E=\frac{1}{2}||y-\hat{y}||^2,\quad \delta_i^{(k)}=\frac{\partial E}{\partial z_i^{(k)}}
E=21∣∣y−y^∣∣2,δi(k)=∂zi(k)∂E则有:
δ
i
(
n
)
=
∂
E
∂
z
i
(
n
)
=
∂
E
∂
y
i
(
n
)
∂
y
i
∂
z
i
(
n
)
=
(
y
i
−
y
^
)
φ
′
(
z
i
(
n
)
)
δ
i
(
k
)
=
∂
E
∂
z
i
(
k
)
=
∂
E
∂
a
i
(
k
)
∂
a
i
(
k
)
∂
z
i
(
k
)
=
∑
j
=
1
n
k
+
1
ω
i
j
(
k
+
1
)
δ
j
(
k
+
1
)
φ
′
(
z
i
(
k
)
)
∂
E
∂
ω
i
j
(
k
)
=
δ
j
(
k
)
α
i
(
k
−
1
)
∂
E
∂
b
i
(
k
)
=
δ
i
(
k
)
\begin{aligned} &\delta_i^{(n)}=\frac{\partial E}{\partial z_i^{(n)}}=\frac{\partial E}{\partial y_i^{(n)}}\frac{\partial y_i}{\partial z_i^{(n)}}=(y_i-\hat{y})\varphi^{'}(z_i^{(n)})\\ &\delta_i^{(k)}=\frac{\partial E}{\partial z_i^{(k)}}=\frac{\partial E}{\partial a_i^{(k)}}\frac{\partial a_i^{(k)}}{\partial z_i^{(k)}}=\sum_{j=1}^{n^{k+1}}\omega_{ij}^{(k+1)}\delta_j^{(k+1)}\varphi^{'}(z_i^{(k)})\\ &\frac{\partial E}{\partial \omega_{ij}^{(k)}}=\delta_j^{(k)}\alpha_i^{(k-1)}\\ &\frac{\partial E}{\partial b_i^{(k)}}=\delta_i^{(k)} \end{aligned}
δi(n)=∂zi(n)∂E=∂yi(n)∂E∂zi(n)∂yi=(yi−y^)φ′(zi(n))δi(k)=∂zi(k)∂E=∂ai(k)∂E∂zi(k)∂ai(k)=j=1∑nk+1ωij(k+1)δj(k+1)φ′(zi(k))∂ωij(k)∂E=δj(k)αi(k−1)∂bi(k)∂E=δi(k)
调参
1.随机梯度下降(Stochastic Gradient Descent,SGD)
不用每输入一个样本就去变换参数,而是输入一批样本(叫做一个batch或mini-batch),求出这些样本的梯度平均值后,根据这个平均值改变参数。
在神经网络训练中,batch的样本数大致设置为50~200不等。
2.激活函数
Sigmoid、tanh、ReLU、Leaky ReLU、Maxout、ELU、Softmax。
3.归一化
最常见的是均值和方差归一化,可以让输入的维度对结果的影响都差不多。
4.
ω
,
b
\omega,b
ω,b的初始化
在
(
−
1
d
,
1
d
)
(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}})
(−d1,d1)之间均匀随机取值。其中
d
d
d为
ω
,
b
\omega,b
ω,b所在层的神经元个数,如果
x
x
x服从正态分布(均值为0,方差为1),且各个维度无关,而
(
ω
,
b
)
(\omega,b)
(ω,b)是
(
−
1
d
,
1
d
)
(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}})
(−d1,d1)的均匀分布,则
ω
T
x
+
b
\omega^Tx+b
ωTx+b是均值为0,方差为
1
3
\frac{1}{3}
31的正态分布。
5.Batch Normalization
将每一层的输入归一化,放缩,需训练参数,使用BN后,一些参数即使设置的不是很好,也没有太大影响。
6.损失函数的选择
回归问题常用MSE作为损失函数,分类问题常用交叉熵作为损失函数,也可以在损失函数中加入正则项(Regulation term)。
如果用交叉熵+softmax的组合,求导将会简化为
q
i
−
p
i
q_i-p_i
qi−pi
7.参数更新策略
SGD问题:
(1)
(
ω
,
b
)
(\omega,b)
(ω,b)的每一个分量获得的梯度绝对值有大有小,这种情况下,将会迫使优化路径变成Z字形。
(2)SGD求梯度的策略过于随机,由于上一次和下一次用的是完全不同的batch数据,将会出现优化的方向随机的情况。
解决各个方向梯度不一致的方法:
(1)AdaGrad,对于每个梯度,让那个梯度除以它的绝对值,这样大的会变小,小的会变大;
(2)RMSProp,对AdaGrad的一种改进;
(3)Momentum,使之前算的梯度能够影响之后的梯度;
(4)Adam,结合几种优化器,兼具它们的优点。
8.关于训练
如果使用BN,对学习率、参数更新策略要求不十分严格,直接使用SGD即可,加上其他反而不好。如果不使用BN,则需要合理调参。由于梯度累积效应的影响,AdaGrad、RMSProp、Adam三种更新策略到了训练后期,参数更新的步长会很短,可以采用提高学习率的方式解决此问题。