说明
- 语言的魅力在于短短的文本中,蕴含了丰富的信息。在我的理解里,大部分自然语言处理的工作,首先要解决的问题就是对于语言的表示,将文本变为结构化的数据(向量),才能根据具体任务,进行后续的工作。早期对于词法、句法信息的特征提取,统计语言模型,再到word2vec、ELMO、GPT、BERT、XLNET等等,可以看到语言预训练技术再不断的发展。
- 本篇是这一两周对于自然语言预训练相关知识的阅读链接整理。主要汇总了自己在学习时觉得有用的文章以及实践工作。
- 参考链接就不额外贴了
理论部分
- 自然语言预训练发展史
全面的介绍了预训练的思想、动机,介绍了word2vec、ELMO、GPT、BERT的相关工作。大致思想,应用有涉及,细节不多。 - ELMO、GPT、BERT
论文阅读笔记,均按照引言、方法、实验三部分介绍,借用了论文的PPT。 - XLNet解析及与BERT比较
文章开头,对于XLNet作者对先前语言表示工作的总结进行解释。概括了主要思想,并与BERT对比。可以看完论文再看看这篇解析。 - XLNet详解
作者以飞机作为比喻,拆解XLNet的各个部分,细节涉及较多,也有作者自己思考。
可以看到近几年的工作,从GPT开始,都引入Attention机制,以Transfomer作为特征提取器。也看到一些博主的观点,Transfomer将取代RNN,目前这一点个人理解不深。主要是理论阅读较多,实验做的少,没有从实践中体会感受。个人体会,深度学习的理论不像数学那么完善(也许是我理解不够),实践效果才是硬道理。
之前对于Attention的认识,是基于NNDL那本书,还有在准备论文报告时,接触了Global Attention的那篇文章。组会上听了学长介绍以后,又继续加深了解。
- Transfomer解读
阐述的十分清楚,可视化做的很棒,很容易理解。
实践部分
之前做了文本分类的任务,说实话,模型结构相当简单,接触的也只是TF2.0高级API。突然发现,tensorflow官网教程中给的Demo相当不错,就是貌似要翻墙。
代码阅读
细节疑惑整理:
之前看的tensorflow2.0教程,属实入门读物,对于更底层的原理,细节都不了解,这个坑要慢慢填完。
坑:
---------------6.4更新----------------------------------
这3个月下来对于预训练模型还有加深了一定的认识,但理论上还没有深究。先从idea上整理下。
- 传统词向量:
- One-hot编码:高维,稀疏
- 分布式表示:降维;稠密
- 特点:解释性增强,但训练慢,新增语料库困难 - 语言模型:
-
N-gram
注意数据平滑技术解决零概率的问题;最简单的平滑技术就是+1(分子分母)
评测方法:交叉熵以及困惑度。构建个测试集(有n个句子)计算其概率。
H p ( T ) = − 1 W T l o g 2 p ( T ) H_p(T) = -\frac{1}{W_T}log_2p(T) Hp(T)=−WT1log2p(T) -
NNLM:上文预测下一个词
- SENNA:换词作为负例,正例得分大于负例
- Word2vec:上下文预测;训练快
-
存在的问题:
- 假设设一个词由唯一的词向量表示,无法解决一词多义。
-
-
上下文相关的词向量:
- CoVe:《Learned in Translation: Contextualized Word Vectors 》
- ELMo
-
预训练模型:
- GPT
- Bert:predict masked word,next sentence predict
都是用Transformer作为encoder,GPT是单向的,BERT是双向的。
GPT是word + pos embedding;Bert:word+pos+segment embedding
Bert的改进:
- 其他预训练目标
ERNIE(百度):针对中文,Mask中文的词与实体,更契合
SpanBERT:没有NSP任务,mask的是一段文字,不是单个字词。在段抽取任务,如抽取式问答中表现良好【应该也适用于关系抽取】
MASS:挖掉句子中的一段文字;通过其余部分,使用seq2seq模型重构该段文字。适用于seq2seq模型,语言生成类的任务,比如机器翻译。 - 融入知识图谱
ERNIE(清华):在预训练模型中,将知识图谱中实体的表示融入文本表示。
《ERNIE: Enhanced Language Representation with Informative Entities》 - 精细调参
- 输入不一致的问题
- 模型压缩与加速
- 跨语言跨模态
总结:
图来自于CCL 2019车万翔教授的报告PPT。
- 预训练模型的应用
- 更多精调方法
- 多任务学习
《BAM! Born-Again Multi-Task Networks for Natural Language Understanding》
可以关注:关系抽取可以看成是一个多任务问题 - 小样本学习:
《Few-Shot Sequence Labeling with Label Dependency Transfer and Pair-wise Embedding》
可以关注:小样本学习多用于分类,将其应用到序列标注问题,结合多任务学习? - 零样本学习
--------------------------------------------------6.13更新-------------------------------------
最近听了些关于NLP的课程,也有些有用的资料
- bert代码阅读讲解
- 实践:BERT生成句向量(思路还是有点没看懂)
Word2Vec:
-
Skipgram是好于CBOW的:
- 同样数据样本量更多(中心预测周围产生的样本多)
- 难易度,直观上说Skipgram更难
- 平滑:CBOW对于出现次数较少的词效果不好,因为做avg_pooling的时候次数少的影响可以认为被抹去了。
-
词向量是在哪产生的?
- CBOW是权重矩阵,从词-隐藏层的矩阵
- Skipgram有两种词向量,u与v。可以理解为一个是代表周围词,一个代表中心词。最后取两者的平均。
-
两者是如何训练的,模型是什么,损失函数是啥?