三、深度学习基础7(微调、初始化)

预训练与微调(fine tuning)

深度网络存在问题 :
1 )网络越深,需要的训练样本数越多。若用监督则需大量标注样本,不然小规模样本容易造成过拟合。深层网络特征比较多,会出现的多特征问题主要有多样本问题、规则化问题、特征选择问题。
(2)多层神经网络参数优化是个高阶非凸优化问题,经常得到收敛较差的局部解;
(3)梯度扩散问题, BP 算法计算出的梯度随着深度向前而显著下降,导致前面网络参数 贡献很小,更新速度慢。
解决方法
逐层贪婪训练,无监督预训练(unsupervised pre-training)即训练网络的第一个隐藏层,再训练第二个… 最后用这些训练好的网络参数值作为整体网络参数的初始值。经过预训练最终能得到比较好的局部最优解。

模型微调 fine tuning

用别人的参数、修改后的网络和自己的数据进行训练,使得参数适应自己的数据,这样一 个过程,通常称之为微调(fine tuning).

微调时候网络参数是否更新

会更新。
1 finetune 的过程相当于继续训练,跟直接训练的区别是初始化的时候。
(2)直接训练是按照网络定义指定的方式初始化。
(3) finetune 是用已有的参数文件来初始化

fine-tuning 模型的三种状态

1 )状态一:只预测,不训练。
特点:相对快、简单,针对那些已经训练好,现在要实际对未知数据进行标注的项目,非常高效;
(2)状态二:训练,但只训练最后分类层。
特点: fine-tuning 的模型最终的分类以及符合要求,现在只是在他们的基础上进行类别降维。
(3)状态三:完全训练,分类层 + 之前卷积层都训练
特点:跟状态二的差异很小,当然状态三比较耗时和需要训练 GPU 资源,不过非常适合fine-tuning 到自己想要的模型里面,预测精度相比状态二也提高不少。

权重偏差初始化

1.全都初始化为 0

偏差初始化陷阱 : 都初始化为 0
产生陷阱原因 :因为并不知道在训练神经网络中每一个权重最后的值,但是如果进行了恰当的数据归一化后,我们可以有理由认为有一半的权重是正的,另一半是负的。令所有权重都初始化为 0,如果神经网络计算出来的输出值是一样的,神经网络在进行反向传播算法计算出来的梯度值也一样,并且参数更新值也一样。更一般地说,如果权重初始化为同一个值,网络就是对称的。
形象化理解 :在神经网络中考虑梯度下降的时候,设想你在爬山,但身处直线形的山谷中,两边是对称的山峰。由于对称性,你所在之处的梯度只能沿着山谷的方向,不会指向山峰;你走了一步之后,情况依然不变。结果就是你只能收敛到山谷中的一个极大值,而走不到山峰上去。

2.全都初始化为同样的值

偏差初始化陷阱: 都初始化为一样的值。

3.初始化为小的随机数

将权重初始化为很小的数字是一个普遍的打破网络对称性的解决办法。

备注:警告:并不是数字越小就会表现的越好。

4.用 1/sqrt(n)校准方差

我们可以通过将其权重向量按其输入的平方根 ( 即输入的数量 ) 进行缩放,从而将每个神经元的输出的方差标准化到 1 。也就是说推荐的启发式方法 (heuristic) 是将每个神经元的权重向量按下面的方法进行初始化。

5.稀疏初始化(Sparse Initialazation)

另一种解决未校准方差问题的方法是把所有的权重矩阵都设为零,但是为了打破对称性,
每个神经元都是随机连接地 ( 从如上面所介绍的一个小的高斯分布中抽取权重 ) 到它下面的一
个固定数量的神经元。一个典型的神经元连接的数目可能是小到 10 个。

初始化偏差

将偏差初始化为零是可能的,也是很常见的,因为非对称性破坏是由权重的小随机数导致的。因为 ReLU 具有非线性特点,所以有些人喜欢使用将所有的偏差设定为小的常数值如 0.01 ,因为这样可以确保所有的 ReLU 单元在最开始就激活触发 (fire) 并因此能够获得和传播一些梯度值。然而,这是否能够提供持续的改善还不太清楚( 实际上一些结果表明这样做反而使得性能更加糟糕) ,所以更通常的做法是简单地将偏差初始化为 0.

你可能感兴趣的:(深度学习,机器学习,深度学习,opencv,人工智能)