神经网络(neural networks)

神经网络理论

感知机

感知机由两层神经元组成。

用数学描述感知机:

定义一个增广向量 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 =[x1],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+b0,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=1N,若该样本集线性可分,则感知机算法经过有限步后,一定能得到一个 ω \omega ω,使 ω T x i ⃗ > 0 , i = 1 ∼ N \omega^T\vec{x_i}>0,i=1\sim N ωTxi >0,i=1N

证明:不失一般性,设能将样本集正确划分的超平面系数为 ω \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+1aω2=ωk+xi aω2=(ωkaω)+xi 2=ωkaω2+xi 2+2ωkTxi 2aωTxi ωTxi >0a使2aωTxi <0a使ωk+1aω2<ωkaω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=1N,取 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+1aω2<ωkaω21,取 d = ∣ ∣ ω 0 − a ω ∣ ∣ d=||\omega_0-a\omega|| d=ω0aω,则至多经过 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=21qipi2
分类问题常用交叉熵(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=1Npilog2(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+ex1φ(x)=φ(x)[1φ(x)]φ(x)=ex+exexexφ(x)=1φ2(x)φ(x)=max(0,x)φ(x)={1,x>00,x0φ(x)=max(βx,x)φ(x)={1,x>0β,x0

分类任务采用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)αbEb(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(n1)+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=21yy^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)Ezi(n)yi=(yiy^)φ(zi(n))δi(k)=zi(k)E=ai(k)Ezi(k)ai(k)=j=1nk+1ωij(k+1)δj(k+1)φ(zi(k))ωij(k)E=δj(k)αi(k1)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}}) (d 1,d 1)之间均匀随机取值。其中 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}}) (d 1,d 1)的均匀分布,则 ω 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 qipi

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三种更新策略到了训练后期,参数更新的步长会很短,可以采用提高学习率的方式解决此问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值