模型训练trick篇

损失函数

分类任务

  • 0-1损失函数
  • 绝对值损失函数,
  • 指数损失函数exponenetial loss,,例如adaboost
  • 感知损失函数perceptron loss,,
  • 合并损失函数Hinge loss,,例如SVM
  • 交叉熵损失函数crossEntropy,也是负的对数似然函数
    • 怎么从最大似然推导?“已知输出Y,假设Y的分布,对Y的分布参数进行似然估计”。先写出预测值为y的概率表达式,假设多个样本独立同分布,则最大似然估计为,然后去负的对数似然即可。
    • 二分类loss:,其中x表示样本,y表示实际的标签,a表示预测的输出,n表示样本总数。假设为伯努利输出分布
    • 多分类loss: 。广义伯努利输出分布
    • 这里输出a的输出单元一般用softmax或sigmoid函数。
    • 交叉熵越低,就证明有算法所算出的非真实分布越接近真实分布。

例如,对于“一枚正反对称的硬币上抛十次”这种事件,我们可以问硬币落地时十次都是正面向上的“概率”是多少;而对于“一枚硬币上抛十次,落地都是正面向上”这种事件,我们则可以问,这枚硬币正反面对称的“似然”程度是多少。
在机器学习中,损失函数一般使用的是负对数似然,这里的对数似然指的是在已知输出Y的情况下,对Y的分布参数进行似然估计,估计的参数与输入X有关。–>
优点:在计算梯度的时候,差异越大,梯度越大,学习越快。

回归任务

  • MSE 均方误差
  • RMSE 均方根误差

分类任务的损失函数能不能用平方损失函数?当使用sigmoid作为激活函数的时候,一般用交叉熵损失函数而不用均方误差损失函数。
不能,当输出单元使用sigmoid函数的时候。平方损失函数对某一个样本点的参数的导数为,其中是sigmoid函数的导数,在达到饱和状态时,导数值会接近0,使得梯度下降很慢。而log损失函数对某一个样本点的参数的导数是,与sigmoid导数无关。

优化算法

给定一个与参数有关的目标函数,求使得目标函数最小的参数。梯度下降通过不断往梯度的负方向移动参数来求解。

  • batch gradient descent (BGD)
    • 需要计算整个训练集的梯度。优点:凸函数可以找到全局最优;非凸函数可以找到一个局部最优。缺点:速度慢,数据量大时不可行
  • stochastic gradient descent (SGD)
    • 仅计算某个样本的梯度。优点:更新频次快,优化速度快,一定的随机性导致有几率跳出局部最优。缺点:随机性导致收敛复杂化,即使到达最优点仍旧会进行过度优化
  • mini-batch gradient descent (MBGD)
    • 计算包含n个样本的mini-batch的梯度。优点:参数更新的动荡变小,收敛过程更稳定,可以利用现有的线性代数库高效的计算多个样本的梯度。缺点:无法保证一个最优解。容易遇到“鞍点”,这个时候四周梯度都是0,很难跳出。
      现在在深度学习中用到的SGD其实就是这里的MBGD,使用这个策略时我们还需要考虑以下因素:
  1. 如何选择合适的学习率,学习率如何调整?【引入动量】
  2. 对所有参数的更新采用相同的学习率是否恰当?【自适应学习率优化算法就是让学习率根据累加和自动调整】
  3. 如何跳出局部最优? 【动量使得虽然当前梯度为0,但累加动量并不为0,所以继续学习】

基于以上问题,提出的梯度下降优化算法:
固定学习率

  1. momentum
  2. 优点:动量的引入是为了加速SGD的优化过程,对方向一致的参数能够加速学习,对梯度改变方向的参数能够减少其更新。
  3. 缺点:比较难学习一个较好的学习率。
  4. Nesterov accelerated gradient
  5. 改进:通过去看前方的梯度,实现快到达时进行减速。
    自适应学习率
  6. Adagrad
  7. ,其中为t时刻前所有施加到参数上的梯度的平方和。
  8. 优点:为出现频率不高的参数提供一个大学习率,为经常出现的参数提供一个小的学习率。
  9. 缺点:因为累计梯度增加,最后学习率过低而学不到东西。
  10. adadelta
  11. 优点:将adagrad中的累积平方和改为一个窗口范围内的梯度平方之和。
  12. RMSprop
  13. 优点:改进了Adagrad在深度学习中过早结束的问题;2.适用于处理非平稳。
  14. 缺点:
  15. Adam
  16. momentum+rmsprop,每一次梯度是之间的均值,且被历史值惩罚系数。另外做了一个偏差纠正,在最开始训练的时候纠正均值的计算。
  17. 本质上是带有动量项的RMSprop,它利用梯度的一阶矩和二阶矩动态的调整每个参数的learning rate(自适应learning rate)。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。

评估指标

一、分类问题的离线评估
精确率precision:分类正确的正样本个数占分类器判定为正样本的样本个数的比例
召回率recall:分类正确的正样本个数占真正的正样本个数的比例
F1指标: 精确率和召回率的调和平均值
P-R曲线:横轴为recall召回率,纵轴为precision精确率画图。此消彼长,负相关
ROC曲线:将所有样本按照预测为正例的概率排序,最有可能可能为正例的排在最前面,按照此顺序将样本作为正例进行预测,则每次都可以得到一个假正例率FPR和真正例率TPR,前者为横轴,后者为纵轴画图得到的就是ROC曲线。

  • 假正例率:假正例占所有假例的比例(横轴)。 物理意义是:随机拿一个没有被点击过的样本,有多大概率会把他预测为点击样本。
  • 真正例率:真正例占所有正例的比例(纵轴)。物理意义是:随机拿一个被点击过的样本,有多大概率会把他预测为点击样本。
  • auc的概率意义:随机选择一个正例和一个负例,分类器给正例的打分大于给负例打分的概率
  • auc的统计算法:将所有样本按照预测概率进行逆序排序,正例在负例前面的pair对占全部pair对的比例。
    使用auc作为评价指标的好处是它避免了对阈值的考虑,能够反映分类器整体的泛化性能,另外它对样本类别是否均衡并不敏感。ROC曲线有一个特点,当正负样本的分布发生变化时,ROC曲线的形状 能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化。若选择不同的测试集,P-R曲线的变化就会非常大,而ROC曲线则 能够更加稳定地反映模型本身的好坏。所以,ROC曲线的适用场景更多,被广泛 用于排序、推荐、广告等领域。但需要注意的是,选择P-R曲线还是ROC曲线是因 实际问题而异的,如果研究者希望更多地看到模型在特定数据集上的表现,P-R曲线则能够更直观地反映其性能。

二、排序问题
NDCG 通常用来衡量和评价搜索结果算法。

其中i表示排序位置,表示第i个位置上的相关度。因此rel_i越高得分越高,越高的rel_i对应越小的i得分越高。

数据处理

1.负样本的选择
分类:简单样本:即模型非常容易做出正确的判断;困难样本:即模型难以做出正确的判断,训练时常会给模型带来较大损失。相对于简单样本,困难样本更有价值,它有助于模型快速学习到边界,也加快了模型的收敛。
基于统计度量的负样本选择方法,例如选择和目标样本集合相似度较高的样本作为负例。
基于模型的负样本选择方法,用训练好的模型预测所有的负样本,找出预测错的或者产生较大loss的样本作为优质负样本,然后再去训练模型,不断迭代优化模型。

2.为什么要做归一化
一个是为了加快模型训练的收敛速度,因为梯度的方向和等高线的切线是垂直的,圆形的等高线能够使梯度下降算法有最少的迭代步数到达函数最低点,而椭圆形的等高线收敛更慢;另一个原因是避免输出位于输出函数例如sigmoid的饱和区,做归一化能够更大程度避免这种情况。

为什么要做normalization?
在深度模型中,因为有多层隐藏层,每一层的参数更新都会导致上层的输入数据在输出时分布规律发生了变化,并且这个差异会随着网络深度增大而增大,这样会导致每个神经元的输入数据不再是独立同分布的了。那么:

  1. 上层参数需要不断适应新的输入数据分布,降低学习速度;
  2. 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区。反向传播时低层神经网络的参数更新会出现梯度消失。
    batch normalization和layer normalization的区别?
    BN是对batch内所有样本的同一维度特征做归一化,LN是对这单个样本的所有维度特征做归一化。
    为什么在NLP中多用LN而不是BN?
    首先讲什么时候不适合用BN。1.mini-batch较小的情况下不太适用;2.BN无法应用在RNN中,因为不同句子的同一位置的分布大概率是不同的,因此应用BN来约束是没有意义的。
    具体而言,BN就是在每个维度上统计所有样本的值,计算均值和方差;LN就是在每个样本上统计所有维度的值,计算均值和方差。
    另一种解释:NLP通过LN对整个高维球体语义空间内进行了0均值1方差的约束。

模型结构

1.激活函数
作用:增加网络的非线形表达能力。
激活单元又分为隐藏单元和输出单元,隐藏单元:tanh、relu;输出单元:sigmoid、softmax

  • sigmoid函数: 输出范围在0~1之间,适合做输出单元,缺点:1. 输出不是以0为中心,所以会降低权重更新的效率;2. [-6,6]之间梯度可求,其他范围梯度为0,参数更新慢
  • tanh函数: 输出在-1~1之间,这与大多数场景下特征分布是0中心的吻合,并且tanh函数在输入0附近相比sigmoid函数有更大的梯度,通常使模型收敛更快。
  • relu函数: 。优点:1. 计算高效简单;2. 当输入为正时,不存在梯度消息和梯度爆炸问题;3.更符合生物学神经激活机制。缺点:1. relu可能会死亡,不再更新梯度;2.relu的输出是非零中心化的,给后一层的神经网络引入偏置偏移, 会影响梯度下降的效率。针对死神经元的改进方法:1.初始化参数用Xavier初始化方法;2.避免将learning rate设置太大,使用adam动态调整learning rate;3.换成其他relu,例如leaky relu。
  • leaky Relu: 。优点:不会出现死神经元的情况。
    输出单元中,二分类多使用sigmoid,多分类则多使用softmax函数。以softmax为决策函数,交叉熵函数为损失函数的时候,计算损失函数对最后一层参数w的导数会非常方便。
    激活单元首选Relu

2.dropout
在每一次迭代训练中随机的隐藏一定概率的隐藏单元,因此每一次迭代的模型都是不同的,每一个神经元都不能多度依赖于另一个神经元,因此增强了模型的鲁棒性。
在测试过程中,将dropout的参数p乘以输出。

3.模型参数可以初始化为同样的值吗?
不能。因为此时隐藏层中各单元呈对称性,在计算梯度下降时,各单元也呈对称性,那么多个隐藏单元在做相同的事情,多个隐藏单元没有意义。因此在初始化参数的时候,应该随机初始化为比较小的值。

训练方法

  1. batch size怎么定?
    大的batch size能够减少训练时间,同时提高梯度计算的稳定性。
    在同一批训练数据下,batch size增加N倍,学习率对应增加N倍,保证同样的样本更新后的权重相等。

  2. 防止过拟合

  3. 数据集:增加数据;数据增强,例如词典替换,反向翻译

  4. 模型:

    • 更简单的模型,例如层数更少
  • dropout
  • L1、L2正则:带约束条件的凸优化问题,L1正则倾向于产生稀疏向量,用于特征选择;L2正则即权重衰减
  • 参数共享-albert
  • early stopping:当迭代到一定次数时(参数w比较大时),就提前结束训练
  1. 集成方式:bagging

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-28 06:06:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-28 06:06:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-28 06:06:03       82 阅读
  4. Python语言-面向对象

    2024-01-28 06:06:03       91 阅读

热门阅读

  1. MySQL封装JDBC为工具类(JDBC简化)

    2024-01-28 06:06:03       57 阅读
  2. MySQL 函数参考手册(MySQL 字符串函数)

    2024-01-28 06:06:03       43 阅读
  3. 中科大--高级数据库期末试卷

    2024-01-28 06:06:03       58 阅读
  4. MySQL 函数参考手册(MySQL 数值函数)

    2024-01-28 06:06:03       35 阅读
  5. mysql数据库的备份和恢复

    2024-01-28 06:06:03       54 阅读
  6. 基础算法--搜索与图论(2)

    2024-01-28 06:06:03       37 阅读
  7. 图论第一天|797.所有可能的路径 200. 岛屿数量

    2024-01-28 06:06:03       67 阅读
  8. vue项目使用element-plus

    2024-01-28 06:06:03       50 阅读
  9. 题记(32)--矩阵K次幂

    2024-01-28 06:06:03       51 阅读
  10. 【LeetCode-435】无重叠区间(贪心)

    2024-01-28 06:06:03       59 阅读
  11. el-tree实现多选、反选、指定选择

    2024-01-28 06:06:03       54 阅读
  12. Compose | UI组件(五) | Button 按钮组件

    2024-01-28 06:06:03       52 阅读
  13. 73. 矩阵置零

    2024-01-28 06:06:03       53 阅读
  14. 解析dapp:铸造虚拟钱包新概念

    2024-01-28 06:06:03       50 阅读