| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> datawhale 8月学习——NLP之Transformers:BERT和GPT -> 正文阅读 |
|
[人工智能]datawhale 8月学习——NLP之Transformers:BERT和GPT |
前情回顾结论速递由于没有很多的NLP知识背景,跳开NLP框架来学习BERT和GPT的时候,有许多不解和迷惑的地方。在本次学习中,我参考了一些相关的NLP博客文章,试图为自己构建一个NLP的知识体系。对于本次学习,其实核心的需要理解NLP中的预训练+微调模式,以及一类重要的任务——语言建模。
对于GPT模型,教程里将其与对Transformer Decoder的进一步向量化讲解糅合在一起,这边也简单小结一下GPT的关注点:
除此之外,这个task还进一步展开解释了Self-Attention的向量化计算过程,结合上一个task的笔记,效果更佳。 本文索引1 BERT1.1 BERT的诞生1.1.1 NLP的发展与BERT的诞生
NLP当前面临的任务是如何最好地表示单词和句子,从而最好地捕捉基本语义和关系。 在这样的背景下,BERT诞生了。BERT诞生于NLP的一些聪明想法上(包括但不限于半监督序列学习、ELMo、ULMFiT、OpenAI transformer和Transformer)。 这些聪明想法为:
提出BERT的Open Sourcing BERT: State-of-the-Art Pre-training for Natural Language Processing,其代码开源在GitHub上google-research/bert 1.1.2 BERT的使用简介使用BERT分为两大主要的步骤
下面这张图来源于The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning),它比较简单清晰的解释了使用BERT的两大主要步骤。 1.1.3 BERT的使用案例:句子分类可以通过句子分类任务更直观地理解BERT模型的使用,任务描述如下:
为了比较好地完成这一个任务,我们可能需要一个很大的有标签数据集,但是通过BERT,我们可以减少这个数据集的大小要求。
1.2 BERT模型1.2.1 概述文章发布时提到了两种大小的BERT,一种是BASE版本,比较小一些(与OpenAI Transformer大小接近),方便和其他模型比较性能;另外一种是LARGE版本,这是一个非常巨大的模型,可以取得最先进的成果。 这两种BERT模型都有大量的Encoder层,BASE和LARGE分别有12层和24层,同时也有更大的前馈神经网络(768, 1024 hidden units)和更多的Attention heads(12, 16)。
1.2.2 简单理解BERT模型BERT模型有很多个位置输出,每个位置输出一个大小为 就像下面这样,叠加一个单层的Classifier
1.2.3 BERT预训练的本质:语言建模(词嵌入)1.2.3.1 词嵌入的回顾所谓的词嵌入,是指
词嵌入对自然语言处理来说相当重要,为了达到好的效果,最好是在大规模的文本数据上预训练好词嵌入,然后直接拿来使用。 现在已经有很多中词嵌入的方法,最常用的是Word2Vec和GloVe,我们可以下载器预训练好的单词列表,并完成词嵌入。 教程里给了一个直观的词嵌入的例子:
1.2.3.2 ELMo:考虑上下文的词嵌入尽管GloVe已经在很多地方很有用处,但是它并没有考虑到一个单词出现在文章中的不同位置会有什么不同的含义。 语言模型嵌入(Embeddings from Language Model,ELMo)试图通过无监督的方式预训练一个语言模型来获取情景化字词表示,它是一种语境化的词嵌入技术。 ELMo没有对单词使用固定的词嵌入,而是在为每个词分配词嵌入之前,查看整个句子,融合上下文信息。 「双向语言模型(bidirectional Language Model,biLM)」 是 ELMo 的基础,当输入为 n n n个标识组成的序列时, ( x 1 , . . . , x n ) (x_1,...,x_n) (x1?,...,xn?),语言模型会学着根据历史预测下个标识的概率。 下图展示了ELMo 的 biLSTM 基础模型。把很多很多地语料输入到这个模型中,就可以得到上下文词嵌入。 举个例子,以 “Let’s stick to” 作为输入,预测下一个最有可能的单词。分为前向和后向两部分,都会进行预测,每个unit都可以输出当前方向下最大概率出现的下一个单词。 1.2.3.3 OpenAI Transformer:Transformer Decoder获取上文信息OpenAI Transformer使用Transformer的Decoder 来进行语言建模,选择Decoder是因为它有mask,可以除去下文的影响,适合进行语言建模。 这个模型包括 12 个 Decoder 层。因为在这种设计中没有 Encoder,这些 Decoder 层不会像普通的 Transformer 中的 Decoder 层那样有 Encoder-Decoder Attention 子层。不过,它仍然会有 Self Attention 层(这些层使用了 mask,因此不会看到句子后来的 token)。 例如句子分类任务(把电子邮件分类为 ”垃圾邮件“ 或者 ”非垃圾邮件“),直接在后面街上一个全连接神经网络。 1.2.3.4 BERT:Transformer Encoder获取上下文信息前面提到,ELMo可以实现双向语言建模,但OpenAI Transformer 只训练了一个前向的语言模型。我们希望可以获得一个双向语言建模的基于Transformer 的模型。 事实上BERT的全称就是Transformer 双向编码器表示(Bidirectional Encoder Representations from Transformers,BERT) 为了能够获取上下文信息,BERT完成了两个任务: 第一个任务,遮罩语言模型(Mask language model,MLM): BERT尝试使用Transformer的Encoder来实现上下文信息的获取,但是Encoder的self-attention会把更多的注意力集中到自己身上,就学不到有用的上下文信息了。于是,BERT 提出使用 mask,把需要预测的词屏蔽掉。 这个模型也叫MLM,即遮罩语言模型(Mask language model,MLM),它像完形填空一样有趣。
下面这个图可以直观地展示MLM:
第二个任务,下一句预测: 由于许多下游任务涉及到对句子间关系的理解(QA,NLI),BERT 额外加了一个辅助任务,训练一个二分类器(binary classifier)判断一句话是不是另一句的下文:
上述两个辅助任务的训练数据可以轻易从任意单语语料中获取,所以训练规模不受限制。训练损失是累计平均遮罩 LM 概率,和累计平均下文预测概率。
下面这个图片展示了上面提到的三个语言建模模型的不同,还挺直观的。 1.2.4 BERT的使用1.2.4.1 BERT的输入嵌入为了在任务中使用BERT模型,需要了解BERT模型的不同位置输出的含义,这个其实涉及到了BERT的输入嵌入 BERT的输入嵌入是三部分的和:
如下图所示: 1.2.4.2 BERT在不同任务上的应用其实也就是微调,论文中给了下图: 而QA任务,要针对问题预测给定段落的文本跨度。BERT 对每个标识要预测两个概率分布,分别对应描述作为文本范围的开端和末尾的几率。微调时新训练的只有两个小矩阵 W s W_s Ws?和 W e W_e We? ,而 s o f t m a x ( h L ( i ) W s ) softmax(h_L^{(i)}W_{s}) softmax(hL(i)?Ws?)和 s o f t m a x ( h L ( i ) W e ) softmax(h_L^{(i)}W_{e}) softmax(hL(i)?We?)对应两个概率分布。 总体来讲微调下游任务时加上的内容很少——一两个权重矩阵,负责将 Transformer的 隐态转换成可解释形式。 1.2.4.3 将 BERT 用于特征提取
1.2.4.4 如何使用BERT
2 GPT2和Transformer Decoder的理解2.1 什么是GPT2事实上,我们在前面的1.2.3.3节已经接触到了GPT,OpenAI Transformer,也叫生成式预训练 Transformer(Generative Pre-training Transformer,GPT)。 GPT2是OpenAI开发的GPT 2.0,它的核心思想就是认为可以用无监督的预训练模型去做有监督任务。GPT2模型的结构还是和GPT一样,由Transformer的Decoder构成。和前文所述一致,它是通过从大量语料上训练一个机器学习模型,来进行语言建模。 GPT-2发布了四个大小版本,层数都很多,如下图 这个其实很好理解,因为decoder就是这么运作的。
2.2 Transformer Block的进化2.2.1 Self-Attention和Masked Self-Attention经过上一个任务attention和transformers的学习,我们现在已经很熟悉Transformer是由Encoder和Decoder构成的。 Encoder长这样,Self-Attention是重要的部分。 同时Decoder的Self-Attention有Mask,也叫Masked Self-Attention,用于屏蔽未来的token,具体来说,它不像 BERT 那样将单词改为mask,而是通过改变 Self-Attention 的计算,阻止来自被计算位置右边的 token。 2.2.2 Transformer-Decoder由Generating Wikipedia by Summarizing Long Sequences 提出的仅decoder模型Transformer-Decoder是GPT的雏形。 2.3 简单理解GPT2模型2.3.1 宏观上看GPT2的计算过程GPT-2 能够处理 1024 个 token。每个 token 沿着自己的路径经过所有的 Decoder 模块。 运行一个训练好的 GPT-2 模型的最简单的方法是让它自己生成文本(这在技术上称为 生成无条件样本)。或者,我们可以给它一个提示,让它谈论某个主题(即生成交互式条件样本)。在漫无目的情况下,我们可以简单地给它输入初始 token,并让它开始生成单词(训练好的模型使用
其实就是,给一个输入,经过GPT2,出来一个输出;下一个时刻,再把这个输出作为输入放入GPT2,然后计算下一个输出。 2.3.2 展开看GPT2的计算过程2.3.2.1 输入首先是输入编码,如下图,每一行都是一个词的embedding。这是一个数字列表wte,可以表示一个词并捕获一些含义。这个列表的大小在不同的 GPT-2 模型中是不同的。最小的模型使用的 embedding 大小是 768。 但是,在把 2.3.2.2 self-attention计算键值对self-attention回顾 2.3.2.3 输出当模型顶部产生输出向量时,可以将该向量乘以embedding的矩阵。 比如说,像下面这个 一般来说会
t
o
p
k
top_k
topk? 设置为 40,让模型考虑得分最高的 40 个词。 2.4 向量化理解Self-Attention2.4.1 Self-Attention在以下例子中,让我们看看一个玩具 Transformer,它一次只能处理 4 个 token。 Self-Attention 主要通过 3 个步骤来实现:
2.4.2 Masked Self-AttentionMasked Self-Attention其实也只是,把后面的token挡住(设为0),模型无法看到未来的值。 这个masking通常通过一个矩阵来实现,叫做attention mask。
2.5 向量化理解GPT2的计算2.5.1 Masked Self-Attention层在这边有一个计算技巧,从第二个位置开始(忽略
2.5.2 FFNN层Self-Attention层输出的向量会输入到FFNN(全连接神经网络层),这一层的计算主要分为两步:
2.5.3 权重矩阵小结在整个GPT2一个decoder模块的计算中,所涉及到的权重矩阵包括:
以GPT2 BASE为例,一个decoder模块所涉及的权重矩阵和其维度如下图所示:
2.6 Transformer Decoder的其他应用包括:
篇章小测
参考阅读 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/1 12:41:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |