关于 知识抽取
kexue.fm/archives/6671
“三元组”抽取任务是知识抽取任务的一个重要方向
字词embedding+位置embedding转成向量,过一遍全连接,再过一遍自注意力,再过一遍全连接, 此时的输出不是softmax,而是sigmoid(二分类,识别这个字是实体的开始与结束).
到此位置,可以抽出文本中的实体信息, 把实体信息输入下面的模型(抽知识了)
实体过长短时记忆,并拼上去
关于DGCNN
https://kexue.fm/archives/5409
或许现在来做的话,估计就把DGCNN变成BERT了, 主要是用这里的sigmoid处理
https://kexue.fm/archives/6736
//-------------------------------------------------------------------------------------
关于 NLP模型一些零碎概念
seq2seq,词袋模型
NLP中,新模型基本上是比老模型好的,比如BERT
CNN,长短时记忆等都不重要,重要的是Attention机制
底层的特征抽取都是由transformer来的
硬件上的进步,GPU和TPU的发展,但是时间序列神经网络的优化算法是无法并行的(按照时间维度),无法加速
jalammar.github.io/illustrated-transformer/
jianshu.com/p/2b0a554a17c
文本是典型的序列数据
编码组件与解码组件
编码器:前馈神经网络(全连接)+自注意力
解码:自注意力+编码-解码注意力层+前馈神经网络
wordEmbedding:word2Vec把词变成词向量
zhuanlan.zhihu.com/p/49271699
GPT在生成文字方面很犀利
//-------------------------------------------------------------------------------------
关于 命名实体识别随手记
datafountain.cn/competition/361/datasets
一个金融领域的数据集
关于很多金融领域的文章(可能来自于社交媒体),来找出其中的金融实体(比如各种公司的名称)
一些中文命名实体模型的通用解决方法(使用简单)
Keras-Bert-Ner
github.com/liushaoweihua/keras-bert-ner/blob/master/README_ZH.md
github.com/bojone/nert_in_keras
(keras调用BERT,十分方便)
调参建议:使用early-patience,使用空洞卷积(数据量大的时候)
解决方案1
比赛代码
github.com/gaozhanfire/CCF-BDCI2019_Entity_Discovery
初赛时,手工选取了100多个特征,使用了Keras-Bert-Ner的模型
首先对数据进行清洗,但是清洗可能会破坏原有语义,此外文本的切分也很容易破坏语义
解决方案2
zhuanlan.zhihu.com/p/100884995
数据展示后发现,大部分数据文本长度较长。是一定要做处理的(用BERT必做)
使用模型 BERT-BILSTM-CRF(也是新模型)
IDCNN, 一点笔记
输入是经过BERT处理的词向量, 普通的卷积是滑窗在文本上滑行
使用空洞卷积,能让NN感知更大的范围
//-------------------------------------------------------------------------------------
关于 ELECTRA Learning
Electra全称:Efficiently Learning an Encoder that Classifies Token Replacements Accurately.
在从大到小的各种体量下都是比BERT好的,在400k step后的优化后,以及和Roberta差不多
在CV中,有一种网络:深层对抗网络 GAN.
Generator和Discriminator 2个部分相互对抗
使用GAN思想,算是对BERT模型有一些在结构上的改进.
BERT的训练任务,也是BERT优化的核心,MLM模型(Mask Language Model). 这个训练任务其实是过于简单的, 所以ELECTRA的目标其实是给这个训练任务增加一些挑战,让这个过程更加充分
于是,Generator的功能(就是一个BERT模型)会产出一些任务,在这个Mask的任务中,可以根据输出的概率,得知这是一个难的任务还是一个简单的任务.
Discriminator是一个二分类判别器, 来看被Mask的任务有没有被正确得回答(或是是被替换了)
zhihu.com/question/354070608
损失函数是Generator和Discriminator的权重之和
通常情况下,Generator和Discriminator中的encoder结构是一样的,作者在做了一部分的参数sharing之后(具体来说,token embedding),发现2边共享参数是会有一点点的改进的
在隐层结构上,经过实验,发现生成器的大小(层数)是判别器的1/4~1/2是比较好的
ELECTRA的最大贡献是在小体积下的优异表现,14M的小模型和经过知识蒸馏(KnowledgeDistill)过的BERT是差不多了,速度还很快
github.com/ymcui/Chinese-ELECTRA
中文ELECTRA