CV-全连接神经网络

全连接神经网络

级联多个变换

例如两层全连接
f = w 2 m a x ( 0 , w 1 x + b 1 ) + b 2 f=w_{2}max(0,w_{1}x+b_{1})+b_{2} f=w2max(0,w1x+b1)+b2

其中非线性操作是必须的
与线性分类器的区别在于可以处理线性不可分的情况

结构

  • 输入
  • 隐藏层
  • 输出
  • 权值

除了输入有多少层就是几层神经网络

激活函数

去掉非线性操作(激活函数)神经网络退化为线性分类器
常用

  • sigmoid
    1 ( 1 + e − x ) \frac{1}{(1+e^{-x})} (1+ex)1
    将值压缩到0~1
  • ReLU
    m a x ( 0 , x ) max(0,x) max(0,x)
  • tanh
    e x − e − x e x + e − x \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} ex+exexex
    将值压缩到-1~1
  • Leaky ReLU
    m a x ( 0.1 x , x ) max(0.1x,x) max(0.1x,x)

结构设计

  • 宽度
  • 深度
    神经元个数越多,非线性能力越强,分界面更复杂

但不是越多越好,越复杂越好
应该根据任务的难度选择

softmax

先指数化再归一化
可以将输出转化为概率分布

交叉熵

需要度量预测分布和真实分布

其中真实分布一般是one-hot形式的

H ( p , q ) = − ∑ x p ( x ) l o g ( q ( x ) ) H(p,q)=-\sum_{x}p(x)log(q(x)) H(p,q)=xp(x)log(q(x))

H(p,q)=KL(p||q)+H(p)
但由于真值一般为one-hot,H(p)通常为0
有时也会使用KL散度

计算图

有向图,表达输入,输出,中间变量间的计算关系,每个节点对应一种运算

可以使计算机使用链式法则计算任意复杂函数的每个位置的梯度

计算图有颗粒度的问题

梯度消失、梯度爆炸

sigmoid的导数在较大范围内导数很小,再加上链式法则的乘法导致,导致导数回传为0,称为梯度消失

同样也能导致梯度爆炸,可以通过梯度裁剪解决

(Leakly)ReLU函数的导数在大于0时永远为一,不会导致梯度消失/爆炸,梯度流动更流畅,收敛更快

改进梯度算法

  • 梯度下降——一次需要计算全样本,太费时
  • 随机梯度下降——有时会有噪声,效率低
  • 小批量梯度下降——折中

仍存在的问题

遇到山谷,一个方向震荡,另一个方向上下降缓慢
在震荡方向做太多无用功
仅调节步长无法解决

解决方案

动量法

利用历史累计
震荡方向相互抵消,平坦下降方向加速

还能突破局部最小值和鞍点

伪码

初始化速度v=0
循环:
----计算梯度g
----速度更新 v = μ v + g v=\mu v+g v=μv+g
----更新权值 w = w − ε v w=w-\varepsilon v w=wεv

μ \mu μ取值[0,1),一般0.9

自适应梯度法

减小震荡方向步长,增大平坦方向步长
其中梯度幅度平方较大为震荡方向,较小为平坦方向
伪码

初始化累计变量r=0
循环:
----计算梯度g
----累计平方梯度r=r+g*g
----更新权值 w = w − ε r + δ g w=w-\frac{\varepsilon}{\sqrt{r}+\delta}g w=wr +δεg

δ \delta δ防止除零,通常为 1 0 − 5 10^{-5} 105

缺陷是累加时间过长平坦方向的速度也会被抑制

RMSProp

解决方法是混合历史信息
改进的地方是将累计平方梯度换为 r = ρ r + ( 1 − ρ ) g ∗ g r=\rho r+(1-\rho )g*g r=ρr+(1ρ)gg
ρ \rho ρ取[0,1)一般为0.999

ADAM

同时使用动量和自适应
伪码

初始化累计变量r=0,v=0
循环:
----计算梯度g
----累计梯度 v = μ v + ( 1 − μ ) g v=\mu v+(1-\mu)g v=μv+(1μ)g
----累计平方梯度 r = ρ r + ( 1 − ρ ) g ∗ g r=\rho r+(1-\rho)g*g r=ρr+(1ρ)gg
----修正偏差 v ^ = v 1 − μ t , r ^ = r 1 − ρ t \hat{v}=\frac{v}{1-\mu^{t}},\hat{r}=\frac{r}{1-\rho^{t}} v^=1μtv,r^=1ρtr
----更新权值 w = w − ε r + δ v ^ w=w-\frac{\varepsilon}{\sqrt{r}+\delta}\hat{v} w=wr +δεv^

衰减速率 ρ \rho ρ动量系数 μ \mu μ建议为0.999和0.9
修正偏差可以缓解算法初期冷启动问题

用ADAM有点是不用手动调参

权值初始化

全零初始化
所有神经元输出相同,参数更新相同,无法训练

随机权值初始化
权值采用高斯分布

但输出在传播过程中会饱和或趋近于零,也无法训练

Xavier初始化
目标是使得网络各层激活值和局部梯度方差在传播过程中尽量保持一致,即寻找w的分布使得输入与输出方差一致
当var(w)=1/N时,输入输出方差一致
HE初始化
适用于ReLU,权值采样于 N ( 0 , 2 / N ) \mathcal{N}(0,2/N) N(0,2/N)

批归一化

直接对神经元输出进行批归一化
通常在全连接之后,在非线性操作之前
可以防止输出落在小梯度区域,能解决梯度消失问题
均值和方差可以由网络学习

欠拟合

模型描述能力太弱,模型过于简单

过拟合

在训练集上性能好但在真实场景性能不好
只记住训练样本而没有提取到特征

机器学习的根本问题

  • 优化 在训练集上获得最佳性能
  • 泛化 在未知数据上获得好性能

训练初期:优化泛化同步进行
训练后期:泛化降低,出现过拟合

解决方法

  • 最优方案——获取足够多数据
  • 次优方案——调节模型允许存储信息大小
    • 调节模型大小
    • 约束模型权值,使用正则项

随机失活

让隐层神经元有一定几率不被激活,在训练时使用Dropout,随机使某些神经元输出为0

  • 减少了模型容量
  • 鼓励权值分散,有正则化作用
  • 可以视为集成模型

存在问题
测试阶段不使用随机失活导致输出范围于训练时不同
解决方案
在训练时对激活的神经元输出乘以系数

超参数

学习率

  • 过大 无法收敛
  • 偏大 震荡,无法达到最优
  • 太小 收敛时间过长
  • 适中 收敛快,结果好

超参数搜索法

  • 网格搜索
  • 随机搜索——超参数组合更多,一般选择
    先粗搜索再细搜索
    一般在log空间搜索
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值