前馈式神经网络形似是多层、多神经元感知机,同样有梯度下降系列算法求解,因有多层、多个神经元,所以每层都有自己的导函数(梯度),“前馈式”的含义即首先解最靠近输出层的层的梯度,最后推到输入层。
神经网络由三个部分构成:1.输入层、2.隐藏层、3.输出层。输入层神经元个数需要与维度数量相同,隐藏层层数和神经元个数可以随意,输出层神经元个数与任务有关,比如多分类单标签任务,神经元个数与类的个数应相同,回归任务,神经元个数只有一个。正是因为前馈式的结构,神经网络在训练过程中易出现梯度消失或梯度爆炸(递归神经网络常见)的问题,就是说底层(靠近输出层)的方差相比顶层小或大了很多,这样严重拖慢了训练速度,甚至使得算法根本无法收敛。
隐藏层的神经元包含一个激活函数:比如ELU,输出层也有一个激活函数,上面提到的多分类单标签任务通常用softmax,回归任务不需要激活函数。一般正常的深度网络训练包括以下步骤:
- 去“模型动物园”里找与你的任务相机且已经训练好的模型,根据是否找到已有的模型,及模型的质量来判断是否需要迁移学习;
- 扩增训练集(方法很多,比如旋转、变换一下图片的对比度);
- 归一化输入(归一化输入层的输入);
- 选择合适的隐藏层激活函数;
- 选择初始化神经元连接权重的方法,与隐藏层激活函数是配套的;
- 考虑是否需要“标准化”的方法,这个是针对每一层的输入和输出,这个通常在选择了激活函数和初始化权重之后,决定要不要使用;
- 选择梯度下降的方法(解方程的方法,通常称为优化的方法);
- 选择正规化的方法;
- 选择制定“学习计划”的方法。
迁移学习:
迁移学习就是把已经训练好的模型的权重放到你即将训练的模型中,只改变一下输入层和顶层(可能抛弃一些层或神经元),然后冻结底层(锁住底层的权重),只训练顶层(maybe,这就是他们说深度学习实际上是特征学习的原因???)。
扩增训练集:
如果是图像数据,可以考虑旋转、缩放、偏移、翻转、裁剪,改对比度、饱和度、亮度等操作(TF有这些函数)。如果你有一堆已标记和一堆未标记的数据,可以通过半监督学习,如自动编码器、受限波尔兹机对数据进行训练。
隐藏层激活函数:
1.逻辑函数:
2.双曲正切函数:
3.ReLU(修正线性单元):
4.leaky ReLU:
a是超参数,一般设置为0.2。
5.RReLU:与leaky ReLU相似,只是a不是定值,是给定范围内的随机值。
6.PReLU:与leaky ReLU相似,只是a不是超参数了,而是反向传播中能更新(学习)的参数。
7.ELU:
初始化权重的方法:
初始化权重的方法是为了尽量让输入和输出的方差保持一致,可以显著提高训练速度。
激活函数 | 标准正态分布(在(-r,r)之间) | 正态分布(均值都为0) |
逻辑函数 | | |
双曲正切函数 | | |
ReLU(及变种) | | |
批量归一化的方法:
如果不使用批量归一化,顶层可能会产生不同尺寸的输入。
优化器选择:
1.Momentum(动量优化):
β 是超参数(摩擦系数),一般为0.9, 是超参数学习速率,
为代价函数
在
处的导数。
2.Nesterov:
性能优于Momentum,原因是因为矢量指向正确的方向,有助于减少振荡,加快收敛。
3.AdaGrad:
AdaGrad可以沿着最陡尺寸滑向最优解,在输入值维度尺寸相差大的情况下,可以避免 值快速滑入谷底,而使得收敛变慢。⨂ 为点乘,
为点除,
为接近0的值,防止
。
4.RMSProp:
AdaGrad会导致下降太快而没法收敛到最优解,加入超参数β 后,可防止以上问题,通常β=0.9
。
5.Adam:
Adam融合了以上算法的思想,在表现上优于上述四种算法,超参数β1 、β2
一般设置为0.9和0.999。
学习计划:
学习计划简单来说就是使学习速率超参数 随迭代数变化。
- 指数调度:η=a∙10-t/r
其中t为迭代周期数,a、r为超参数。
- 功率调度:η=a∙(1+t/r)-c
其中c为超参数,常为1,其余与指数调度相同,表现不如指数调度。
正规化方法:
- 提前停止(早期停止法):每隔一个周期保存一次权重,如果训练经过5个周期或者更多周期,代价函数并未降低或是精度并未变高,则终止训练,并使用最优的权重作为最终解。
- dropout:每一个训练步骤中,每个神经元都设置一个丢失几率p
,常为0.5,训练结束后,所有神经元都不会被丢弃,但它们的权重应乘以(1-p)
,即乘以该神经元被保持的可能性。如果发现模型过度拟合,应提高p
值,相反则应降低。
- 最大范数正规化:该方法没有dropout流行,但依然很实用,即设置超参数r,使得输入每个神经元的权重的L2范数小于等于r,如果大于r,则:
以此更新输入权重。有了该正规化方法就不需要额外添加正规化项了。