当前位置: 首页 > article >正文

LLM----BERT+HuggingFace理论及基础入门实战

一、BERT基础知识

1.1bert是什么

传统的表征模型:Word2Vec

1.基本原理

  Word2Vec通过分析大规模文本数据生成单词嵌入(word embeddings),捕捉单词之间的语义关系。其基本思想是,如果两个单词在许多上下文中出现得很相近,那么它们的语义和用法就可能相似。通过这一方法,Word2Vec能够生成高维向量(通常为100到300维),并保留单词之间的距离关系。

2.主要模型

Word2Vec主要实现了两种模型:CBOW(Continuous Bag of Words)和Skip-Gram。

  1. CBOW模型:使用上下文单词来预测中心单词。上下文单词组成一个窗口,CBOW模型通过对这些上下文单词的向量表示求平均或加权平均来预测目标中心单词。例如,在句子“The cat sat on the mat”中,当上下文窗口为2时,上下文可能是“The”,“cat”,“on”,“the”,而目标中心词是“sat”。
  2. Skip-Gram模型:用中心单词来预测上下文单词。输入一个中心单词,模型尝试预测在该中心词周围的上下文单词。对于同样的句子“The cat sat on the mat”,如果中心词是“sat”,则要预测上下文词“The”,“cat”,“on”,“the”,“mat”。

3.存在的缺点

因此提出了 Contestualized Word Embedding 的多语义结合方式。

bert的创新

1.抛弃了seq2seq的结构

encode可以学习r前后关系、decoder只有向前关系。bert只使用到了encoder方向。

2.加入了segment embedding,position embedding也可以通过参数学习

3.Mssaked Language Model(MLM) 

使用15%概率对训练集进行Mask,让模型预测出原有单词。

测试阶段不可能对全部词进行Mask,于是就产生了数据格式不匹配的问题。只会对mask敏感。

bert使用了8(mask):1(随机替换):1(不变)的方法。

总结

BERT是一个充分利用上下文的编码器,能够以文本中各个字/词(token)的原始词向量为输入,输出文本中各个字/词(token)融合了全文语义信息后的向量表示,并且在每一层都可以单独输出一个向量进行下游任务使用。bert运用到的是transformer的编码器结构,可以用于文本的相似度计算、序列标注、文本分类等任务。bert模型的base版有12层,large有24层。BERT模型考虑了所有的上下文,GPT只考虑了之前的n-1刻的前文。BERT的输入 在前边会增加[CLS]和[SEP]

[CLS]:分类的标识符。在BERT的输入序列的最开始,会添加一个特殊的标记[CLS]。这个标记的作用是作为整个输入序列的代表,用于后续的分类任务。例如,在情感分析任务中,模型会基于这个标记的输出向量来判断整个句子的情感倾向。

[SEP]:分隔符。标记用于分隔输入序列中的不同部分。这在处理成对的句子或段落时特别有用,比如问答任务中的问题和答案,或者句子关系判断任务中的两个句子。

1.2从bert结构详细学习bert

 1.2.1BERT的输入输出逻辑

BERT模型的主要输入是文本中各个字/词(token)的原始词向量,该向量既可以随机初始化,也可以利用 Word2Vector等算法进行预训练以作为初始值,输出是文本中各个字/词(token)融合了全文语义信息后的向量表示。

使用BERT预训练模型最多只能输入512个字符,最多只能两个句子合成一句,在处理逻辑上,针对输入的文本,先进行进行分词,然后利用bert固定的词库将切分好的token映射为对应的ID,并逐步获取其对应的向量表示。而最基本的处理,就是对输入进行切分,具体地: 将句子切分为tokens->在句子的开头添加[CLS] token->在句子的末尾添加[SEP] token->用[PAD] token填充句子,以使总长度等于最大长度->将每个token转换为模型中相应的ID->创建注意掩码,以明确区分真实token和[PAD]token BertTokenizer是其中输入处理的重要模块.

BERT的第一种输出[CLS]的表示,输出shape是[batch size,hidden size]。第二种获取的是整个句子每一个token的向量表示,输出shape是[batch_size, seq_length, hidden_size],model.get_sequence_output()结果中头尾是[CLS]和[SEP]的向量。

1.2.2BERT输入前的分词器

BERT中的tokenization.py是预处理进行分词的程序,主要有BasicTokenizer、WordpieceTokenizer、FullTokenizer三个分词器。

BasicTokenizer对于一个待分词字符串,做一些基础的大小写、unicode转换、标点符号分割、小写转换、中文字符分割、去除重音符号等操作,最后返回的是关于词的数组(中文是字的数组)。

wordpieceTokenizer基于词表vocabulary进行再一次切分,得到子词subword。subword介于char和word之间,既在一定程度保留了词的含义,又能够照顾到英文中单复数、时态导致的词表爆炸和未登录词的OOV问题,将词根与时态词缀等分割出来,从而减小词表,也降低了训练难度。

在切分上,采用最大正向匹配匹配方法,从左到右的顺序,将一个词拆分成多个子词,每个子词尽可能长,例如tokenizer这个词就可以拆解为“token”和“##izer”两部分,注意后面一个词的“##”表示接在前一个词后面。

FullTokenizer是BasicTokenizer和WordpieceTokenizer的结合,先进行 BasicTokenizer得到一个分得比较粗的token列表,然后再对每个token进行一次WordpieceTokenizer,得到最终的分词结果。

1.2.3BERT输入中的input Embeddings

BertEmbeddings类中BERT中的输入表示包括token embedding、segment embedding、position embedding三种,输入embedding由三种embedding相加得到,经过layernorm 和dropout后输出。

1)input_ids标记编码:[101, 146, 112, 182, 6949, 1158, 15642, 1116, 119, 102, 0, 0],标记编码就是上面的序列中每个标记转成编码后得到的向量;
2)position_id位置编码:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],位置编码记录每个标记的位置;;
3)token_type_ids句子位置编码:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],句子位置编码记录每个标记属于哪句话,0是第一句话,1是第二句话(注意:[CLS]标记对应的是0);
4)input_mask注意力掩码:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],注意力掩码记录某个标记是否是填充的,1表示非填充,0表示填充。这个用于attention_mask,其需要通过mask矩阵得到哪些位置有词。

下面对具体的embedding进行介绍:

1、token embedding

token embedding,BERT 模型通过查询字向量表将文本中的每个字转换为为词表大小x768维,使用embedding_lookup函数,将input_ids进行转换。

1)初始化词嵌入矩阵矩阵大小及 [vocab_size, embedding_size] 词表大小*词向量维度。
2)输入input_ids和嵌入矩阵相乘得到输入的嵌入矩阵,再reshape成[batch_size, seq_length, embedding_size]输出。

2、segment embedding

BERT的输入包括两种情况,单个句子或者一个句子对,segment embedding是为了区分第一个句子和第二个句子,segment embedding大小,也叫token_type_embeddings,为句子个数(type_vocab_size)x768维,BERT中的type_vocab_size设置为2,使用token_type_ids作为输入。

以“[CLS]今天心情好去哪玩[SEP]回江西吧[SEP]”为例:
“[CLS]今天心情好去哪玩[SEP]”中每一个字的segment embedding是一个1x768的向量,其中每一个向量元素全为0;
“回江西吧[SEP]”中每一个字的segment embedding是一个1x768的向量,其中每一个向量元素全为1。

在计算上,token_type_ids 输入大小是 [batch_size, seq_length],对应的嵌入矩阵是[token_type_vocab_size, embedding_size], 输入之后和嵌入矩阵相乘在reshape得到[batch_size, seq_length, embedding_size]。

3、position embedding

因为Transformer 在结构上不能识别来自不同位置的 token,position embedding的作用是为了记录句子中字词的顺序信息。

在实现上, position embedding的shape为[max_positition_embeddings, embedding],max_positition_embeddings最长为512,在处理过程中根据seq_length直接截取前seq_length,此时矩阵大小是[seq_length,embedding]。

二、HuggingFace Transformers

2.1自然语言处理的常见任务

2.2Transformers相关库

2.3Pipline

可以应用于文本分类、情感分析、问答、掩码填充、摘要、翻译。

# 查看Pipeline支持的任务类型

#根据任务类型直接创建Pipeline, 默认都是英文的模型

# 指定任务类型,再指定模型,创建基于指定模型的Pipeline

# 预先加载模型,再创建Pipeline

# 使用GPU进行推理

# 确定Pipeline参数 根据模型任务来确定有哪些参数

2.4Tokenizer

2.5 Model

1.要会在线加载模型

2.要会离线用git下载模型

2.6 Datasets

数据映射:定义一个函数,对每个数据都进行一个数据处理,比如设置成一定的格式返回。

2.7 evaluate

2.8 Trainer

三、问题总结

1.AutoTokenizer和BertTokenizer的区别

AutoTokenizer以其通用性和便捷性著称,适用于需要处理多种模型的情况;而BertTokenizer则针对BERT模型进行了优化,能够更好地处理未登录词和构建丰富的词汇表示。

2.hugging face连接不成功模型

在hugging face中下载这些文件保存到项目中

关于hugging face连接不上的问题,接可以加上如下两句:

import os
os.environ["HF_ENDPOIINT"]="https://hf-mirror.com"

3.numpy版本与transformer库不兼容

参考说明(感谢以下作者和老师)

如果需要本文项目实战代码可以去1、2up主视频下领取。

1.9.实战任务3中文句子关系推断_哔哩哔哩_bilibili​​​​​​

2.【手把手带你实战HuggingFace Transformers-入门篇】基础知识与环境安装_哔哩哔哩_bilibili、

3.【BERT】是师姐都说讲的清晰的BERT模型,确定不来看看吗!!_哔哩哔哩_bilibili

4.技术详解:BERT的分词预处理、输入Embedding、中间编码与输出向量解析_bert输入-CSDN博客


http://www.kler.cn/news/361048.html

相关文章:

  • 【Flutter】基础入门:自定义Widget
  • 空文件夹,python项目来启动
  • 《Python基础教程》笔记(ch0-1)
  • 2024年软件设计师中级(软考中级)详细笔记【7】面向对象技术(下)23种设计模式(分值10+)
  • js读取.txt文件内容
  • RIP协议
  • 刷爆leetccode Day5
  • 7-1 大写字母转换为小写字母(C++;cin;cout)
  • 数据库表的创建
  • Spring配置/管理bean-IOC(控制反转) 非常详细!基于XML及其注解!案例分析! 建议复习收藏!
  • 开源图像超分ECBSR项目源码分析
  • L1练习-鸢尾花数据集处理(分类/聚类)
  • STM32CubeIDE(Eclipse)Post-build steps添加带参.exe实现全流程(2):带参调用.exe的几种方法
  • 搭建知识库 | 知识管理在汽车行业中的作用
  • 缓存框架JetCache源码解析-缓存变更通知机制
  • 建库建表练习
  • c语言 atoi 函数的功能和模拟实现
  • YOLO11改进 | 注意力机制 | 正确的 Self-Attention 与 CNN 融合范式,性能速度全面提升【独家创新】
  • 【LVGL快速入门(二)】LVGL开源框架入门教程之框架使用(UI界面设计)
  • 揭秘 Feign 调用机制:微服务通信的无缝集成