自然语言表示简史(BERT/ELMO/Word2vec/LDA/Bow/Ohehot,词向量、句向量、优缺点、应用与解决的问题)

本文链接: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,构建的共现矩阵如下图

                      

自然语言表示简史(BERT/ELMO/Word2vec/LDA/Bow/Ohehot,词向量、句向量、优缺点、应用与解决的问题)_第1张图片

                 

          那么"我"的词向量可以表示为: [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损失函数如下:               

自然语言表示简史(BERT/ELMO/Word2vec/LDA/Bow/Ohehot,词向量、句向量、优缺点、应用与解决的问题)_第2张图片

                                                           

             解决的问题:词向量间上下文关系,部分解决词向量全局关系。

             应用:一般性词向量,句向量构建,相似度计算,词嵌入等

             优点:算法简单直观,只用了纯统计方法,综合了词语的全局信息和局部信息等

             缺点:严重依赖于语料库;

                       不能刻画出词序信息; 

                       不能解决一词多义问题;

                       常见python工具包不集成使得训练麻烦,应用较少;

 

五、基于语言模型的深度学习方法(NNLM、word2vec、Elmo、GPT、BERT)

        5.1  NNLM

               nnlm是2003年bengio等提出的一种神经网络语言模型,他的主要思想是根据句子中的前N个词语序列预测下一个

        单词(这点和现在流行的MLM任务有点类似),采用的是MLP+tanh+softmax模型,其中神经元W便是重要的副产品,

        提供给下游任务的词向量。

               从某种意义上而言,nnlm是随着word2vec的兴起和热度而被考古出来的,从其贡献本身来说或许意义并不是很大。

               nnlm结构图如下:

                       

自然语言表示简史(BERT/ELMO/Word2vec/LDA/Bow/Ohehot,词向量、句向量、优缺点、应用与解决的问题)_第3张图片

             解决的问题:学习词语的分布式表示(从高维降到低维),词向量的隐含语义,一段话的句向量表示

             应用:一般性词向量,句向量构建,相似度计算,词嵌入等

             优点:使用神经网络模型训练词向量

             缺点:模型优化不够,输出的类别较多导致训练过慢;

                       自回归语言模型,无法获取下文信息;

                       早期方案,应用较少,一般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

你可能感兴趣的:(知识图谱,自然语言理解,人工智能,自然语言处理,nlp)