NLP自然语言处理(零)—— NLP的来龙去脉

网上有些人说的DeepNLP,不是什么深层次的自然语言处理模型

DeepNLP=Deep Learning + NLP

就是用深度学习的方法来进行自然语言处理

现在研究的热点也就是用深度学习的方法来进行自然语言处理,即现在研究的热点也就是DeepNLP

 

一、DeepNLP的核心关键:语言表示(Representation)

     最近DeepNLP非常火热。当常规的机器学习Machine Learning升级发展到了一定的阶段后,慢慢的被后起的深度学习Deep Learning夺势而去,并如火如荼地引领了一波新高潮,因为Deep Learning有machinelearning过而不及之处!那当Deep Learning进入NLP领域,自然是要横扫ACL一批paper才是。事实也是这样的。


        先提下数据特征表示问题。数据表示是机器学习的核心问题,在过去的Machine Learning阶段,大量兴起特征工程,人工设计大量的特征解决数据的有效表示问题。而到了Deep Learning,想都别想,end-2-end,一步到位,hyper-parameter自动帮你选择寻找关键的特征参数。


        那么,Deep Learning如何能在NLP中发挥出应有的real power呢?很明显,先不提如何设计出很强势的网络结构,不提如何在NLP中引入基于NN的解决例如情感分析、实体识别、机器翻译、文本生成这些高级任务,咱们首先得把语言表示这一关过了——如何让语言表示成为NN能够处理的数据类型。


        我们看看图像和语音是怎么表示数据的:

 NLP自然语言处理(零)—— NLP的来龙去脉
        在语音中,用音频频谱序列向量所构成的matrix作为前端输入喂给NN进行处理,good;

       在图像中,用图片的像素构成的matrix展平成vector后组成的vector序列喂给NN进行处理,good;

       那在自然语言处理中呢?噢你可能知道或者不知道,将每一个词用一个向量表示出来!想法是挺简单的,对,事实上就是这么简单,然而真有这么简单吗?可能没这么简单。

        有人提到,图像、语音属于比较自然地低级数据表示形式,在图像和语音领域,最基本的数据是信号数据,我们可以通过一些距离度量,判断信号是否相似,在判断两幅图片是否相似时,只需通过观察图片本身就能给出回答。而语言作为人类在进化了几百万年所产生的一种高层的抽象的思维信息表达的工具,其具有高度抽象的特征,文本是符号数据,两个词只要字面不同,就难以刻画它们之间的联系,即使是“麦克风”和“话筒”这样的同义词,从字面上也难以看出这两者意思相同(语义鸿沟现象),可能并不是简单地一加一那么简单就能表示出来,而判断两个词是否相似时,还需要更多的背景知识才能做出回答。


        所以,如何有效地表示出语言句子是决定NN能发挥出强大拟合计算能力的关键前提!

 

语言模型就是计算一个句子的概率大小的这种模型。有什么意义呢?一个句子的打分概率越高,越说明他是更合乎人说出来的自然句子。


二、NLP词的表示方法类型

       文本表示分为离散表示和分布式表示。

      离散表示的代表就是词袋模型,one-hot(也叫独热编码)、TF-IDF、n-gram都可以看作是词袋模型。

      分布式表示也叫做词嵌入(word embedding),经典模型是word2vec,还包括后来的Glove、ELMO、GPT和最近很火的BERT


1、词的独热表示one-hot representation

        NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation

        这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。关于one-hot编码的资料很多,街货,这里简单举个栗子说明:


                “话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...]
                “麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]


        每个词都是茫茫 0 海中的一个 1。这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。


现在我们分析他的不当之处。

       ①向量的维度会随着句子的词的数量类型增大而增大;

       任意两个词之间都是孤立的,根本无法表示出在语义层面上词语词之间的相关信息,而这一点是致命的


2、词的分布式表示distributed representation

       传统的独热表示( one-hot representation)仅仅将词符号化,不包含任何语义信息。如何将语义融入到词表示中?Harris 在 1954 年提出的分布假说( distributional hypothesis)为这一设想提供了理论基础:上下文相似的词,其语义也相似。Firth 在 1957 年对分布假说进行了进一步阐述和明确:

         词的语义由其上下文决定( a word is characterized by thecompany it keeps)。


        到目前为止,基于分布假说的词表示方法,根据建模的不同,主要可以分为三类:

         ①基于矩阵的分布表示

         ②基于聚类的分布表示

         ③基于神经网络的分布表示。

      尽管这些不同的分布表示方法使用了不同的技术手段获取词表示,但由于这些方法均基于分布假说,它们的核心思想也都由两部分组成:一、选择一种方式描述上下文;二、选择一种模型刻画某个词(下文称“目标词”)与其上下文之间的关系。

 

三、词的分布式表示

1. 基于矩阵的分布表示
        基于矩阵的分布表示通常又称为分布语义模型,在这种表示下,矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。由于分布假说认为上下文相似的词,其语义也相似,因此在这种表示下,两个词的语义相似度可以直接转化为两个向量的空间距离。
        常见到的Global Vector 模型( GloVe模型)是一种对“词-词”矩阵进行分解从而得到词表示的方法,属于基于矩阵的分布表示。


2. 基于聚类的分布表示
        基于聚类的分布表示我也还不是太清楚,所以就不做具体描述。


3. 基于神经网络的分布表示,词嵌入( word embedding)
        基于神经网络的分布表示一般称为词向量、词嵌入( word embedding)或分布式表示( distributed representation)。这正是我们的主角today。


        神经网络词向量表示技术通过神经网络技术对上下文,以及上下文与目标词之间的关系进行建模。由于神经网络较为灵活,这类方法的最大优势在于可以表示复杂的上下文。在前面基于矩阵的分布表示方法中,最常用的上下文是词。如果使用包含词序信息的 n-gram 作为上下文,当 n 增加时, n-gram 的总数会呈指数级增长,此时会遇到维数灾难问题。而神经网络在表示 n-gram 时,可以通过一些组合方式对 n 个词进行组合,参数个数仅以线性速度增长。有了这一优势,神经网络模型可以对更复杂的上下文进行建模,在词向量中包含更丰富的语义信息。

 

四、词嵌入( word embedding)


        基于神经网络的分布表示又称为词向量、词嵌入,神经网络词向量模型与其它分布表示方法一样,均基于分布假说,核心依然是上下文的表示以及上下文与目标词之间的关系的建模。


        前面提过,one-hot表示法具有维度过大的缺点,那么现在将vector做一些改进:

       ①将vector每一个元素由整形改为浮点型,变为整个实数范围的表示;

       ②将原来稀疏的巨大维度压缩嵌入到一个更小维度的空间。

如图所示

 NLP自然语言处理(零)—— NLP的来龙去脉
        这也是词向量又名词嵌入的缘由了。

 


词向量既能够降低维度,又能够capture到当前词在本句子中上下文的信息(表现为前后距离关系)

参考:

https://blog.****.net/scotfield_msn/article/details/69075227