工程实践问题概述
参考书籍《机器学习与应用》——雷明
实现细节问题
一、训练样本
对训练样本的优化:增加样本的数量和代表性,可以通过采集更多的训练样本以及对样本进行增广得到。
样本的标注对算法的精度至关重要。
对于图像、声音类样本,样本的对齐也是需要考虑的问题。
在实际应用中出现各个类的训练样本不均衡问题,解决方法:
1.对数量少的样本进行增广,增加样本数。
2.采用抽样的方法从各个类抽取数量大致相等的样本。
3.为损失函数加上类权重,样本数少的类权重大,样本数大的类权重小。(贝叶斯分类器、支持向量机、AdaBoost算法、神经网络等均支持)
二、特征预处理
当特征向量各分量的取值范围相差很大,会影响算法的精度:
小的特征值被大的特征值淹没
在计算时也可能会出现浮点数的溢出
解决方案:
1.数据归一化到某一具体区间(常常是[0,1])
2.使用方差和均值进行归一化
3.将特征向量特征化到单位长度,将向量的每个分量除以向量的模
三、模型选择
集思广益,善于参考他人
计算精度:没有免费午餐定理,一般选用精度高的算法
计算成本:首先满足精度;同等性能的前提下选择简单的模型。
四、过拟合问题
有监督学习算法使用时均需要面对的问题。
解决方法:
1.加入惩罚项
正则化的具体实现——决策树的剪枝、神经网络训练中的Dropout机制
2.提前终止
安全性问题
对于深度神经网络和其他机器学习算法,都可以通过将一个输入样本x进行细微调整,得到一个人无法察觉到变化的样本α,分类器会对α做出错误的预测结果。α被叫做对抗样本。
一、对抗样本
即使是对图像进行非常细微的随机扰动,也可导致图像被以很高的执行度错分类->神经网络拟合出来的目标函数不连续->极易被攻击
在一个网络上寻找到的这种对抗样本在其他网络上也是有效的,即具有迁移特性。
人工生成对抗样本的方法:
1.分析网络所表示的映射函数
2.遗传算法+梯度下降法
二、形成原因分析
线性样本:如果线性模型的维数很高,会出现对抗样本问题
ReLU等激活函数的网络由于激活函数的线性或者近似线性,从而也容易出现对抗样本问题。
使用sigmoid激活函数的神经网络如果激活函数值大部分都落在不饱和区间(不饱和区间的函数近似线性),也会出现类似的问题。
如果随机对图像做一个微小的扰动,一般来说不会导致它被神经网络错分类。
对抗样本的数量有多少?
对抗样本大量存在。
实现成本问题
一、训练样本量
如何降低样本的标注量?
1.人工标注训练样本
2.对偶学习的方法解决机器翻译的训练样本问题
3.小样本的深度学习技术
迁移学习(使用其他问题上的训练样本训练模型,再用本问题上的少量样本进行调优)、数据增广技术、One-shot学习技术
4.半监督学习
针对大量未标注但已经采集的样本
二、计算与存储成本
存储空间上的改进:压缩模型
计算量的增加:
1.运行在服务端的模型可以通过GPU、分布式等并行计算技术进行加速
2.运行在移动端和嵌入式系统中的模型由于成本等因素的限制,可以采用并行计算,对算法和模型本身进行剪裁或者优化
深度模型优化
减少存储空间和计算量的一种方法是对神经网络的模型进行压缩,以下是一些实现方法:
一、剪枝和编码
过程概述:
1.剪枝->剪枝后的权重组成的稀疏矩阵存储
2.量化编码和权重共享(让多个权值共享一个值)
对权值使用聚类实现(k-means),属于这个组的权重值用类中心值代替。
类中心的初始化:
随机初始化、密度分布初始化、线性初始化(效果相对较好)
为了进行反向传播,对梯度矩阵也要进行量化编码和共享。训练时,每次迭代只需要将权重矩阵减掉学习因子和梯度矩阵的乘积即可。
3.对权重进行哈夫曼编码
二、二值化网络
将网络的权重由浮点数转换为定点数甚至是二值数据可以大幅度地提高计算的速度,减少模型的存储空间。
二值(1和-1)神经网络
三、卷积核分离
将一个卷积核拆分成多个简单的卷积核实现(一般是更低维的卷积核),用简单的卷积核一次对数据进行卷积在效果上等同于标准的卷积。