半指导学习(Semi-supervised Learning)的概念说起来一点儿也不复杂,即从同时含有标注数据和未标注数据的训练集中学习模型。半指导学习是介于有指导学习与无指导学习之间的一种机器学习方式。

在NLP领域的很多任务中,标注数据其实是很难获取的。尤其像句法、语义等训练资源在标注时往往需要比较深厚的专家知识(如语言学知识)作为指导,从而导致标注成本太高。尽管现在大家都在提倡标注简单化、大众化甚至娱乐化,但是对于这种知易行难的问题,要找到一种能利用群体智慧的标注方式又是何其难也。近年来比较热的“众包”技术也没能够有效地解决这种“专家级”标注问题。从这个角度来看,半指导学习是非常有意义而且值得研究的。上半年UIUC的高晶学姐回学校做了一次关于融合有指导学习与无指导学习的报告,我个人觉得很受启发。

由于半指导学习本身理解起来并不难,因此概念以及定义之类的这里就不赘述了。下面主要总结一下本次活动中所讨论的半指导学习方法(模型)。

Self-Training Models

自学习模型的基本假设是,分类器对样本进行预测时,置信度高的样本被正确分类的可能性大。比如SVM对某个样本进行分类时,离分类界面距离较远的那些样本可以认为被正确分类。那么基于这个假设,自学习模型就显得异常简单了。假设我有两堆数据A和B,其中A是已标注的数据,即带Label的;而B是未标注数据。Self-Training的做法如下:

  1. 从已标注数据A中训练一个分类模型M
  2. 用该模型对B进行预测
  3. 将预测结果中置信度高的K个样本,连同它们的Label加入训练数据A,并从B中删除
  4. 回到第1步。

当然,第3步可以有很多实现方法,比如可以将B中所有样本加入A,根据预测时置信度的不同给样本赋予不同的权重。

自学习模型是最简单也最易实现的半指导模型,但是简单的东西往往不怎么好用,这世上既简单又好用的东西实在不多。自学习的缺点在于,如果一个错误分类的样本被加入了原来的训练集,那么在其后的训练过程中,它所犯的错误只会越来越深,还会诱使其他样本犯错,这种outlier实在罪不容恕。而自学习模型对此表示无能为力。

Generative Models

判别模型与生成模型如何区分依然是大家争论的一个重点。推荐大家看看2009年NIPS的一个workshop:http://gen-disc2009.wikidot.com/。判别模型与生成模型的融合是我一直想做的一个课题,尽管已经在Parse Reranking上做过一些实验,但是总是觉得不深入,对两者的理解仍然不够深。

生成模型在半指导学习中的应用比较简单,我们经常遇到的高斯混合模型(GMM)就是一种典型的生成模型(当然,还有其他的混合密度分布,如混合多项式分布)。GMM总是和EM算法紧紧地捆绑在一起的。我们知道,如果在GMM中,每个样本属于哪个类别(高斯分布)是已知的话,那么很容易通过MLE对其进行参数估计。如果所有的样本都不知道类别,那么我们一般使用EM算法迭代地估计其参数。前者是有指导学习,后者是无指导学习。于是很容易想到第三种情况,即部分样本的类别已知,而剩余的样本类别未知。这时,只需要将似然函数的形式稍作改变即可用EM算法求之。

Cluster-then-Label

从前面的EM算法在半指导学习中的运用,可以很自然地想到,无指导方法一般都可以用于半指导学习。K-Means是EM算法的一种简单形式,那么能否将聚类用于半指导学习呢?

Cluster-then-Label,顾名思义:先聚类,再分类。其算法如下:

  1. 对所有样本(包括已标注数据A和未标注数据B)进行聚类
  2. 对于聚类结果中的每个簇,执行第3、4步。令S为该簇中已标注的样本
  3. 如果S非空,那么在S上学习一个分类器,并对该簇中未标注的样本进行预测
  4. 如果S为空,那么根据所有已标注的数据来预测该簇中未标注的样本

这样,我们就得到的所有样本的类别。想法非常简单,但是究竟效果好不好还有待实验进行验证。

Co-Training

第一次接触Co-Training这个词是在大三的时候,那时对机器学习几乎没有什么概念,脑海里只充满了对人工智能各种各样的幻想。那时对Co-Training的理解是:有两个Robots,能够相互Teaching,相互Learning。听起来很高深的样子,呵呵。后来证明真实的Co-Training也与之差相仿佛了。

Co-Training又叫协同训练或协同学习,是一种MultiView算法。Multiview是指认识事物的多个角度。比如对于“月亮”,我们会在脑海里浮现出一轮飞镜似的明月,或圆或缺,或明或暗,我们甚至还会联想到古代词人吟风弄月的很多佳句。当然也有人会立刻联想到月亮的各种特征,比如它是地球的卫星,它的表面有环形山,它绕地运行……等等一系列特征。这便是看待同一件事物的两个角度。那么从不同的角度看待训练数据,我们能够得到不同的特征空间。而在不同的特征空间中,我们又能够得到不同的分类模型。这就是Co-Training的基本思想。

协同训练的过程如下:假设数据有两种特征表达,比如图像特征(X-1, Y-1)和文本特征(X-2, Y-2)。对于未标注数据同样有两种View。算法如下:

  1. 从(X-1, Y-1),(X-2, Y-2)分别训练得到两个个分类模型F-1,F-2
  2. 分别使用F-1与F-2对未标注数据进行预测
  3. 将F-1所预测的前K个置信度最高的样本加入F-2的训练数据集
  4. 将F-2所预测的前K个置信度最高的样本加入F-1的训练数据集
  5. 回到第1步

基本的Co-Training算法还是很简单的。如何将其应用到NLP的Task里又有很多研究点。我觉得从Co-Training的思想出发可以稍微帮助理解一下人工智能。一直以为人工智能一定是群体作用的结果,一个封闭的自学习系统是很难激发出智能的,除非本身拥有一个非常强大的知识集和归纳、演绎系统。一个智能体,在幼儿时主要依靠专家指导(我们的父母亲人)来强化自身的学习系统(人脑神经网络),在学习系统成长的过程中,我们也在不断地和我们的同伴相互对比,相互学习。在这不断地碰撞和启发中,我们才渐渐地拥有了知识和对事物准确的判断力。人的这种获取智能的方式应该是值得机器学习方法所借鉴的。或许有一天,我们真的能够模拟人脑的思维,而不再仅仅是模拟人类的行为。

Semi-supervised learning methods widely used include:

1.EM with generative mixture models

2.self-training

3.co-training

4.transductive support vector machines

5.graph-based methods

self-training:

A classifier is first traind with the small amount of labeled data. The classifier is then used to classify the unlabeled data. Typically the most confident unlabeled data points, together with their predicted labels, are added to the training set. The classifier is re-trained and the procedure repeated.

When the existing supervised classifier is complicated and hard to modify, self-training is a practical wrapper method. Applied to several natural language processing tasks, word sense disambiguation, parsing, machine translation and object detection system from images.

co-training

Co-training assumes that features can be split into two sets. Each sub-features is sufficient to train a good classifier. The two sets are conditionally independent given the class. Initially two seperate classifiers are trained with the labeled data, on the two sub-features sets respectively. Each classifier then classifies the unlabeled data, and ‘teaches’ the other classifier with the few unlabeled examples(and the predicted labels) they feel most confident.

Each classifier is retrained with the additional training examples given by the other classifer, and the process repeats.

When the features naturally split into two sets, co-training may be appropriate.

references:

http://www.jiangfeng.me/blog/tag/self-training

http://blog.csdn.net/bookwormno1/article/details/7024929

原文:http://www.leexiang.com/self-training-and-co-training

self-training and co-training的更多相关文章

  1. [WeChall] Training: Encodings I (Training, Encoding)

    Training: Encodings I (Training, Encoding) We intercepted this message from one challenger to anothe ...

  2. WeChall_Prime Factory (Training, Math)Training: WWW-Robots (HTTP, Training)

    In this little training challenge, you are going to learn about the Robots_exclusion_standard.The ro ...

  3. Summer training round2 #10(Training 30)

    A:签到题 B!:搜索+DP #include<bits/stdc++.h> #define mp make_pair #define pi pair<int,int> usi ...

  4. Summer training round2 #7 (Training #23)

    A:约瑟夫环 套公式 B:线性筛素数 C:投骰子 概率DP F:有权无向图的生成树(边最大值和最小值只差最小) 直接kruskal G:状压BFS或者双向BFS H:模拟题 I:几何题 J:高斯消元

  5. Summer training round2 #6 (Training #22)

    A:二分答案 如果中位数比目前的大就right=mid-1 else left=mid+1 C!:几何 G:优先队列贪心 #include <bits/stdc++.h> using na ...

  6. Summer training round2 #5 (Training #21)

    A:正着DFS一次处理出每个节点有多少个优先级比他低的(包括自己)作为值v[i] 求A B 再反着DFS求优先级比自己高的求C #include <bits/stdc++.h> #incl ...

  7. Summer training round2 #4 (Training #20)

    A!:UESTC1752 B!:找区间内L到R之间内的数的个数  权值分块加莫队 C!:给你一个哈斯图 去掉其中的几条边 要求输出字典序最大的拓扑排序:线段树模拟拓扑排序 D!:要求你找到最短路树并输 ...

  8. WeChall_ Training: Stegano I (Training, Stegano)

    This is the most basic image stegano I can think of. 解题: 一张小图片,文本方式打开.

  9. Method for training dynamic random access memory (DRAM) controller timing delays

    Timing delays in a double data rate (DDR) dynamic random access memory (DRAM) controller (114, 116) ...

  10. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

随机推荐

  1. Python代码风格的良好养成

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  2. Liunx 用户权限之目录

    总结一下: 今天又对liunx权限的认知多了一点,就是关于目录的权限的作用 可以打个比方来形容就是:相当于一个大门 只有目录权限都有的情况下,才能够对目录中的文件进行目录权限操作 例如:drwxrwx ...

  3. 关于scanf一个变量的覆盖问题

    假如你为了省空间,在scanf一个很长的字符串s后,又重复scanf 字符串s, 但是后面的s比前面的s短,那么在s后面一定有没覆盖的原字符串的字符: 那么在取字符串长度时会不会还是原来的s长度而不是 ...

  4. 关于ORACLE的串行化隔离级别--来自ORACLE概念手册

    为了描述同时执行的多个事务如何实现数据一致性,数据库研究人员定义了被 称为串行化处理(serializability)的事务隔离模型(transaction  isolation model).当所有 ...

  5. Linux服务器安装配置JDK

    一.准备工作: 1.登录服务器,切换到root用户(su - root,然后输入密码,按enter),进入根目录:cd / 2.进入要安装jdk的目录,自己可以创建一个java目录,执行命令如下: c ...

  6. C++使用socket传输图片

    Client: #include <WinSock2.h> #include <Windows.h> #include <stdio.h> #pragma comm ...

  7. params修饰符的用法

    params修饰符是用来声明参数数组允许向方法传递数量不定的自变量用的.事实上System.Console 类的 Write 和 WriteLine 方法是参数数组用法的典型示例.他们的声明方式如下: ...

  8. SpringMvc (注解)中的上传文件

    第一步:导入commons-fileupload-1.3.1.jar 和commons-io-2.2.jar 架包 第二步:在applicationContext.xml中 配置 <bean i ...

  9. Linux——awk

    https://blog.csdn.net/jin970505/article/details/79056457 可以根据特定规则输出文本文件内容

  10. Python CGI编程Ⅹ

    检索Cookie信息 Cookie信息检索页非常简单,Cookie信息存储在CGI的环境变量HTTP_COOKIE中,存储格式如下: 以下是一个简单的CGI检索cookie信http://www.we ...