赞
踩
最近在复现NER的模型,将本次复现的过程进行复现
1、选择合适的bert进行下载到本地,本人选择的是bert-base-chinese
保存至本地 下载网址Hugging Face – The AI community building the future.
进行加载bert模型
在这里涉及到一个打破bert 521字符的限制方法,此模型采用的是苏神的层次分解位置编码。
本人理解仅供参考:
层次分解位置编码:
通俗理解:基于原本训练好的512的词向量从新生成一个新的position embedding
操作流程:1、将下载的bert 里面 pytorch_model.bin模型进行加载
(里面都是参数加载出来是字典格式)
2、取出参数 bert.embeddings.position_embeddings.weight
定义一个分层位置编码PositionEmbedding
进行实例化并生成新的 并且嵌入到bert模型里面
2、创建gp模型
创建两个类别的字典,一个是类别名对应数字,一个数字对应类别名
创建gp模型,传入的参数有 (bert模型,类别数量,位置编码层大小 )
gp类里面有二块内容,
def __init__ 里面是传入的数据并继承nn.Module
传入 bert模型 (encoder),
传入类别数量 (ent_type_size),
传入位置编码层大小()
设置位置旋转编码RoPE为True
两个Linear层
1、(bert隐藏大小,位置编码层大小*2)
2、(bert隐藏大小,类别数量*2) 原版(位置编码层大小*2,类别数量*2)
def forward() #前向传播
SinusoidalPositionEmbedding 定义Sin-Cos位置Embedding
add_mask_trill 排除下三角
sequence_masking
3、加载预料
4、制作dataloader
流程:将x,y 对应存在两个list里面,
将x进行tokenizer 生成bert的输入
(添加参数return_offsets_mapping=True)多生成一个输出用来得到编码前后token的位置
然后提取并从结果里面删掉
生成一个用零填充的张量 维度(样本数,类别数,样本最长长度,样本最长长度)
遍历y 根据对应的位置标记成1 将张量添加到三个E一起 返回一个四个元素的字典
{三个E和一个y张量}
5、找到测试集样本每个类别的数量 制作成字典 (用于计算准确率)
dic = {‘类别1’:200,‘类别1’:300}
6、训练数据集
1、这里用到了一个差分学习率
大概的原理是将模型里面的 参数提取出来 保存到list里面
将bert模型层的和其他模型层的区分开来进行设置学习率
生成一个优化器和调节器
2、训练模型
用到了 梯度累加 这样可以做到batch_data更大
还用到的梯度裁剪
梯度裁剪可以防止梯度爆炸,即在训练过程中,梯度可能会变得非常大,
导致模型无法收敛。通过限制梯度的大小,
梯度裁剪可以确保梯度始终在一个合理的范围内,从而提高模型的稳定性和训练效果。
3、保存模型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。