efficient_global_pointer

最近在复现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、保存模型

                

 

 

                        

                

                        

        

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值