人类语言处理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

相关文章

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与