半监督学习的原理和实现方法总结(李宏毅视频课个人理解)

0 前言

本文由整理李宏毅老师视频课笔记和个人理解所得,主要讲述了半监督学习的原理及实现方法。有问题欢迎在评论区下方交流,我会及时回复。

1 有监督和半监督的概念

有监督学习: { ( x r , y ^ r } r = 1 R \left\{\left(x^{r}, \hat{y}^{r}\right\}_{r=1}^{R}\right. {(xr,y^r}r=1R 训练时用了R个带标签的样本数据,用已经标记好的数据(labelled data),用来做训练来预测新数据的类型(class)。也就是说训练的过程中不仅参考了样本信息,也参考了标签信息。

半监督学习:假设有两组数据 { ( x r , y ^ r } r = 1 R , x u = R u R + U \left\{\left(x^{r}, \hat{y}^{r}\right\}_{r=1}^{R}, x_{u=R}^{u R+U}\right. {(xr,y^r}r=1R,xu=RuR+U一组是labelled,另外一组是unlabelled。通常一般的情况是U远大于R,也就是无unlabelled的数据更多。

一般可以分为两种:

  • (直推学习)Transductive learning:无标签数据就是测试数据,没有用label,只用了feature。

  • (归纳学习)Inductive Learning不把测试集考虑进来,也就是训练数据中使用的unlabelled的数据并非测试集中的数据。
    在这里插入图片描述
    如下图,假设我们要做分类的项目,要建立一个猫和狗的分类决策面,同时有一大堆有关猫和狗的图片,蓝色和橙色是有标签的,但是大部分灰色是没有标签的。那么如果只考虑有标签数据,那么决策面会是这样:
    在这里插入图片描述
    但是这些灰色点没有标签,但是它们还是可以告诉我们一些信息,那么可能决策面就会变成:
    在这里插入图片描述
    但是可能实际的unlabelled data是均匀分布两边的,那么就很难分,一般跟unlabelled data的假设有关系。比如下图红框实际上是狗狗,只是绿色背景让它分布在这边:
    在这里插入图片描述

2 半监督学习中的生成模型

2.1 有监督的生成模型

先再讲一下监督学习中的生成模型:
在这里插入图片描述
这里实际上就是利用贝叶斯定理计算对于给定x,x属于类别的概率。当然先验分布 P ( C i ) P(C_i) P(Ci)是需要给出的,然后假设 P ( x ∣ C ) P(x|C) P(xC)服从高斯分布,因为样本是已知的,那么其 μ 1 , Σ \mu^{1}, \Sigma μ1,Σ μ 2 , Σ \mu^{2}, \Sigma μ2,Σ是固定,所以可以通过:
P ( C 1 ∣ x ) = P ( x ∣ C 1 ) P ( C 1 ) P ( x ∣ C 1 ) P ( C 1 ) + P ( x ∣ C 2 ) P ( C 2 ) P\left(C_{1} \mid x\right)=\frac{P\left(x \mid C_{1}\right) P\left(C_{1}\right)}{P\left(x \mid C_{1}\right) P\left(C_{1}\right)+P\left(x \mid C_{2}\right) P\left(C_{2}\right)} P(C1x)=P(xC1)P(C1)+P(xC2)P(C2)P(xC1)P(C1)

来计算数据属于哪个类别的概率更大。

2.2 半监督的生成模型

但是如果给了一些无标签的数据,就会影响决策。比如多的数据会影响你的均值和方差,最后影响了输出概率:
在这里插入图片描述

那么面对这个问题怎么做的呢?

  1. 初始化一组参数 θ = { P ( C 1 ) , P ( C 2 ) , μ 1 , μ 2 , Σ } 。  \theta=\left\{P\left(C_{1}\right), P\left(C_{2}\right), \mu^{1}, \mu^{2}, \Sigma\right\}_{\text {。 }} θ={P(C1),P(C2),μ1,μ2,Σ} 
  2. 计算每笔无标签数据的后验概率(posterior probability) P θ ( C 1 ∣ x u ) , x u P_{\theta}\left(C_{1} \mid x^{u}\right), x^{u} Pθ(C1xu),xu 表示无标签的数 据。
  3. 通过 N 1 + ∑ x u P ( C 1 ∣ x u ) N ( N \frac{N_{1}+\sum_{x^{u}} P\left(C_{1} \mid x^{u}\right)}{N}\left(N\right. NN1+xuP(C1xu)(N 是所有样本的数量, N 1 N_{1} N1 是被标记为 C 1 C_{1} C1 的样本数量)来更新 P ( C 1 ) P\left(C_{1}\right) P(C1) , 其中 C 1 C_{1} C1 出现的次数就是所有无标签数据属于 C 1 C_{1} C1 的概率之和。
    μ 1 = 1 N 1 ∑ x r ∈ C 1 x r + 1 ∑ x u P ( C 1 ∣ x u ) ∑ x u P ( C 1 ∣ x u ) x u … … \mu^{1}=\frac{1}{N_{1}} \sum_{x^{r} \in C_{1}} x^{r}+\frac{1}{\sum_{x^{u}} P\left(C_{1} \mid x^{u}\right)} \sum_{x^{u}} P\left(C_{1} \mid x^{u}\right) x^{u} \ldots \ldots μ1=N11xrC1xr+xuP(C1xu)1xuP(C1xu)xu
    μ 1 \mu^{1} μ1 通过上面的公式更新(等式右边第一个式子是计算所有属于 C 1 C_{1} C1 的样本的均值, 第二个式子, 如果 x u x^{u} xu 偏向于 C 1 C_{1} C1, 那么就对 P ( C 1 ) P\left(C_{1}\right) P(C1) 的影响就大一点, 反之就小一点。把它们加起来,再除以所 有 x u x_{u} xu P ( C 1 ∣ x u ) P\left(C_{1} \mid x^{u}\right) P(C1xu) 的和)。
  4. 有了新的参数后就可以回到第一步(EM算法)

在这里插入图片描述
为什么是这样?
在这里插入图片描述

  1. 假设原来只有有标签数据, 我们要做的事情是最大化似然log L ( θ ) = ∑ x r log ⁡ P θ ( x r , y ^ r ) L(\theta)=\sum_{x^{r}} \log P_{\theta}\left(x^{r}, \hat{y}^{r}\right) L(θ)=xrlogPθ(xr,y^r), 如
    果给定参数 θ \theta θ, 那么每笔训练数据的 P θ ( x r , y ^ r ) P_{\theta}\left(x^{r}, \hat{y}^{r}\right) Pθ(xr,y^r) 是可以算出来的: P θ ( x r , y ^ r ) = P_{\theta}\left(x^{r}, \hat{y}^{r}\right)= Pθ(xr,y^r)=
    P θ ( x r ∣ y ^ r ) P ( y ^ r ) P_{\theta}\left(x^{r} \mid \hat{y}^{r}\right) P\left(\hat{y}^{r}\right) Pθ(xry^r)P(y^r)
  2. 现在同时有有标签数据和无标签数据 使用log L ( θ ) = ∑ x r log ⁡ P θ ( x r , y ^ r ) + L(\theta)=\sum_{x^{r}} \log P_{\theta}\left(x^{r}, \hat{y}^{r}\right)+ L(θ)=xrlogPθ(xr,y^r)+
    ∑ x u log ⁡ P θ ( x u ) \sum_{x^{u}} \log P_{\theta}\left(x^{u}\right) xulogPθ(xu), 其中一笔无标签数据出现的几率 P θ ( x u ) = P θ ( x u ∣ C 1 ) P ( C 1 ) + P_{\theta}\left(x^{u}\right)=P_{\theta}\left(x^{u} \mid C_{1}\right) P\left(C_{1}\right)+ Pθ(xu)=Pθ(xuC1)P(C1)+
    P θ ( x u ∣ C 2 ) P ( C 2 ) P_{\theta}\left(x^{u} \mid C_{2}\right) P\left(C_{2}\right) Pθ(xuC2)P(C2) 就是 C 1 C_{1} C1 的先验概率乘以 C 1 C_{1} C1 类别产生无标签数据的概率加上 C 2 C_{2} C2 的先验概率乘 以 C 2 C_{2} C2 类别产生无标签数据的概率(全概率公式)。就是说这笔无标签数据可能从 C 1 C_{1} C1 来,也可能 从 C 2 C_{2} C2 中来, 接下来就要最大化log L ( θ ) = ∑ x r log ⁡ P θ ( x r , y ^ r ) + ∑ x u log ⁡ P θ ( x u ) L(\theta)=\sum_{x^{r}} \log P_{\theta}\left(x^{r}, \hat{y}^{r}\right)+\sum_{x^{u}} \log P_{\theta}\left(x^{u}\right) L(θ)=xrlogPθ(xr,y^r)+xulogPθ(xu)

3 低密度分隔假设

基于低密度分割(Low-density Separation),也就是非黑即白。如果有颜色的是有标签的,那么在有标签的数据中间划分决策面,那么其实两根红线都可以,但是显然低密度区域的分界比较好:
在这里插入图片描述

3.1 自训练算法(Self-training)

其中最典型的方法就是自训练算法(Self-training):

  1. 先用有标签的数据训练出一个模型。
  2. 再把这个模型应用于无标签的数据,看输出的标签是什么,这些标签称为伪标签。
  3. 从无标签的数据中拿一些数据去训练模型,再把得到的数据放回标签数据集中。

在回归上有用吗?回归就是输出数字,没标签没用。

这里用的是hard label,生成模型用的是soft label,在做自训练时我们会强制一个训练样本数据一定属于某个类别;在生成模型时输出的是概率值。
在这里插入图片描述
考虑神经网络,将一笔无标签数据喂给NN,如果是Hard那么得到的输出是[1 0],如果是Soft得到的是[0.7 0.3]。如果用Soft,那么得到的结果和经过NN的输出没有变化。就不会有用,因此在NN中是要用Hard的方法:
在这里插入图片描述

3.2 基于熵的正则化(Entropy-based Regularization)

可能会觉得只依靠概率来判定过于武断,这里考虑使用熵(Entropy)。我们希望预测概率的分布是集中的,而不是分散的,如下图,那么怎么估计这个输出概率分布是集中的还是分散的呢?
在这里插入图片描述
我们可以计算分布的熵,描述了不确定性,熵值越小代表确定性越强,也就是越集中:
E ( y u ) = − ∑ m = 1 N y m u ln ⁡ ( y m u ) E\left(y^{u}\right)=-\sum_{m=1}^{N} y_{m}^{u} \ln \left(y_{m}^{u}\right) E(yu)=m=1Nymuln(ymu)
可见上图中熵值小的都是我们需要的。 现在我们可以重新设计损失函数:

L = ∑ x r C ( y r , y ^ r )  labelled   data  + λ ∑ x u E ( y u )  unlabeled   data  \begin{aligned} L &=\sum_{x^{r}} C\left(y^{r}, \hat{y}^{r}\right) & \begin{array}{c} \text { labelled } \\ \text { data } \end{array} \\ &+\lambda \sum_{x^{u}} E\left(y^{u}\right) & \begin{array}{c} \text { unlabeled } \\ \text { data } \end{array} \end{aligned} L=xrC(yr,y^r)+λxuE(yu) labelled  data  unlabeled  data 
对于有标签数据集可以使用常用的损失函数,而对于无标签数据集,可以加入计算熵值的项,熵值越小越好。

3.3 半监督的SVM

对于unlabelled data,SVM会穷举所有的可能标签,然后每一种情况都给出一个分类的决策面,选择使得提供largest margin和least error的那种情况:
在这里插入图片描述
可能有同学会问,如果数据很多,那么怎么穷举完呢?这个文章里提出一个近似的方法。类似于伪标签的做法,一开始得到了伪标签,然后修改伪标签,看看会不会使得结果变好。

4 平滑性假设(Smoothness Assumption)

在这里插入图片描述
假设:相似的 x x x 有相同的输出 y ^ \hat{y} y^
更精确的假设是:

  • x x x 的分布是不平均的
  • 如果 x 1 x^{1} x1 x 2 x^{2} x2 都空间分布中在同一个高密度的区域, 那么就假设有 x 1 x^{1} x1 x 2 x^{2} x2 有相同的label。
    在这里插入图片描述

4.1 基于密度的方式

如下图, x 1 , x 2 x^{1}, x^{2} x1,x2 都属于某个高密度的区域,因此说它们的输出是一样的。在这里插入图片描述
这种密度描述有点像是在两个点之间的还排布了很多过渡点,代表他们是相关的,比如考虑手写数字识别和头像的问题: 在这里插入图片描述
最简单实践就是聚类:
在这里插入图片描述

4.2 基于图的方式(Graph-based Approach)

用图结构来表示这些数据点,相连的话就是一类:
在这里插入图片描述
比如可以建立KNN的图,很像一个圆,有K个邻居。邻居间是否相连,就需要定义相似度,可以用很多方式,比如高斯径向基函数 s ( x i , x j ) = exp ⁡ ( − γ ∥ x i − x j ∥ 2 ) s\left(x^{i}, x^{j}\right)=\exp \left(-\gamma\left\|x^{i}-x^{j}\right\|^{2}\right) s(xi,xj)=exp(γxixj2),这个函数下降的速度很快,靠的很近效果才好,或者别的距离也可以:
在这里插入图片描述有标签的数据会影响他的邻居,类别信息会传递。但是数据要足够多,才能传过去:
在这里插入图片描述
Smoothness function的假设

定义图的平滑程度 Define the smoothness of the labels。考虑两两之间的样本,计算权值乘标签差的平方:
S = 1 2 ∑ i , j w i , j ( y i − y j ) 2 = y T L y S=\frac{1}{2} \sum_{i, j} w_{i, j}\left(y^{i}-y^{j}\right)^{2}=\boldsymbol{y}^{T} L \boldsymbol{y} S=21i,jwi,j(yiyj)2=yTLy
S的值越小越平滑:
在这里插入图片描述
这一项整理一下:
在这里插入图片描述
建立图拉普拉斯,如果考虑神经网络,那么可以加入符合Smoothness 假设的正则项:
在这里插入图片描述可以放在哪一层都可以。

参考:

  1. 李宏毅老师深度学习视频课2020
  2. https://blog.csdn.net/weixin_43603028/article/details/106642173?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%9C%89%E7%9B%91%E7%9D%A3%E7%9A%84%E5%AD%A6%E4%B9%A0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-5-.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187
  3. https://blog.csdn.net/dukuku5038/article/details/82929071

热门文章

暂无图片
编程学习 ·

Java输出数组的内容

Java输出数组的内容_一万个小时-CSDN博客_java打印数组内容1. 输出内容最常见的方式// List<String>类型的列表List<String> list new ArrayList<String>();list.add("First");list.add("Second");list.add("Third");list.ad…
暂无图片
编程学习 ·

母螳螂的“魅惑之术”

在它们对大蝗虫发起进攻的时候&#xff0c;我认认真真地观察了一次&#xff0c;因为它们突然像触电一样浑身痉挛起来&#xff0c;警觉地面对限前这个大家伙&#xff0c;然后放下自己优雅的身段和祈祷的双手&#xff0c;摆出了一个可怕的姿势。我被眼前的一幕吓到了&#xff0c;…
暂无图片
编程学习 ·

疯狂填词 mad_libs 第9章9.9.2

#win7 python3.7.0 import os,reos.chdir(d:\documents\program_language) file1open(.\疯狂填词_d9z9d2_r.txt) file2open(.\疯狂填词_d9z9d2_w.txt,w) words[ADJECTIVE,NOUN,VERB,NOUN] str1file1.read()#方法1 for word in words :word_replaceinput(fEnter a {word} :)str1…
暂无图片
编程学习 ·

HBASE 高可用

为了保证HBASE是高可用的,所依赖的HDFS和zookeeper也要是高可用的. 通过参数hbase.rootdir指定了连接到Hadoop的地址,mycluster表示为Hadoop的集群. HBASE本身的高可用很简单,只要在一个健康的集群其他节点通过命令 hbase-daemon.sh start master启动一个Hmaster进程,这个Hmast…
暂无图片
编程学习 ·

js事件操作语法

一、事件的绑定语法 语法形式1 事件监听 标签对象.addEventListener(click,function(){}); 语法形式2 on语法绑定 标签对象.onclick function(){} on语法是通过 等于赋值绑定的事件处理函数 , 等于赋值本质上执行的是覆盖赋值,后赋值的数据会覆盖之前存储的数据,也就是on…
暂无图片
编程学习 ·

Photoshop插件--晕影动态--选区--脚本开发--PS插件

文章目录1.插件界面2.关键代码2.1 选区2.2 动态晕影3.作者寄语PS是一款栅格图像编辑软件&#xff0c;具有许多强大的功能&#xff0c;本文演示如何通过脚本实现晕影动态和选区相关功能&#xff0c;展示从互联网收集而来的一个小插件&#xff0c;供大家学习交流&#xff0c;请勿…
暂无图片
编程学习 ·

vs LNK1104 无法打开文件“xxx.obj”

写在前面&#xff1a; 向大家推荐两本新书&#xff0c;《深度学习计算机视觉实战》和《学习OpenCV4&#xff1a;基于Python的算法实战》。 《深度学习计算机视觉实战》讲了计算机视觉理论基础&#xff0c;讲了案例项目&#xff0c;讲了模型部署&#xff0c;这些项目学会之后可以…
暂无图片
编程学习 ·

工业元宇宙的定义与实施路线图

工业元宇宙的定义与实施路线图 李正海 1 工业元宇宙 给大家做一个关于工业元宇宙的定义。对于工业&#xff0c;从设计的角度来讲&#xff0c;现在的设计人员已经做到了普遍的三维设计&#xff0c;但是进入元宇宙时代&#xff0c;就不仅仅只是三维设计了&#xff0c;我们的目…
暂无图片
编程学习 ·

【leectode 2022.1.15】完成一半题目

有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目&#xff0c;整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题&#xff0c;请返回被选的 N 道题目至少包含多少种知识点类型。 示例 1&#xff1a…
暂无图片
编程学习 ·

js 面试题总结

一、js原型与原型链 1. prototype 每个函数都有一个prototype属性&#xff0c;被称为显示原型 2._ _proto_ _ 每个实例对象都会有_ _proto_ _属性,其被称为隐式原型 每一个实例对象的隐式原型_ _proto_ _属性指向自身构造函数的显式原型prototype 3. constructor 每个prot…
暂无图片
编程学习 ·

java练习代码

打印自定义行数的空心菱形练习代码如下 import java.util.Scanner; public class daYinLengXing{public static void main(String[] args) {System.out.println("请输入行数");Scanner myScanner new Scanner(System.in);int g myScanner.nextInt();int num g%2;//…
暂无图片
编程学习 ·

RocketMQ-什么是死信队列?怎么解决

目录 什么是死信队列 死信队列的特征 死信消息的处理 什么是死信队列 当一条消息初次消费失败&#xff0c;消息队列会自动进行消费重试&#xff1b;达到最大重试次数后&#xff0c;若消费依然失败&#xff0c;则表明消费者在正常情况下无法正确地消费该消息&#xff0c;此时…
暂无图片
编程学习 ·

项目 cg day04

第4章 lua、Canal实现广告缓存 学习目标 Lua介绍 Lua语法 输出、变量定义、数据类型、流程控制(if..)、循环操作、函数、表(数组)、模块OpenResty介绍(理解配置) 封装了Nginx&#xff0c;并且提供了Lua扩展&#xff0c;大大提升了Nginx对并发处理的能&#xff0c;10K-1000K Lu…
暂无图片
编程学习 ·

输出三角形

#include <stdio.h> int main() { int i,j; for(i0;i<5;i) { for(j0;j<i;j) { printf("*"); } printf("\n"); } }
暂无图片
编程学习 ·

stm32的BOOTLOADER学习1

序言 最近计划学习stm32的BOOTLOADER学习,把学习过程记录下来 因为现在网上STM32C8T6还是比较贵的,根据我的需求flash空间小一些也可以,所以我决定使用stm32c6t6.这个芯片的空间是32kb的。 #熟悉芯片内部的空间地址 1、flash ROM&#xff1a; 大小32KB&#xff0c;范围&#xf…
暂无图片
编程学习 ·

通过awk和shell来限制IP多次访问之学不会你打死我

学不会你打死我 今天我们用shell脚本&#xff0c;awk工具来分析日志来判断是否存在扫描器来进行破解网站密码——限制访问次数过多的IP地址&#xff0c;通过Iptables来进行限制。代码在末尾 首先我们要先查看日志的格式&#xff0c;分析出我们需要筛选的内容&#xff0c;日志…
暂无图片
编程学习 ·

Python - 如何像程序员一样思考

在为计算机编写程序之前&#xff0c;您必须学会如何像程序员一样思考。学习像程序员一样思考对任何学生都很有价值。以下步骤可帮助任何人学习编码并了解计算机科学的价值——即使他们不打算成为计算机科学家。 顾名思义&#xff0c;Python经常被想要学习编程的人用作第一语言…
暂无图片
编程学习 ·

蓝桥杯python-数字三角形

问题描述 虽然我前后用了三种做法&#xff0c;但是我发现只有“优化思路_1”可以通过蓝桥杯官网中的测评&#xff0c;但是如果用c/c的话&#xff0c;每个都通得过&#xff0c;足以可见python的效率之低&#xff08;但耐不住人家好用啊&#xff08;哭笑&#xff09;&#xff09…