PyTorch深度学习实战 | 迁移学习与自然语言处理实践

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
简介: 实践是检验理论的唯一标准。为此,我们将通过中国计算机学会举办的2019 CCF大数据与计算智能大赛的互联网金融新实体发现竞赛作为实践,让大家了解预训练模型的强大。

640.jpg

01、赛题任务

从提供的金融文本中识别出现的未知金融实体,包括金融平台名、企业名、项目名称及产品名称。持有金融牌照的银行、证券、保险、基金等机构、知名的互联网企业如腾讯、淘宝、京东等和训练集中出现的实体认为是已知实体。

02、赛题分析

1、任务本质

使用BERT实体识别微调方法完成任务。

2、数据分析

针对赛题数据集,我们进行了较为详细的统计和分析。数据集中的文本长度分布如图1所示,文本长度0~500的数据有3615条,超过500的则有6390条。大部分数据文本长度较长。其中文本最短长度为4,最大长度为32787,平均长度为1311。在训练集中还存在200多条数据有标签谬误。数据集中出现了部分噪声,包括一些HTML文字和特殊字符。可以看出,数据集存在文本过长,噪声过多等问题。

640.jpg


▍图1 文本长度统计

实验流程如图2所示。

640.jpg


▍图2 实验流程图

03、实验代码

因为整个项目代码比较长,我们将按照顺序给出每一个部分的核心代码。

1、模型构建

我们尝试使用了多种开源的预训练模型(BERT,ERNIE, BERT_WWM, ROBERTA[4]),并分别下接了IDCN-CRF与BILST-CRF两种结构来构建实体抽取模型。本节介绍的单模以预训练模型BERT作为基准模型来举例。

a●BERT-BILSTM-CRF

BILSTM-CRF是目前较为流行的命名实体识别模型。将BERT预训练模型学习到的token向量输入BILSTM模型进行进一步学习,让模型更好的理解文本的上下关系,最终通过CRF层获得每个token的分类结果。BERT-BILSTM-CRF模型图如图3所示。

640.jpg


▍图3 BERT-BILSTM-CRF结构图

b●BERT-IDCNN-CRF

EmmaStrubell等人首次将IDCNN用于实体识别。IDCNN通过利用空洞(即补0)来改进CNN结构,在丢失局部信息的情况下,捕获长序列文本的长距离信息,适合当前长文本的数据集。该方法比传统的CNN具有更好的上下文和结构化预测能力。而且与LSTM不同的是,IDCNN即使在并行的情况下,对长度为N的句子的处理顺序也只需要O(n)的时间复杂度。BERT-IDCNN-CRF模型结构如图4所示。该模型的精度与BERT-BILSTM-CRF相当。模型的预测速度提升了将近50%。

640.jpg


▍图4 BERT-IDCNN-CRF结构图

c●BERT多层表示的动态权重融合

Ganesh Jawahar等人通过实验验证了BERT每一层对文本的理解都有所不同。为此,我们对BERT进行了改写,将BERT的12层transformer生成的表示赋予一个权重,权重的初始化如式(1)所示,而后通过训练来确定权重值,并将每一层生成的表示加权平均,再通过一层全连接层降维至512维如式(2)所示,最后结合之前的IDCNN-CRF和BILSTM-CRF模型来获得多种异构单模。BERT多层表示的动态权重融合结构如图5所示。其中为BERT每一层输出的表示,为权重BERT每一层表示的权重值。

640.jpg


(1)


640.jpg


(2)


640.jpg


▍图 5 BERT动态权重融合

对使用动态融合的RoBERTa-BILSTM-CRF和未使用动态融合的相同模型结果进行了对比,结果如表1所示。通过表中的结果,可以看到加入了动态融合的方法使单模成绩提高了1.4%。值得一提的是,我们通过BERT动态权重融合的方法,得到了该赛题得分最高的单模。

表1 两种异构单模结果对比表

image.png

d●模型构建

代码在model.py,我们可以通过config.py来控制是否对BERT进行动态权重融合,也可以控制使用哪种模型结构,代码如下:

//获取到StreamController的stream,即出口可以取数据
  1.  # /chapter8/CCF_ner/model.py
2.  def __init__(self, config):
3.  self.config = config
4.      # 喂入模型的数据占位符
5.  self.input_x_word = tf.placeholder(tf.int32, [None, None], name="input_x_word")
6.  self.input_x_len = tf.placeholder(tf.int32, name='input_x_len')
7.  self.input_mask = tf.placeholder(tf.int32, [None, None], name='input_mask')
8.  self.input_relation = tf.placeholder(tf.int32, [None, None], name='input_relation') # 实体NER的真实标签
9.  self.keep_prob = tf.placeholder(tf.float32, name='dropout_keep_prob')
10.   self.is_training = tf.placeholder(tf.bool, None, name='is_training')
11.  
12.  # BERT Embedding
13.  self.init_embedding(bert_init=True)
14.  output_layer = self.word_embedding
15.  
16.  # 超参数设置
17.  self.relation_num = self.config.relation_num
18.  self.initializer = initializers.xavier_initializer()
19.  self.lstm_dim = self.config.lstm_dim
20.  self.embed_dense_dim = self.config.embed_dense_dim
21.  self.dropout = self.config.dropout
22.  self.model_type = self.config.model_type
23.  print('Run Model Type:', self.model_type)
24.  
25.  # idcnn的超参数
26.  self.layers = [
27.     {'dilation': 1},
28.     {'dilation': 1},
29.     {'dilation': 2},]
30.  self.filter_width = 3  
31.  self.num_filter = self.lstm_dim
32.  self.embedding_dim = self.embed_dense_dim
33.  self.repeat_times = 4  
34.  self.cnn_output_width = 0  
35.  
36.  # CRF超参数
37.  used = tf.sign(tf.abs(self.input_x_word))
38.  length = tf.reduce_sum(used, reduction_indices=1)
39.  self.lengths = tf.cast(length, tf.int32)
40.  self.batch_size = tf.shape(self.input_x_word)[0]
41.  self.num_steps = tf.shape(self.input_x_word)[-1]
42.  if self.model_type == 'bilstm':
43.  lstm_inputs = tf.nn.dropout(output_layer, self.dropout)
44.  lstm_outputs = self.biLSTM_layer(lstm_inputs, self.lstm_dim, self.lengths)
45.  self.logits = self.project_layer(lstm_outputs)
46.  
47.  elifself.model_type == 'idcnn':
48.  model_inputs = tf.nn.dropout(output_layer, self.dropout)
49.  model_outputs = self.IDCNN_layer(model_inputs)
50.  self.logits = self.project_layer_idcnn(model_outputs)
51.  
52.  else:
53.  raise KeyError
54.  
55.  # 计算损失
56.  self.loss = self.loss_layer(self.logits, self.lengths)

2、代码框架介绍

我们此次介绍的代码框架复用性与解耦性比较高。我们在这里大致说明一下怎么去使用这个框架。对于一个问题,我们首先想的是解决问题的办法,也就是模型构建部分model.py。当模型确定了,就要构建数据迭代器(utils.py)给模型输入数据了,而utils.py读入的数据是preprocess.py清洗干净的数据。

当构建以上这几部分之后,便是模型训练部分train_fine_tune.py,这个部分包含训练、验证F1和保存每一个epoch训练模型的过程。一开始训练单模得先确定单模是否有效,我们可以通过train_fine_tune.py的main函数将训练集和验证集都用验证集去表示,看一下验证集F1是否接近90%,若接近则说明模型构建部分没有出错,但不保证F1评估公式是否写错。因此,使用刚刚用验证集训练得到的模型,通过predict.py来预测验证集,人工检验预测的结果是否有效,这样子就能保证我们整体的单模流程完全没问题了。
最后就是后处理规则postprocess和融合ensemble两部分,这里的主观性比较强,一般都是根据具体问题具体分析来操作。
其中,utils.py也有main函数,可以用来检验构造的Batch数据是否有误,直接打印出来人工检验一下即可。整个框架的超参数都在config.py处设置,加强框架的解耦性,避免了一处修改,处处修改的情况。
整体的框架也可复用到其他问题上,只需要根据修改的model.py来确定输入的Batch数据格式,其他的代码文件也只是根据问题去修改相应部分,降低了调试成本。

04、源代码

https://www.jianguoyun.com/p/DQR-jOMQ9of0ChjGxv4EIAA

目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
PyTorch深度学习 ? 带你从入门到精通!!!
🌟 蒋星熠Jaxonic,深度学习探索者。三年深耕PyTorch,从基础到部署,分享模型构建、GPU加速、TorchScript优化及PyTorch 2.0新特性,助力AI开发者高效进阶。
PyTorch深度学习 ? 带你从入门到精通!!!
|
6月前
|
机器学习/深度学习 PyTorch API
PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
本文深入探讨神经网络模型量化技术,重点讲解训练后量化(PTQ)与量化感知训练(QAT)两种主流方法。PTQ通过校准数据集确定量化参数,快速实现模型压缩,但精度损失较大;QAT在训练中引入伪量化操作,使模型适应低精度环境,显著提升量化后性能。文章结合PyTorch实现细节,介绍Eager模式、FX图模式及PyTorch 2导出量化等工具,并分享大语言模型Int4/Int8混合精度实践。最后总结量化最佳策略,包括逐通道量化、混合精度设置及目标硬件适配,助力高效部署深度学习模型。
1015 21
PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
|
6月前
|
机器学习/深度学习 自然语言处理 数据可视化
基于图神经网络的自然语言处理:融合LangGraph与大型概念模型的情感分析实践
本文探讨了在企业数字化转型中,大型概念模型(LCMs)与图神经网络结合处理非结构化文本数据的技术方案。LCMs突破传统词汇级处理局限,以概念级语义理解为核心,增强情感分析、实体识别和主题建模能力。通过构建基于LangGraph的混合符号-语义处理管道,整合符号方法的结构化优势与语义方法的理解深度,实现精准的文本分析。具体应用中,该架构通过预处理、图构建、嵌入生成及GNN推理等模块,完成客户反馈的情感分类与主题聚类。最终,LangGraph工作流编排确保各模块高效协作,为企业提供可解释性强、业务价值高的分析结果。此技术融合为挖掘非结构化数据价值、支持数据驱动决策提供了创新路径。
419 6
基于图神经网络的自然语言处理:融合LangGraph与大型概念模型的情感分析实践
|
2月前
|
机器学习/深度学习 存储 PyTorch
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
Neural ODE将神经网络与微分方程结合,用连续思维建模数据演化,突破传统离散层的限制,实现自适应深度与高效连续学习。
159 3
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
|
1月前
|
机器学习/深度学习 数据采集 人工智能
深度学习实战指南:从神经网络基础到模型优化的完整攻略
🌟 蒋星熠Jaxonic,AI探索者。深耕深度学习,从神经网络到Transformer,用代码践行智能革命。分享实战经验,助你构建CV、NLP模型,共赴二进制星辰大海。
|
5月前
|
机器学习/深度学习 存储 PyTorch
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
本文通过使用 Kaggle 数据集训练情感分析模型的实例,详细演示了如何将 PyTorch 与 MLFlow 进行深度集成,实现完整的实验跟踪、模型记录和结果可复现性管理。文章将系统性地介绍训练代码的核心组件,展示指标和工件的记录方法,并提供 MLFlow UI 的详细界面截图。
259 2
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
|
9月前
|
机器学习/深度学习 数据采集 自然语言处理
深度学习实践技巧:提升模型性能的详尽指南
深度学习模型在图像分类、自然语言处理、时间序列分析等多个领域都表现出了卓越的性能,但在实际应用中,为了使模型达到最佳效果,常规的标准流程往往不足。本文提供了多种深度学习实践技巧,包括数据预处理、模型设计优化、训练策略和评价与调参等方面的详细操作和代码示例,希望能够为应用实战提供有效的指导和支持。
|
6月前
|
数据采集 机器学习/深度学习 自然语言处理
NLP助力非结构化文本抽取:实体关系提取实战
本文介绍了一套基于微博热帖的中文非结构化文本分析系统,通过爬虫代理采集数据,结合NLP技术实现实体识别、关系抽取及情感分析。核心技术包括爬虫模块、请求配置、页面采集和中文NLP处理,最终将数据结构化并保存为CSV文件或生成图谱。代码示例从基础正则规则到高级深度学习模型(如BERT-BiLSTM-CRF)逐步演进,适合初学者与进阶用户调试与扩展,展现了中文NLP在实际场景中的应用价值。
508 3
NLP助力非结构化文本抽取:实体关系提取实战
|
9月前
|
机器学习/深度学习 数据可视化 算法
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新模型,将神经网络的离散变换扩展为连续时间动力系统。本文基于Torchdyn库介绍Neural ODE的实现与训练方法,涵盖数据集构建、模型构建、基于PyTorch Lightning的训练及实验结果可视化等内容。Torchdyn支持多种数值求解算法和高级特性,适用于生成模型、时间序列分析等领域。
500 77
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
|
5月前
|
数据采集 缓存 自然语言处理
NLP驱动网页数据分类与抽取实战
本文探讨了使用NLP技术进行网页商品数据抽取时遇到的三大瓶颈:请求延迟高、结构解析慢和分类精度低,并以目标站点goofish.com为例,展示了传统方法在采集商品信息时的性能问题。通过引入爬虫代理降低封禁概率、模拟真实用户行为优化请求,以及利用关键词提取提升分类准确性,实现了请求成功率从65%提升至98%,平均请求耗时减少72.7%,NLP分类错误率下降73.6%的显著优化效果。最终,代码实现快速抓取并解析商品数据,支持价格统计与关键词分析,为构建智能推荐模型奠定了基础。
129 0
NLP驱动网页数据分类与抽取实战

推荐镜像

更多