1)算法目标设定
首先要确定一个算法目标及约束条件,比如运行时间、硬件内存限制、准确度等选择算法。
学习效果一般尽量采用单个指标进行评估,对于 N 个评价指标,选择其中一个指标作为优化指标,选择剩下的 N-1 个指标作为满足指标。
比如针对分类,有些场合关注查准率,有些场合关注查全率,而有些是用F1 score来评估。这些效果跟具体应用需求相关。
另外还应该确定应用的最后一级输出,比如除了分类外,是否还应该输出位置或者特征点,制定对应的代价函数。
2) 优化流程及确认优化方向
深度学习时,一般可以把数据集分为Training set、Dev set、Test set。
Training set:一般用于训练模型。
Dev set:用于评估不同算法以及不同超参数训练出来的模型在Dev set上的效果。
Test set: 选定模型后在测试集上评估效果。
算法的优化流程一般如下:
Fit Training set well
Fit Dev set well
Fit Test set well
Perform well in real world
降低Training Set的错误率和降低Dev set的错误率有不同的优化方法,因此要先判断算法的优化方向。这个一般可以通过对比偏差与方差来做判断。
在自然感知上的问题,如计算机视觉、语音识别、自然语言处理,目前机器识别还很难超过人类专家水平。以图片分类为例,人类专家团队的水平可以做到0.3%,可以作为一个比较基准,以下是一种训练结果:
Base error:0.3%,
Training error :1.0%
Dev error: 1.1%
当 (Training error - Base error = 0.7%)超过(Dev error - Training error=0.1%)时,算法的优化方向应该去寻找降低训练误差的方法,比如增加迭代次数,找更多的数据,更深的网络等。
反之,算法的努力方向是降低方差,这时要采用dropout、正则化或者寻找新的网络结构等方法。
如果训练集和验证集错误率都很低,而实际场景使用时错误率比较高,可能就是开发集和真实场景数据不匹配问题,也就是他们的数据分布不同。这时就要想办法把更多真实数据引入到训练集和开发集中。
3)优化策略
错误分析
错误分析一般是人工进行的,方法是对错误分类的样本进行归类分析,然后改进算法,解决比例最高的那一类错误。
超参数种类及范围选择
超参数范围选择一般不会用线性坐标,而应该用对数坐标:
比如学习率的选择,我们需要将区间对数化来采样。例如我们将[0.0001,1]转化成四个区间[0.0001,0.001],[0.001,0.01],[0.01,0.1],[0.1,1],每个区间各取几个数,而不是直接在[0.0001,1]上平均做选择。
正交化思想应用
调节超参数,优化自己想改善的性能,而不会影响其他性能。
应用正交化的思想,我们可以独立地解决高偏差和高方差的问题。
解决高偏差问题的方法有:
训练更大的模型
训练更长时间 / 使用更好的优化算法(如使用动量、RMSprop、Adam 等)
调整神经网络结构(如调整网络层数、激活函数,使用 CNN、RNN 等)/ 进行超参数搜索
解决高方差问题的方法有:
获取更多数据
正则化(如 L2 正则化、Dropout 等)
调整神经网络结构 / 进行超参数搜索
迁移学习
当新的学习任务的训练样本数量不足时,可以采用迁移学习进行算法优化。
比如一个训练好的学习猫的网络,用于其他图片学习。可以把以下的红色部分去掉,创建一些新的网络,作为新的层,新创建层的参数进行随机初始化,使用新任务的数据集,重新进行训练。
迁移学习的前提条件如下:
任务 A 和任务 B 具有相同的输入 x
任务 A 的可用数据远远多于任务 B
任务 A 的低层特征有益于任务 B 的学习
4)网络模型简化
精通训练算法情况下设计层数核节点更小的网络,精度下降可接受范围。
5)网络模型压缩
这个主要以深鉴为代表,针对训练后的模型进行压缩,在边缘设备部署推理功能时降低对计算和存储的需求。神经网络压缩算法,能够在保证基本不损失算法精度的前提下,将网络模型的计算量和规模压缩数倍至数十倍。
深鉴科技网络压缩算法原理:
剪枝Pruning,发现网络中对总体结果影响不大的权重,直接去掉它们。比如直接去掉权重绝对值小于0.1的连接,再进行fine-tune
第二个步骤是利用Code Book做量化。它是说把32bit长度的浮点数压缩到8bit甚至4bit。
用霍夫曼编码的形式存储数据
---------------------
【转载】
作者:拾贝壳的大男孩
原文:https://blog.csdn.net/weixin_38712697/article/details/83475022
|
|