图解当前最强语言模型BERT:NLP是如何攻克迁移学习的?
2018 年是机器学习模型处理文本(更准确地说是自然语言处理,简称 NLP)的一个转折点。如何最好地表征词和句子以便最好地理解其潜在含义和关系?我们对此的概念理解正在快速演进。此外,NLP 社区也一直都在提出强大的新组件――你可以免费下载它们并将其用在你自己的模型和流程中(这被称为 NLP 的 ImageNet 时刻,是指这类似于多年前用于计算机视觉任务的机器学习的加速发展)。
ULM-FiT 和 Cookie Monster 没任何直接联系,但我想不到其它东西……
这一领域最近的里程碑是 BERT 的发布,人们将这一事件誉为 NLP 新时代的开端。BERT 这种模型打破了多项模型处理基于语言的任务的纪录。在描述该模型的论文发布之后不久,其研究团队还开源了该模型的代码,并发布了可供下载的模型版本――已经在大规模数据集上经过预训练。这是一个重大的进展,因为它让任何人都可以构建涉及语言处理的机器学习模型,并将这种强大工具用作其中的组件――这能节省从头开始训练语言处理模型所需的时间、精力、知识和资源。
BERT 的开发分为两个步骤。你可以下载在步骤 1 中预训练过的模型(在无标注数据上训练过);只需考虑针对步骤 2 进行调整。
BERT 的开发基础包含很多 NLP 社区内近期涌现出的聪明思路,其中包括但不限于半监督序列学习(来自 Andrew Dai and Quoc Le)、ELMo(来自 Matthew Peters 以及 AI2 和华盛顿大学计算机科学与工程系的研究者)、ULMFiT(来自 fast.ai 创始人 Jeremy Howard 和 Sebastian Ruder)、OpenAI transformer(来自 OpenAI 的研究者 Radford、Narasimhan、Salimans 和 Sutskever)、Transformer(Vaswani et al)。
要恰当地了解 BERT 究竟是什么,你需要了解很多概念。所以我们先来看看可以如何使用 BERT,之后再介绍涉及该模型的概念。
示例:句子分类
使用 BERT 最直接的方式是将其用于分类单个文本。该模型看起来会是这样的:
为了训练这样一个模型,你主要必须训练分类器(Classifier),而让 BERT 模型在训练过程中有尽可能小的变化。这个训练阶段被称为微调(Fine-Tuning),而且源自半监督序列学习和 ULMFiT。
为不熟悉这一主题的人解释一下:因为我们正在谈论分类器,那么我们就处于机器学习的监督学习领域。也就是说我们需要一个有标注的数据集来训练模型。对于这个垃圾邮件分类器示例,有标注的数据集即为邮件信息和对应标签构成的列表(每条邮件信息被标注为「垃圾邮件」或「非垃圾邮件」)。
这种用例的其它示例包括:
情感分析
输入:电影/产品评论。输出:这个评论是正面的还是负面的?
示例数据集:SST:
事实检查
输入:句子。输出:「事实声明」或「非事实声明」。
更雄心勃勃且更有未来感的示例:输入:称述句。输出:「真」或「假」。
Full Fact 是一家组织机构为公共利益构建的一款自动事实检查工具。其一部分工作流程是让分类器阅读新闻并检查声明的事实(将文本分类为「事实声明」或「非事实声明」),之后再进行事实查证(这个事情现在是人类在做,希望未来能让机器做)。
视频:用于自动化事实查证的句子嵌入:
模型架构
现在你的脑子里已经有一个有关 BERT 使用方式的示例用例了,现在我们来仔细看看它的工作方式。
这篇论文为 BERT 提出了两种大小的模型:
BERT BASE:与 OpenAI Transformer 大小相当,这是为了比较两者的表现而构建的。
BERT LARGE:一个非常巨大的模型,实现了当前最佳。
BERT 基本上就是一个经过训练的 Transformer Encoder 的堆栈。现在该向你推荐我之前解释 Transformer 的文章了: ;Transformer 模型是 BERT 以及我们后面将会讨论的很多概念的基础概念。
这两种大小的 BERT 模型都有很多编码器层(这篇论文称之为 Transformer Blocks)――Base 版有 12 层,Large 版有 24 层。相比于 Transformer 初始论文的参考实现的默认配置(6 个编码器层、512 个隐藏单元和 8 个注意头),它们还有更大的前馈网络(分别有 768 和 1024 个隐藏单元)和更多注意头(attention head,分为有 12 和 16 个)。
模型输入
首个输入的 token 由一个特殊的 [CLS] token 填补,原因后面就会明了。CLS 表示 Classification。
与 Transformer 的简单纯粹的编码器一样,BERT 以词序列为输入,这些词会在其堆栈中不断向上流动。每一层都会应用自注意,并会通过一个前馈网络传递它的结果,然后将其移交给下一个编码器。
在架构方面,直到这部分为止都与 Transformer 完全相同(除了规模大小,见上述的配置)。在输出的位置,我们开始看到不同。
模型输出
每个位置都会输出一个大小为 hidden_size(BERT Base 为 768)的向量。对于我们上面看到的句子分类示例,我们仅关注第一个位置的输出(即我们传递了特殊的 [CLS] token 的位置)。
现在,这个向量就可以被用作我们所选择的分类器的输入。这篇论文仅使用单层神经网络作为分类器就取得了非常优良的结果。
如果你有更多标签(比如如果你的电子邮件服务会将邮件标注为「垃圾邮件」、「非垃圾邮件」、「社交」、「广告」),那么你只需要调整分类器网络使其具有更多输出神经元,然后通过 softmax 即可。
对比卷积网络
如果你有计算机视觉的背景,你可能会发现这种向量传递类似于 VGGNet 等网络的卷积部分与网络末端的全连接分类部分之间的情况。
嵌入的新时代
这些新进展带来了词编码方式的转变。到目前为止,词嵌入一直都是推动 NLP 模型解决语言任务的主要力量。word2vec 和 GloVe 等方法在这类任务上得到了广泛的应用。我们先来看看之前的做法,然后再看现在有什么变化。
回顾词嵌入
要让机器学习模型能处理词,首先需要将词表示成某种数值形式,以便模型进行计算。Word2Vec 表明我们可以使用向量(某种数值列表)来恰当地表征词,使得这些表征能具备词之间的语义或含义关系(比如能说明词的含义是否相似或相反,像是「斯德哥尔摩」和「瑞典」这一组词与「开罗」和「埃及」这一组词之间具有同样的关系)以及句法或基于语法的关系(比如「had」和「has」之间的关系与「was」和「is」之间的关系一样)。
这一领域很快认识到,使用在大规模文本数据上预训练后的词嵌入是一个很棒的思路,而不是在通常很小的数据集上与模型一起训练词嵌入。因此,人们就可以下载词以及使用 Word2Vec 或 GloVe 预训练后生成的词嵌入了。下面是词「stick」的 GloVe 嵌入示例(嵌入向量大小为 200):
词「stick」的 GloVe 词嵌入,这是一个由 200 个浮点数(四舍五入到两位小数)构成的向量。这里给出的并不完整,总共有 200 个值。
因为这些向量很大而且都是数字,所以本文会使用下面的简单图形来表示它们:
ELMo:上下文很重要
如果我们使用这种 GloVe 表示方法,那么不管上下文如何,词「stick」都会表示成这个向量。很多 NLP 研究者意识到了这种操作并不稳妥,比如 Peters et. al., 2017、McCann et. al., 2017 以及 Peters et. al., 2018 的 ELMo 论文。根据使用的场景,「stick」可能具有多种含义。为什么不根据其所处的语境/上下文来确定词嵌入呢――这样既能获得该词在上下文中的含义,还能得到其它语境信息?为此,语境化词嵌入诞生了。
语境化词嵌入能根据词在句子语境中的含义给予其不同的嵌入。
ELMo 并不为每个词使用一个固定的嵌入,而是会在为句子中的词分配嵌入之前检查整个句子。它使用了一个在特定任务上训练的双向 LSTM 来创建这些嵌入。
ELMo 是向 NLP 预训练所迈出的重要一步。ELMo LSTM 会在我们数据集的语言的一个大规模数据集上进行训练,然后我们可以将其用作其它需要处理语言的模型的组件。
ELMo 有何奥妙?
ELMo 的训练方式是预测一个词序列的下一个词,并以此来获得对语言的理解――这个任务被称为语言建模。这是很方便的,因为我们有大量文本数据,这样的模型无需标签也能学习。
ELMo 的预训练过程中的一步。给定「Let’s stick to」为输入,预测下一个最有可能的词――这是一个语言建模任务。在大型数据集上训练时,模型会开始提取语言模式。在这个示例中,模型不太可能准确猜出下一个词。更现实的情况是,比如在出现了「hang」这个词之后,为「out」分配更高的概率(以拼出「hang out」),而不是「camera」。
?我们可以看到从 ELMo 的头部后面伸出的每个未展开的 LSTM 步骤的隐藏状态。在这个预训练完成之后,它们能用在嵌入过程中。
ELMo 实际上更进了一步,训练了一个双向 LSTM――使其语言模型不仅有对下一个词的感知,还有对前一个词的感知。
一个很赞的介绍 ELMo 的幻灯片:
ELMo 通过一种特定方式(连接之后加权求和)对隐藏状态(和初始嵌入)进行分组,从而构建出语境化的嵌入。
ULM-FiT:解决 NLP 中的迁移学习
ULM-FiT 引入了新的方法,可有效利用模型在预训练阶段学习到的很多东西――不只是嵌入,而且也不只是语境化嵌入。ULM-FiT 引入了一种新语言模型和新处理过程,可针对多种任务对语言模型进行调整。NLP 终于有一种做迁移学习的方法了,或许就像计算机视觉一样。
Transformer:超越 LSTM
Transformer 论文和代码的发布以及其在机器翻译等任务上取得的结果开始让该领域内的一些人思考用 Transformer 替代 LSTM。这是因为事实上 Transformer 在处理长期依赖方面优于 LSTM。
Transformer 的编码器-解码器结构使其能完美应用于机器翻译。但我们如何将其用于句子分类呢?我们怎么将其用于预训练语言模型,然后再针对其它任务调整这个语言模型呢?(该领域将这些利用了预训练的模型或组件的监督学习任务称为下游任务)。
OpenAI Transformer:为语言建模训练 Transformer 解码器
事实证明,我们不需要整个 Transformer,就能将迁移学习和可调节的语言模型用于 NLP 任务。我们只需要 Transformer 的解码器就够了。解码器是很好的选择,因为这是语言建模的自然选择(预测下一个词),因为它是为得到未来 token 的掩码而构建的――对逐词生成翻译
埃隆马斯克创办的公司有哪些 埃隆马斯克是什么公司的创始人
埃隆马斯克创办的公司有哪几家,埃隆马斯克创办的公司有哪家,埃隆马斯克公司名称,埃隆马斯克的公司叫什么埃隆马斯克作为当今硅谷的红人,其业务除了著名的电动汽车品牌特斯拉 Tesla,还包括哪些呢?
2020 年 5 月 30 日,有史以来第一次,一家私人商业航空航天公司将宇航员送入地球太空轨道。将 NASA 宇航员 Robert Behnken 和 Douglas Hurley 送入太空的火箭就是马斯克旗下的 spaceX 的猎鹰 9 号,搭载宇航员的"龙"飞船也是出自 spaceX。这是马斯克火星殖民野心的一部分
该公司的最终目标是在主要城市建立隧道网络,以缓解地面交通。该公司在其网站上辩称,隧道是城市的一个很好的解决方案
你能想象有一天,电影《黑客帝国》中的脑接口仪器会实现吗?马斯克曾宣称,脑链接口可以让人的大脑类似电脑硬件一样,扩展人的神经系统
OpenAI 是特斯拉自动驾驶系统,以及脑链接口的扩展
特斯拉甚至超过了丰田,成为市值最大的汽车制造公司,也是新世纪以来成长最快的制造业公司;也许特斯拉在中国上海、德国柏林等都已经有新的超级工厂的规划,旗下电动汽车也成为了世界各地的明星汽车产品
作为美国最流行的个人电子支付系统,其源头包括了 Confinity 与 Elon Musk 创立的
马斯克作为现在硅谷最具想象力的人,在个人支付、新能源汽车制造、公共运输系统、人工智能以及太空领域等都有着超出常人想象力,希望这些企业最终都能给人类带来幸福
欢迎关注公众号:KnowHub 知识加油站!
open ai 宸ヤ綔鎬荤粨
!pip install openai # 导入评论数据 comments = pd.read_csv("comment_data.csv") comments
comments_list=comments['Comment'].tolist() import os import openai openai.api_key="API密码"
API密码链接:
Just a moment...i=0 comments_str='' for comment in comments_list: comments_str=comments_str+ str(i) +'.'+'"'+comment+'\ ' i=i+1 if i==60: break prompt=comments_str + "\ Comment sentiment ratings:" prompt="Classify the sentiment in these comments:\ " + comments_str + "\ comment sentiment ratings:" response=openai.Completion.create( model="text-davinci-003", prompt=prompt, temperature=0, max_tokens=120, top_p=1.0, frequency_penalty=0.0, presence_penalty=0.0 ) response
comments_str.split('\ ') b=(response["choices"][0]["text"]).split('\ ') c=b[1:] a=comments.head(30) a["GPT"]=c a a['GPT_classfication']=a['GPT'].map(lambda x:x.split('.')[1]) a.drop(['GPT'],axis=1, inplace=True) a
处理好数据后,部分数据截取
confusion_matrix=pd.crosstab(a['Sentiment'],a['GPT_classfication'],margins=True) confusion_matrix (confusion_matrix.iloc[0,0]+ confusion_matrix.iloc[1,1]+confusion_matrix.iloc[2,2])/confusion_matrix.iloc[3,3]
混淆矩阵-交叉表验证准确率,目前有67%