ML+DL学习经验知识总结

机器学习

建模方法

  • 曲面式建模: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
    • 极大似然估计
      • 从概率角度建模的
  • 无监督学习
    • 带隐藏变量的极大似然估计
      • 如何求证据下界
    • 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混用
  • 训练到一定程度精度突然降低

    • 表现为精度从一个较高的数值降低到较低的数值
    • 需考虑学习率是否逐渐减少,尝试减小学习率
    • 出现除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版本类似
    • 动态计算图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容