| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 图解BERT、ELMo(NLP中的迁移学习)| The Illustrated BERT ELMo and co. -> 正文阅读 |
|
[人工智能]图解BERT、ELMo(NLP中的迁移学习)| The Illustrated BERT ELMo and co. |
看我看我这是我翻译这位大佬的第三篇文章了,我的翻译结束,翻译授权见最后。 之前的工作:
文章目录正文2018年是NLP模型发展的转折点。我们不断探索单词和句子的表示方法,以求能最好地捕捉其中潜在的语义和关系。此外,NLP领域已经提出了一些功能强大的组件式模型,你可以免费下载,并在自己的模型和pipeline中使用它们(这被称为NLP领域的ImageNet时刻,类似的发展在几年前,计算机视觉领域的机器学习也是这样加速发展起来的)。
在这一发展过程中,最新的里程碑工作之一是BERT。 使用BERT的两个步骤:下载在步骤1中已经在无标签数据上预训练好的模型,只需要考虑步骤2的的微调。 BERT 是建立在近期NLP领域中涌现的许多聪明想法之上的,包括但不限于半监督学习、ELMo、ULMFiT、GPT 和Transformer。 为了正确理解BERT是什么,我们需要了解许多概念。先不去看这些概念,让我们先看看BERT的使用方法。 举个🌰 :句子分类使用BERT最直接的方法是使用它对一段文本进行分类。这个模型看起来是这样的: 要训练一个基于BERT的分类模型,你主要做的是训练一个分类器(Classifier),而BERT模型直接拿过来,做一点微小的改动就行了。微小改动也就是微调,微调起源于半监督学习和ULMFiT。 但对于不熟悉我们现在讨论的这个话题的人来说,既然我们谈论的是分类任务,那么我们就进入了机器学习的监督学习领域。这意味着我们需要一个带标签的数据集来训练模型。
模型结构现在,你已经知道了如何直接使用BERT,接下来讲一下子它是如何工作的。 BERT论文中提出了两个尺寸的BERT模型:
BERT基本上是用Transformer的Encoder组件堆起来的。 是时候向你们介绍我之前写的《图解Transformer》了,这篇文章介绍了Transformer模型。想要了解我们接下来要介绍的东西,一定要先了解Transformer。 两种尺寸的BERT模型都有大量的encoder块(论文里叫Encoder块为Transformer block)。
模型输入
和Transformer的普通的encoder一样,BERT将一个单词序列作为输入,该序列在一层层encoder块中不断向上流动。在每个encoder块中都施加自注意力,并通过前馈网络将其结果传递给下一个encoder块。 模型输出每个位置输出一个大小为hidden_size(BERT-base为768)的向量。对于上面说的句子分类那个例子,我们只需要关注第一个位置的输出(就是我们之前传入特殊 这个向量现在可以作为我们分类器的输入。论文中使用一个单层神经网络作为分类器就取得了很好的效果。
与卷及网络类似对于那些有计算机视觉基础的人来说,这种方式应该会让人联想到一些网络(例如VGG),一个卷积网络 + 全连接层分类器。 Embedding新纪元NLP领域的新发展带来了文字编码方式的转变。词嵌入一直是NLP模型处理语言的主力军,像Word2Vec和Glove这样的方法已经获得了广泛应用。在说新发展之前我们先来回顾一下之前的词嵌入(word embedding)编码方式。 简要回顾词嵌入Word Embedding如果想用机器学习模型来处理单词的话,你需要先将单词转化为模型能够理解的数值表示。
人们很快意识到,我们可以直接在大量文本数据上预训练好embedding,而不是对每个模型的数据集都进行embedding训练。
因为这些向量都很长,画那么多格子不切实际,之后我会用这样少数几个格子来表示向量。 ELMo: 上下文语境很重要如果我们使用GloVe的那些词嵌入,那么不管上下文是什么,单词
语境化词嵌入可以根据词语在句子语境中的含义赋予词语不同的embedding。 ELMo没有对每个单词使用固定的词嵌入,而是在为每个单词计算embedding之前考虑整个句子。ELMo模型使用的是特定任务上训练好的bi-LSTM进行词嵌入。 ELMo为NLP的预训练任务的发展迈出了重要一步。ELMo在大型语料库上进行预训练,然后我们可以将其作为一个组件放到其他模型上处理语言。 ELMo的秘密是什么? ELMo是通过预测任务进行语言理解的,这项任务称为语言建模。这个任务非常方便,因为不需要有标签的数据,而我们有大量的文本数据可以让模型从中学习。 当在数据集上训练时,模型开始学习。在这个例子中,它不太可能准确地猜出下一个单词(`improvisation`)。 举个现实一点的例子,比如`hang`之类的单词,它大概率输出`out`之类的词,反正`out`概率肯定比`camera`更高。 上图我们可以看到展开的 LSTM,每个步骤的隐藏状态从 ELMo 的后脑勺上的向量逐步传播,一直到最顶上传给一个前馈神经网络。模型训练完以后,这些向量会在计算词嵌入的过程中派上用场。 看下图,ELMo 实际上不只是LSTM,而是训练了一个bi-LSTM,这样它的语言模型不仅能看到下一个词,也能看到上一个词。能捕获到双向的语义关系。 ELMo通过以某种方式将隐藏状态和初始embedding组合在一起,进行语境化词嵌入。 ULM-FiT:将迁移学习引入NLPULM-FiT引入了一些新思路,可以有效地利用模型在预训练阶段学到的很多东西——不仅仅是embedding,也不仅仅是语境化的embedding。 NLP终于有了一种像CV领域一样的迁移学习方法。 Transformer:超越LSTMs的存在Transformer诞生之后在机器翻译等任务上取得了一些成果,让NLP领域的一些人认为它是LSTM的替代品。Transformer相较于LSTM,能更好地处理长期依赖关系。 Transformer的encoder-decoder结构使其非常适合机器翻译。但是如何用它来进行句子分类呢? GPT:使用Transformer Decoder的预训练语言模型GPT向我们证明,我们不需要整个Transformer进行迁移学习或者做NLP任务的预训练模型。我们可以只使用Transformer的decoder。Decoder是一个不错的选择,它天然适合语言建模,因为它采用的是masked self-attention,可以遮盖当前步骤之后的tokens。 GPT 由12个Transformer的decoder块组成。因为模型没有encoder,因此这些decoder和Transformer原始的decoder相比是没有encoder-decoder注意力子层的,但是会保留masked self-attention子层。 使用这种结构,我们可以继续用语言建模任务训练模型:使用大量无标签数据集预测下一个单词。 只需要把7000本书的文本扔给它,让它学习! 迁移到下游任务现在GPT已经经过了预训练,我们可以开始将它用于下游任务。 让我们先来看一下句子分类(把电子邮件分类为“spam”或“not spam”): GPT论文中列出了一些方案:怎么转换输入以适应不同类型的任务。
BERT:不用Decoder了,我们来用encoderGPT为我们提供了一个基于transformer的可微调的预训练模型。但是在从bi-LSTM到Transformer的转变过程中,有些东西消失了。
BERT:“看我的!” 掩码语言模型 Masked Language ModelBERT:“我们将使用Transformer的encoder!” Ernie:“哦我的老天鹅,你疯了吧。是个人就知道双向制约在多层语境中能让文本间接看到自己的信息。” BERT自信地说:“我们将使用mask!” 找到正确的方法去训练Transformer的encoder是一个难点。BERT通过采用早期文献中的“掩码语言模型”(masked language modelnMLM)来解决这个问题。 BERT不是单纯的mask掉15%的输入,为了便于模型微调,BERT还在其中混合了其他的东西。比如有时它会随机用另一个单词替换一个单词,要求模型预测该位置的正确单词。
两个句子的任务如果你回想一下GPT对不同任务的输入进行转换的时候,一些任务需要模型对两个句子做一些提示。(例如,给定两个输入,一个是维基百科词条作,另一个是关于该词条的问题,需要提示“我们能回答这个问题吗?”)。 为了使BERT更好地处理多个句子之间的关系,预训练过程中还有一个额外的任务。给定两个句子AB,判断B是否是A的下一句。
不同任务中的BERTBERT的论文展示了在不同任务中使用BERT的多种方法。 BERT 的特征抽取微调并不是使用BERT的唯一方法。和ELMo一样,你可以用预训练好的BERT做动态词嵌入,然后把学到的嵌入信息提供给你的模型。论文中表示,在命名实体识别等任务上,用BERT提供动态词嵌入和微调BERT的效果差不多。 哪个向量最适合作为上下文嵌入? 我觉得这取决于任务。论文原文考虑了六种选择(与获得 96.4 分的微调模型相比): 带BERT出去炫试用BERT的最佳方法是通过谷歌Colab上托管的云TPUs进行BERT微调。如果你以前没用过云TPU,那么这也是一个尝试的的好起点。BERT代码可以在CPU、TPU、GPU上工作。 第二步当然是看看BERT的源码:
你也可以看一下Pytorch版本的BERT。 AllenNLP 允许任何模型使用BERT嵌入。 Jay Alammar’s Blog
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/29 8:57:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |