基础神经网络

基本结构

可以理解为根据特征走出一条最佳路线,从左到右为数据计算流程

●第一层为输入层,输入数据

●最后一层为输出层,输出结果(可以有多个输出如多分类场景)

●中间为隐含层 2、3个隐含层以上可称为深度学习/深度神经网络

●数据预测从输入到输出称为前向传播 FP

●数据训练更新参数的过程为反向传播 BP

基础神经网络图

世间万物均可通过变换得到,因此每一层通过线性函数z=wx+b、非线性函数a=g(z)不断变换,得到真相

●b可以平移数据,称为偏置项,一般不在神经网络图中体现

●w可以旋转、缩放、升降维数据(如部分w=0可使特征无效)的能力,称为权重

●z为神经元状态函数

●a可以弯曲数据,称为激活函数,作为下一层的输入值

注:代表第2层神经的第3个神经元、代表第3层神经的第1个神经元与上一层第2个神经元的权重,不同知识中序号的表达可能不太一致,不需要过于在意

激活函数

没有激活函数的神经网络等效于纯线性函数,和最简单的线性回归没有区别。常用的激活函数包括:

ReLU

ReLU ,其正数部分导数始终为1。异常值容易导致神经元死亡:如极端值使此次权重更新至-100,后续正常数据∈[0,10000]训练时永远为负数,则该神经元永远输出为0

●避免过拟合,存在单元稀疏性

●梯度计算快捷,负数不再计算

●作为隐藏层激活函数

Leaky ReLU是其缓解方法,,0.01是参数可调整

Sigmoid、Softmax一般作为输出层的激活函数

基础概念

超参数 模型设计时需确定的参数,非数据训练时调节出来的一般参数

学习率 α

正则化参数 λ

神经网络层数 L ,包含输入层、输出层、隐藏层

每个隐含层中神经元个数 j

学习回合数 epoch  

训练样本规模 batchsize,Iterations为每次Epoch样本训练数量,batchsize÷epoch=Iterations

其他还包括代价函数的选择、权重初始化方式、神经元激活函数选择、输出神经元编码方式

链式法则

每层函数导数相乘、相加为复合函数导数、

●Dropout 为每层神经设置神经元死亡概率(一般为0.5)

数据量较大时效果较好,训练时神经元死亡会造成输出为0(屏蔽某些特征,让参数调优更加公平),避免过拟合

数据预测时关闭Dropout,避免结果不稳定导致预测错误

●神经元 处理数据的一个神经单元

稀疏性:人脑理解事物最多只会动用5%的神经元,动用过少重要特征易被忽略,动用过多思考成本过大

神经死亡:由于异常值导致学习参数剧烈变化,所有样本通过该单元的激活函数始终为0,相当于该神经元无效

神经饱和:神经元相关参数更新时,导数趋近为0导致即梯度下降时参数调整幅度过小

●深度网络VS浅层长条网络

7层效果好于1层16K

浅层长条网络隐藏层数少,但同样的预测效果相比深度神经要求成倍的参数数量

●零均值

将数据处理为0分布、1标准差的分布后,梯度下降求解速度将加快。同时避免数据全为正或负时使用某些激活函数导致梯度只在同一方向调整的可能

以,为例

梯度优化方向为当前梯度切线的垂直方向,若两特征意义相当,则将大于100倍

梯度下降时会很快趋近最优,而还在赶路

●Early Stopping

每次训练回合结束后计算模型准确度。连续X次训练未超过最佳准确度即模型无需继续训练,可提前停止

●权重初始化:Xavier、HE

神经网络的核心依然是更新参数,以权重w为例其重点是使用梯度下降计算每次w的更新值。更新的核心是该权重上一层输入值m乘后一层神经元对它的梯度值n,这2项与激活函数输出值、导数高度相关

如激活函数Tanh下不适当初始化会造成所有m*n趋近于0或±1:

①权重均值0,方差0.01分布:数值多逼近0,则激活函数输出接近0,多层链式传递时参数几乎不更新

②权重均值0,方差1分布:数值多在±1两侧,则激活函数输出接近1,此时导数趋近0,导致同①的问题

权重初始化优化思路就是希望任意层的状态值依然是0均值相同方差的正态分布,避免输入至Tanh的数据趋近于0或远离±2导致学习速度过慢。Xavier设计者在假设样本、权重均服从0均值、特定方差的数据分布下,论证了权重只需服从跟输入、输出节点数量有关的均匀分布,并在5层神经网络下实验了Tanh激活值可以获得较好的数据分布。由于Xavier的假定前提:所有层的输出方差均一样,这样可直接对所有权重做服从特定分布的初始化。HE是适用于Relu的权重初始化(HE假设ReLU训练时有一半神经元被关闭,则方差影响减半,要保证每层方差不变,则权重方差要乘以一倍来补偿)

反向传播-参数更新

输入层相当于参数直接输入,因此参数更新是针对连接隐藏层、输出层的权重与偏置项

以SOFTMAX为例,损失函数。以草图为例进行解释:

Softmax利用输出层中每个神经元状态值对结果进行计算。因此对某神经元状态函数求导时需考虑其他神经元。这里,将上述y的下标定义改变,代表当前样本属于第i类。令j为输出层第j个神经元,每个神经元负责一个类别:

i=j实线部分:\frac{da}{dz_i}=\frac{d}{dz_i}\frac{e^{z_i}}{∑e^{z_k}} =\frac{e^{z_i}}{∑e^{z_k}} -\frac{e^{z_i}e^{z_i}}{∑e^{z_k}∑e^{z_k}} =\frac{e^{z_i}}{∑e^{z_k}}(1-\frac{e^{z_i}}{∑e^{z_k}})=a_i(1-a_i)

i≠j虚线部分:

,因此

因为真实分类问题中只会有一项为1如样本的输出向量。则上述式子可简化:

,此时若要对求导,则,为线性函数、代表该样本在第1类的真实预测值:0或1

隐藏层的反向传播由上已初见端倪,利用损失函数对权重的导数+梯度下降完成。我们对求导可得:

一次完整梯度下降对所有神经元求得对应更改参数m后,则对权重进行一次修改:,偏置项同理

注:括号中的值为残差,它是下一层所有与该神经元有连接的节点的导数乘以连接权重之和。这样对于深度网络我们不需要每进行一层参数求导,就重头计算一次导数。只需要每向前走一层,保留当前神经元的残差即可:

代表l+1层神经元j的残差,相当于反向求导至该神经元的状态函数部分

非输出层中,对于l层神经元i的残差:

 代表l+1层所有连接该神经元的节点残差总和乘对状态函数的导数

以上例为主,状态函数的导数就是括号后的,假设激活函数为ReLU且输出值大于0,则,对于的更新值m可通过残差快速求解,而不必从输出层再跋山涉水:

偏置项b再线性函数中y=ax+b求导为1,故不需要前一项的输出值。另外不同文章中对的l层定义不一样,有些是对l层连接l+1层的权重、有些是l-1层对l层的连接权重,会导致最终公式中上标l的表示有出入,不过核心思想同上文所述

你可能感兴趣的:(基础神经网络)