基于百科类数据训练的 ELMo 中文预训练模型

2024-03-14 11:50

本文主要是介绍基于百科类数据训练的 ELMo 中文预训练模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在NLP世界里,有一支很重要的家族,英文叫做LARK(LAnguage Representations Kit),翻译成中文是语言表示工具箱。目前LARK家族最新最重要的三种算法,分别是ELMo,BERT和ERNIE。

你一定不知道,这三个普通的名字,竟然包含着一个有趣的秘密。

真相,即将揭开!

我们先从算法模型的名字寻找一些蛛丝马迹

第一位,ELMo:

来自英文Embedding from Language Models 的缩写,来自论文名为Deep contextualized word representation

第二位,BERT:

来自英文Bidirectional Encoder Representations from Transformers的缩写,来自论文名为Pre-training of Deep Bidirectional Transformers for LanguageUnderstanding

第三位,ERNIE:

来自英文Enhanced Representation through kNowledge IntEgration) 的缩,来自论文名为Enhanced Representation through Knowledge Integration

看完了,是不是,还是一头雾水,哪里有什么秘密?

不卖关子了,直接上图!

What??

再回头看看,你还记得那三个算法的名字么?

 

ELMo,BERT,ERNIE

竟然都是美国经典动画片,《Sesame Street(芝麻街)》里面的卡通人物!!!

 

好吧,如果你说,没看过这个动画片,没感觉啊。那我举个例子,如果把《芝麻街》类比成中文《舒克和贝塔》。那么,第一篇论文把模型取做“舒克”,第二篇很有爱的就叫做“贝塔”,第三篇就硬把模型叫做“皮皮鲁”,也许不久的下一个模型就命名为“鲁西西”啦。

 

谁说科学家们很无聊,是不是也很童趣?

好了,扯远了,今天我们先给大家介绍LARK家族的ELMo! 提出它的论文获得2018年NAACL最佳paper,它在NLP领域可是有着响当当的名头,让我们来认识它!

ELMo模型简介

ELMo(Embeddings from Language Models) 是重要的通用语义表示模型之一,以双向 LSTM 为网路基本组件,以 Language Model 为训练目标,通过预训练得到通用的语义表示,将通用的语义表示作为 Feature 迁移到下游 NLP 任务中,会显著提升下游任务的模型性能。

 

ELMo模型核心是一个双层双向的LSTM网络,与传统的word2vec算法中词向量一成不变相比,ELMo会根据上下文改变语义embedding。

一个简单的例子就是 “苹果”的词向量:

句子1:“我 买了 1斤 苹果”

句子2:“我 新 买了 1个 苹果 X”

在word2vec算法中,“苹果”的词向量固定,无法区分这两句话的区别,而ELMo可以解决语言中的二义性问题,可以带来性能的显著提升。

ELMo项目的飞桨(PaddlePaddle)实现

为了方便广大的开发者,飞桨(PaddlePaddle) 完成了ELMo的开源实现(依赖于 Paddle Fluid 1.4),发布要点如下。

注意啦,下面划重点!!!

 

接下来,我们看看怎么可以快速把ELMo用到我们的项目中来吧!

 

ELMo训练过程介绍

 

(1)数据预处理

 

将文档按照句号、问号、感叹以及内容分词预处理。预处理后的数据文件,每行为一个分词后的句子。给出了训练数据 data/train 和测试数据 data/dev的数据示例如下:

本 书 介绍 了 中国 经济 发展 的 内外 平衡问题 、 亚洲 金融 危机 十 周年 回顾 与 反思 、 实践 中 的 城乡 统筹 发展 、 未来 十 年 中国 需要 研究 的 重大 课题 、 科学 发展 与新型 工业 化 等 方面 。

吴 敬 琏 曾经 提出 中国 股市 “ 赌场 论 ” , 主张 维护 市场 规则 , 保护 草根 阶层 生计, 被 誉 为 “ 中国 经济 学界 良心 ” , 是 媒体 和公众 眼中 的 学术 明星

 

(2)模型训练

 

利用提供的示例训练数据和测试数据,进行单机多卡预训练。在开始预训练之前,需要把 CUDA、cuDNN、NCCL2 等动态库路径加入到环境变量 LD_LIBRARY_PATH 之中,然后执行run.sh即可开始单机多卡预训练,run.sh文件内容如下:

 

 

  •  

export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

python train.py \

--train_path='data/train/sentence_file_*' \

--test_path='data/dev/sentence_file_*' \

--vocab_path data/vocabulary_min5k.txt \

--learning_rate 0.2 \

--use_gpu True \

--all_train_tokens 35479 \

--local True $@

其中,all_train_tokens为train和dev统计出来的tokens总量,训练过程中,默认每个epoch后,将模型参数写入到 checkpoints 路径下,可以用于迁移到下游NLP任务。

(3)ELMo模型迁移

 

以 LAC 任务为示例, 将 ELMo 预训练模型的语义表示迁移到 LAC 任务的主要步骤如下:

#step1: 在已经搭建好的LAC 网络结构之后,加载 ELMo 预训练模型参数:

 

  •  

from bilm import

init_pretraining_params

init_pretraining_params(exe,args.pretrain_elmo_model_path, fluid.default_main_program())

 

#step2: 基于ELMo 字典 将输入数据转化为 word_ids,利用 elmo_encoder接口获取 ELMo embedding:

from bilm import elmo_encoder

elmo_embedding = elmo_encoder(word_ids)

#step3: ELMoembedding与 LAC 原有 word_embedding 拼接得到最终的 embedding:

 

  • word_embedding=fluid.layers.concat(input=[elmo_embedding, word_embedding], axis=1)

好的,到这里,模型的迁移就完成了,再来回顾一下加入ELMo后对性能的提升,心动不如行动,赶紧用起来吧!

ERNIE模型简介

学习完了ELMo,我们再来了解一下LARK家族的学习成绩最好的重磅成员ERNIE,在多项NLP中文任务上表现非凡。

ERNIE通过建模海量数据中的实体概念等先验语义知识,学习真实世界的语义关系。具体来说,ERNIE 模型通过对词、实体等语义单元的掩码,使得模型学习完整概念的语义表示。相较于BERT 学习原始语言信号,ERNIE 直接对先验语义知识单元进行建模,增强了模型语义表示能力。

ERNIE在多个公开的中文数据集上进行了效果验证,包括语言推断、语义相似度、命名实体识别、情感分析、问答匹配等自然语言处理各类任务上,均超越了语义表示模型 BERT 的效果。

更多详细内容请点击文末阅读原文或参见:

https://github.com/PaddlePaddle/LARK

这篇关于基于百科类数据训练的 ELMo 中文预训练模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/808340

相关文章

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

Python实现中文大写金额转阿拉伯数字

《Python实现中文大写金额转阿拉伯数字》在财务票据中,中文大写金额被广泛使用以防止篡改,但在数据处理时,我们需要将其转换为阿拉伯数字形式,下面我们就来看看如何使用Python实现这一转换吧... 目录一、核心思路拆解二、中文数字解析实现三、大单位分割策略四、元角分综合处理五、测试验证六、全部代码在财务票

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性