人类语言处理nlp部分笔记——二、BERT和它的家族-介绍和微调

2024-06-08 01:04

本文主要是介绍人类语言处理nlp部分笔记——二、BERT和它的家族-介绍和微调,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考自李宏毅课程-人类语言处理

二、BERT和它的家族-介绍和微调

在这里插入图片描述

1. What is pre-train model

这里所说的pre-train model是输入一串tokens,能够输出一串vectors,且每个vector可以表示对应的语义的模型,这些vectors也被称作为embeddings。以前常用的模型有word2vec,Glove等,这里并没有详细介绍,之后需要单独去看,由于英文单词太多了,只要来一个新单词,整个embedding的模型就需要重新train,为了解决这个问题,有了fasttext。fasttext是针对英文的,针对中文的则是输入图片,让模型通过图片中文字的偏旁部首去预测出训练时没见过的文字的embedding。这种训练embedding的方式,根据语言的不同会有不同的方法。
在这里插入图片描述
但是有一个问题,如果输入的token是一样的,那么每次出来的vector也一样,所以希望模型可以在输入某个token的embedding的时候,考虑上下文信息,这叫做contextualized word embedding。这样的模型基本就是基于LSTM或者self-attention layer去搭建的一个seq2seq的模型(如Bert,Megatron,Turing NLG等),可以理解为encoder。
在这里插入图片描述
为了让模型效果变好,所用的模型越来越大,参数量越来越多,有一些模型压缩方面的技术,比如Distill BERT,Tiny BERT,ALBERT等,这里没有细说。

2. How to fine-tune

将pre-train model应用到各种任务中,这里将任务按照输入和输出分类
在这里插入图片描述

2.1 Input

  • one sentence
    输入只有一个句子时,直接输入就行了,因为pre-train model也是一个句子的输入。
  • multiple sentences
    输入有多个句子时,用一个叫做“[SEP]”的分隔符将两个句子拼成一个句子,然后再输入。
    在这里插入图片描述

2.2 Output

  • one class
    输入只有一个分类的时候,有两种做法,一种做法是,在输入的开头加“[CLS]”token,然后在“[CLS]”对应的输出的embedding后面加一个head,也就是比较浅的神经网络,可以是一层全连接,然后输出想要的类别数量;另一种做法是,把所有token的输出都输入到一个head当中去,然后输出想要的类别数量。
    在这里插入图片描述
  • class for each token
    当每个token都要做分类的时候,那在模型的后面加一个seq2seq的head就可以了。
    在这里插入图片描述
  • copy from input
    比如,当任务是Extraction-based QA时,输入有question和document,因此加入“[SEP]”分隔符合并成一个序列,然后输出是找出document中的哪个token为答案的start,哪个为答案的end,这个时候,就要用两个额外的向量去分别和document中每个token的输出做dot product,然后和start向量最相关的token是start token,和end向量最相关的token是end token。
    在这里插入图片描述
  • general sequence
    当希望模型的输出也是一个sequence的时候,可以把pre-train model的输出作为输入,在后面接一个decoder,让decoder去完成输出sequence的步骤,这样的坏处是decoder是一个比较大的模型,同时也没有进行pre-train。
    在这里插入图片描述
    另一种做法是把pre-train model当作decoder去做,这就需要在inout后面加一个类似“[SEP]”的特殊符号,然后把符号的输出丢到自定义的head中,然后输出一个token,然后把这个token当作输入,重复这个过程,直到输出"[EOS]"。
    在这里插入图片描述

2.3 Fine-tune

  • 在训练的时候,可以把pre-trained model的weights都固定住,只去训练最后自定义加上去的head。
  • 也可以直接训练整个模型,虽然模型很大,但是大部分的weights是与训练过的,所以训练起来没有重头训练困难,实际经验也是这种方法比上面的方法更好。
    在这里插入图片描述
    如果要用第二种方法,不同的tast需要train不同的模型,而这样的模型往往非常大,这就很浪费计算资源和存储资源,所以就有了Adaptor。Adaptor是我们在pretrained-model里加一些layer,然后训练的时候就训练这些layer和最后的head,这样pretrained model还是不动的。
    在这里插入图片描述
    下图就是一种插入Adaptor的方式。实验证明,Adapter可以让模型调很少的参数,却达到finetune整个模型的效果,Adaptor怎么加是需要考虑的。
    在这里插入图片描述

2.4 Weighted Features

由于pre-trained model往往很大,不同层得到的feature代表的意义也不同,所以可以把各层的feature抽出来加权后输入到head,加权的weights可以是模型自己去学的。
在这里插入图片描述

3. Why fine-tune

那为什么需要fine-tune,一方面是trainning loss可以更快的收敛,下图对比随机初始化训练和预训练之后训练的training loss随epoch的变化过程。
在这里插入图片描述
另一方面是fine-tune得到的模型有更好的泛化能力,在同样去找极小值点的时候,预训练的模型找到的极小值点附近的区域更加平缓,意味着泛化能力更好。
在这里插入图片描述

这篇关于人类语言处理nlp部分笔记——二、BERT和它的家族-介绍和微调的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040815

相关文章

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过