bert-base-chinese模型使用教程

向量编码和向量相似度展示
import torch
from transformers import BertTokenizer, BertModel
import numpy as npmodel_name = "C:/Users/Administrator.DESKTOP-TPJL4TC/.cache/modelscope/hub/tiansz/bert-base-chinese"sentences = ['春眠不觉晓', '大梦谁先觉', '浓睡不消残酒', '东临碣石以观沧海']tokenizer = BertTokenizer.from_pretrained(model_name)
# print(type(tokenizer)) # <class 'transformers.models.bert.tokenization_bert.BertTokenizer'>model = BertModel.from_pretrained(model_name)
# print(type(model)) # <class 'transformers.models.bert.modeling_bert.BertModel'>def test_encode():input_ids = tokenizer.encode('春眠不觉晓', return_tensors='pt') # shape (1, 7)output = model(input_ids)print(output.last_hidden_state.shape)  # shape (1, 7, 768)v = torch.mean(output.last_hidden_state, dim=1)  # shape (1, 768)print(v.shape)  # shape (1, 768)print(output.pooler_output.shape)  # shape (1, 768)

根据 transformers\modeling_outputs.py:196,即 BaseModelOutputWithPoolingAndCrossAttentions 的注释:

@dataclass
class BaseModelOutputWithPoolingAndCrossAttentions(ModelOutput):"""Base class for model's outputs that also contains a pooling of the last hidden states.Args:last_hidden_state (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`):Sequence of hidden-states at the output of the last layer of the model.pooler_output (`torch.FloatTensor` of shape `(batch_size, hidden_size)`):Last layer hidden-state of the first token of the sequence (classification token) after further processingthrough the layers used for the auxiliary pretraining task. E.g. for BERT-family of models, this returnsthe classification token after processing through a linear layer and a tanh activation function. The linearlayer weights are trained from the next sentence prediction (classification) objective during pretraining.hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):Tuple of `torch.FloatTensor` (one for the output of the embeddings, if the model has an embedding layer, +one for the output of each layer) of shape `(batch_size, sequence_length, hidden_size)`.Hidden-states of the model at the output of each layer plus the optional initial embedding outputs.attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`):Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length,sequence_length)`.Attentions weights after the attention softmax, used to compute the weighted average in the self-attentionheads.cross_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` and `config.add_cross_attention=True` is passed or when `config.output_attentions=True`):Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length,sequence_length)`.Attentions weights of the decoder's cross-attention layer, after the attention softmax, used to compute theweighted average in the cross-attention heads.past_key_values (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`):Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of shape`(batch_size, num_heads, sequence_length, embed_size_per_head)`) and optionally if`config.is_encoder_decoder=True` 2 additional tensors of shape `(batch_size, num_heads,encoder_sequence_length, embed_size_per_head)`.Contains pre-computed hidden-states (key and values in the self-attention blocks and optionally if`config.is_encoder_decoder=True` in the cross-attention blocks) that can be used (see `past_key_values`input) to speed up sequential decoding."""last_hidden_state: torch.FloatTensor = Nonepooler_output: torch.FloatTensor = Nonehidden_states: Optional[Tuple[torch.FloatTensor, ...]] = Nonepast_key_values: Optional[Tuple[Tuple[torch.FloatTensor]]] = Noneattentions: Optional[Tuple[torch.FloatTensor, ...]] = Nonecross_attentions: Optional[Tuple[torch.FloatTensor, ...]] = None

1为batch_size,我们出入的就是一个字符串所以batch_size为1。

7为sequence_length,BERT模型会为单句的输入前面加特殊字符[CLS]和后面加特殊字符[SEP],因此为7个字符。

768为hidden_size,即每个字符被编码成768个数字组成的向量。

根据文档的说法,pooler_output向量一般不是很好的句子语义摘要,因此这里采用了将 last_hidden_state 进行池化的方法。

torch.mean(dim)函数

这是常用的池化pooling方法,降低向量的维度,便于运算。

dim不指定任何参数就是所有元素的算术平均值

dim指定为0时,求得是列的平均值。

dim指定为1时,求得是行的平均值;

也就是经过tarch.mean()之后,这句话变成了一个 1X768 的向量,即使用这一个向量来代表着句话的语义。

接下来就可以计算文本相似度得分了,目标为上面给出的四个句子。

def test_similarity():with torch.no_grad():vs = [sentence_embedding(sentence).numpy() for sentence in sentences]nvs = [v / np.linalg.norm(v) for v in vs]  # normalize each vectorm = np.array(nvs).squeeze(1)  # shape (4, 768)print(np.around(m @ m.T, decimals=2))  # pairwise cosine similaritydef sentence_embedding(sentence):input_ids = tokenizer.encode(sentence, return_tensors='pt')output = model(input_ids)return torch.mean(output.last_hidden_state, dim=1)

@符号是矩阵相乘

输出结果 4X4

[[1.   0.75 0.83 0.57][0.75 1.   0.72 0.51][0.83 0.72 1.   0.58][0.57 0.51 0.58 1.  ]]
春眠不觉晓大梦谁先觉浓睡不消残酒东临碣石以观沧海
春眠不觉晓10.750.830.57
大梦谁先觉0.7510.720.51
浓睡不消残酒0.830.7210.58
东临碣石以观沧海0.570.510.581

with torch.no_grad() 的作用是将模型状态置为推断(inference),即在计算过程中不进行梯度计算和反向传播操作。

关于 last_hidden_state 与 pooler_output

看bert中文文本分类任务,发现训练输出结果向量仅使用了第一个token的向量,而一句话中的第一个位置是特殊字符[CLS],那么该如何理解呢?

BERT在第一句前会加一个[CLS]标志,CLS 就是 classification 分类之意,即 CLS 的作用就是它能代表整句话的意思,使用它就可以对整句话进行分类。用于下游的分类任务等。

为什么选它呢,因为与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。具体来说,self-attention是用文本中的其它词来增强目标词的语义表示,但是目标词本身的语义还是会占主要部分的,因此,经过BERT的12层,每次词的embedding融合了所有词的信息,可以去更好的表示自己的语义。而[CLS]位本身没有语义,经过12层,得到的是attention后所有词的加权平均,相比其他正常词,可以更好的表征句子语义。

当然,也可以通过对最后一层所有词的embedding做pooling池化处理去表征句子语义,最常用的池化方法就是平均法mean。

从上面的打印信息我们可以知道 pooler_output 的结果也是 1X768,与 torch.mean() 的维度一样,可以理解为它是经过模型池化后的结果。pooler_output是通过应用一个线性层和一个激活函数(通常是Tanh)到last_hidden_state的第一个token(即[CLS]标记)的隐藏状态来生成的。这个输出通常用于分类任务,因为它编码了整个序列的信息。

BERT下游NLP任务的微调

https://zhuanlan.zhihu.com/p/149779660

在BERT原论文的设计中,下游NLP任务被分成如下几类:

  1. 句子对分类型任务,如GLUE的MNLI、QQP、MRPC等
  2. 单句分类型任务,如GLUE的STS-2、CoLA等
  3. 问答/阅读理解型任务,需要根据问题,在备选回答文本中标识出答案部分,如SQuAD
  4. 单句标注任务,给每个token打上标签,如POS词性标注、NER命名实例识别任务

一般来说,以上4类任务已经基本上可以涵盖大部分下游NLP任务了。

我们在上节指定的sst-2任务实际上就是一类“单句分类”型NLP任务,利用run_glue.py脚本,我们可以几乎不用写代码就可以完成微调。GLUE基准测试集一共包括9种不同类型的数据集,如下表小结。

在这里插入图片描述

动手写BERT系列 https://www.bilibili.com/video/av258262103?vd_source=0c75dc193ee55511d0515b3a8c375bd0&spm_id_from=333.788.videopod.sections

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML+CSS科技感时钟(附源码!!!)

预览效果 源码(直接复制使用) <!DOCTYPE html> <html lang"zh-Hans"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>科技感时钟</…

PyQt5实战——UTF-8编码器功能的实现(六)

个人博客&#xff1a;苏三有春的博客 系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序…

‌MySQL中‌between and的基本用法‌

文章目录 一、between and语法二、使用示例2.1、between and数值查询2.2、between and时间范围查询2.3、not between and示例 BETWEEN AND操作符可以用于数值、日期等类型的字段&#xff0c;包括边界值。 一、between and语法 MySQL中的BETWEEN AND操作符用于在两个值之间选择…

微服务系列一:基础拆分实践

目录 前言 一、认识微服务 1.1 单体架构 VS 微服务架构 1.2 微服务的集大成者&#xff1a;SpringCloud 1.3 微服务拆分原则 1.4 微服务拆分方式 二、微服务拆分入门步骤 &#xff1a;以拆分商品模块为例 三、服务注册订阅与远程调用&#xff1a;以拆分购物车为例 3.1 …

jvm学习笔记-轻量级锁内存模型

一&#xff0c;轻量级锁 LockRecord的那个第一个成员变量是拷贝对应锁定了的java对象资源的MarkWord&#xff0c;Lock Record有一个Ptr指针刚开始指向自己&#xff0c;后面这个指针存储在锁定资源的java对象的markword中&#xff0c;后续可以通过java对象的MarkWord快速定位到…

【力扣专题栏】面试题 01.02. 判定是否互为字符重排,如何利用数组模拟哈希表解决两字符串互排问题?

题解目录 1、题目描述解释2、算法原理解析3、代码编写(1)、两个数组分别模拟哈希表解决(2)、利用一个数组模拟哈希表解决问题 1、题目描述解释 2、算法原理解析 3、代码编写 (1)、两个数组分别模拟哈希表解决 class Solution { public:bool CheckPermutation(string s1, stri…

指针和内存地址的关系(uint8_t和uint32_t的指针有什么区别)

指针在我们的学习中非常常见&#xff0c;有些人只是了解指针的基本概念&#xff0c;却不知道他的原理&#xff0c;到时候使用起来一头雾水&#xff0c;接下来我将对指针做出一些解释说明。 一、数据是如何存储的&#xff1a; 我们初始化一个int变量a,变量a会存储到内存中&#…

flutter 专题四 Flutter渲染流程

一、 Widget - Element - RenderObject关系 二、 Widget 、Element 、RenderObject 分别表示什么 2.1 Widget Widget描述和配置子树的样子 Widget就是一个个描述文件&#xff0c;这些描述文件在我们进行状态改变时会不断的build。但是对于渲染对象来说&#xff0c;只会使用最…

高效内容营销策略提升品牌影响力与客户忠诚度

内容概要 内容营销是一种通过创造和分享有价值的内容&#xff0c;以吸引特定目标受众并促进品牌发展的策略。这种营销形式不仅仅注重产品的直接推广&#xff0c;更着眼于与受众之间建立长期的信任关系。有效的内容营销能够提升品牌在市场中的影响力和客户的忠诚度&#xff0c;…

git 入门作业

任务1: 破冰活动&#xff1a;自我介绍任务2: 实践项目&#xff1a;构建个人项目 git使用流程&#xff1a; 1.将本项目直接fork到自己的账号下&#xff0c;这样就可以直接在自己的账号下进行修改和提交。 这里插一条我遇到的问题&#xff0c;在fork的时候没有将那个only camp4的…

NumPy Ndarray学习

1.NumPy Ndarray 对象简介 NumPy 最重要的特点是其 N 维数组对象 ndarray&#xff0c;它是一系列同类型数据的集合&#xff0c;以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。 2.N…

网络层3——IP数据报转发的过程

目录 一、基于终点的转发 1、理解 2、IP数据报转发过程 二、最长前缀匹配 1、理解 2、主机路由 3、默认路由 三、二叉线索查找 一、基于终点的转发 1、理解 理解什么叫终点转发 IP数据报的传递&#xff0c;交给路由器后 可不可以做到直接发送给目的主机呢&#xff1f;…

【UGUI】为射击游戏添加动态显示的分数和血量到UI界面

项目背景 在这个项目中&#xff0c;我们希望实现一个简单的游戏系统&#xff0c;其中玩家可以通过击中目标来获得分数&#xff0c;同时通过与怪物碰撞来减少血量。分数和血量需要在游戏界面上实时显示&#xff0c;以便玩家能够随时了解自己的状态。 技术实现 1. 静态变量的使…

「C/C++」C/C++标准库 之 #include<cstdlib> 通用工具函数库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

CTF压缩包破解神器bkcrack教程和详细使用过程

kali安装bkcrack教程和详细使用过程 1.bkcrack介绍&#xff1a;2.bkcrack功能&#xff1a;3.bkcrack安装&#xff1a;Linux-Kali下&#xff1a;测试&#xff1a;Windows下安装&#xff1a; 4.bkcrack的使用方法&#xff1a;4.1查看相关参数4.2恢复内部密钥从 zip 档案中加载数据…

基于Python的乡村居民信息管理系统【附源码】

基于Python的乡村居民信息管理系统 效果如下&#xff1a; 系统主页面 系统登录页面 管理员主页面 居民管理页面 政务学习页面 土地信息管理页面 个人信息管理页面 居民登陆页面 村委人员主页面 研究背景 随着信息技术的飞速发展和乡村振兴战略的深入实施&#xff0c;传统的乡…

UI设计公司—兰亭妙微—提供轨道交通行业UI设计

蓝蓝设计工作室2008年开始&#xff0c;2011年正式成立北京兰亭妙微科技有限公司&#xff0c;主创清华团队&#xff0c;专注软件和互联网ui设计开发&#xff0c;擅长企业信息化管理、监控、大数据软件UIUE咨询和设计开发服务。立足UI&#xff0c;一直在学习进步。交通行业UE UI解…

2-Ubuntu/Windows系统启动盘制作

学习目标&#xff1a; 掌握使用Win32DiskImager、Rufus等工具制作系统启动盘的基本步骤。独立将ISO镜像文件写入USB闪存驱动器&#xff0c;确保在需要时顺利安装或修复系统。通过学习如何选择正确的源文件和目标驱动器&#xff0c;理解启动盘的使用场景和注意事项&#xff0c;…

Java项目管理与SSM框架介绍

Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程&#xff0c;管理jar包&#xff0c;编译代码&#xff0c;完成测试&#xff0c;项目打包等等。Maven工具是基于POM&#xff08;Project Object Model&#xff0c;项目对象模型&#xff09;实现的。在Maven的管理下每…

CGAL生成简单形状

三角形 四边形 立方体 六面体 棱柱 锥体 二十面体 网格 Polyhedron _mesh;/**************三角形************/CGAL::make_triangle(K::Point_3(100, 0, 0), K::Point_3(0, 100, 0), K::Point_3(0, 0, 0), _mesh);CGAL::IO::write_polygon_mesh("F:/WORK/STL/triangle.stl…