ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[半监督学习] Temporal Ensembling for Semi-Supervised Learning

2022-01-24 17:34:04  阅读:289  来源: 互联网

标签:Ensembling 训练 Semi Temporal ensembling tilde theta model Pi


self-ensembling

self-ensembling 即自集成, 自己集成自己. 对于神经网络来说, 一个样本如果多次送入网络, 能够产生多个模型预测结果, 这些结果可以进行融合, 同时在不同的 batch 训练之后, 模型的参数也会发生变化, 参数可以进行融合, 因此, self-ensembling 的套路在于集成模型预测结果或者模型参数.

论文中提出两种自集成的实现: Π \Pi Π-model, Temporal ensembling

文中符号定义如下:

  • N N N 为训练集大小.
  • M M M 为带标签的样本个数.
  • { x i } i = 1 N \{x_i\}_{i=1}^N {xi​}i=1N​ 为训练集中的每个样本 .
  • L L L 为每个样本的索引集合, 且 ∣ L ∣ = M \vert L \vert =M ∣L∣=M.
  • 对于每个 i ∈ L i \in L i∈L, 对应一个正确的标签 y i ∈ { 1 , … , C } y_i \in \{1,\dots,C\} yi​∈{1,…,C}, C C C 为不同类别的数量.
  • w ( t ) w(t) w(t) 为无监督权重 ramp-up 函数.
  • f θ ( x ) f_\theta(x) fθ​(x) 为具有可训练参数 θ \theta θ 的随机神经网络.
  • g ( x ) g(x) g(x) 为随机输入增强函数.
  • α \alpha α 为 ensembling momentum.

Π \Pi Π-model

在每个 epoch, 对于每个训练输入 x i x_i xi​ 进行两次评估, 从而得到预测向量 z i z_i zi​ 和 z ~ i \tilde{z}_i z~i​. 损失函数由两个部分组成: 1.标准交叉熵损失, 仅针对标记输入进行评估. 2.对所有输入进行评估, 取预测向量 z i z_i zi​ 和 z ~ i \tilde{z}_i z~i​ 之间的均方差. 为了结合监督和非监督损失项, 在之后通过加权函数 w ( t ) w(t) w(t) 进行缩放操作.

Π \Pi Π-model 模型如下图所示:
在这里插入图片描述
需要注意的是, 由于 dropout 正则化, 训练期间的网络输出是一个随机变量. 因此, 在相同网络权重 θ \theta θ 下对相同输入 x i x_i xi​ 的两次评估会产生不同的结果. 此外, 高斯噪声和诸如随机平移之类的增强被评估了两次, 从而产生了额外的变化. 这些效果的组合解释了预测向量 z i z_i zi​ 和 z ~ i \tilde{z}_i z~i​ 之间的差异. 鉴于原始输入 x i x_i xi​ 相同, 这种差异可以看作是分类错误, 因此最小化它是一个合理的目标.

Π \Pi Π-model 算法流程如下图所示:
在这里插入图片描述
循环当前mini-batch B B B 中的所有 x i x_i xi​:

  • 1.计算两次 augmentation 后的值, 分别为 z i z_i zi​ 和 z ~ i \tilde{z}_i z~i​.
  • 2.使用损失函数 l o s s loss loss 对参数 θ \theta θ 进行更新.
  • 重复1,2直到退出循环. 最终得到学习完成的参数 θ \theta θ.

在此实现中, 无监督损失加权函数 w ( t ) w(t) w(t) 从零开始 ramp-up, 这个权重随时间变化而变化, 即 time-dependent. 其在前 80 个 epoch 中沿着高斯曲线上升. 同时文中发现 ramp-up 的上升速度要足够慢才行, 不然, 网络很容易陷入退化的解, 无法获得有意义的数据分类.

下面代码来自 mean-teacher 中的 ramp-down 策略

def cosine_rampdown(current, rampdown_length):
    """Cosine rampdown from https://arxiv.org/abs/1608.03983"""
    assert 0 <= current <= rampdown_length
    return float(.5 * (np.cos(np.pi * current / rampdown_length) + 1))

Temporal ensembling

在这里插入图片描述
首先对训练集进行一次分类而不更新权重 θ \theta θ, 然后使用刚刚获得的预测作为目标, 在不同的增强和 dropout 下在相同的输入上训练网络. 这时, 每个样本在每个 epoch 只通过了一次增强和一次评估, 比 Π \Pi Π-model 的速度快2倍.
在这里插入图片描述

  • 1.初始化 Z Z Z, z ~ \tilde{z} z~, 分别为 N × C N \times C N×C 的预测结果矩阵和目标向量.
  • 2.在每个 epoch t 中, 对每个 mini-batch B B B 执行:
    • 评估增强输入的网络输出 z i ∈ B z_{i \in B} zi∈B​.
    • 使用损失函数 l o s s loss loss 对参数 θ \theta θ 进行更新.
  • 3.通过指数滑动平均(EMA)更新 Z ← α Z + ( 1 − α ) z Z \gets \alpha Z+(1-\alpha)z Z←αZ+(1−α)z.
  • 4.通过偏差校正目标向量 z ~ ← Z / ( 1 − α t ) \tilde{z} \gets Z/(1-\alpha^t) z~←Z/(1−αt).
  • 循环结束后获得最终参数 θ \theta θ.

与 Π \Pi Π-model 相比, Temporal Ensembling 根据优势. 首先, 训练速度更快, 因为在每个 epoch 的每个输入中只对网络进行一次评估. 其次, 训练目标 z ~ \tilde{z} z~ 比 Π \Pi Π-model 的噪声要小.

代码地址: https://github.com/s-laine/tempens

标签:Ensembling,训练,Semi,Temporal,ensembling,tilde,theta,model,Pi
来源: https://blog.csdn.net/by6671715/article/details/122667631

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有