介绍
每个好的ML模式的背后,都有一个良好的数据集。这并不奇怪anybody-after,整个“机器学习”的前提是基于开发方法,“学习”如何理解examples-data-related执行一些任务,任务。即便如此,因为收集/组装的数据通常是用于训练模型至少愉快的方面构建一个毫升的解决方案(通常要求人们花费数万如果不是数百小时手工标签监管数据集),数据集建设步骤常常是要么被忽视,要么成本专用工人的生命时间工作辛苦地标签数据。有大量的数据通常是一件好事,但也增加了难以保证公平数据本身,以及标签的质量和一致性。
BetterUp机器学习和数据的团队,确定的问题如何有效利用如此庞大,未标记的数据集是我们必须克服的最大挑战之一,当我们努力的最终目标并不是关于数据——它是关于改变人们生活更清晰,目的,和激情。数据是一个强大的杠杆我们能实现这一目标;根据不同的任务,我们有许多方式可能方法标签大量的数据,如生成pseudo-labels慎独和zero-shot学习,甚至产生合成数据本身。而可能是将来的一篇文章的话题,今天我们兴奋地分享一些久经沙场的技术我们使用被称为弱监督。
弱监督是什么?
想象某人,大概在管理,递给你一个语料库的文档包含一万句,告诉你,你需要开发一个高质量的文本分类器在星期五。周三下午,时间紧迫。你知道任务是训练模型来区分两种类型的写作风格,“俚语”和“莎士比亚”,但是你的语料库是完全无标号。你打算怎样训练模型/分类器在这么短的时间吗?当你开始深入研究数据,你看到在风格上的差异。一些句子是这样的:
- “必胜客努力,没有上限”
- “这是什么没有睡眠[脏话]”
- “学习语言是一个美丽的艺术❤”
而另一些则更像这样:
- “我不是真正的婚姻思想”
- “和你最好花在你会!”
- “我再说一遍,使总起义”
显然,这里有一个重要的区别。但是你的时间不多了,你没有资源,将这一思想应用到10000句你。华体会手机登入还是你?
你让几个关键的观察:
- 现代俚语有不少特殊单词/字符(emojis、咒骂、缩写[认为“lol”、“lmao”,“《”,等等)
- 莎士比亚的英语也有不少特殊的单词/字符(“你”,“有”,“twas”)但也许更如此,语法感觉在某种程度上不同于我们今天用英语的方式,虽然你无法确定到底如何。
基于这些观察,您以编程方式创建一些简单的函数,应用标签的句子。例如,通过使用你最喜欢的NLP库宽大的扫描特定的关键字或将文本分解成更根本的语言形式(即分类词为名词、动词、形容词/副词,介词等)可以匹配特定的词法模式。使用这些基于规则的分类器,您可以快速应用标签在一个简单的和系统化的时尚。几小时后的编码和测试,瞧!尽你所能去组装一套粗糙但相当准确的标签,现在你可以训练你的模型!
这是弱监督的承诺。通过检测模式和观察,我们可以剪出几十个小时的工作,快捷有趣毫升工作流的一部分,所有良好的前提下数据。
是它吗?
现在你可能会想:“好吧,这有什么特别之处呢?这只是让计算机猜测的规则。为什么需要这个名字“弱标签”或“弱和这一切吗?“我同意。我最初学习这个技巧的时候,我有两个问题:
- 如果你标记函数结果不是很准确?不会,腐败的模型?
- 如果你的标签功能自己不够准确?不是足够的分类器?
对于第二个问题,如果你足够准确的在自己的标签功能,太好了!你已经完成了。但是,随着一些研究表明,一般来说,你不应该让你的希望。我前面显示的例子通常是清楚,但也可能有病态的例子你的数据集:
- “虐待她精致的青年用药物或矿物质”(莎士比亚)
- “球迷们,注意了!# MedievalCavalry已经到来。”(俚语)
这样的例子,盲目地应用你的标签系统薄弱可能导致问题的结果,在开发一个模型可以产生一个分类器与更好的泛化。这让我们点1:如果我们开发一个好的分类器函数结果不够准确吗?混乱的数据会导致混乱的模型。但这就是为什么弱监督不仅仅是标签函数实际上是有点聪明得多。在引擎盖下,弱监督实现将使用嘈杂,不准确标记函数来生成一个概率标记模型:
这样,噪音数据占并相应地调整标签,给我们更健壮的、准确的数据可以用来训练分类器。,不仅你组装一个数据集管理成千上万的点在短短几小时,你可以训练一个模型数据与信心,和毫不费力地扩展到更大的训练数据集,如果数据是可用的。恭喜!
在BetterUp弱标签和工作/生活事件
在BetterUp,我们相信到处都在帮助人们生活在更大的明晰度、更激烈的目的,和激情。为了帮助别人前进,我们首先要知道可能阻碍了它们的发展。因为当我们知道他们正在苦苦挣扎,我们可以更有效地helping-whether通过教练的建议或另一个平台的经验。这给我们带来了工作和生活事件的概念,或WLEs-an想法由BetterUp“人类见解阵容”,这使得严格的想法出现的意义发生在成员的生活。
工作或生活事件发生的意义对一个人导致偏离常态在给定的上下文中,可以工作或生活相关,代表了一种中性的改变一个人的心情。事件点生活,人们花时间思考,并且通常可以兴奋,焦虑,或适应。
王很重要,因为它们都是我们的会员花重要的认知和情感能量。他们那种人可能考虑的概念是“当前大事”在他们的生活中,这些促销活动,或大公司的变化,婚姻或工作冲突。总之,有30多个不同类型的事件我们想从几个来源分类开放式文本。
每一天,成千上万的BetterUp教练和成员一起吃训练课程和工作通过各种事件和挑战发生在成员的生活。这些会议得出结论后,成员和教练选择写下一点什么是在会话中所讨论的,如果必要的同意的条件已经满足,这些数据可用于个性化他们的产品体验。例如,成员可能希望跟踪他们的工作和生活事件如何影响他们的进展教练旅行,或一个教练可能感兴趣跟踪的关键工作和生活事件成员的经验,为了更好的准备和提供最好的指导。我们可以样品近一百万句包含工作和生活事件训练专业工作和生活事件分类模型。
标签吗?检查。数据?检查。把它们放在一起。对于我们的弱标签设置,我们利用Humanloop编程,快速建造大型weakly-supervised Python-integrated应用数据集(他们也有一个很好的快速入门指南对于那些有兴趣)。与弱标签功能,它提供了一个整洁的用户界面和直观与Python和宽大的集成,使其适合在数小时内把我们的大规模语料库变成一个标签数据集。
至于标签函数本身,而创建的任务几乎是微不足道的,相对容易找到可利用的数据模式,和强烈的令人安心的知道的力量弱标签能够清理混乱的可能。这个博客的目的,我想强调我们考虑三种不同的逻辑路径,这是反映在我们的函数声明。
类型:文本和正则表达式匹配
最简单快捷的方法我们发现找工作/生活事件,仅仅涉及到匹配的文本。这些函数一般像这些形式之一:
进口再保险def exact_words_matching(行)- > bool: search_term =“职业过渡”返回row.text.find (search_term) ! = 1 #匹配文本完全def work_stress(行)- > bool: #使用正则表达式捕捉人物的话#或不区分大小写的匹配,或捕捉多个情况下拍= re.compile (r \ b(工作(负载)?从工作压力|压力)\ b”,旗帜= re.IGNORECASE)返回pat.search (row.text)不是没有
功能最喜欢这些工作时常见的短语,有非常一致的形式提到,这为主题,有具体的名称或文字工作(职业转型,性能改进计划,搬迁)。但是一些主题可以更开放。
B型:开始和结束短语匹配
考虑以下的句子:
- “我考虑搬到加州为我工作。”
- “机会打开了,但它需要我搬到欧洲。”
- “由于一些家庭问题,我和我的妻子需要搬出去。”
这些句子都是讨论的问题,但所有这三个以不同的方式,以不同组合的[移动动词]和[搬迁地区]。由于组合爆炸,对我们有太多组合跟踪使用蛮力模式匹配的方法,所以我们需要尝试另一种方法。这是我们第二次的动机类型的标签功能:
def find_move_phrase(行)- > bool:“”“找到实例结束搜索短语,然后从那里找到最接近的词从一组候选短语和返回真或假如果找到这句话。”““start_search_phrases =(“移动”,“迁移”,“移动”,“搬迁”,“移动”,“搬迁”]end_search_patterns =(“城”,“状态”,“国家”,“镇”,“区”“(Nn)奥尔特(Aa) merica”, r \ bUSA吗?\ b”、“(Cc) anada " r " \ bCA \ b " r " bNY \ b \”,“(Nn)电子战(Yy)工作”,r \ bTX \ b " r " \ bFL \ b " r " \ bLA \ b " r " \ bSF \ b”、“(Bb) ay (Aa)意图”、“海岸”、“地区”)#如果我把括号表达式,将会给我分隔符#这是有用的因为我想计算分离器长度end_search_phrases = [re.compile (f({}))的年代end_search_patterns] max_chars_inbetween = 30 end_search_phrase end_search_phrases:部分= end_search_phrase.split (row.text)如果len(部分)= = 1:继续= 0结束我的范围(0,len(部分[2]),2):开始为start_phrase =没有start_search_phrases:[我].rfind rfind_index =部分(start_phrase)如果rfind_index ! = 1: start_phrase_index = rfind_index + len (start_phrase)如果开始没有或start_phrase_index >开始:开始= start_phrase_index如果开始不是没有:开始+ =结束结束+ = len(部分[我])如果结束>开始和结束-开始< max_chars_inbetween:还真结束+ = len(部分(I + 1))其他:结束+ = len(部分[我])+ = len (I + 1)(部分)返回False
这个函数有点碍眼,但它实现了上述想法。internally-defined列表中每一个具体的结局模式,向后搜索函数将从他们的位置,试图找到一个单词开始,返回True,如果检测到起始词与一组硬编码长度限制(在本例中,30个字符)。这里我们组装的列表(移动动词)和安置区,但这个想法适用于任何实例要求开始和结束的话。另外还有一个好处,它可以很容易地修改排除某些关键词包含开始和结束之间的话说,如果这功能是可取的。
输入C:宽大的
到目前为止我们看到的功能不错,但它们语言无关。他们不把英语单词有任何特殊的意义,而是专注于人物之间的模式,完全无视任何额外的信息,可以通过把单词和句子语言对象。当然,Python整个英语教学将是令人难以置信的不困难,如果我们能这样做,它将立即解决我们所有的问题。但是我们可以得到相当接近使用宽大的NLP图书馆。
def verb_meeting(行:数据)- >列表(跨度):““用宽大的匹配器对象找到最大的实例模式”“匹配器=匹配器(nlp.vocab) phrase1 =[{“引理”:{“在”:[””、“准备”、“汇报”,“加入”,“领导”,“参与”,“计划”,“演练”,“实践”]}},{“POS”:“ADP”、“人事处”:“?”},{“POS”:“精细”,“人事处”:“?”},{“POS”:“吃”,“人事处”:“?”},{“POS”:“睡觉”,“人事处”:“?”},{“POS”:“的”、“人事处”:“?”},{“引理”:{“在”:[“会议”、“演示”]}}]= [phrase1] doc =行模式。医生匹配器。添加(“匹配”模式)匹配=匹配器(doc) by_match_starts ={} #只保留最长匹配match_id,开始,结束比赛:跨度= doc(开始结束):#匹配的跨度如果开始by_match_starts:如果len(跨度)> len (by_match_starts[开始]):by_match_starts[开始]=跨度:by_match_starts[开始]=跨跨度=[跨度(开始=。start_char,结束= span.end_char)跨越by_match_starts.values()]返回跨越
如果您熟悉语言学或正式的语言理论,你可能听说过一个概念解析树或语法树,这是一个方法声明的单词分解成令牌使用语法规则。宽大的有能力的,我们可以使用这个特性来匹配特定的语法模式对象(某些名词、动词、介词等)相匹配的句子。例如,上述函数匹配提到参与会议/报告。
51个标签功能后,我们有我们的数据集,训练的时候了。Facebook的罗伯塔提供了一个先进的变压器结构,调整我们的数据集是一个微风与拥抱的脸变形金刚的API。金本位WLE分类器结果是高质量的,我们正在寻找。任务完成。
最终的想法
在这样一个世界变得越来越依赖越来越大的数据,这个问题的规模正变得比以往任何时候都更加显著。因此,弱标签技术变得越来越重要,随着我们的ML工具的发展跟上这样的数据驱动的社会的需要。从弱标签我们已经看到了不可思议的结果,但是我们觉得有这么多进一步我们可以,我们能做那么多使用这些方法来帮助我们的成员,还有更多的挑战等着我们在路上给客户最终的执教经验。
关于作者
科林他是一个机器学习工程师BetterUp的人类的见解,滑铁卢大学本科计算机科学学生。他喜欢任天堂游戏和视频在业余时间优雅的数学问题,并从迫在眉睫的咖啡瘾仍在运行。

加入谈话