本文链接:https://blog.csdn.net/rensihui/article/details/103284986
收起
一、自然语言表征与计算机表示
自然语言是指一种人类社会中自然地随文化演化的语言,聪明的人类经过万年的积累,并通过后天良久的学习才能理解语言的魅力和含义,机械的计算机当然不能如此容易地表达出来。
要了解自然语言的计算机表示,我们首先从发展、工业落地更加成熟的图像领域说起,图像使用非负数的矩阵表示像素点,是低层次的,连续的数据和特征。图像的任务,如分类,相似度,目标检测等,都是具体的,可轻易区分的。
相比于图像,自然语言无疑复杂得多。经过万年发展的语言是人类智慧高度凝结的结晶,语言语义很难通过数据来刻画。汉语2000多个常用字,2万多个字,成百上千万个词等语言基本单元就很难刻画,例如"喜欢"和"爱"是近义词,但是从字面上并不能反映这种信息。更别说复杂的任务:分词,分类,信息抽取......
下面简要介绍下自然语言表示的常用方法。
二、onehot独热编码
onehot独热编码是一种古老而又现代的编码方式,它通过给每个字符、词语或句子分配唯一id表示。这种做法是将要表示的字典中每个单元看成独立的唯一的单元,可以用正整数表示,不过通常构建字典大小的一维矩阵,设置一个数字为1,其他的位置全部为0等。
举个例子: "大漠帝国"可以表示为[0, 0, ,0, 0, 0, 1],或者是一个数字 32
现在单独只用one-hot作机器学习、深度学习、强化学习是比较少了的,因为效果不够好。不过倒是通常用one-hot作为唯一标识原始输入(也就是索index的作用)。
解决的问题:自然语言文本在计算机的表示,one-hot句子构建的词袋模型能够扩充特征
应用:索引表示字、词、句子等
优点: 简单可解释,线性可分
缺点: 无法表征编码单元(比如说字,词,句子)之间的关系,无法表示词序关系;
只是符号化,一维度单点的数字携带的信息和特征太少;
数据量大时会带来维数灾难。
三、传统统计方法bag of words, tf, idf, tf-idf, bm25
3.1 TF-IDF
TF-IDF(英文名: term frequency-inverse document frequency),引用百度百科的说法: TF-IDF是一种用于信息检索与数据挖掘的常用加权技术。
TF意思是词频(Term Frequency),用在句子构成的语料中,就是字或者词在文本中出现的频率。
IDF意思是逆文本频率指数(Inverse Document Frequency),就是出现该字或者词的句子条数。一般计算是: IDF = Log ( 语料中句子总数 / (包含该词或字的句子数+1) );
而TF-IDF = TF * IDF。
解决的问题:划分词语重要程度,引入外部语料库信息(即所谓的先验概率)
应用:用于信息检索与数据挖掘的常用加权技术,关键词,句子相似度等
优点:实现简单高效,给出一种表示字词句子重要性的方法;常见python工具包都会集成
缺点:词频等重合会导致表示冲突,严重依赖于语料库;
会偏向于文本中频率小的词;
不能刻画出词序信息;
3.2 词袋模型bag of words
词袋模型,通俗的说,就是将句子、语料中的词语都丢到一个袋子里,构建一个词语集合-词频的一维矩阵,不考虑顺序,不考虑重要性,认为词语是独立的。例子sample:
"我爱帝国, 大漠帝国”; 词语有 "我", "爱", "帝国", "大漠"
“我爱帝国”的句向量为 [1, 1, 2, 1]
解决的问题:
应用:可用于信息检索与数据挖掘的常用加权技术,关键词,句子相似度等
优点:实现简单高效,给出一种表示句子一维向量的方法;
缺点:无法展示不同词语的重要程度;
不能刻画相似词语,不能刻画一词多义;
不能刻画出词序信息,维度灾难;
四、基于矩阵的统计方法(共现矩阵,NMF, LSI, LDA等主题模型[分解派],Glove)
这种方法的关键在于构建矩阵,基于矩阵的统计方法主要有矩阵分解派(NMF, LSI, LDA等主题模型),以及共现矩阵,降维共现矩阵Glove等。
4.1 基于统计的共现矩阵方法
共现矩阵方法主要通过K个窗口的词语的词频构建的向量表示词向量,具体做法就是构建N*N的矩阵(N为词典大小),矩阵中元素填充为训练语料中的共现词语频次。举个例子,
假设有语料: “我喜欢你”, “我爱你”, “我想你”,窗口为4,构建的共现矩阵如下图
那么"我"的词向量可以表示为: [0, 1, 1, 2, 1, 1]
解决的问题:简单解决词向量不能计算相似度问题
应用:词向量,句向量构建
优点:实现简单高效,给出一种表示字词句子一维向量的表示方法
缺点:严重依赖于语料库;
不能刻画出词序信息;
数据稀疏与维度灾难;
4.2 主题模型(NMF, LSI, LDA)
首先构建构建N*N的方矩(N为词典大小),矩阵中元素填充一般为训练语料中的TF-IDF,也可以是词频或BM25。
我们提出的假设是"词-主题,主题-句子",所以使用主题模型进行降维,得到的权重矩阵W,就是词语对应的词向量。
可以使用NMF矩阵分解方法提取词向量: V = W * H;也可以使用SVD奇异值分解提取词向量: A= U * E * V,或者是
更加复杂的LDA主题模型。
一般我们会获取W权重矩阵作为词向量模型,例如通常会得到如下结果:
# 权重矩阵
[[1.99561456 0.03769528 0.92768855]
[2.19064197 0.33915908 1.32014035]
[3.94014929 0.01328534 0. ]
[2.35460586 0.44811399 1.68201657]
[0.72884099 2.33034829 0. ]]
解决的问题:词向量间隐藏的语义,如"孙悟空"和"唐僧"有关系。
应用:词向量,句向量构建,潜在语义与主题
优点:算法简洁明了可解释;有严谨的假设和证明;使用全局特征;常见python工具包都会集成
缺点:严重依赖于语料库;
不能刻画出词序信息;
计算复杂维度灾难;
主题个数不好确定;
4.3 相似度与共现矩阵(Glove)
从某种意义上说,Glove是一种神奇的脑洞,glove是一种生不逢时的词嵌入方法,为何如此说呢?1.glove效果与
word2vec相似,没有什么明显性能提升,但诞生于word2vec后面; 2.glove是一种传统统计学习方法而没有使用人工神经
网络;3.方法与计算相对复杂,并且没有什么好用的官方包,并且常见的python工具包也没有集成glove。
glove算法认为,A的词向量 / B的词向量 = Pac / Pbc;统计共现矩阵,共现矩阵为X,在整个语料库中,
Pac为单词A和单词C共同出现在一个窗口中的次数除以语料中单词A出现的个数;
同理,Pbc为单词B和单词C共同出现在一个窗口中的次数除以语料中单词B出现的个数。
化简为 A的词向量 * B的词向量 ∝ Freq ab,即 A的词向量 乘以 B的词向量 正比于 AB词出现的词频,
再加上一些偏置项,就是glove了,glove损失函数如下:
解决的问题:词向量间上下文关系,部分解决词向量全局关系。
应用:一般性词向量,句向量构建,相似度计算,词嵌入等
优点:算法简单直观,只用了纯统计方法,综合了词语的全局信息和局部信息等
缺点:严重依赖于语料库;
不能刻画出词序信息;
不能解决一词多义问题;
常见python工具包不集成使得训练麻烦,应用较少;
五、基于语言模型的深度学习方法(NNLM、word2vec、Elmo、GPT、BERT)
5.1 NNLM
nnlm是2003年bengio等提出的一种神经网络语言模型,他的主要思想是根据句子中的前N个词语序列预测下一个
单词(这点和现在流行的MLM任务有点类似),采用的是MLP+tanh+softmax模型,其中神经元W便是重要的副产品,
提供给下游任务的词向量。
从某种意义上而言,nnlm是随着word2vec的兴起和热度而被考古出来的,从其贡献本身来说或许意义并不是很大。
nnlm结构图如下:
解决的问题:学习词语的分布式表示(从高维降到低维),词向量的隐含语义,一段话的句向量表示
应用:一般性词向量,句向量构建,相似度计算,词嵌入等
优点:使用神经网络模型训练词向量
缺点:模型优化不够,输出的类别较多导致训练过慢;
自回归语言模型,无法获取下文信息;
早期方案,应用较少,一般python工具不会集成;
5.2 word2vec
word2vec来自2013年google的论文《Efficient Estimation of Word Representations in Vector Space》,是一种浅层神
经网络模型,其中cbow模式就是预测连续N个词与中抠出来那个。例子“我 不 喜欢 帝国 主义 的”,假设滑动窗口是5,那么
可以有用词袋模型[“我", "不", "喜欢", ”主义“] 预测 ”帝国“。
skip-gram模型正好相反,用”帝国“去预测[“我", "不", "喜欢", ”主义“]。
word2vec模型结构图如下:
解决的问题:神经网络训练词向量速度慢的问题,
浅层词语意思抽取(语言模型),
预训练与下游任务微调问题
应用:词向量,句向量构建,词嵌入,相似度计算等
优点:算法简单直观,只用了浅层神经网络,
优化后训练速度快,能够获取相似词向量,
无论是word2vec还是其变种fastext都很好,很多包支持
缺点:不能解决一词多义问题;
不能区分和解决同义词反义词等深层次语义问题;
5.3 ELMO
elmo(deep contextualized word representation),是一种新的深层语境化的词汇表达方式,即动态变化的词向量,
这一点是和之前的静态词向量是迥异的。其具体做法是使用biLM语言任务,具体来说就是根据句话中的上下文预测当前
词语。例子:
假设有一句话"中国斗鱼又名叉尾斗鱼,广泛分布于华南地区。",elmo就是要预测"鱼"这个单词,那么就用前向LSTM
编码"中国斗鱼又名叉尾斗",得到编码h1,后向LSTM编码",广泛分布于华南地区。",得到编码h2,把h1和h2拼接起来,
即[h1, h2],去预测"鱼"的概率。
这样子训练,大规模语料中的通用信息,就存储到这个双层前向后向LSTM中了。
使用来做字,词,句子embedding,或者是做下游任务的时候,可以这么来理解,输入一个句子,elmo句子中的
词语的词向量受上下文词语影响,其上下文不同,则当前词语的词义不一样,如此,就能够解决一词多义的情况了。
ELMO网络结构如下:
解决的问题:一词多义问题,
深层次句子语义问题
应用:词向量,句向量构建,NLP四大任务等下游任务
优点:预训练模型使用通用语料,引入外部语料;
使用bilstm特征抽取器抽取词语,句子,语义等各层次信息;
解决一词多义问题,序列依赖问题;
缺点:bilstm抽取特征能力不够强,训练速度慢,不能并行化处理;
输出拼接前向、后向融合特征的方式不够好;
没有一个比较好的通用训练好的中文elmo预训练模型,也没有比较好用的工具;
5.3 Bert
Bert(Pre-training of Deep Bidirectional Transformers for Language Understanding),深层双向Transformer
预训练语言模型,是NNLM、Word2vec、ELMO和GPT等embedding技术的集大成者。
Bert采用更大规模(几十G)、更深层次网络(12,24)训练通用预训练模型,其训练任务有两个,一个是MLM(masked
Language Model)遮挡语言模型,而是NSP(Next Sentence Prediction)下一句子预测。
应该很好理解,MLM就是用句子中的其他词语预测被遮挡住的词语,
例子: "我爱语文"这句话,可以把["我", masked, "语", "文"]预测"爱"这个词。
NSP也很好理解,将连续的两句话拼接起来,用[SEP]间隔开,是连续句子就是True,否则为False,二分类任务。
这些任务,ELMO可以做,CBOW也可以做,不同的是,Bert在输入时候把token_segnment,position_embedding,
segnment_embedding一体化融合;两阶段模型(预训练,微调);Transformer编码层作特征抽取器;使用双向语言模型等
BERT网络结构如下图:
解决的问题:一词多义问题;
并行化快速训练问题;
词语、句子语义层次问题;
transformer上下文信息获取;
应用:词向量,句向量构建,NLP四大任务等下游任务
优点:预训练模型使用通用语料,引入外部语料,便于下游任务微调;
使用transformer特征抽取器抽取词语,并行化获取句子,语义等各层次信息;
解决一词多义问题,双向语言模型;
缺点:相同句式的词语语义区分不明显;
训练、微调时候输入不一致;
多层transformer训练比较慢,耗时长,需要能耗高;
bert维度768,多层transformer网络参数大,占用空间,预测比较慢;
不大适合生成式任务,对于超长文本不太友好,对于只需要浅层语义的NLP任务不友好;
参考/感谢:
词向量表示方法梳理: https://zhuanlan.zhihu.com/p/46026058
从Word Embedding到Bert模型——自然语言处理预训练技术发展史:https://mp.weixin.qq.com/s/FHDpx2cYYh9GZsa5nChi4g
————————————————
版权声明:本文为CSDN博主「Macropodus」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/rensihui/article/details/103284986