Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks学习笔记

本文主要是介绍Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Pseduo-Label

  • 伪标签的介绍
  • 论文介绍
    • 核心思想
    • 相关流程
    • 相关函数
      • Denoising Auto-Encoder
      • 模型整体的目标函数
  • 伪标签有效的原因
    • 类间的低密度分离
    • 熵正则化
  • 实验结果
  • 读后感
    • 思考
    • 存在不足

论文地址:Pseduo-Label
从DAFomer溯源到的论文

伪标签的介绍

伪标签的介绍可以参考:伪标签(Pseudo-Labelling)——锋利的匕首,详细介绍了什么是伪标签方法以及伪标签方法的分类,本论文用到的方法就是上文中的 创新版伪标签的方法(将没有标签的数据的损失函数也加入进来,就是最后公式后边那一坨,具体如下图)
在这里插入图片描述

论文介绍

核心思想

Pseudo-Label 模型作为一个简单、有效的半监督学习方法早在 2013年就被提出,其核心思想包括两步:

  • 第一步:运用训练出的模型给予无标签的数据一个伪标签。方法很直接:用训练中的模型对无标签数据进行预测,以概率最高的类别作为无标签数据的伪标签
  • 第二步:运用 entropy regularization(熵正则化化) 思想,将无监督数据转为目标函数的正则项(如下文公式)。实际中,就是将拥有伪标签的无标签数据视为有标签的数据,然后用交叉熵来评估误差大小

相关流程

使用有标签数据和无标签数据同时以有监督的方式训练预训练网络。对于无标签的数据,在每次权值更新时重新计算的伪标签,被用于与监督学习任务相同的损失函数计算(即每次权值更新时,都重新计算伪标签,并将该伪标签当作真是标签用于计算损失函数)。

相关函数

Denoising Auto-Encoder

去噪自动编码器是一种无监督学习算法,基于使学习的表示对输入模式的部分破坏具有鲁棒性的思想。该方法可以用于训练自动编码器,这些微分代数方程组(DAE)可以堆叠起来初始化深度神经网络:

h i = s ( ∑ j = 1 d v W i j x ~ j + b i ) h_i=s(\sum_{j=1}^{d_v}W_{ij}\tilde x_j+b_i) hi=s(j=1dvWijx~j+bi)
x ^ j = s ( ∑ i = 1 d h W i j h i + a j ) \widehat x_j=s(\sum_{i=1}^{d_h} W_{ij}h_i+a_j) x j=s(i=1dhWijhi+aj)
x ~ j \tilde x_j x~j是第 j 个输入值的损坏版本
x ^ j \widehat x_j x j是第 j 个输入值的重构

自动编码训练在于最小化 x j x_j xj x ^ j \widehat x_j x j重构误差(error)。对于二分类输入值,常用的重构误差选择是交叉熵:
L ( x , x ^ ) = ∑ j = 1 d v − x j l o g x ^ j − ( 1 − x j ) l o g ( 1 − x ^ j ) L(x,\widehat x)=\sum_{j=1}^{d_v}-x_jlog \widehat x_j-(1-x_j)log(1-\widehat x_j) L(x,x )=j=1dvxjlogx j(1xj)log(1x j)

模型整体的目标函数

y i ′ = { 1 , if  i = a r g m a x i ′ f i ′ ( x ) 0 , otherwise y_i'= \begin{cases} 1, & \text{if $i=argmax_{i'}f_{i'}(x)$} \\[2ex] 0, & \text{otherwise} \end{cases} yi= 1,0,if i=argmaxifi(x)otherwise

L公式左边是评估有标签数据的误差交叉熵,右边是评估伪标签数据的误差交叉熵

L = 1 n ∑ m = 1 n ∑ i = 1 C L ( y i m , f i m ) + α ( t ) 1 n ′ ∑ m = 1 n ′ ∑ i = 1 C L ( y i ′ m , f i ′ m ) L=\frac{1}{n}\sum_{m=1}^n\sum_{i=1}^C L(y_i^m,f_i^m)+\alpha (t)\frac{1}{n'}\sum_{m=1}^{n'}\sum_{i=1}^C L(y_i'^m, f_i'^m) L=n1m=1ni=1CL(yim,fim)+α(t)n1m=1ni=1CL(yim,fim)

n n n 是SGD中有标签数据的mini-batch大小
n ′ n' n 是SGD中无标签数据的mini-batch大小
f i m f_i^m fim 是有标签数据中 m 个样本的输出集合
y i m y_i^m yim 是有标签数据中 m 个样本的真实标签
f i ′ m f_i'^m fim 是无标签数据中 m 个样本的输出集合
y i ′ m y_i '^m yim 是无标签数据中 m 个样本的伪标签
α ( t ) \alpha(t) α(t) 是平衡它们的系数

为了平衡有标签和无标签之间的损失引入了 α ( t ) \alpha(t) α(t)
α ( t ) \alpha(t) α(t) 的合理调度对网络性能至关重要:
● 如果 α ( t ) \alpha(t) α(t) 太大,甚至对有标记数据的训练也会产生干扰
● 如果 α ( t ) \alpha(t) α(t) 太小,则无法获得来自未标签数据的好处
此外,期望通过缓慢增加 α ( t ) \alpha(t) α(t) 的确定性退火过程,来帮助优化过程,以避免较差的局部极小值,从而使无标签数据的伪标签尽可能类似于真实标签。

α ( t ) = { 0 , t < T 1 t − T 1 T 2 − T 1 α f , T 1 ≤ t < T 2 α f , T 2 ≤ t \alpha(t)= \begin{cases} 0, & \text{$t<T_1$} \\ \frac{t-T_1}{T_2-T_1}\alpha_f, & \text{$T_1\leq t < T_2$} \\ \alpha_f, & \text{$T_2 \leq t$} \end{cases} α(t)= 0,T2T1tT1αf,αf,t<T1T1t<T2T2t
α f = 3 , T 1 = 100 , T 2 = 600 \alpha_f =3, \quad T_1=100, \quad T_2=600 αf=3,T1=100,T2=600

伪标签有效的原因

类间的低密度分离

在这里插入图片描述
这个世界是非黑即白的,什么是非黑即白?

假设现在有一大堆的data,有标注数据,有非标注数据,在两个类别之间会有一个明显的鸿沟。给一些标注数据,可以把边界分在上图右边的线,也可以把边界分在上图左边的线。但是考虑非标注数据,那么左边的边界会好一点,在边界处,两个类别的密度是低的(不会出现data)。

熵正则化

熵正则化是在最大后验估计框架中受益于无标签数据的一种手段。该方案通过最小化无标签数据的类别概率的条件熵,支持类间的低密度分离,而无需对密度进行任何建模。

H ( y ∣ x ′ ) = − 1 n ′ ∑ m = 1 n ′ ∑ i = 1 C P ( y i m = 1 ∣ x ′ m ) l o g P ( y i m = 1 ∣ x ′ m ) H(y|x')=-\frac{1}{n'}\sum_{m=1}^{n'}\sum_{i=1}^{C}P(y_i^m=1|x'^m)logP(y_i^m=1|x'^m) H(yx)=n1m=1ni=1CP(yim=1∣xm)logP(yim=1∣xm)
n ′ n' n 是无标签数据的数目
C C C 是类别数目
y i m y_i^m yim是第 m 个无标签样本的未知标签
x ′ m x'^m xm 是第 m 个无标签样本的输入向量
这个熵用于度量类间的重叠。随着类间重叠的减少,决策边界上的数据点密度降低。

MAP估计被定义为后验分布的最大化:
C ( θ , λ ) = ∑ m = 1 n l o g P ( y m ∣ x m ; θ ) − λ H ( y ∣ x ′ ; θ ) C(\theta ,\lambda)=\sum_{m=1}^nlogP(y^m|x^m;\theta)-\lambda H(y|x';\theta) C(θ,λ)=m=1nlogP(ymxm;θ)λH(yx;θ)
● n 是有标签数据的数目
x m x^m xm 是第 m 个有标签样本
λ \lambda λ 是平衡两项的系数
通过最大化有标签数据的条件对数似然(第一项),并最小化无标签数据的熵(第二项),我们可以利用无标签数据获得更好的泛化性能。

就如上文相关流程中所说: pseudo label多是先用标注数据训练模型,然后在未标注样本上预测,筛选高置信的未标注样本再训练新模型,训练多轮直到模型效果不再提升,而这篇文章的实现其实是把未标注样本作为正则项的一部分。因为预测label和预测概率是相同模型给出的,因此最小化预测label的交叉熵,也就是最大化预测为1的class对应的概率值,和MinEnt直接最小化未标注样本交叉熵的操作一样。(在思考模块详细讲解个人想法)

实验结果

在实验中,研究人员用 MNIST 数据集进行了实验验证,并尝试了在有标签数据仅为100、600、1000和3000时的结果入下图所示:
在这里插入图片描述
DROPNN、PL 和 PL+DAE 分别是实验中的 baseline 模型、baseline 模型+Pseudo-Label 方法 以及 baseline 模型+Pseudo-Label 方法+ DAE 预训练方案。

这里我们主要关注Pseudo-Label 方法的效果,其结果如表中倒数第二行所示。从表中可以看出,当有标签数据仅为 600 条时,Pseudo-Label 方法相对于其他公开模型,可以达到最佳的效果。但在其他实验条件下,只能实现相对较好的表现。不过相对于 baseline,此方法在所有情况下均能实现一定的提升。有标签数据量越少,这一提升越明显。这说明 Pseudo-Label 方法确实可以在一定程度上从无标签数据中提取有效信号。

进一步,研究人员通过降维可视化的方式展示了 Pseudo-Label 模型使用前后的效果,实验数据包含 600 有标签数据 + 60000 无标签数据:
在这里插入图片描述
对比上面左右两张图可以看出来, Pseudo-Label 模型相对于单独的有监督模型,可以有效改善各类别数据在空间中的聚集密度。

读后感

思考

在这里插入图片描述
熵正则化的目的是为了让相同类别的分布更加集中,减少class overlap;而降低预测值和伪标签的交叉熵,也就是最大化预测为1(或者一个类的概率非常接近1,可以近似等于1?)的class对应的概率值,也就是让最有可能的预测结果最大,这样的话信息熵自然就很小。

存在不足

Pseudo-Label 方法只在训练时间这个维度上,采用了退火思想,即采用时变系数α(t)。而在伪标签这个维度,对于模型给予的预测标签一视同仁,这种方法在实际中存在明显问题。很显然,如果模型对于一个样本所预测的几个类别都具有相似的低概率值,如共有十个类别,每个类别的预测概率值都接近 0.1,那么再以最大概率值对应的类别作为伪标签,是不合适的,将会引入很大的错误信号。(概括一下也就是:Pseudo-Label 方法,以最大概率值对应的类别作为伪标签这个操作是不太合适的(考虑到每个类别的预测概率值都接近 0.1,每个类别的预测结果都很差))

本文内容参考如下:
伪标签(Pseudo-Labelling)——锋利的匕首

我们真的需要那么多标注数据吗?半监督学习技术近年来的发展历程及典型算法框架的演进

[论文笔记]Pseudo-Label:The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks

Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks

Pseudo-Label 代码

这篇关于Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/308466

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss