【Day 24】半监督式学习(Semi-supervised Learning)(上)

我们知道监督式学习(Supervised Learning)就是有一堆Label好的训练资料,而半监督式学习是我们有一组Label好的训练资料,另外还有一组Unlabel的训练资料,并且Unlabel的资料远大於Label的资料。

半监督式学习可以分成两种:Transductive Learning以及Inductive Learning。在做Transductive Learning的时候,你的Unlabeled data就是你的测试资料,而Inductive Learning就是我们不考虑测试资料,也就是我们不知道测试资料是什麽。

为什麽叫做半监督式学习呢?因为很多人会说我们没有data,但其实我们不会没有data,我们只是缺少有Label的data,所以半监督式学习如果可以利用这些Unlabel的data来做某些事的话,会是很有价值的。

生成模型(Generative Model)

Supervised Generative Model

监督式学习的生成模型在分类(Classification)(上)有讲过了,在监督式学习里面,你有一堆训练资料,你知道他们分别是属於class 1还是class 2,然後你会去估测class 1和class 2的事前机率(Prior probability) https://chart.googleapis.com/chart?cht=tx&chl=P(C_1)%2C%20P(C_2),接着你会去估测 https://chart.googleapis.com/chart?cht=tx&chl=P(x%7CC_1)%2C%20P(x%7CC_2)。假设每一个class的分布都是Gaussian distribution的话,那你会估测这个class 1是从mean是 https://chart.googleapis.com/chart?cht=tx&chl=%5Cmu%5E1,covariance是 https://chart.googleapis.com/chart?cht=tx&chl=%5CSigma 的Gaussian估测出来的,而这个class 2是从mean是 https://chart.googleapis.com/chart?cht=tx&chl=%5Cmu%5E2,covariance也是 https://chart.googleapis.com/chart?cht=tx&chl=%5CSigma 的Gaussian估测出来的。有了这些你就可以估测新的data是属於class 1的机率,那你会决定一个boundary的位置,就可以完成分类。

Semi-supervised Generative Model

而如果给了我们一些Unlable的data,它就会影响你的决定,假设下图中绿色的点是Unlabeled data,那如果你的mean和variance是 https://chart.googleapis.com/chart?cht=tx&chl=%5Cmu%5E1%2C%20%5Cmu%5E2%2C%20%5CSigma 显然很不合理,应该要是虚线所画出来的样子,而prior也会受到影响,举例来说,我们本来觉得这两个Labeled data是一样多的,但看了这些Unlabeled data以後,你或许会觉得class 2的data其实是比较多的,它的Prior probability应该是比较大的。

  • 步骤一:计算每一笔Unlabeled data的事後机率(Posterior probability)。
    • https://chart.googleapis.com/chart?cht=tx&chl=P_%7B%5Ctheta%7D(C_1%7Cx%5Eu)
  • 步骤二:更新model。
    • https://chart.googleapis.com/chart?cht=tx&chl=P(C_1)%20%3D%20%5Cfrac%7BN_1%20%2B%20%5Csum_%7Bx%5Eu%7DP(C_1%7Cx%5Eu)%7D%7BN%7Dhttps://chart.googleapis.com/chart?cht=tx&chl=N 是所有的example,https://chart.googleapis.com/chart?cht=tx&chl=N_1 是被标记为class 1的example,在不考虑Unlabeled data的情况下,直觉就是 https://chart.googleapis.com/chart?cht=tx&chl=P(C_1)%20%3D%20%5Cfrac%7BN_1%7D%7BN%7D,而考虑了Unlabeled data,https://chart.googleapis.com/chart?cht=tx&chl=C_1 出现的次数就会是所有Unlabeled data它是 https://chart.googleapis.com/chart?cht=tx&chl=C_1 的事後机率的总和。
    • https://chart.googleapis.com/chart?cht=tx&chl=%5Cmu%5E1%20%3D%20%5Cfrac%201%20%7BN_1%7D%20%5Cdisplaystyle%20%5Csum_%7Bx%5Er%20%5Cin%20C_1%7D%20x%5Er%20%2B%20%5Cfrac%201%20%7B%5Csum_%7Bx%5Eu%7DP(C_1%7Cx%5Eu)%7D%20%5Cdisplaystyle%20%5Csum_%7Bx%5Eu%7D%20P(C_1%7Cx%5Eu)x%5Eu,在不考虑Unlabeled data的情况下,https://chart.googleapis.com/chart?cht=tx&chl=%5Cmu%5E1 就是把所有属於 https://chart.googleapis.com/chart?cht=tx&chl=C_1 的labeled data都平均起来,而加上Unlabeled data之後,就是把Unlabeled data的每一笔data https://chart.googleapis.com/chart?cht=tx&chl=x%5Eu,根据它的事後机率做weighted sum。
  • 步骤三:回到步骤一,有了新的model之後,机率会不一样,机率不一样在步骤二model算出来就会不一样,就一直反覆的做下去。

Low-density Separation

Low-density Separation意思就是在两个class之间有一个很明显的鸿沟,也就是在这两个class的交界处的density是低的,几乎不会有data。

Self-training

Self-training是Low-density Separation最具代表性、最简单的方法,假设我们有一些Labeled data和Unlabeled data,接下来训练一个model https://chart.googleapis.com/chart?cht=tx&chl=f%5E*,根据 https://chart.googleapis.com/chart?cht=tx&chl=f%5E* 去Label你的Unlabeled data,就是把 https://chart.googleapis.com/chart?cht=tx&chl=x%5Eu 丢进去 https://chart.googleapis.com/chart?cht=tx&chl=f%5E* 看输出 https://chart.googleapis.com/chart?cht=tx&chl=y%5Eu 是什麽,就是你的Labeled data,这件事我们称之为Pseudo-label。再来你要从你的Unlabeled data set里面拿出一些data加进去Labeled data里面,而得到更多Labeled data之後,就可以再回去训练你的model。

Hard label vs Soft label

Self-training很像是前面提到的Generative Model里面用的方法,唯一的差别是在Self-training你用的是Hard lebel,在Generative Model用的是Soft label。在Self-training我们会强制assign一笔训练资料一定是属於某一个class,但是在Generative Model我们是根据它的事後机率,可能有一部分属於class 1,有一部分属於class 2。

假设我们用的是Neural Network,你从你的Labeled data得到一组Network的参数 https://chart.googleapis.com/chart?cht=tx&chl=%5Ctheta%5E*,现在你有一笔Unlabeled data https://chart.googleapis.com/chart?cht=tx&chl=x%5Eu,根据 https://chart.googleapis.com/chart?cht=tx&chl=%5Ctheta%5E* 把它分成两类,如果是Hard label就直接把它Label成class 1,而如果是Soft label,就会说是70%属於class 1,30%属於class 2。

Entropy-based Regularization

它是Self-training的进阶版。Entropy-based Regularization是如果你用Neural Network,你的输出会是一个distribution,这个distribution一定要很集中,如果分布很平均就不符合Low-density Separation的假设。

於是我们就可以透过Entropy来计算这个distribution是集中还是分散,当Entropy越小,就代表越集中,而根据这个假设就可以重新设计Loss function。


参考资料

李宏毅老师 - ML Lecture 12


<<:  Day 24 [Python ML、资料视觉化] 如何选择图表型态

>>:  Day 24 : Tkinter-利用Python建立GUI(元件篇)

[REPORT] report rdl每页显示标题列

环境 VS2008 .rdl 1.新增报表 2.右键,新增table. 3.先设定title每页重覆...

Java 开发 WEB 的好平台 -- Grails -- (3) 建立一个 SPA 的 Grails 专案

或许有人会问「那我要开发 SPA 网站时,要如何跟 Grails 搭配呢?」。这个问题的答案很简单,...

# JS杂食-06--小实作-1: Star Calculator

参考资料1:MDN — the Mozilla Developer Network 参考资料2:0...

Stripe

前言 现在越来越多民众喜欢透过网路付款,在网路付款中很重要的环节就是需要进行线上刷卡,提到网路付款和...

Day25 Matrix

EX:创建一个3X3的矩阵 Step1:先用语法产生一个三成三的矩阵,利用for回圈把资料抓出来 S...