通俗易懂ELMO原理+中文词嵌入实现(训练神雕侠侣小说)

本文主要是介绍通俗易懂ELMO原理+中文词嵌入实现(训练神雕侠侣小说),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 前言

今天给大家介绍一篇2018年提出的论文《Deep contextualized word representations》,在这篇论文中提出了一个很重要的思想ELMo。本文作者推出了一种新的基于深度学习框架的词向量表征模型,这种模型不仅能够表征词汇的语法和语义层面的特征,也能够随着上下文语境的变换而改变。简单来说,本文的模型其实本质上就是基于大规模语料训练后的双向语言模型内部隐状态特征的组合。实验证明,新的词向量模型能够很轻松的与NLP的现有主流模型相结合,并且在六大NLP任务的结果上有着巨头的提升。同时,作者也发现对模型的预训练是十分关键的,能够让下游模型去融合不同类型的半监督训练出的特征。

2.ELMo简介

ELMo是一种新型深度语境化词表征,可对词进行复杂特征(如句法和语义)和词在语言语境中的变化进行建模(即对多义词进行建模)。我们的词向量是深度双向语言模型(biLM)内部状态的函数,在一个大型文本语料库中预训练而成。

说到词向量,我们一定会联想到word2vec,因为在它提出的词向量概念给NLP的发展带来了巨大的提升。而ELMo的主要做法是先训练一个完整的语言模型,再用这个语言模型去处理需要训练的文本,生成相应的词向量,所以在文中一直强调ELMo的模型对同一个字在不同句子中能生成不同的词向量。

但是与word2vec不同的是ELMo采用双向LSTM,即给定的一个句子(t_{1},t_{2},...t_{N})$(t_{1},t_{2},...t_{N})$,我们构建的语言模型就是通过一个词汇的上下文去,预测一个词$t_{k}$:

p(t_1, t_2,...t_N) = \prod_{k=1}^Np(t_k|t_1, t_2, ..., t_{k-1})

该语言模型的输入就是词向量(获取的途径多种多样,作者提了一个是字符卷积),然后通过一个多层的前向LSTM网络,在LSTM的每一层,我们都能输出基于文本的一个向量表示。其最后的一层的输出,经过一层softmax归一,就可以来预测词t_{k},大概流程长下面这样。

现在流行使用双向语言模型,于是我们可以将正向LSTM和反向LSTM拼接起来(注意两个LSTM的参数是不进行共享的),而我们的目标函数就是取这两个方向语言模型的最大似然。

\sum_{k=1}^N(logp(t_k|t_1,...t_{k-1};\Theta_x, \overrightarrow{\Theta}_{LSTM}, \Theta_s) + logp(t_k|t_k+1,...t_{N};\Theta_x, \overleftarrow{\Theta}_{LSTM}, \Theta_s))

于是最终结构形式便如下:

3.论文模型结构

ELMO是一个结合双向语言模型表示层的语言模型,对于每个词t_{k},一个具有L层的双向语言模型(论文中使用的双向LSTM)会计算出2L+1个表示:

R_k = \{x_k^{LM}, \overrightarrow{h}_{k,j}^{LM}, \overleftarrow{h}_{k,j}^{LM} | j = 1,...L\}=\{​{h}_{k,j}^{LM} | j = 0,...,L\}

其中{h}_{k,0}^{LM}表示双向语言模型的第一层,每一层都是由双向LSTM拼接而成。

而前面也说了,ELMO本质上就是一个任务导向的,双向语言模型(biLM)内部的隐状态层的组合。通用的表达式如下,

ELMO_k^{task} = E(R_k;\Theta^{task}) = \gamma^{task}\sum_{j=0}^Ls_j^{task}h_{k,j}^{LM}

其中,\gamma是用来控制ELMO模型生成的向量大小,原文中说该系数对于后续的模型优化过程有好处(在附件中,作者强调了这个参数的重要性,因为biLM的内核表达,与任务需要表达,存在一定的差异性,所以需要这么一个参数去转换。并且,这个参数对于,last-only的情况(就是只取最后一层,ELMO的特殊情况),尤其重要),另一个参数s,原论文只说了softmax-normalized weights,其实它的作用等同于层间的归一化处理。

有时候我们并不需要从头开始去训练对应的词向量,我们只需要将ELMO与预训练的词向量hk结合,让模型去训练学习ELMO的内部状态的线性组合,然后,生成一个共同的词向量[h_k; ELMO_k^{task}],简单来说,就是用预训练的词向量来取代原来的语料库的词向量,相当于finetune,并用于后期的训练。

至此,整个模型结构已经说清楚了。作者在实验论证该预训练模型之前,阐述了一下其预训练过程。最终作者用于实验的预训练模型,为了平衡语言模型之间的困惑度以及后期NLP模型的计算复杂度,采用了2层Bi-Big-Lstm,共计4096个单元,输入及输出维度为512维,并且在第一层和第二层之间使用残差网络进行连接,包括最初的那一层文本向量(用了2048个过滤器, 进行基于字符的卷积计算),整个ELMO会为每一个词提供一个3层的输出,而下游模型学习的就是这3层输出的组合。另外,作者强调了一下,对该模型进行FINE-TUNE训练的话,对具体的NLP任务会有提升的作用。

作者的论文的实验部分,具体展示了ELMO模型在六大nlp任务上的表现,证实了该模型的有效性。

4.总结

1.ELMO模型只取最后一层的输出,和多层的线性组合,实验结果发现,只取最后一层也取得了很好的效果,而且多层的效果提升并不是特别的明显(较之于只取最后一层),结果见下图:

2.ELMo的假设前提一个词的词向量不应该是固定的,所以在一词多意方面ELMo的效果一定比word2vec要好。

3.word2vec的学习词向量的过程是通过中心词的上下窗口去学习,学习的范围太小了,而ELMo在学习语言模型的时候是从整个语料库去学习的,而后再通过语言模型生成的词向量就相当于基于整个语料库学习的词向量,更加准确代表一个词的意思。

4.ELMO可以广泛的应用到任何自然语言处理的下游任务,可以用于求解相似问题

5.代码实现

我在我的github上开源了一个我利用ELMO模型训练金庸的武侠小说小说神雕侠侣,这里我并没有使用预训练模型来,而是直接以小说作为语料库进行训练。这里以\n为分隔符,一共分隔了14200个短文本,以i5-8400的cpu进行训练,训练时间为2小时50分钟,平均训练速率为1.4it/s,最终损失在3.45左右。

[['小龙女', 0.72927003860473633],['李莫愁', 0.64811800956726074],['黄蓉', 0.62415822315216064],['郭襄', 0.60209492921829224],['说', 0.6064872646331787],['周伯通', 0.59836891555786133],['法王', 0.5962932949066162],['郭靖', 0.5876373634338379],['陆无双', 0.58300589084625244]]文字参考链接:
1、https://www.jianshu.com/p/d93912d5280e
2、https://www.cnblogs.com/huangyc/p/9860430.html
代码参考:
https://github.com/huseinzol05/NLP-Models-Tensorflow/tree/master/embedded
详细内容请参考我的github:
https://github.com/RundongChou/elmo-chinese-oversimplified

这篇关于通俗易懂ELMO原理+中文词嵌入实现(训练神雕侠侣小说)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

YOLO v3 训练速度慢的问题

一天一夜出了两个模型,仅仅迭代了200次   原因:编译之前没有将Makefile 文件里的GPU设置为1,编译的是CPU版本,必须训练慢   解决方案: make clean  vim Makefile make   再次训练 速度快了,5分钟迭代了500次

利用Frp实现内网穿透(docker实现)

文章目录 1、WSL子系统配置2、腾讯云服务器安装frps2.1、创建配置文件2.2 、创建frps容器 3、WSL2子系统Centos服务器安装frpc服务3.1、安装docker3.2、创建配置文件3.3 、创建frpc容器 4、WSL2子系统Centos服务器安装nginx服务 环境配置:一台公网服务器(腾讯云)、一台笔记本电脑、WSL子系统涉及知识:docker、Frp