机器学习
建模方法
- 曲面式建模:y=f(x,w),x为输入、w为可训练参数、y为输出
- 概率式建模:p(y|x,w),代表有x和w的情况下输出y的概率
- 两种建模方式没有本质区别,可以通用。
- 大多数文献中,描述依赖和模型时都是使用概率描述。
训练方法
- 可以通过统计方式训练(KNN、贝叶斯等)
- 可以通过求取函数梯度训练(神经网络等)
- 可以通过采样方式求解(LDA)
- 通用可以通过规则变换得到(特征值分解,LU分解)
- 前两种方法没有本质区别。比如统计样本出现频率从另一个角度来说就是极大似然估计,估计过程使用了梯度、导数。
数据和处理思路
文本数据
- 文本向量化:
- 算法:ContVect等算法
- 过程:文本->统计词频等->文本稀疏矩阵
- 可以用于文本相似度比对(simhash)
- 词向量化(有顺序文本):
- 算法:WordEmbedding、Word2vec
- 过程:词->OneHot向量->乘W->降维向量(线性降维)
- 文本矩阵降维:
- 算法:非负矩阵分解(NMF)、LDA、PCA
- 过程:文本稀疏矩阵->LDA->密集矩阵、 文本密集矩阵(稀疏矩阵转化)->NMF->密集矩阵
- 举例:可将降为后密集矩阵应用于文本分类
- 可以用于文本相似度比对
- 序列文本处理:
- 算法:RNN(HMM)
- 过程:词向量化矩阵->RNN网络->具体任务
- 举例:文本分类、语句生成
- 不定长序列转化:
- 算法:Seq2Seq
- 过程:词向量化矩阵->Encoder->Decoder->词向量化矩阵->词序列
- 举例:自然语言翻译、对话机器人
一维、二维连续数据(波形、图像类型)
- 预处理和特征:
- 算法:傅里叶变换,卷积、互相关,小波变换等
- 过程:原始数据->特征变换算法->图形特征->其他变换
- 举例:使用Haar小波变换后图形+局部敏感哈希可以对比图形相似度。或者利用傅里叶变换进行滤波
- 数据压缩:
- 算法:SVD、PCA、ICA、字典学习等
- 过程:原始数据->压缩算法->降维
- 举例:使用SVD算法对图像进行压缩。
- 图像特征
- 图像关键点检测
- 拼图
- 三维空间重建
- 可以用于建筑物安全检测
- 三维建模
- 图像关键点检测
- 连续数据处理:
- 算法:一维二维三维卷积、卷积神经网络天然适合处理连续数据。
- 非均匀网格可以使用PointNet、PointConv、GraphCNN
- 过程:连续数据->卷积->预期输出
- 举例:人脸识别、语音识别
二维非连续数据(表格类型)
-
有缺失数据:
- 算法1:特征工程
- 过程1:填补缺失值->预期输出
- 算法2:贝叶斯等算法
- 过程2:缺失数据->贝叶斯算法->预期输出
-
特征过多:
- 算法:特征选择、降维、正则化
- 过程1:原始数据->特征选择->分类
- 过程2:原始数据->降维->分类
-
对于二维表格类型数据来说可能传统机器学习算法更加合适。
-
如果需要使用多层神经网络记得数据去均值等处理。
学习流程
step1:定义需求、确定问题->需要有将实际问题抽象化的能力
step2:准备数据、了解数据->需要会做特征工程与数据处理能力
setp3:选择算法->需要具备根据数据选择算法能力、以及算法调优能力
setp4:算法调优->使得算法具备良好性能和可扩展性
step5:模型部署->解决实际问题(需要时间累积)
传统ML算法
- 有监督学习
- SVM:约束最优化问题
- 对偶问题
- 松弛边界
- 朴素贝叶斯
- 基础是变量间是独立的
- 逻辑回归是分类算法
- 集成学习类
- Bagging
- Boosting
- Stacking
- 回归
- 线性回归
- 鲁棒线性回归:huberloss
- 加入不同正则化
- 支持向量机回归
- 神经网络回归
- 二阶优化方法
- 牛顿法
- 拟牛顿法
- 线性回归
- 一阶优化算法
- 随机梯度下降法
- RMSProp
- Adam
- 极大似然估计
- 从概率角度建模的
- SVM:约束最优化问题
- 无监督学习
- 带隐藏变量的极大似然估计
- 如何求证据下界
- EM算法
- 知道原理 **
- 聚类算法
- 记忆Kmeans,高斯混合模型
- 层次聚类等属于了解 **
- 降维
- 线性降维
- PCA
- LDA:文本降维
- 了解ICA,DL
- 流形
- TSNE:主要用于做可视化 **
- 稀疏自编码器
- 线性降维
- 带隐藏变量的极大似然估计
深度学习
超参数选取
- 一般而言学习率比DropOut、正则化参数更加重要。很多时候网络不收敛应该考虑减少学习率。
- 现在这个学习阶段,可以不考虑预热。
- 学习率选取可以以10的倍数选择。
- 学习率很少看到1以上的取值。其可以随着迭代过程逐渐减少。而且当loss不变的时候可以考虑减少学习率实验。
- 做数据和模型时避免出现Nan。
- 可以考虑使用小的BatchSize(比如32),一方面可以减少内存和时间消耗,另一方面性能没有明显下降。
- dropout取值0.5左右比较合适。
- 要保证训练过程中样本均衡。
- 绝大部分情况下,样本是非均衡的
- 给非均匀样本进行加权
- FocalLoss=(1-p)^\alpha log 1/p
- 图形处理中kernel一般选择3*3大小卷积核心,多加层数。
- 有了深度可分离卷积后,可以使用5*5的卷积核心增大感受野
- 卷积神经网络可以使用ReLU(ReLU6)增加计算速度
- 当然也可以考虑Inception+ResNet优化。
- ReLU+BatchNrom。
- BN层在推断的过程中需要调整参数
- Adam优化器可以考虑。
- xavier初始化可以考虑。
- 通过初始化参数,使得正向传播的方差不变
- 可以通过BN解决
- 推断过程BN层与Conv层融合
- 与选择初始化参数等价
- 如果网络30层还不能解决问题那么很有可能继续增加深度也无济于是。
- 现在这个学习阶段,慎重增加层数
- 深度神经网络应当参考现有模型
- 池化层可能使得网络性能降低。
- Inception,池化层(平均池化)用于提取低频特征
- 词Embedding可以选择128。
- 全连接层数量超过w量级的基本没见过。
- VGG:4096*4096
- 全连接层需要较多的可训练参数
- 在卷积层中难以提升精度
- 决定卷积神经网络精度,主要在于Conv结构
- 可以考虑恰当的可视化方式来观察训练。
- 达到相同性能FC、CNN几乎总是比循环神经网络好训练。
- 相同可训练参数CNN比RNN要快(10倍)
- RNN比较容易获得文本特征
- CNN更加容易量化
- 循环神经网络梯度容易出现问题,可以限制梯度大小(梯度截断,不超过某个阈值)。现在这个学习阶段,不需要复杂处理,可以调整学习率。
- 测试网络时可以选择小样本集进行测试。
- 神经网络结构是可以通用的。
- 统计可训练参数数量可预估时间。
- 一般情况要求神经网络样本数量几倍于可训练参数数量。
- 查文献寻找可行方法。
- 不断的实践,积累经验
参数调优
-
对于学习率选取,开始迭代可以使用较小的学习率进行预热。
-
之后训练过程使用正常学习率,在收敛过程中逐步减少学习率。
-
如果网络不收敛可以尝试使用更小的学习率。
-
建议使用Adam算法,其对超参数鲁棒性较强。其默认学习率是1e-3
-
网络依然不收敛怎么办?80%都是数据问题,20%是网络过深
- 方向1:尝试查看数据和标签读取是否有问题
- 表现为精度与随机情况接近
- 假设10类,精度10%。
- 方向2:模型是否合理
- 表现为精度有所提升,但最终精度并不高
- 从随机的10%到15%
- 是否网络过深,导致难以训练,出现梯度消失
- 是否加入了BatchNorm
- 是否丢失重要特征
- 可能DropOut过大,很少,不可以和BatchNorm混用
- 表现为精度有所提升,但最终精度并不高
- 方向1:尝试查看数据和标签读取是否有问题
-
训练到一定程度精度突然降低
- 表现为精度从一个较高的数值降低到较低的数值
- 需考虑学习率是否逐渐减少,尝试减小学习率
- 出现除0问题
- 最可能的是数据问题,预处理中除0,使得网络全为Nan。
- 建议保存模型中保存一个最优解
- BatchNorm也可能出现除以0的问题。
- epsilon选择过小,导致16位精度计算过程中出现除以0
-
一般而言学习率比DropOut更加重要。
- 测试时可以将DropOut的比例设置为1。
- 如果DropOut设置比较小那么网络可能不收敛。
- 通常用于全连接层中。
-
正则化可以有效的避免过拟合问题。
- 如果正则化选择比较大,那么网络可能不收敛。
- 其可以减少网络过拟合风险。
-
BatchNorm(BN)操作
- 现在的网中成为了一个标准的操作
- 其可以用于卷积层中
- 可以避免过拟合,并加快训练速度。
- BN是放在激活函数前。
-
BATCHSIZE(BS)大小问题
- 主要看自身硬件情况,可选择32~512
- 自然语言处理中可以适当减少BS
- 图像处理中BS中每类数据的概率是相同的(相当于样本均衡)
- 图像处理中BS比自然语言处理中可以大一些
- 建议测试网络过程中选择适当的BS
-
图形处理中kernel可以选择33大小卷积核心,多加层数,来自于VGG的经验。使用MobileNet可以使用55的Kernel。
-
xavier, he初始化可以考虑。在有了BN后初始化影响较小。
-
如果网络30层还不能解决问题那么很有可能继续增加深度也无济于是。也就是测试过程中过深网络可能更加难以训练。
-
池化层可能使得网络性能降低。但是Inception中的池化思路不同。
-
全连接层数量超过w量级的基本没见过。
-
可以考虑恰当的可视化方式来观察训练。
-
倾向于使用全连接、卷积网络代替RNN。
-
统计可训练参数数量可预估时间。
-
查文献寻找可行方法。
-
不断的实践,积累经验
-
可视化:sklearn:TSNE -> 比PCA效果好
模型层次关系
基础计算结构
- 矩阵运算模块(BLAS、FBGEMM)
- 激活函数模块
- 量化模块(FBGEMM)
基础模型结构:1~3维
- 普通卷积
- 深度可分离卷积
- 转置卷积/反卷积
- 空洞卷积
基础模型
- Inception(GoogleNet)
- ResNet
- DenseNet
应用模型
- 物体检测
- 机器翻译
- 图像超分辨率采样
- 图像去噪
- 图像生成
- 图像分割
- 视频帧生成
DL学习算法
基本结构
- 全连接网络:FC
- 卷积神经网络:CNN
- 循环神经网络:RNN
- 激活函数
高层结构
- 分类模型
- CNN+FC:图像分类,人脸识别
- RNN+FC:文本分类,文本生成
- 卷积+反卷积
- RNN+RNN:seq2seq
- 优化结构
- BatchNorm
- DropOut
- Inception
- ResNet
- Skip connection **
损失函数
- 用来回归的
- 均方误差MSE
- 绝对值
- huber loss
- 用来做分类的
- 交叉熵
- hinge loss
- 其他
- sequence loss
- ctc loss
- center loss
- margin loss
常用库
- TensorFlow
- 2.0以上版本最大特点Bug多
- 建议2.0版本以PyTorch
- PyTorch
- 1.7版,量化功能需要完善
- 与TF2.0版本类似
- 动态计算图
网友评论