bert处理超过512的长文本(强制改变位置编码position_embeddings )

news2024/11/29 0:48:25

最近在做 NER 任务的时候,需要处理最长为 1024 个字符的文本,BERT 模型最长的位置编码是 512 个字符,超过512的部分没有位置编码可以用了

处理措施:

  1. 将bert的位置编码认为修改成(11024),前512维使用原始的 (1512)初始化,后512维随机初始化
  2. 将bert的位置编码认为修改成(11024),前512维使用原始的 (1512)初始化,后512维依旧使用原始的(1*512)进行初始化
  3. 苏剑林:层次分解位置编码,让BERT可以处理超长文本 - 科学空间|Scientific Spaces
  4. 使用longformer
  5. 对文本进行切割

下面介绍如何强制改变位置编码

采用1,2所表述的方式,强制改变位置编码,由512 扩展到 1024,具需要在 modeling_bert.py 的 BertEmbeddings class中,新声明一个 (1*1024)的position_embedding,并且将forward 函数中的 position_embedding替换成新声明的这个位置编码。
在load 完模型之后,会警告说,新的位置编码并不在原始的模型参数中,所以是随机初始化的,这里注意,原始的位置编码还是要保留的,用于将原始的位置编码加载进来。当模型加载结束后,我们将原始的 位置编码和新的位置编码单独取出,并用原始的位置编码替换掉新位置编码的部分参数(前 512 维)。
1024 中后一半的位置编码同样使用 原始的 512 维进行初始化,这样就相当于将两个 512 的位置编码拼接到了一起。

用transformer库 具体操作

1,修改 transformers/model/bert/modeling_bert.py ,大概在 172行

self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size)

在下面添加一个

self.position_embeddings_test = nn.Embedding(config.max_position_embeddings, config.hidden_size)

再把原来的position 修改一下

self.position_embeddings = nn.Embedding(config.max_position_embeddings//2, config.hidden_size)

区别在于第一个参数 //2
在这里插入图片描述

然后在 forward 函数里面 将原来的 position_embeddings 替换成 position_embeddings_test
在这里插入图片描述

训练的代码中,加载完模型参数后添加

add_position_embeddings = torch.tensor(model.bert.embeddings.position_embeddings_test.weight)
add_position_embeddings[:512] = torch.tensor(model.bert.embeddings.position_embeddings.weight)

如果后半部分也是用 原始的位置编码初始化那就吧下面的代码也加上

add_position_embeddings[512:] = torch.tensor(model.bert.embeddings.position_embeddings.weight)

最后将改好的位置编码放回去

model.bert.embeddings.position_embeddings_test.weight = nn.Parameter(add_position_embeddings)

在这里插入图片描述
但是运行时提示用sourceTensor.clone().detach() 或者sourceTensor.clone().detach().requires_grad_(True) 代替上面的torch.tensor(**)
在这里插入图片描述
现在position_embeddings 长度就可以使1024了
在这里插入图片描述
后面接nn.linear和crf就可以做ner了
在这里插入图片描述
PS:

BertConfig {
  "architectures": [
    "BertForMaskedLM"
  ],
  "attention_probs_dropout_prob": 0.1,
  "gradient_checkpointing": false,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 1024,
  "id2label": {
    "0": "LABEL_0",
    "1": "LABEL_1",
    "2": "LABEL_2",
    "3": "LABEL_3",
    "4": "LABEL_4",
    "5": "LABEL_5",
    "6": "LABEL_6",
    "7": "LABEL_7",
    "8": "LABEL_8",
    "9": "LABEL_9",
    "10": "LABEL_10",
    "11": "LABEL_11",
    "12": "LABEL_12",
    "13": "LABEL_13",
    "14": "LABEL_14"
  },
  "initializer_range": 0.02,
  "intermediate_size": 4096,
  "label2id": {
    "LABEL_0": 0,
    "LABEL_1": 1,
    "LABEL_10": 10,
    "LABEL_11": 11,
    "LABEL_12": 12,
    "LABEL_13": 13,
    "LABEL_14": 14,
    "LABEL_2": 2,
    "LABEL_3": 3,
    "LABEL_4": 4,
    "LABEL_5": 5,
    "LABEL_6": 6,
    "LABEL_7": 7,
    "LABEL_8": 8,
    "LABEL_9": 9
  },
  "layer_norm_eps": 1e-12,
  "max_position_embeddings": 1024,
  "model_type": "bert",
  "num_attention_heads": 16,
  "num_hidden_layers": 24,
  "pad_token_id": 0,
  "position_embedding_type": "absolute",
  "transformers_version": "4.9.0",
  "type_vocab_size": 2,
  "use_cache": true,
  "vocab_size": 30522
}

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

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

相关文章

【C++】类和对象(二)

目录 一、默认成员函数 二、构造函数 1、构造函数概念 2、构造函数编写 3、默认构造函数 4、内置类型成员的补丁 三、析构函数 1、析构函数概念 2、析构函数编写 3、默认析构函数 四、拷贝构造函数 1、拷贝构造函数概念及编写 2、默认拷贝构造函数 3、拷贝构造…

大学物理·第15章【量子物理】

黑体 斯特藩玻耳兹曼定律 维恩定律 光电效应 在光照射下 ,电子从金属表面逸出的现象,叫光电效应. 逸出的电子,叫光电子 经典理论: 光电流值与入射光强成正比截止频率(红限)v0对某种金属来说,只有…

关于 NodeJs 处理超长字符串问题的分析

问题:对于超大的 string V8不能支持 问题背景 在 Nodejs 计算服务中,对端上上报的内存信息二进制数据进行预处理缓存时,遇到了一个奇怪的报错:RangeError: Invalid string length 。根据该报错信息,查找得知是字符串长…

二叉搜索树(查找,插入,删除)

目录 1.概念 2.性质 3.二叉搜索树的操作 1.查找 2.插入 3.删除(难点) 1.概念 二叉搜索树又称二叉排序树.利用中序遍历它就是一个有顺序的一组数. 2.性质 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 2.若它的右子树不为空,则右子树上所有节点的值都…

代码解析工具cpg

cpg 是一个跨语言代码属性图解析工具,它目前支持C/C (C17), Java (Java 13)并且对Go, LLVM, python, TypeScript也有支持,在这个项目的根目录下: cpg-core为cpg解析模块的核心功能,主要包括将代码解析为图,core模块只包括对C/C/Ja…

Flink 滚动窗口、滑动窗口详解

1 滚动窗口(Tumbling Windows) 滚动窗口有固定的大小,是一种对数据进行“均匀切片”的划分方式。窗口之间没有重叠,也不会有间隔,是“首尾相接”的状态。如果我们把多个窗口的创建,看作一个窗口的运动,那就好像它在不…

大坝安全监测系统:水库“守坝人”!

一、项目背景 随着社会经济的迅速发展,我国水资源利用率越来越高,各类水利水电工规模进一步扩大。在抗洪救灾、水利发电等方面带来巨大的经济和社会效益。但受多种因素影响,大坝的安全问题日益严重。大量工程实践证明,为保证大坝…

uniapp 离线本地打包

uniapp打包教程地址 https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android.html点击查看 需要的环境: java (1.8)离线SDK(上面的连接下载即可)Android Studio(同上) 配置环境变量 依次点击“计算机”-“属性”&#…

通过 指针 引用 多维数组 详解

目录 一:回顾多维数组地址知识 二:二维数组的有关指针 三:指向数组元素的指针变量 四:用指向数组的指针作为函数参数 首先简单来讲,指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。下面…

Java线程中:Runnable和Callable的区别和联系

点个关注,必回关 文章目录一、Java提供了三种创建线程的方法1.继承Thread2.实现Runnable接口3.通过Callable和Future创建线程二、Runnable和Callable的区别和联系1.定义接口(1) Runnable(2)Callable(3&…

onnx-graphsurgeon----ONNX计算图修改神器

0. 简介 作为深度学习用户,经常会听到ONNX、TensorRT等一系列常用的文件保存格式。而对于ONNX而言,经常我们会发现在利用TensorRT部署到NVIDIA显卡上时,onnx模型的计算图不好修改,在以前的操作中很多时候大佬是将onnx转换成ncnn的…

vscode中安装python运行调试环境

在运行代码之前,需要到微软商店下载安装python环境,35m,都是自动的。 1、安装python 的extensions插件。 ctrlshiftx 输入 python 后点击 install 按钮。 2、新建文件夹spider文件夹。 3、在新建文件夹spider下新建文件spider.py源代码。…

注册OpenAI体验ChatGPT实战演示

什么是ChatGPT ChatGPT,美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布的人工智能技术驱动的自然语言处理工具,能够真正像人一样完成交流和任务处理。日前,ChatGPT已经更新多个版本,很多大厂也都在接入其API。…

Spark On YARN时指定Python版本

坑很多&#xff0c;直接上兼容性最佳的命令&#xff0c;将python包上传到hdfs或者file:/home/xx/(此处无多余的/) # client 模式 $SPARK_HOME/spark-submit \ --master yarn \ --deploy-mode client \ --num-executors 2 \ --conf "spark.yarn.dist.archives<Python包…

超店有数,tiktok变现 |TikTok最新选品秘籍!让你爆单销量10W+

商家想要自家产品爆单&#xff0c;获得更高的转化&#xff0c;tiktok变现&#xff0c;选品很重要。但很多商家在选品上&#xff0c;找不到头绪。那不妨看看一下的内容&#xff0c;可以帮助你找到选品的思路方向和方法。一、tiktok选品方向1、 考虑垂直细分产品考虑垂直细分领域…

Vue3快速入门【二】

Vue3快速入门一、传值父传子&#xff0c;子传父v-model二、插槽2.1、匿名插槽2.2、具名插槽2.3、插槽作用域2.4、插槽作用域案例2.4.1、初始布局2.4.2、插槽使用2.4.3、点击编辑按钮获取本行数据&#xff08;插槽作用域的使用&#xff09;2.4.4、类型书写优化2.4.5、全局接口抽…

云计算|OpenStack|社区版OpenStack安装部署文档(十一--- 如何获取镜像---Rocky版)

前言&#xff1a; 前面我们使用虚拟机搭建了一个openstack集群&#xff0c;也就是在VM虚拟机的基础上模拟了一个简单的基于openstack社区版Rocky的私有云&#xff0c;但&#xff0c;不管任何部署安装工作&#xff0c;最后其实都是需要有实际的应用的&#xff0c;也就是常说的实…

拿来就用的Java海报生成器ImageCombiner(一)

背景如果您是UI美工大师或者PS大牛&#xff0c;那本文一定不适合你&#xff1b;如果当您需要自己做一张海报时&#xff0c;可以立马有小伙伴帮您实现&#xff0c;那本文大概率也不适合你。但是&#xff0c;如果你跟我一样&#xff0c;遇上到以下场景&#xff0c;最近公司上了不…

新手小白适合做跨境电商吗?

今天的跨境电商已经逐渐成熟&#xff0c;靠运气赚钱的时代早已过去&#xff0c;馅饼不可能从天上掉下来&#xff0c;尤其是你想做一个没有货源的小白劝你醒醒。做跨境电商真的不容易&#xff0c;要想做&#xff0c;首先要分析自己是否适合做。米贸搜整理了以下资料&#xff0c;…

硬件设计—高性能ADC前端电路

高性能模数转换器&#xff08;ADC&#xff09;一般对系统的性能有非常高的要求&#xff0c;而AD芯片的“前端”的输入电路设计对ADC系统的的性能有非常大的影响。以下主要介绍了ADC芯片前端输入使用放大器和变压器各自的优势。 1、放大器和变压器根本区别 放大器是有源器件&am…