2022最新版-李宏毅机器学习深度学习课程-P50 BERT的预训练和微调

本文主要是介绍2022最新版-李宏毅机器学习深度学习课程-P50 BERT的预训练和微调,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

模型输入无标签文本(Text without annotation),通过消耗大量计算资源预训练(Pre-train)得到一个可以读懂文本的模型,在遇到有监督的任务是微调(Fine-tune)即可。

最具代表性是BERT,预训练模型现在命名基本上是源自于动画片《芝麻街》。

 芝麻街人物

经典的预训练模型:

  • ELMo:Embeddings from Language Models
  • BERT:Bidirectional Encoder Representations from Transformers
  • 华丽分割线,命名逐渐开始离谱
  • ERNIE:Enhanced Representation through Knowledge Integration
  • Grover:Generating aRticles by Only Viewing mEtadaya Records

一、pre-train model 是什么

(一)预训练概念

预训练模型的概念并不是由BERT时才出现。

预训练的任务一般是实现 词语token -> 词向量embedding vector, vector中包含token的语义,比如我们语文中常学习的近义词,语义相近,那么要求其词向量也应该近似。

(二)多语义多语境

存在的问题:同一个token就可以指代同一个vector。解决方法Word2vec、Glove...

但是语言有无穷尽的词语,咱们现在就一直在创造新词语,如 “雪糕刺客”、“栓Q”等等新兴词汇不断迭代更新,一个新的词汇就要增加一个向量,显然是不太OK的。

那么,研究者就想到可以将词语再分,英文可以拆分为字符(FastText),中文可以拆分为单个字,或者将一个中文字看作一张图片输入CNN等模型,可以让模型学习到字的构成。

但分解为单个character后面临的就是语义多意的问题,“养只狗”、“单身狗”其中的“狗”都是狗,但是我们知道,两个“狗”其实是不同的,然鹅他们又不能完全分开,毕竟都用了一个字,其实咱们是将考虑到其语义的。

考虑上下文后,就诞生了语境词向量(Contextualized Word Embedding),输入模型的是整个句子,模型会阅读上下文,而不是仅仅考虑单个token,考虑语境后得到一个词向量表示。【Encoder行为】

语境词向量的模型一般模型会由多层组成,层结构常使用LSTM、Self-attention layers或者一些Tree-based model(与文法相关)。但Tree-base Model经过检验效果不突出,在文法结构严谨(解决数学公式)时,效果突出。

李老师列举了“苹果”在10个句子中的向量表示,两两计算相似度,得到一个10*10的混淆矩阵。可以明显观察到,水果苹果和苹果公司两个苹果语义有所区别。

预训练模型训练参数逐渐增加,网络结构逐渐复杂,各个公司都争相发布“全球最大预训练模型”。

(三)穷人的BERT

预训练模型参数量大,在训练时会消耗大量计算资源,都是一些互联网公司在做,像我们这些“穷人”,没有那么大的GPU算力,就会搞一些丐版BERT。

举例:

  • Distill BERT

[1910.01108] DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter (arxiv.org)​arxiv.org/abs/1910.01108

  • Tiny BERT

[1909.10351v5] TinyBERT: Distilling BERT for Natural Language Understanding (arxiv.org)​arxiv.org/abs/1909.10351v5

  • Mobile BERT

[2004.02984] MobileBERT: a Compact Task-Agnostic BERT for Resource-Limited Devices (arxiv.org)​arxiv.org/abs/2004.02984

  • ALBERT(相比于原版BERT, 12层不同参数,ALBERT12层参数完全一致,效果甚至超过原版BERT一点点)

[1909.11942] ALBERT: A Lite BERT for Self-supervised Learning of Language Representations (arxiv.org)​arxiv.org/abs/1909.11942

模型压缩技术:网络剪枝(Network Pruning)、知识蒸馏(Knowledge Distillation)、参数量化(Parameter Quantization)、架构设计(Architecture Design)

(四)架构设计(Architecture Design)

在该领域架构设计的目标,意在处理长文本语句。

典型代表,读者可以自行检索学习

  • Transformer-XL: Segment-Level Recurrence with State Reuse

[1901.02860] Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context (arxiv.org)​arxiv.org/abs/1901.02860

  • Reformer

[2001.04451] Reformer: The Efficient Transformer (arxiv.org)​arxiv.org/abs/2001.04451

  • Longformer

[2004.05150] Longformer: The Long-Document Transformer (arxiv.org)​arxiv.org/abs/2004.05150

Reformer和Longformer意在降低Self-attention的复杂度。

二、怎么做 Fine-tune

预训练+微调范式是现在的主流形式,我们可以拿到大公司训练好的大模型,只需要根据自己的下游任务加一些Layer,就可以应用某一个具体的下游任务上。

预训练微调效果的实现,需要预训练模型针对该问题进行针对性设计。

(一)Input & Output

这里总结了NLP Tasks的常见输入输出。

  • Input:
    • one sentence: 直接丢进去。
    • multiple sentences: Sentence1 SEP Sentence2, 句子分割。
  • Ouput:
    • one class: 加一个 CLS,或者直接将所有Embedding表示接下游任务分类
    • class for each token
    • copy from input: 可以解决阅读理解问题,QA。
    • General Sequence: 用到Seq2Seq Model
      • v1:将预训练模型看作Encoder,将下游任务模型看作Decoder。
      • v2:给出一个特别符号 SEP,得到字符再输入到预训练模型,让预训练模型encoder-decoder。

 

 

(二)How to fine-tune

如何微调也有两种,一种是冻结预训练模型,只微调下游任务对应的Task-specific部分;另一种是连同预训练模型,将整体网络结构进行参数微调(预训练模型参数不是随机初始化,可以有效避免过拟合)。

Adaptor

        考虑到模型巨大,微调代价太大,且消耗存储大。引入Apt,只微调Pre-train Model中的一部分Apt。这样只需要存储Apt和Task specific. 此处举一个例子。

现在很多预训练模型中都是使用了Transformer的结构,研究者在Transformer结构中插入Adaptor层,通过训练微调Adaptor,而不去修改其他已经训练好的参数。

三、Why Pre-train Models?

研究者提出了GLUE指标,用来衡量机器与人在不同语言任务上的表现,随着深度学习的发展,预训练模型的迭代更新,现在预训练模型使得模型效果已经同人类水平相差无几。

四、Why Fine-tune?

EMNLP19年刊发的一篇文章做了分析,在网络模型上fine-tune与否,Training Loss变化是不同的。

在有Fine-tune的情况下,Training Loss可以很好的实现收敛,而从头训练则会出现较大的波动。

同时考虑泛化能力,因为基于预训练模型将Training Loss降低到很低,有没有可能是过拟合导致的。海拔图可以表示,如果海拔图中,变化越陡峭,模型泛化能力越差,变化越平稳,模型泛化能力越强。

这篇关于2022最新版-李宏毅机器学习深度学习课程-P50 BERT的预训练和微调的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程