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

自然语言处理NLP---预训练模型与 BERT

一、预训练模型

1.1简单认识

        预训练模型(Pretrained Model):在大规模数据上提前训练好模型,让模型先学习这些大数据的通用信息,掌握一般的特征或知识。然后再迁移到具体的任务中,无需重新从0开始训练。

        注意:这些数据集是没有标签的,进行的是无监督学习。预训练模型总结来的两个重要思想就是预训练和微调。

        预训练模型的杰出代表:ChatGPT、BERT

1.2核心技术机制

(1)自监督学习(SSF--self supervised learning):使用数据本身构造标签;

(2)微调(FT --- fine tuning):方式众多比如继续训练、参数微调;

(3)多模态建模:同时处理文本、图像、语言等多模态信息。

1.3案例

利用别人封装好的大模型进行一个文本分类操作,当前选择的模型是基于BERT模型的

步骤:

(1)导入模型,可以自己在官网下载,也可以编写程序,在程序中自动下载;

(2)利用模型进行推理。(最好在集成终端中进行)

# from transformers import BertForSequenceClassification
# from transformers import BertTokenizer
# import torch
# import os# current_path=os.path.realpath(os.path.dirname(__file__))
# cache_path =os.path.join(current_path,'cache')# tokenizer=BertTokenizer.from_pretrained(
#     'IDEA-CCNL/Erlangshen-Roberta-110M-Sentiment',
#     cache_dir=cache_path
#     )
# model=BertForSequenceClassification.from_pretrained(
#     'IDEA-CCNL/Erlangshen-Roberta-110M-Sentiment',
#     cache_dir=cache_path
#     )# text='今天天气真好'# inputs  =  tokenizer(
#     text,
#     return_tensors = 'pt'
#     )
# print('输入token_id',inputs['input_ids'])# with torch.no_grad():
#     outputs=model(**inputs)
#     print('输出logits',outputs.logits)# # 转为类别
# predicted_class_id = torch.argmax(outputs.logits, dim=-1).item()
# print("预测类别ID:", predicted_class_id)  
# print("预测类别标签:", model.config.id2label[predicted_class_id])# # model.config.id2label 
# # 是 Hugging Face Transformers 模型中的一个字典,它把 模型输出的类别索引(整数) 映射为 可读的标签(字符串)。from transformers import BertForSequenceClassification
from transformers import BertTokenizer  #把文字转成模型能理解的 token_id(整数序列)。
import torch
import os#路径处理,最好都用这种方法
current_path=os.path.realpath(os.path.dirname(__file__)) #当前文件的相对路径
cache_path =os.path.join(current_path,'cache')  #路径拼接#加载分词器,指定缓存路径
tokenizer=BertTokenizer.from_pretrained('IDEA-CCNL/Erlangshen-Roberta-110M-Sentiment',cache_dir=cache_path)#加载分类模型,直接用于预测
model=BertForSequenceClassification.from_pretrained('IDEA-CCNL/Erlangshen-Roberta-110M-Sentiment',cache_dir=cache_path)text='今天天气真好'inputs = tokenizer(text,return_tensors = 'pt')
print('编码id:',inputs['input_ids'])
decoder_text = tokenizer.decode(inputs['input_ids'][0])
print('解码文字:',decoder_text)#推理
with torch.no_grad():outputs = model(**inputs)print('原始输出:',outputs.logits)#转换类别
pre_cls_id = torch.argmax(outputs.logits,dim=-1).item()#将原本的positive、negative变为中文版的解释
id2label = model. config.id2label
pre_label = id2label[pre_cls_id]dict1 = {'Positive':'这是好评','Neutral': '这是中立评论','Negative':'这是差评'
}
print('预测类别id:',pre_cls_id)
print('预测类别标签:',dict1[pre_label])

结果:

编码id: tensor([[ 101,  791, 1921, 1921, 3698, 4696, 1962,  102]])
解码文字: [CLS] 今 天 天 气 真 好 [SEP]
原始输出: tensor([[-0.5385,  0.4860]])
预测类别id: 1
预测类别标签: 这是好评

二、BERT

BERT(bidirectional encoder representations from transformers)

2.1核心思想

        就是预训练模型的范式:BERT还包括一个双向。

(1)海量无标签数据进行无监督学习的预训练

(2)对模型进行具体项目的微调

cls本身并不代表具体的单词,它只是一个特殊标记,但是它为什么可以做分类判断:注意力机制,提取了整个语句的语义。

2.2优势

  • 强上下文理解能力:双向建模使得其理解力更强。

  • 预训练迁移能力强:可以微调于各种NLP下游任务。

  • 统一架构:一个模型可以处理分类、问答、文本蕴含等多种任务。

2.3模型结构

        BERT完全基于transformer encoder,没有decoder。

        

模型参数
版本层数隐藏维度注意力头数参数量

BERT base

BERT large

12

24

768

1024

12

16

110M

340M

M:百万

b:十亿

CLS:作为句子的开头,通过注意力机制,允许CLS与其他的token进行交互,具有整合序列全局信息的作用。

SEP:每一句话的结尾,作为模型区分句子的标志。

2.4预训练任务

        预训练任务有MLM和NSP两个任务,且两个任务同时训练。

2.4.1MLM

        MLM(Masked Language Model):将原句子的一小部分词(15%)进行掩码填充,不让模型看到这个真实的词,帮助模型理解词级别的上下文。

        方法:80%被mask,10%随机词,10%保留原词。

2.4.2NSP

        NSP(next sentences prediction):帮助模型理解句子之间的关系。模型输入两个句子50%是实际的连续句子,50%是另一篇文章的随机句子。

2.5下游任务

        BERT在做预训练之后,可以被用于多种NLP(自然语言处理)下游任务。

(1)句子级任务:情感分析、新闻分类、意图识别、虚假新闻识别;

(2)句对级任务:自然语言推理、问题匹配、问答系统;

(3)标注级任务:命名体识别、关键词抽取;

2.6使用方式

(1)预训练后微调FN整个模型;

(2)冻结BERT参数,再添加符合自己需求的上层新网络。

2.7 BERT问答系统

如果已经保存了模型,就只填模型路径,如果没有保存模型,可以直接下,将模型放到固定位置。

from transformers import AutoModelForQuestionAnswering,AutoTokenizer,pipeline
import oscurrent_path=os.path.realpath(os.path.dirname(__file__))
model_path=os.path.join(current_path,'01.review\QA_model')
if __name__ == '__main__':model = AutoModelForQuestionAnswering.from_pretrained(#'uer/roberta-base-chinese-extractive-qa',model_path)tokenizer = AutoTokenizer.from_pretrained(#'uer/roberta-base-chinese-extractive-qa',model_path)QA = pipeline('question-answering', model=model, tokenizer=tokenizer)QA_input = {'question': "谁是笨蛋",'context': "1不太聪明,2也不太聪明,3最不聪明。"}QA(QA_input)print(QA(QA_input))

三、小结

        学习了预训练范式以及基于BERT框架的情感分类、问答系统的两个小实验,认识了BERT的结构和参数组成,初步了解了一点有关大模型的基础知识。

http://www.xdnf.cn/news/1317853.html

相关文章:

  • rt-thread audio框架移植stm32 adc+dac,对接cherryusb uac,进行录音和播放
  • 软件需求规格说明书
  • 评测系统构建
  • 43.安卓逆向2-补环境-使用unidbg(使用Smali语法调用方法和使用方法地址调用方法)
  • 问津集 #5:Crystal: A Unified Cache Storage System for Analytical Databases
  • LangChain 多任务应用开发
  • 向量数据库基础和实践 (Faiss)
  • PyCharm与前沿技术集成指南:AI开发、云原生与大数据实战
  • 【FreeRTOS】刨根问底6: 应该如何防止任务栈溢出?
  • linux中已经启用的命令和替代命令
  • Honor of Kings 101star (S40) 2025.08.17
  • 开发者说 | EmbodiedGen:为具身智能打造可交互3D世界生成引擎
  • ICCV 2025 | Reverse Convolution and Its Applications to Image Restoration
  • GitLab CI/CD、Jenkins与GitHub Actions在Kubernetes环境中的方案对比分析
  • 多维视角下离子的特性、应用与前沿探索
  • C#读取文件, IO 类属性及使用示例
  • 为何她总在关键时“失联”?—— 解密 TCP 连接异常中断
  • tcp会无限次重传吗
  • 前端vue3+后端spring boot导出数据
  • 《设计模式》工厂方法模式
  • 【CV 目标检测】Fast RCNN模型②——算法流程
  • 代码随想录算法训练营四十四天|图论part02
  • 【Luogu】每日一题——Day21. P3556 [POI 2013] MOR-Tales of seafaring (图论)
  • 上网行为组网方案
  • 数据结构03(Java)--(递归行为和递归行为时间复杂度估算,master公式)
  • Mac(五)自定义鼠标滚轮方向 LinearMouse
  • Linux软件编程:进程与线程(线程)
  • JVM学习笔记-----StringTable
  • Docker Compose 安装 Neo4j 的详细步骤
  • PostgreSQL导入mimic4