热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BERT模型的应用与实践

本文探讨了BERT模型在自然语言处理领域的应用与实践。详细介绍了Transformers库(曾用名pytorch-transformers和pytorch-pretrained-bert)的使用方法,涵盖了从模型加载到微调的各个环节。此外,还分析了BERT在文本分类、情感分析和命名实体识别等任务中的性能表现,并讨论了其在实际项目中的优势和局限性。


1. transformer资料

transformers(以前称为pytorch-transformers和pytorch-pretrained-bert)

提供用于自然语言理解(NLU)和自然语言生成(NLG)的BERT家族通用结构(BERT,GPT-2,RoBERTa,XLM,DistilBert,XLNet等),包含超过32种、涵盖100多种语言的预训练模型


2.使用

import numpy as np
import torch

下载transformers包

!pip install transformers

下载分词器和模型

from transformers import BertTokenizer,BertModel

下载bert-base-chinese的config.josn,vocab.txt,pytorch_model.bin三个文件后,放在bert-base- chinese文件夹下,此例中该文件夹放在F:/Transformer-Bert/下#导入分词器

model_name = 'bert-base-chinese'
MODEL_PATH = 'F:/Transformer-Bert/bert-base-chinese/'

导入分词器

tokenizer = BertTokenizer.from_pretrained(model_name)

 导入配置文件

model_config = BertConfig.from_pretrained(model_name)

修改配置

model_config.output_hidden_states = True
model_config.output_attentions = True

通过配置和路径导入模型

bert_model = BertModel.from_pretrained(MODEL_PATH, config = model_config)

 输入文本

input_text = "我爱伟大的祖国"

# 通过tokenizer把文本变成 token_id

encode仅返回input_ids

encode_plus返回所有编码信息

    input_ids:是单词在词典中的编码

    token_type_ids:区分两个句子的编码(上句全为0,下句全为1)

    attention_mask:指定 对哪些词 进行self-Attention操作

input_ids = tokenizer.encode(input_text)
sen_code = tokenizer.encode_plus('这个故事没有终点', "正如星空没有彼岸")

#print(sen_code)

# {'input_ids': [101, 6821, 702, 3125, 752, 3766, 3300, 5303, 4157, 102, 3633, 1963, 3215, 4958, 3766, 3300, 2516, 2279, 102], 

#  'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
#  'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

将input_id转化回token

tokenizer.convert_ids_to_tokens(sen_code['input_ids'])

转化为tensor

tokens_tensor = torch.tensor([sen_code['input_ids']]) # 添加batch维度并,转换为tensor,torch.Size([1, 19])
segments_tensors = torch.tensor(sen_code['token_type_ids']) # torch.Size([19])
bert_model.eval()
# 进行编码
with torch.no_grad():outputs = bert_model(tokens_tensor, token_type_ids = segments_tensors)encoded_layers = outputs # outputs类型为tupleprint(encoded_layers[0].shape, encoded_layers[1].shape, encoded_layers[2][0].shape, encoded_layers[3][0].shape)# torch.Size([1, 19, 768]) torch.Size([1, 768])# torch.Size([1, 19, 768]) torch.Size([1, 12, 19, 19])

Bert最终输出的结果维度为:sequence_output, pooled_output, (hidden_states), (attentions)

以输入序列为19为例:

    sequence_output:torch.Size([1, 19, 768])
        输出序列

    pooled_output:torch.Size([1, 768])
        对输出序列进行pool操作的结果

    (hidden_states):tuple, 13 * torch.Size([1, 19, 768])
        隐藏层状态(包括Embedding层),取决于 model_config 中的 output_hidden_states

    (attentions):tuple, 12 * torch.Size([1, 12, 19, 19])
        注意力层,取决于 model_config 中的 output_attentions

2. 遮蔽语言模型 Masked Language Model

BERT以训练遮蔽语言模型(Masked Language Model)作为预训练目标。

    具体来说就是把 输入的语句中的字词 随机用 [MASK] 标签覆盖,然后 训练模型 结合被覆盖的词的 左侧 和 右侧上下文进行预测。

    可以看出,BERT 的做法 与 从左向右语言模型只通过左侧语句预测下一个词的做法相比,遮蔽语言模型 能够生成同时融合了左、右上下文的语言表示。

    这种做法能够使 BERT 学到字词更完整的语义表示。


推荐阅读
  • 所在位置|室友_Python+OpenCv实现图像边缘检测(滑动调节阈值)
    所在位置|室友_Python+OpenCv实现图像边缘检测(滑动调节阈值) ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文详细介绍了 Android 开发中常用的单位 dip(设备独立像素)、px(像素)、pt(点)和 sp(可缩放像素),并解释了它们在不同屏幕密度下的应用。 ... [详细]
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • 分层学习率衰减在NLP预训练模型中的应用
    本文探讨了如何通过分层学习率衰减技术来优化NLP预训练模型的微调过程,特别是针对BERT模型。通过调整不同层的学习率,可以有效提高模型性能。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 本文档详细介绍了软通动力Java开发工程师职位的笔试题目,涵盖了Java基础、集合框架、JDBC、JSP等内容,并提供了详细的答案解析。 ... [详细]
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • 本文介绍了一个使用Spring框架和Quartz调度器实现每周定时调用Web服务获取数据的小项目。通过详细配置Spring XML文件,展示了如何设置定时任务以及解决可能遇到的自动注入问题。 ... [详细]
  • 深入解析Python进程间通信:Queue与Pipe的应用
    本文详细探讨了Python中进程间通信的两种常用方法——Queue和Pipe,并通过具体示例介绍了它们的基本概念、使用方法及注意事项。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中安装 Python 3.7 的步骤,包括编译工具的安装、Python 3.7 源码的下载与编译、软链接的创建以及常见错误的处理方法。 ... [详细]
author-avatar
mobiledu2502934573
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有