深度学习之神经网络理论基础
人工神经元
人工神经元:人类神经元中抽象出来的数学模型
MP模型
mp模型:1943年心理学家W.S.McCulloch和数理逻辑学家W.Pitts研究出人工神经元,称为M-P模型。
M-P神经元(一个用来模拟生物行为的数学模型):接收n个输入(通常是来自其他神经元),并给各个输入赋予权重计算加权和,然后和自身特有的阈值进行比较 (作减法),最后经过激活函数(模拟"抑制"和"激活")处理得到输出(通常是给下一个神经元)
人工神经网络:大量神经元以某种连接方式构成的机器学习模型
多层感知机
首先需要说明的是:感知机模型的相关概念。从而在此基础上引出了第一个人工神经网络-多层感知机。
感知机模型:激活函数为sgn(阶跃函数)的神经元(是一个用来分类的模型)
f ( x ) = sign ( w ⋅ x + b ) f(x)=\operatorname{sign}(w \cdot x+b) f(x)=sign(w⋅x+b)
感知机
感知机由两层神经元组成,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元。也称为阈值逻辑单元(threshold logic unit)"。以下为一个单层感知机模型示意图
感知机模型存在的致命缺点:Minsky在1969年证明Perceptron无法解决异或问题
本质的原因是感知机模型:只能解决线性可分的问题。
导致了人工神经网络的第一次衰弱。
多层感知机(MLP)
多层感知机(MultiLayerPerceptron,MLP):单层神经网络基础上引入一个或多个隐藏层,使神经网络有多个网络层,因而得名多层感知机。
其中的权重矩阵为4 * 5的矩阵(对应4个输入x1,x2,x3,x4和隐藏层中的五个节点)
连接权重矩阵不一定唯一可能存在多个(多个隐藏层)
多层感知机的前向传播
注意的是其中X向量是一个1*4的结构。
通过前向传播算法得到了第一个1*5的向量结构 之后的另一个权重矩阵为5 * 3的权重矩阵。通过前向传播得到了对应的三个输出结果。
在运算的过程中每一层的计算需要激活函数,若无激活函数,网络将退化为单层网络。
H = X W h + b h O = H W o + b o O = ( X W h + b h ) W o + b o = X W h W o + b h W o + b o \begin{aligned} \boldsymbol{H} & =\boldsymbol{X} \boldsymbol{W}{h}+\boldsymbol{b}{h} \\ \boldsymbol{O} & =\boldsymbol{H} \boldsymbol{W}{o}+\boldsymbol{b}{o} \boldsymbol{O}=\left(\boldsymbol{X} \boldsymbol{W}{h}+\boldsymbol{b}{h}\right) \boldsymbol{W}{o}+\boldsymbol{b}{o}=\boldsymbol{X} \boldsymbol{W}{h} \boldsymbol{W}{o}+\boldsymbol{b}{h} \boldsymbol{W}{o}+\boldsymbol{b}_{o} \end{aligned} HO=XWh+bh=HWo+boO=(XWh+bh)Wo+bo=XWhWo+bhWo+bo
这个公式就说明了无激活函数时,最后多个矩阵相乘的结果与线性模型相同
在隐藏层引入激活函数就可以避免模型的退化。
激活函数
- 让多层感知机成为真正的多层,否则等价于一层
- 引入非线性,使网络可以逼近任意非线性函数(万能逼近定理,universalapproximator)
万能逼近定理:从理论上证明了激活函数可以逼近任意的非线性函数
激活函数需要具备的性质
- 连续并可导(允许少数点上不可导),便于利用数值优化的方法来学习网络参数
- 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率
- 激活函数的导函数的值域要在合适区间内,不能太大也不能太小,否则会影响训练的效率和稳定(影响权重值的计算)
之后我们引出了三个常见的激活函数
分别为sigmoid(s型)Tanh(双曲正切)ReLU(修正线性单元)
激活函数特性
-
其中sigmoid函数通常用来做二分类问题的激活函数(其中导函数的两侧区域称为饱和区域 也是弊端之一因为在饱和区域的梯度接近于0导致前向传播变得困难)
-
Tanh(双曲正切)图像与sigmoid函数的图像类似,但是值域的范围在-1和1之间 其中中间值的均值为0 适合做对称的数据(也存在饱和区)
其中两个函数的中间部分存在的区域我们称之为线性区域
- ReLU因为不存在饱和区域,因此通常应用在卷积神经网络中(非饱和激活函数)。
反向传播算法
-
前向传播:输入层数据开始从前向后,数据逐步传递至输出层
-
反向传播:损失函数开始从后向前,梯度逐步传递至第一层
反向传播作用:用于权重更新,使网络输出更接近标签
反向传播的原理:微积分中的链式求导法则
y = f ( u ) , u = g ( x ) ∂ y ∂ x = ∂ y ∂ u ∂ u ∂ x y=f(u), u=g(x) \quad \frac{\partial y}{\partial x}=\frac{\partial y}{\partial u} \frac{\partial u}{\partial x} y=f(u),u=g(x)∂x∂y=∂u∂y∂x∂u
首先要明白梯度是一个向量的概念(梯度向量)。通常在数学中常常计算某个点的梯度值。
损失函数 : 衡量模型输出与真实标签的差异
Loss = f ( y ∧ , y ) \text { Loss }=f\left(y^{\wedge}, y\right) Loss =f(y∧,y)
网络计算图
计算符定义:prod(x,y),表示x与y根据形状做必要的变换,然后相乘
∂ L ∂ W ( 2 ) = prod ( ∂ L ∂ O , ∂ O ∂ W ( 2 ) ) = ∂ L ∂ O ⋅ h ⊤ ∂ L ∂ h = prod ( ∂ L ∂ O , ∂ O ∂ h ) = W ( 2 ) T ⋅ ∂ L ∂ O ∂ L ∂ z = prod ( ∂ L ∂ O , ∂ O ∂ h , ∂ h ∂ z ) = ∂ L ∂ h ⊙ ϕ ′ ( z ) ∂ L ∂ W ( 0 ) = prod ( ∂ L ∂ O , ∂ O ∂ h , ∂ h ∂ z , ∂ z ∂ W ( ν ) ) = ∂ L ∂ z ⋅ χ ⊤ \begin{array}{l} \frac{\partial L}{\partial W^{(2)}}=\operatorname{prod}\left(\frac{\partial L}{\partial O}, \frac{\partial O}{\partial W^{(2)}}\right)=\frac{\partial L}{\partial O} \cdot h^{\top} \\ \frac{\partial L}{\partial h}=\operatorname{prod}\left(\frac{\partial L}{\partial O}, \frac{\partial O}{\partial h}\right)=W^{(2) T} \cdot \frac{\partial L}{\partial O} \\ \frac{\partial L}{\partial z}=\operatorname{prod}\left(\frac{\partial L}{\partial O}, \frac{\partial O}{\partial h}, \frac{\partial h}{\partial z}\right)=\frac{\partial L}{\partial h} \odot \phi^{\prime}(z) \\ \frac{\partial L}{\partial W^{(0)}}=\operatorname{prod}\left(\frac{\partial L}{\partial O}, \frac{\partial O}{\partial h}, \frac{\partial h}{\partial z}, \frac{\partial z}{\partial W^{(\nu)}}\right)=\frac{\partial L}{\partial z} \cdot \chi^{\top} \end{array} ∂W(2)∂L=prod(∂O∂L,∂W(2)∂O)=∂O∂L⋅h⊤∂h∂L=prod(∂O∂L,∂h∂O)=W(2)T⋅∂O∂L∂z∂L=prod(∂O∂L,∂h∂O,∂z∂h)=∂h∂L⊙ϕ′(z)∂W(0)∂L=prod(∂O∂L,∂h∂O,∂z∂h,∂W(ν)∂z)=∂z∂L⋅χ⊤
梯度下降(Gradient Decent)
反向传播的过程中如何去更新我们的权重呢?此时就涉及到了梯度下降的概念了。
- 权值沿梯度负方向更新,使函数值减小
- 导数:函数在指定坐标轴上的变化率
- 方向导数:指定方向上的变化率
- 梯度:一个向量,方向为方向导数取得最大值的方向
学习率(Learning Rate):控制更新步长
w i + 1 = w i − g ( w i ) w_{i+1}=w_{i}-g\left(w_{i}\right) wi+1=wi−g(wi)
w i + 1 = w i − L R ∗ g ( w i ) w_{i+1}=w_{i}-L R^{*} g\left(w_{i}\right) wi+1=wi−LR∗g(wi)
学习率的设置通常小于1
损失函数
损失函数:衡量模型输出与真实的标签之间的差距
- 损失函数(LossFunction):
Loss = f ( y ∧ , y ) \operatorname{Loss} =f\left(y^{\wedge}, y\right) Loss=f(y∧,y)
- 代价函数(CostFunction):
C o s t = 1 N ∑ i N f ( y i , y i ) Cost=\frac{1}{N} \sum_{i}^{N} f\left(y_{i}, y_{i}\right) Cost=N1i∑Nf(yi,yi)
- 目标函数(objectiveFunction):
O b j = C o s t + Regularization Term(正则项) \boldsymbol{Obj}=Cost+\text { Regularization Term(正则项) } Obj=Cost+ Regularization Term(正则项)
其中正则项:用来控制模型的复杂度防止产生过拟合的现象
其中损失函数指的是单样本的损失,而代价函数指的是总体的损失的平均值 但是优化loss值与优化cost值在本质上是一样的
两种常见的目标函数
分别是用在回归任务中使用的均方误差损失和用于分类任务中的交叉熵损失函数。
- MSE(均方误差,MeanSquaredError)输出与标签之差的平方的均值,常在回归任务中使用。计算公式:
M S E = ∑ i = 1 n ( y i − y i h a t ) 2 n M S E=\frac{\sum_{i=1}^{n}\left(y_{i}-y_{i}^{hat}\right)^{2}}{n} MSE=n∑i=1n(yi−yihat)2
- CE(CrossEntropy,交叉熵)交叉源自信息论,用于衡量两个分布的差异,常在分类任务中使用。计算公式:
H ( p , q ) = − ∑ i = 1 n p ( x i ) log q ( x i ) H(p, q)=-\sum_{i=1}^{n} p\left(x_{i}\right) \log q\left(x_{i}\right) H(p,q)=−i=1∑np(xi)logq(xi)
其中p是真实的分布 q是模型预测的分布
信息熵:描述信息的不确定度
自信息:I(x)=-logP(x),p(x)是某事件发生的概率
信息熵=所有可能取值的信息量的期望,即
H ( x ) = E x ∼ p [ I ( x ) ] = − E [ log P ( x ) ] = − ∑ i = 1 N p i log ( p i ) H(\mathrm{x})=E_{x \sim p}[I(x)]=-E[\log P(x)]=-\sum_{i=1}^{N} p_{i} \log \left(p_{i}\right) H(x)=Ex∼p[I(x)]=−E[logP(x)]=−i=1∑Npilog(pi)
相对熵:又称K-L散度,衡量两个分布之间的差异。公式如下:
D K L ( P ∥ Q ) = E x ∼ p [ log P ( x ) Q ( x ) ] = E x ∼ p [ log P ( x ) − log Q ( x ) ] = ∑ i = 1 N P ( x i ) ( log P ( x i ) − log Q ( x i ) ) H ( p , q ) = − ∑ i = 1 n p ( x i ) log q ( x i ) H ( x ) = E x ∼ p [ I ( x ) ] = − E [ log P ( x ) ] = − ∑ i = 1 N p i log ( p i ) \begin{array}{l} \begin{array}{l} D_{K L}(P \| Q)=E_{x \sim p}\left[\log \frac{P(x)}{Q(x)}\right]=E_{x \sim p}[\log P(x)-\log Q(x)] \\ =\sum_{i=1}^{N} \mathrm{P}\left(\mathrm{x}{i}\right)\left(\log P\left(\mathrm{x}{i}\right)-\log \mathrm{Q}\left(\mathrm{x}{i}\right)\right) \\ H(p, q)=-\sum{i=1}^{n} p\left(x_{i}\right) \log q\left(x_{i}\right) \end{array} \\ H(\mathrm{x})=E_{x \sim p}[I(x)]=-E[\log P(x)]=-\sum_{i=1}^{N} p_{i} \log \left(p_{i}\right) \end{array} DKL(P∥Q)=Ex∼p[logQ(x)P(x)]=Ex∼p[logP(x)−logQ(x)]=∑i=1NP(xi)(logP(xi)−logQ(xi))H(p,q)=−∑i=1np(xi)logq(xi)H(x)=Ex∼p[I(x)]=−E[logP(x)]=−∑i=1Npilog(pi)
H(p,q)=H(P)+D_KL(PlIQ),即 交叉熵=信息熵+相对熵
Softmaxa函数
在交叉熵验证中常用到的一个函数:softmax函数
将数据变换到符合概率分布的形式
y i = S ( z ) i = e z i ∑ j = 1 C e z j , i = 1 , ... , C y_{i}=S(\boldsymbol{z}){i}=\frac{e^{z{i}}}{\sum_{j=1}^{C} e^{z_{j}}}, i=1, \ldots, C yi=S(z)i=∑j=1Cezjezi,i=1,...,C
Softmax操作:
- 取指数,实现非负
- 除以指数之和,实现之和为1
在动手学深度学习中用于多分类问题,并且会给出预测的结果值
权值初始化
权值初始化:训练前对权值参数赋值,良好的权值初始化有利于模型训练简便但错误的方法:初始化为全0(会导致网络的退化)
随机初始化法:高斯分布随机初始化,从高斯分布中随机采样,对权重进行赋值,比如N~(0,0.01)30准则:数值分布在(u-30,u+3)中的概率为99.73%
控制权重的尺度,使得初始化的值不能落在饱和的区域。使得模型的训练不能变得更加的困难。
正则化方法
Regularization:减小方差的策略,通俗理解为减轻过拟合的策略
-
误差可分解为:偏差,方差与噪声之和。即误差=偏差+方差+噪声之和
-
偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力
-
方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响
-
噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界
过拟合现象:方差过大在训练集表现良好在测试集表现糟糕
两种常见的正则项
L1 Regularization Term:
∑ i N ∣ w i ∣ \begin{array}{l} \sum_{i}^{N}\left|w_{i}\right| \\ \end{array} ∑iN∣wi∣
L2 Regularization Term:
∑ i N w i 2 \begin{array}{l} \sum_{i}^{N} w_{i}^{2} \end{array} ∑iNwi2
从L2正则项由此引出了权值衰减的概念。
权值衰减(weight decay)
O b j = Cos t + Regularization Term O b j = Loss + λ 2 ∗ ∑ i N w i 2 \begin{array}{l} O b j=\operatorname{Cos} t+\text { Regularization Term } \\ O b j=\operatorname{Loss}+\frac{\lambda}{2} * \sum_{i}^{N} w_{i}^{2} \end{array} Obj=Cost+ Regularization Term Obj=Loss+2λ∗∑iNwi2
若无正则项则对应的公式为:
w i + 1 = w i − ∂ O b j ∂ w i = w i − ∂ L o s s ∂ w i w_{i+1}=w_{i}-\frac{\partial O b j}{\partial w_{i}}=w_{i}-\frac{\partial L o s s}{\partial w_{i}} wi+1=wi−∂wi∂Obj=wi−∂wi∂Loss
有正则项则对应的公式为:
w i + 1 = w i − ∂ O b j ∂ w i = w i − ( ∂ L o s s ∂ w i + λ ⋆ w i ) = w i ( 1 − λ ) − ∂ L o s s ∂ w i \begin{array}{l} w_{i+1}= w_{i}-\frac{\partial O b j}{\partial w_{i}}=w_{i}-\left(\frac{\partial L o s s}{\partial w_{i}}+\lambda^{\star} w_{i}\right) \\ =w_{i}(1-\lambda)-\frac{\partial L o s s}{\partial w_{i}} \end{array} wi+1=wi−∂wi∂Obj=wi−(∂wi∂Loss+λ⋆wi)=wi(1−λ)−∂wi∂Loss
随机失活(Dropout)
优点:避免过度依赖某个神经元,实现减轻过拟合
- 随机:dropout probability(eg:p=0.5)
- 失活:weight=0
注意事项:训练和测试两个阶段的数据尺度变化测试时,神经元输出值需要乘以p