【深度学习】语言模型与注意力机制以及Bert实战指引之一

文章目录

  • 统计语言模型和神经网络语言模型
  • 注意力机制和Bert
  • 实战Bert
    • 配置环境和模型转换
    • 格式准备
  • 模型构建
    • 网络设计
    • 模型配置
    • 代码实战


统计语言模型和神经网络语言模型

区别:统计语言模型的本质是基于词与词共现频次的统计,而神经网络语言模型则是给每个词赋予了向量空间的位置作为表征,从而计算它们在高维连续空间中的依赖关系。
相对来说,神经网络的表示以及非线性映射,更加适合对自然语言进行建模。


注意力机制和Bert

Attention is all you need 是关于注意力机制最经典的论文,它是机制,准确来说,不是一个算法,而是一个构建网络的思路。
其实 Attention 机制要做:找到最重要的关键内容。它对网络中的输入(或者中间层)的不同位置,给予了不同的注意力或者权重,然后再通过学习,网络就可以逐渐知道哪些是重点,哪些是可以舍弃的内容了。

BERT 的全称是 Bidirectional Encoder Representation from Transformers,即双向 Transformer 的 Encoder。作为一种基于 Attention 方法的模型,它最开始出现的时候可以说是抢尽了风头,在文本分类、自动对话、语义理解等十几项 NLP 任务上拿到了历史最好成绩。BERT 的理论框架主要是基于论文《Attention is all you need》中提出的 Transformer,而后者的原理则是刚才提到的 Attention。
在这里插入图片描述
结合上图我们要注意的是,BERT 采用了基于 MLM 的模型训练方式,即 Mask Language Model。因为 BERT 是 Transformer 的一部分,即 encoder 环节,所以没有 decoder 的部分(其实就是 GPT)。
在这里插入图片描述

用过 Word2Vec 的小伙伴应该比较清楚,在 Word2Vec 中,对于同一个词语,它的向量表示是固定的,这也就是为什么会有那个经典的“国王-男人+女人=皇后”的计算式了,但有个问题,“苹果”可能是水果,也可能是手机品牌。如果还是用同一个向量表示,就有偏差了,而BERT可以根据上下文的不同,对同一个token给出的词向量是动态变化的,很灵活。

实战Bert

配置环境和模型转换

安装hugging face的Pytorch版本的Transformers包

pip install Transformers

ref:https://github.com/huggingface/transformers

在这里插入图片描述
找到这里面很重要的两个文件:
convert_BERT_original_tf_checkpoint_to_PyTorch.py 和 modeling_BERT.py
第一个是将tf2的模型转成pytorch版的
第二个是给咱一个BERT的使用案例

选一个预训练模型Pre-trained Models
ref:https://github.com/google-research/bert

在这里插入图片描述
102 languages, 12-layer, 768-hidden, 12-heads, 110M parameters

模型转换:

python convert_tf_checkpoint_to_pytorch.py --tf_checkpoint_path D:\code\python_project\01mlforeveryone\multilingual_L-12_H-768_A-12\multilingual_L-12_H-768_A-12\bert_model.ckpt  --bert_config_file D:\code\python_project\01mlforeveryone\multilingual_L-12_H-768_A-12\multilingual_L-12_H-768_A-12\bert_config.json --pytorch_dump_path bert/pytorch_model.bin

转换成功在这里插入图片描述
confiig.json BERT模型的配置文件,记录了所有用于训练的参数设置
PyTorch_model.bin 模型文件
vocab.txt 词表文件 用于识别所支持语言的字符、字符串或者单词

格式准备

输入的数据不能是直接把词输入到模型,需要转换成三种向量:

  1. Token embeddings: 词向量, [CLS] 开头,用于文本分类等任务
  2. Segment embeddings: 将两句话进行区分,比如问答任务,问句和答句同时输入,这就需要能够区分两句话的操作。
  3. Position embeddings 单词的位置信息

模型构建

我们来搭建一个基于BERT的文本分类网络模型,包括:网络的设计、配置、以及数据准备。

网络设计

modeling_BERT.py 文件作者已经给我们提供了很多种类的NLP任务代码。
其中“BERTForSequenceClassification”, 这个分类网络我们可以直接使用,它是最基本的BERT文本分类的流程。

模型配置

config.json
id2label: 类别标签和类别名称的映射关系
label2id:类别名称和列表标签的映射关系
num_labels_cate:类别的数量

修改方式见这里
ref:https://blog.csdn.net/qsx123432/article/details/126159843
ref:https://blog.csdn.net/weixin_42223207/article/details/125024596

代码实战

import numpy as np
import torch
from transformers import BertTokenizer, BertConfig, BertForMaskedLM, BertForNextSentencePrediction
from transformers import BertModelmodel_name = "./bert/bert-base-chinese/"
MODEL_PATH = "D:/code/python_project/01mlforeveryone/bert/bert-base-chinese/"
#### 'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-pytorch_model.bin",
####  'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-config.json",
####  'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt",
# a. 通过词典导入分词器
tokenizer = BertTokenizer.from_pretrained(model_name)
# b.导入配置文件
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)print(tokenizer.encode('吾儿莫慌'))   # [101, 1434, 1036, 5811, 2707, 102]sen_code = tokenizer.encode_plus('这个故事没有终点', "正如星空没有彼岸")
print(sen_code)
"""
{'input_ids': [101, 100, 100, 100, 100, 100, 100, 100, 100, 102, 100, 100, 100, 100, 100, 100, 100, 100, 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_ids转化回token:
print(tokenizer.convert_ids_to_tokens(sen_code['input_ids']))
"""
['[CLS]', '这', '个', '故', '事', '没', '有', '终', '点', '[SEP]', '正', '如', '星', '空', '没', '有', '彼', '岸', '[SEP]']
"""
# 将分词输入模型,得到编码:
# 对编码进行转换,以便输入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])
model_name = 'bert-base-chinese'    # 指定需下载的预训练模型参数

在下一 篇文章,我们将开始做更多的练习

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

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

相关文章

2023大湾区汽车创新大会暨IEEE自动驾驶国际标准研讨会成功举办

2023年12月15日-12月16日,由IEEE ADWG工作组主席孙栋博士、杨子江博士共同主持的2023大湾区汽车创新大会平行主题论坛-IEEE自动驾驶国际标准研讨会在深圳坪山成功举办。图灵奖获得者Joseph Sifakis、英伟达仿真生态总监German Ros、ASAM标准组织CEO Marius Dupuis、…

云原生之深入解析Kubernetes集群发生网络异常时如何排查

一、Pod 网络异常 网络不可达,主要现象为 ping 不通,其可能原因为: 源端和目的端防火墙(iptables, selinux)限制; 网络路由配置不正确; 源端和目的端的系统负载过高,网络连接数满…

Re解析(正则表达式解析)

正则表达式基础 元字符 B站教学视频: 正则表达式元字符基本使用 量词 贪婪匹配和惰性匹配 惰性匹配如下两张图,而 .* 就表示贪婪匹配,即尽可能多的匹配到符合的字符串,如果使用贪婪匹配,那么结果就是图中的情况三 p…

CTF网络安全大赛是干什么的?发展史、赛制、赛程介绍,参赛需要学什么?

CTF(Capture The Flag)是一种网络安全竞赛,它模拟了各种信息安全场景,旨在提升参与者的网络安全技能。CTF 赛事通常包含多种类型的挑战,如密码学、逆向工程、网络攻防、Web 安全、二进制利用等。 发展史 CTF 的概念…

LLM大语言模型(二):Streamlit 无需前端经验也能画web页面

目录 问题 Streamlit是什么? 怎样用Streamlit画一个LLM的web页面呢? 文本输出 页面布局 滑动条 按钮 对话框 输入框 总结 问题 假如你是一位后端开发,没有任何的web开发经验,那如何去实现一个LLM的对话交互页面呢&…

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚

目录 一、实验 1.环境 2.GitLab新建项目存放K8S部署文件 3.Jenkins手动测试前端项目CD 流水线代码(下载部署文件) 4. 将K8S master节点配置为jenkins从节点 5.K8S 手动回滚前端项目版本 6.Jenkins手动测试前端项目CD 流水线代码(发布应…

棋牌的电脑计时计费管理系统教程,棋牌灯控管理软件操作教程

一、前言 有的棋牌室在计时的时候,需要使用灯控管理,在开始计时的时候打开灯,在结账后关闭灯,也有的不需要用灯控,只用来计时。 下面以 佳易王棋牌计时计费管理系统软件为例说明: 软件试用版下载或技术支…

Axure中继器完成表格的增删改查的自定义元件(三列表格与十列表格)

目录 一、中继器 1.1 定义 1.2 特点 1.3 适用场景 二、三列表格增删改查 2.1 实现思路 2.2 效果演示 三、十列表格增删改查 3.1 实现思路 3.2 效果演示 一、中继器 1.1 定义 在Axure中,"中继器"通常指的是界面设计中的一个元素,用…

Eclipse 一直提示 loading descriptor for 的解决方法

启动eclipse之后,进行相关操作时,弹出界面,提示:loading descriptor for xxx 解决方法: 在Eclipse左侧的Project Explorer 最右上角有一个小钮,鼠标移上去时提示"View Menu". 你点一下,在弹出的上下文菜单中…

TypeScript基础语法

官方网站: TypeScript: JavaScript With Syntax For Types. (typescriptlang.org) 中文网站:TypeScript中文网 TypeScript——JavaScript的超集 (tslang.cn) TypeScript基础语法 1.变量声明 2.条件控制 3.循环迭代 数组迭代 4.函数 默认参数 5.类和接…

JavaWeb笔记之JavaWeb JDBC

//Author 流云 //Version 1.0 一. 引言 1.1 如何操作数据库 使用客户端工具访问数据库,需要手工建立连接,输入用户名和密码登录,编写 SQL 语句,点击执行,查看操作结果(结果集或受影响行数)。…

计算机网络考研辨析(后续整理入笔记)

文章目录 体系结构物理层速率辨析交换方式辨析编码调制辨析 链路层链路层功能介质访问控制(MAC)信道划分控制之——CDMA随机访问控制轮询访问控制 扩展以太网交换机 网络层网络层功能IPv4协议IP地址IP数据报分析ICMP 网络拓扑与转发分析(重点…

【Git】在 IDEA 中合并多个 commit 为一个

文章目录 1 未提交到远程分支1.1 需求说明1.2 reset 操作1.3 再次 push 2 已经提交到远程分支2.1 需求说明2.2 rebase 操作2.3 强制 push 分两种情况: 一种是本地提交还没推到远程,这种好处理另一种是已经提交到远程分支,这个略麻烦 1 未提…

我的4096创作纪念日

机缘 岁月如梭,时光一晃已经在CSDN扎根4096天了。第一次注册CSDN好像还是在2012年,那会还没大学毕业。初入CSDN,只是把他当作自己编程时遇到问题的在线笔记记录而已,没想到无意间还帮助了其他遇到同样问题困扰的同学。而在这4096…

杰发科技AC7840——SPM电源管理之低功耗模式

0、SPM简介 很早以前就听过低功耗模式,一直没有怎么深入了解,最近遇到几个项目都是跟低功耗有关。正好AutoChips的芯片都有电源管理的功能,在此借用AC7840的SPM对低功耗进行测试。 1、AC7840的5种功耗模式 2、AC7840的模式转换 3、唤醒 在…

Java实现一个在windows环境下的文件搜索引擎

以下是一个简单的Java实现的Windows文件搜索引擎的示例代码: import java.io.File; import java.util.ArrayList; import java.util.List;public class FileSearchEngine {public static void main(String[] args) {String searchDirectory "C:/"; // …

保护您的Android应用程序:Android应用程序安全一览

保护您的Android应用程序:Android应用程序安全一览 我们都知道Android是为所有人设计的——开放、面向开发者、面向用户,这种开放性为今天和明天的移动技术提供了很多便利。然而,开放性也带来了需要妥善处理的安全风险。 安全是我们所有人都…

lua语法

lua语法 1.lua数据类型 lua 脚本输出乱码,将lua脚本改为UTF-8编码,并且需要DOS下修改代码页:CHCP 65001 即可。 基本语法 注释 print("script lua win")-- 单行注释--[[多行注释]]--标识符 类似于:java当中 变量、…

【论文笔记】动态蛇卷积(Dynamic Snake Convolution)

精确分割拓扑管状结构例如血管和道路,对医疗各个领域至关重要,可确保下游任务的准确性和效率。然而许多因素使分割任务变得复杂,包括细小脆弱的局部结构和复杂多变的全局形态。针对这个问题,作者提出了动态蛇卷积,该结…

随笔记录-springboot_LoggingApplicationListener+LogbackLoggingSystem

环境:springboot-2.3.1 加载日志监听器初始化日志框架 SpringApplication#prepareEnvironment SpringApplicationRunListeners#environmentPrepared EventPublishingRunListener#environmentPrepared SimpleApplicationEventMulticaster#multicastEvent(Applicati…