精华内容
下载资源
问答
  • 在cips2016出来之前,笔者也总结过种类繁多,类似向量的内容,自然语言处理︱简述四大类文本分析中的“向量”(文本特征提取)事实证明,笔者当时所写的基本跟CIPS2016一章中总结的类似,当然由于入门较晚没有...

    在cips2016出来之前,笔者也总结过种类繁多,类似词向量的内容,自然语言处理︱简述四大类文本分析中的“词向量”(文本词特征提取)事实证明,笔者当时所写的基本跟CIPS2016一章中总结的类似,当然由于入门较晚没有CIPS2016里面说法权威,于是把CIPS2016中的内容,做一个摘录。

    CIPS2016 中文信息处理报告《第五章 语言表示与深度学习研究进展、现状及趋势》第三节 技术方法和研究现状中有一些关于语言表示模型划分的内容P33-P35,其中:
    这里写图片描述
    语言表示方法大体上可以从两个维度进行区分。一个维度是按不同粒度进行划分,语言具有一定的层次结构,语言表示可以分为字、词、句子、篇章等不同粒度的表示。另一个维度是按表示形式进行划分,可以分为离散表示和连续表示两类。离散表示是将语言看成离散的符号,而将语言表示为连续空间中的一个点,包括分布式表示和分散式表示。

    CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bcebos.com/cips2016.pdf
    .
    .


    一、离散表示

    1、词向量

    • 一个词可以表示为One-Hot 向量(一维为1 其余维为0
      的向量),也叫局部表示。离散表示的缺点是词与词之间没有距离的概念,这和事实不符。
    • 一种改进的方法是基于聚类的词表示。其中一个经典的方法是Brown 聚类算法,该算法是一种层次化的聚类算法。在得到层次化结构的词类簇之后,我们可以用根节点到词之间的路径来表示该词。

    2、句向量

    有了词的表示之后,我们可以进一步得到句子或篇章的表示。句子或篇章的离散表示通常采用词袋模型、N 元模型等。
    .
    .
    .


    二、连续表示——分布式表示

    这样就可以通过共现矩阵的方式来进行词的表示,这类方法也叫分布式表示(Distributional Representations)

    1、词向量

    潜在语义分析模型(Latent Semantic Analysis, LSA)、潜在狄利克雷分配模型(Latent Dirichlet Allocation,LDA)、随机索引(random indexing)等。

    2、句向量

    句子的表示方式对应于共现矩阵,另一列,在LDA中句子-词语矩阵中就是很好地句子表示方式。
    .
    .
    .


    ★三、连续表示——分散式表示

    另一种连续表示是分散式表示(Distributed Representations),即将语言表示为稠密、低维、连续的向量

    1、词向量

    研究者最早发现学习得到词嵌入之间存在类比关系。比如apple−apples ≈ car−cars, man−woman ≈ king – queen 等。这些方法都可以直接在大规模无标注语料上进行训练。词嵌入的质量也非常依赖于上下文窗口大小的选择。通常大的上下文窗口学到的词嵌入更反映主题信息,而小的上下文窗口学到的词嵌入更反映词的功能和上下文语义信息。

    2、句向量

    句子编码主要研究如何有效地从词嵌入通过不同方式的组合得到句子表示。其中,比较有代表性的方法有四种。

    • (1)神经词袋模型

    简单对文本序列中每个词嵌入进行平均/加总,作为整个序列的表示。
    这种方法的缺点是丢失了词序信息。对于长文本,神经词袋模型比较有效。但是对于短文本,神经词袋模型很难捕获语义组合信息。

    • (2)递归神经网络(Recursive Neural Network)

    按照一个给定的外部拓扑结构(比如成分句法树),不断递归得到整个序列的表示。递归神经网络的一个缺点是需要给定一个拓扑结构来确定词和词之间的依赖关系,因此限制其使用范围。

    • (3)循环神经网络(Recurrent Neural Network)

    将文本序列看作时间序列,不断更新,最后得到整个序列的表示。

    • (4)卷积神经网络(Convolutional Neural Network)

    通过多个卷积层和子采样层,最终得到一个固定长度的向量。

    在上述四种基本方法的基础上,很多研究者综合这些方法的优点,结合具体的任务,已经提出了一些更复杂的组合模型,例如双向循环神经网络(Bi-directional Recurrent Neural Network)、长短时记忆模型(Long-Short Term Memory)等。
    同时根据上面的内容,句向量的表征在RNN、CNN之间,到底哪个更好呢? 有一篇文章在这点上讲得比较清楚,会在下面的延伸三:《NLP 模型到底选 RNN 还是 CNN?》提到。

    3、篇章表示

    如果处理的对象是比句子更长的文本序列(比如篇章),为了降低模型复杂度,一般采用层次化的方法,先得到句子编码,然后以句子编码为输入,进一步得到篇章的表示。具体的层次化可以采用以下几种方法:

    • (1)层次化的卷积神经网络

    即用卷积神经网络对每个句子进行建模,然后以句子为单位再进行一次卷积和池化操作,得到篇章表示。

    • (2)层次化的循环神经网络

    即用循环神经网络对每个句子进行建模,然后再用一个循环神经网络建模以句子为单位的序列,得到篇章表示。

    • (3)混合模型

    先用循环神经网络对每个句子进行建模,然后以句子为单位再进行一次卷积和池化操作,得到篇章表示。在上述模型中,循环神经网络因为非常适合处理文本序列,因此被广泛应用在很多自然语言处理任务上。
    .
    .
    .


    四、总结

    基于深度学习的方法在自然语言处理中取得了很大的进展,因此,分散式表示也成为语言表示中最热门的方法,不但可以在特定的任务中端到端地学习字、词、句子、篇章的分散式表示,也可以通过大规模未标注文本自动学习。
    分散式表示可以非常方便地应用在下游的各种自然语言处理任务上,并且可以端到端地学习,给研究者带来了很大的便利。但是分散式表示对以下几种情况还不能很好地处理,需要进一步解决。

    1. 语言中出现所有符号是否都需要使用统一的表示模型?比如,无意义的符号、变量、数字等。
    2. 新词以及低频词的表示学习方法。目前的表示学习方法很难对这些词进行很好的建模,而这些词都是极具信息量的,不能简单忽略。
    3. 篇章的语言表示。目前对篇章级别的文本进行建模方法比较简单,不足以表示篇章中的复杂语义。
    4. 语言表示的基础数据结构。除了目前的基于向量的数据结构之外是否有更好的表示结构,比如矩阵、队列、栈等。
      .
      .

    延伸一:句向量的表示方式

    参考blog:Sentence Embedding/Nishant Nikhil

    在实际应用方面,可以参考google在2014发表的内容,对实际应用非常有帮助:Distributed Representations of Sentences and Documents

    该博客较多是对分散表示词向量进行一定的总结与归纳。

    1、词向量简单相加/平均(类似神经词袋模型)

    对词向量的相加/平均,但是譬如以下的两句话质心是一致的:

    You are going there to teach not play.
    You are going there to play not teach

    这样的方式,再来求句子距离,其实是在求句子的质心距离(centroid distance)。
    另外一种改良版本,用Word Movers’ Distance

    这里写图片描述

    相近词之间求距离,然后把这样的相近距离相加。

    参考paper1:From Word Embeddings To Document Distances
    参考paper2:Using Centroids of Word Embeddings and Word Mover’s Distance for Biomedical Document Retrieval in Question Answering
    .
    .

    2、深度学习方面

    以上的方法并没有关照到句子的序列信息。
    1、CNN
    用CNN来句子表示(paper:Convolutional Neural Networks for Sentence Classification),操作流程是:
    padding句子让其长度一致 -> 使用词表示技术成为方阵 -> 使用CNN -> 使用Max-overtime pooling -> 全连接层 -> 获得句向量。

    2、GRU
    Dynamic Memory Networks for Visual and Textual Question Answering
    通过GRU进行编码,生成上下文向量+更新记忆。
    当然还有用双向GRUs(Efficient Summarization With Read-Again And Copy Mechanism
    .
    .

    3、fasttext表示

    可见NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
    .
    .

    延伸二:句向量表达:Sentence 2 vec

    跟眼神一中词向量简单相加减类似,是通过PCA/SVD的加权得到了句向量,同时作者在实验过程中,发现这一表征方式,可以跟LSTM表征的效果媲美。
    这里写图片描述

    github地址:https://github.com/peter3125/sentence2vec
    paper地址:《A SIMPLE BUT TOUGH-TO-BEAT BASELINE FOR SENTENCE EMBEDDINGS》

    # test
    embedding_size = 4   # dimension of the word embedding
    w1 = Word('Peter', [0.1, 0.2, 0.3, 0.4])
    w2 = Word('was', [0.2, 0.1, 0.3, 0.4])
    w3 = Word('here', [0.1, 0.4, 0.1, 0.4])
    
    sentence1 = Sentence([w1, w2, w3])
    sentence2 = Sentence([w2, w3, w1])
    sentence3 = Sentence([w3, w1, w2])
    
    # calculate and display the result
    print(sentence_to_vec([sentence1, sentence2, sentence3], embedding_size))

    .


    延伸三:NLP 模型到底选 RNN 还是 CNN?

    本文来源于文章《AI技术讲座精选:NLP 模型到底选 RNN 还是 CNN?》,不过实质上并没有得出非常建设性的答案。
    paper地址:https://arxiv.org/pdf/1702.01923.pdf

    CNN 是分层架构,RNN 是连续结构。一般靠常规直觉来判断:

    1. 倾向于为分类类型的任务选择 CNN,例如情感分类,因为情感通常是由一些关键词来决定的;
    2. 对于顺序建模任务,我们会选择 RNN,例如语言建模任务,要求在了解上下文的基础上灵活建模。

    在实践中,得到的结论:

    1. CNN 和 RNN 为文本分类任务提供补充信息。至于哪个架构的执行效果更好一点,取决于对整个序列的语义理解的重要程度。
    2. 目前来看,RNN 在文本级别的情感分类表现得很好(Tang et al., 2015),对于LSTM,封闭的 CNN
      在语言建模任务上同比 LSTM 更胜一筹
    3. RNN 表现较好并且在大范围内的任务中都较为稳健。除了以下种情况:当前的任务本质上是一项在一些情感探测和问答匹配设置中识别关键词的任务。
    4. 隐藏层尺寸hidden size和批尺寸batch size会使 DNN 的性能变得非常不稳定,波动较大,从实践来看这两个参数对结果的影响非常大。

    .

    延伸四:对词向量干预,可以提高效率

    paper:All-but-the-Top: Simple and Effective Postprocessing for Word Representations
    本文来源于paperweekly,《本周值得读(2017.02.06-2017.02.10)》

    本文提出了一种对已有的词向量进行预处理的方法,用来对学习到的词向量降噪。基于词向量自身的几何结构 — 均值非零以及各项不同性,本文提出了一个反直观的处理方法:从所有的词向量中移除均值,以及移除部分导致各项不同性的方向。虽然这种处理方式忽略了词向量中的部分信息,但是它可以使多种通过不同方式训练出来的词向量加强词向量中包含的语义信息。经过预处理之后的词向量在一系列intrinsic衡量方式上(similarity, analogy, concept categorization)得到了一致性地提高。同时,我们通过了不同的应用上进行了测试,试验结果表明该预处理已经在诸多neural network中有所体现,进一步证实了对词向量进行预处理的重要性。

    .


    延伸五:NLP+Skip-Thoughts-Vectors︱基于TensorFlow的带语义特征的句向量编码方式

    本篇转载于新智元,题为《TensorFlow 自动句子语义编码,谷歌开源机器学习模型
    Skip-Thoughts》

    笔者觉得是高层次的

    github地址(新换):https://github.com/tensorflow/models/tree/master/research/skip_thoughts

    Skip-Thoughts 模型概要

    Skip-Thoughts 模型是一个句子编码器。它学习将输入的句子编码成固定维度的向量表示,这些向量表示能够对许多任务有用,例如检测释义,或对产品评论进行积极或消极的分类等等。有关模型架构和更多示例应用的详细信息,可以参阅Ryan Kiros 等人的 NIPS 论文 Skip-Thought Vectors。

    一个训练好的 Skip-Thoughts 模型会在嵌入的向量空间中对相互临近的相似句子进行编码。以下示例展示了对电影评论数据集中的一些句子的余弦相似性的最近邻域。
    我们描述了一种通用、分布式句子编码器的无监督学习方法。使用从书籍中提取的连续文本,我们训练了一个编码器-解码器模型,试图重建编码段落周围的句子。语义和语法属性一致的句子因此被映射到相似的向量表示。我们接着引入一个简单的词汇扩展方法来编码不再训练预料内的单词,令词汇量扩展到一百万词。同时建立word2vec到skip-thoughts向量之间的映射关系。
    在训练模型后,我们用线性模型在8个任务上提取和评估我们的向量,包括:语义相关性,释义检测,图像句子排序,问题类型归类,以及4个基准情绪和主观性数据集。最终的结果是一个非专门设计的编码器,能够生成高度通用性的句子表示,在实践中表现良好。
    这里写图片描述

    Skip-Thought 模型是 NIPS 2015论文 Skip-Thought Vectors 中描述的模型的一个 TensorFlow 实现,学习对句子的语义属性进行编码。

    引用:Ryan Kiros, Yukun Zhu, Ruslan Salakhutdinov, Richard S. Zemel, Antonio Torralba, Raquel Urtasun, Sanja Fidler. Skip-Thought Vectors. In NIPS, 2015.

    论文下载地址:https://papers.nips.cc/paper/5950-skip-thought-vectors.pdf

    这里写图片描述

    编码句子示例

    该示例的句子来自电影评论数据集(Movie Review Data)。

    ipython  # Launch iPython.
    
    In [0]:
    
    # Imports.
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    import numpy as np
    import os.path
    import scipy.spatial.distance as sd
    from skip_thoughts import configuration
    from skip_thoughts import combined_encoder
    
    In [1]:
    # Set paths to the model.
    VOCAB_FILE = "/path/to/vocab.txt"
    EMBEDDING_MATRIX_FILE = "/path/to/embeddings.npy"
    CHECKPOINT_PATH = "/path/to/model.ckpt-9999"
    # The following directory should contain files rt-polarity.neg and
    # rt-polarity.pos.
    MR_DATA_DIR = "/dir/containing/mr/data"
    
    In [2]:
    # Set up the encoder. Here we are using a single unidirectional model.
    # To use a bidirectional model as well, call load_encoder() again with
    # configuration.ModelConfig(bidirectional_encoder=True) and paths to the
    # bidirectional model's files. The encoder will use the concatenation of
    # all loaded models.
    encoder = combined_encoder.CombinedEncoder()
    encoder.load_encoder(configuration.ModelConfig(),
                         vocabulary_file=VOCAB_FILE,
                         embedding_matrix_file=EMBEDDING_MATRIX_FILE,
                         checkpoint_path=CHECKPOINT_PATH)
    
    In [3]:
    # Load the movie review dataset.
    data = []
    with open(os.path.join(MR_DATA_DIR, 'rt-polarity.neg'), 'rb') as f:
      data.extend([line.decode('latin-1').strip() for line in f])
    with open(os.path.join(MR_DATA_DIR, 'rt-polarity.pos'), 'rb') as f:
      data.extend([line.decode('latin-1').strip() for line in f])
    
    In [4]:
    # Generate Skip-Thought Vectors for each sentence in the dataset.
    encodings = encoder.encode(data)
    
    In [5]:
    # Define a helper function to generate nearest neighbors.
    def get_nn(ind, num=10):
      encoding = encodings[ind]
      scores = sd.cdist([encoding], encodings, "cosine")[0]
      sorted_ids = np.argsort(scores)
      print("Sentence:")
      print("", data[ind])
      print("\nNearest neighbors:")
      for i in range(1, num + 1):
        print(" %d. %s (%.3f)" %
              (i, data[sorted_ids[i]], scores[sorted_ids[i]]))
    
    In [6]:
    # Compute nearest neighbors of the first sentence in the dataset.
    get_nn(0)

    输出:

    Sentence:
     simplistic , silly and tedious .
    
    Nearest neighbors:
     1. trite , banal , cliched , mostly inoffensive . (0.247)
     2. banal and predictable . (0.253)
     3. witless , pointless , tasteless and idiotic . (0.272)
     4. loud , silly , stupid and pointless . (0.295)
     5. grating and tedious . (0.299)
     6. idiotic and ugly . (0.330)
     7. black-and-white and unrealistic . (0.335)
     8. hopelessly inane , humorless and under-inspired . (0.335)
     9. shallow , noisy and pretentious . (0.340)
     10. . . . unlikable , uninteresting , unfunny , and completely , utterly inept . (0.346)

    延伸六:Doc2Vec的情感分析以及相似性

    Tutorial for Sentiment Analysis using Doc2Vec in gensim (or “getting 87% accuracy in sentiment analysis in under 100 lines of code”)
    github:https://github.com/linanqiu/word2vec-sentiments

    也可以用doc2vec来做相似性分析,其他办法有:
    第一种方法,使用docsim;第二种办法,使用doc2vec;第三种方式:使用LSH。
    博客里面也有code

    详细可见:用docsim/doc2vec/LSH比较两个文档之间的相似度

    .

    延伸七:能够表征相似的:基于CNN的短文本表达模型及相似度计算的全新优化模型

    来源:LSF-SCNN:一种基于CNN的短文本表达模型及相似度计算的全新优化模型

    LSF-SCNN,即基于词汇语义特征的跳跃卷积模型 (Lexical Semantic Feature based Skip Convolution neural network ),基于卷积神经网络模型引入三种优化策略:词汇语义特征 (Lexical Semantic Feature, LSF)、跳跃卷积 (Skip Convolution, SC)和K-Max均值采样 (K-Max Average Pooling, KMA) ,分别在词汇粒度、短语粒度、句子粒度上抽取更加丰富的语义特征,从而更好的在向量空间构建短文本语义表达模型,并广泛的适用于问答系统 (question answering)、释义识别 (paraphrase identification) 和文本蕴含 (textual entailment)等计算成对儿出现的短文本的相似度的任务中。
    LSF特征怎样计算得到?
    问题和答案中的每一个单词都会有一个LSF特征,具体来说是一个[0,t]上的整数值。LSF的计算过程可通过下面一个例子说明,当我们想要求解问题中general一词的LSF特征时,第一步我们需要计算general与答案中每一个词的余弦相似度并选取其中的最大值,因此chief被选取出来。第二步,余弦相似度值的最大值0.79将通过一个映射函数映射为一个[0,t]区间的整数,当我们假定t=10,最终计算得到general的LSF特征为3。这是合理的,general和chief一定程度上是近义词。
    这里写图片描述

    .

    延伸八:473个模型试验告诉你文本分类中的最好编码方式

    论文地址:https://arxiv.org/pdf/1708.02657.pdf
    来源机器之心:学界 473个模型试验告诉你文本分类中的最好编码方式
    本论文实证研究了在文本分类模型中汉语、日语、韩语(CJK)和英语的不同编码方式。该研究讨论了不同层面的编码,包括 UTF-8 bytes、字符级和词汇级。对于所有的编码层面,我们都提供了线性模型、fastText (Joulin et al., 2016) 和卷积网络之间的对比。对于卷积网络,我们使用字符字形(character glyph)图像、one-hot(或 one-of-n)编码和嵌入方法比较了不同的编码机制。总的来说,该实验涉及 473 个模型,并使用了四种语言(汉语、英语、日语和韩语)的 14 个大规模文本分类数据集。该研究所得出来的一些结论:基于 UTF-8 字节层面的 one-hot 编码在卷积网络中始终生成优秀结果;词层面的 N 元线性模型即使不能完美地分词,它也有强大的性能;fastText 使用字符层面的 N 元模型进行编码取得了最好的性能,但当特征太多时容易过拟合。
    这里写图片描述

    通过比较以上表格中的误差率,作者得出以下结论:

    • 1、fastText模型对中、日、韩文本(CJK语言文本)在character级编码的处理结果更好;而对英语文本则在word级编码的处理结果更好;
    • 2、对于fastText和线性模型,CJK语言的word级编码在没有完美分割的情况下效果相当;
    • 3、卷积网络的最佳编码机制是byte级独热编码(byte-level one-hot encoding)。
      这表明卷积网络能够从低级别的表示中理解文本,并提供了一致的和统一的方式来处理多种语言。
    • 4、fastText相比于卷积网络更倾向于过拟合,而相比于线形模型也并没有表现出更多的表示能力(representation
      capacity)。

    当然,尽管作者在此列了473种模型进行对比,但仍不是全部。例如深度学习模型本文只用了卷积网络模型,但其实还有别的一些有意思的模型,例如周期性网络(recurrent networks)等。作者似乎计划在之后会对周期性网络进行研究,同时还会改进卷积网络模型,看会有什么样的效果。

    展开全文
  • 一个维度是按不同粒度进行划分,语言具有一定的层次结构,语言表示可以分为字、、句子、篇章等不同粒度的表示。另一个维度是按表示形式进行划分,可以分为离散表示和连续表示两类。离散表示是将语言看成离散的符号...

    这里写图片描述
    语言表示方法大体上可以从两个维度进行区分。一个维度是按不同粒度进行划分,语言具有一定的层次结构,语言表示可以分为字、词、句子、篇章等不同粒度的表示。另一个维度是按表示形式进行划分,可以分为离散表示和连续表示两类。离散表示是将语言看成离散的符号,而将语言表示为连续空间中的一个点,包括分布式表示和分散式表示。
    一、离散表示

    1、词向量
    一个词可以表示为One-Hot 向量(一维为1 其余维为0
    的向量),也叫局部表示。离散表示的缺点是词与词之间没有距离的概念,这和事实不符。
    一种改进的方法是基于聚类的词表示。其中一个经典的方法是Brown 聚类算法,该算法是一种层次化的聚类算法。在得到层次化结构的词类簇之后,我们可以用根节点到词之间的路径来表示该词。
    2、句向量
    有了词的表示之后,我们可以进一步得到句子或篇章的表示。句子或篇章的离散表示通常采用词袋模型、N 元模型等。
    二、连续表示——分布式表示

    可以通过共现矩阵的方式来进行词的表示,这类方法也叫分布式表示(Distributional Representations)

    1、词向量

    潜在语义分析模型(Latent Semantic Analysis, LSA)、潜在狄利克雷分配模型(Latent Dirichlet Allocation,LDA)、随机索引(random indexing)等。

    2、句向量

    句子的表示方式对应于共现矩阵,另一列,在LDA中句子-词语矩阵中就是很好地句子表示方式。

    三、连续表示——分散式表示

    另一种连续表示是分散式表示(Distributed Representations),即将语言表示为稠密、低维、连续的向量

    1、词向量
    研究者最早发现学习得到词嵌入之间存在类比关系。比如apple−apples ≈ car−cars, man−woman ≈ king – queen 等。这些方法都可以直接在大规模无标注语料上进行训练。词嵌入的质量也非常依赖于上下文窗口大小的选择。通常大的上下文窗口学到的词嵌入更反映主题信息,而小的上下文窗口学到的词嵌入更反映词的功能和上下文语义信息。
    2、句向量
    句子编码主要研究如何有效地从词嵌入通过不同方式的组合得到句子表示。其中,比较有代表性的方法有四种。
    (1)神经词袋模型
    简单对文本序列中每个词嵌入进行平均/加总,作为整个序列的表示。
    这种方法的缺点是丢失了词序信息。对于长文本,神经词袋模型比较有效。但是对于短文本,神经词袋模型很难捕获语义组合信息。
    (2)递归神经网络(Recursive Neural Network)
    按照一个给定的外部拓扑结构(比如成分句法树),不断递归得到整个序列的表示。递归神经网络的一个缺点是需要给定一个拓扑结构来确定词和词之间的依赖关系,因此限制其使用范围。
    (3)循环神经网络(Recurrent Neural Network)
    将文本序列看作时间序列,不断更新,最后得到整个序列的表示。
    (4)卷积神经网络(Convolutional Neural Network)
    通过多个卷积层和子采样层,最终得到一个固定长度的向量。
    在上述四种基本方法的基础上,很多研究者综合这些方法的优点,结合具体的任务,已经提出了一些更复杂的组合模型,例如双向循环神经网络(Bi-directional Recurrent Neural Network)、长短时记忆模型(Long-Short Term Memory)等。
    同时根据上面的内容,句向量的表征在RNN、CNN之间,到底哪个更好呢?
    3、篇章表示
    如果处理的对象是比句子更长的文本序列(比如篇章),为了降低模型复杂度,一般采用层次化的方法,先得到句子编码,然后以句子编码为输入,进一步得到篇章的表示。具体的层次化可以采用以下几种方法:
    (1)层次化的卷积神经网络
    即用卷积神经网络对每个句子进行建模,然后以句子为单位再进行一次卷积和池化操作,得到篇章表示。
    (2)层次化的循环神经网络
    即用循环神经网络对每个句子进行建模,然后再用一个循环神经网络建模以句子为单位的序列,得到篇章表示。
    (3)混合模型
    先用循环神经网络对每个句子进行建模,然后以句子为单位再进行一次卷积和池化操作,得到篇章表示。在上述模型中,循环神经网络因为非常适合处理文本序列,因此被广泛应用在很多自然语言处理任务上。

    四、总结

    基于深度学习的方法在自然语言处理中取得了很大的进展,因此,分散式表示也成为语言表示中最热门的方法,不但可以在特定的任务中端到端地学习字、词、句子、篇章的分散式表示,也可以通过大规模未标注文本自动学习。
    分散式表示可以非常方便地应用在下游的各种自然语言处理任务上,并且可以端到端地学习,给研究者带来了很大的便利。但是分散式表示对以下几种情况还不能很好地处理,需要进一步解决。
    语言中出现所有符号是否都需要使用统一的表示模型?比如,无意义的符号、变量、数字等。
    新词以及低频词的表示学习方法。目前的表示学习方法很难对这些词进行很好的建模,而这些词都是极具信息量的,不能简单忽略。
    篇章的语言表示。目前对篇章级别的文本进行建模方法比较简单,不足以表示篇章中的复杂语义。
    语言表示的基础数据结构。除了目前的基于向量的数据结构之外是否有更好的表示结构,比如矩阵、队列、栈等。

    句向量的表示方式
    1、词向量简单相加/平均(类似神经词袋模型)
    对词向量的相加/平均,但是譬如以下的两句话质心是一致的:
    You are going there to teach not play.
    You are going there to play not teach
    这样的方式,再来求句子距离,其实是在求句子的质心距离(centroid distance)。
    另外一种改良版本,用Word Movers’ Distance
    这里写图片描述
    相近词之间求距离,然后把这样的相近距离相加。
    2、深度学习方面

    以上的方法并没有关照到句子的序列信息。
    1、CNN
    用CNN来句子表示(paper:Convolutional Neural Networks for Sentence Classification),操作流程是:
    padding句子让其长度一致 -> 使用词表示技术成为方阵 -> 使用CNN -> 使用Max-overtime pooling -> 全连接层 -> 获得句向量。

    2、GRU
    Dynamic Memory Networks for Visual and Textual Question Answering
    通过GRU进行编码,生成上下文向量+更新记忆。
    当然还有用双向GRUs(Efficient Summarization With Read-Again And Copy Mechanism)
    3、fasttext表示
    FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法。
    fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。
    序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间层,中间层再映射到标签。
    fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。
    fastText 模型架构和 Word2Vec 中的 CBOW 模型很类似。不同之处在于,fastText 预测标签,而 CBOW 模型预测中间词。
    这里写图片描述
    句向量表达:Sentence 2 vec

    跟词向量简单相加减类似,是通过PCA/SVD的加权得到了句向量,同时作者在实验过程中,发现这一表征方式,可以跟LSTM表征的效果媲美。
    这里写图片描述
    NLP 模型到底选 RNN 还是 CNN?

    CNN 是分层架构,RNN 是连续结构。一般靠常规直觉来判断:
    倾向于为分类类型的任务选择 CNN,例如情感分类,因为情感通常是由一些关键词来决定的;
    对于顺序建模任务,我们会选择 RNN,例如语言建模任务,要求在了解上下文的基础上灵活建模。
    在实践中,得到的结论:
    CNN 和 RNN 为文本分类任务提供补充信息。至于哪个架构的执行效果更好一点,取决于对整个序列的语义理解的重要程度。

    目前来看,RNN 在文本级别的情感分类表现得很好(Tang et al., 2015),对于LSTM,封闭的 CNN 在语言建模任务上同比 LSTM 更胜一筹

    RNN 表现较好并且在大范围内的任务中都较为稳健。除了以下种情况:当前的任务本质上是一项在一些情感探测和问答匹配设置中识别关键词的任务。

    隐藏层尺寸hidden size和批尺寸batch size会使 DNN 的性能变得非常不稳定,波动较大,从实践来看这两个参数对结果的影响非常大。

    对词向量干预,可以提高效率
    https://www.researchgate.net/publication/313398040_All-but-the-Top_Simple_and_Effective_Postprocessing_for_Word_Representations
    本文提出了一种对已有的词向量进行预处理的方法,用来对学习到的词向量降噪。基于词向量自身的几何结构 — 均值非零以及各项不同性,本文提出了一个反直观的处理方法:从所有的词向量中移除均值,以及移除部分导致各项不同性的方向。虽然这种处理方式忽略了词向量中的部分信息,但是它可以使多种通过不同方式训练出来的词向量加强词向量中包含的语义信息。经过预处理之后的词向量在一系列intrinsic衡量方式上(similarity, analogy, concept categorization)得到了一致性地提高。同时,我们通过了不同的应用上进行了测试,试验结果表明该预处理已经在诸多neural network中有所体现,进一步证实了对词向量进行预处理的重要性。

    NLP+Skip-Thoughts-Vectors︱基于TensorFlow的带语义特征的句向量编码方式

    github地址:https://github.com/tensorflow/models/tree/master/skip_thoughts

    Skip-Thoughts 模型概要

    Skip-Thoughts 模型是一个句子编码器。它学习将输入的句子编码成固定维度的向量表示,这些向量表示能够对许多任务有用,例如检测释义,或对产品评论进行积极或消极的分类等等。有关模型架构和更多示例应用的详细信息,可以参阅Ryan Kiros 等人的 NIPS 论文 Skip-Thought Vectors。

    一个训练好的 Skip-Thoughts 模型会在嵌入的向量空间中对相互临近的相似句子进行编码。以下示例展示了对电影评论数据集中的一些句子的余弦相似性的最近邻域。
    我们描述了一种通用、分布式句子编码器的无监督学习方法。使用从书籍中提取的连续文本,我们训练了一个编码器-解码器模型,试图重建编码段落周围的句子。语义和语法属性一致的句子因此被映射到相似的向量表示。我们接着引入一个简单的词汇扩展方法来编码不再训练预料内的单词,令词汇量扩展到一百万词。同时建立word2vec到skip-thoughts向量之间的映射关系。
    在训练模型后,我们用线性模型在8个任务上提取和评估我们的向量,包括:语义相关性,释义检测,图像句子排序,问题类型归类,以及4个基准情绪和主观性数据集。最终的结果是一个非专门设计的编码器,能够生成高度通用性的句子表示,在实践中表现良好。
    这里写图片描述
    Doc2Vec的情感分析以及相似性

    Tutorial for Sentiment Analysis using Doc2Vec in gensim (or “getting 87% accuracy in sentiment analysis in under 100 lines of code”)
    github:https://github.com/linanqiu/word2vec-sentiments

    也可以用doc2vec来做相似性分析,其他办法有:
    第一种方法,使用docsim;第二种办法,使用doc2vec;第三种方式:使用LSH。
    能够表征相似的:基于CNN的短文本表达模型及相似度计算的全新优化模型
    LSF-SCNN,即基于词汇语义特征的跳跃卷积模型 (Lexical Semantic Feature based Skip Convolution neural network ),基于卷积神经网络模型引入三种优化策略:词汇语义特征 (Lexical Semantic Feature, LSF)、跳跃卷积 (Skip Convolution, SC)和K-Max均值采样 (K-Max Average Pooling, KMA) ,分别在词汇粒度、短语粒度、句子粒度上抽取更加丰富的语义特征,从而更好的在向量空间构建短文本语义表达模型,并广泛的适用于问答系统 (question answering)、释义识别 (paraphrase identification) 和文本蕴含 (textual entailment)等计算成对儿出现的短文本的相似度的任务中。
    LSF特征怎样计算得到?
    问题和答案中的每一个单词都会有一个LSF特征,具体来说是一个[0,t]上的整数值。LSF的计算过程可通过下面一个例子说明,当我们想要求解问题中general一词的LSF特征时,第一步我们需要计算general与答案中每一个词的余弦相似度并选取其中的最大值,因此chief被选取出来。第二步,余弦相似度值的最大值0.79将通过一个映射函数映射为一个[0,t]区间的整数,当我们假定t=10,最终计算得到general的LSF特征为3。这是合理的,general和chief一定程度上是近义词。
    这里写图片描述

    展开全文
  • 的向量表示

    万次阅读 2014-04-30 12:59:13
     NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了...
    
    
    

      这篇博客是我看了半年的论文后,自己对 Deep Learning 在 NLP 领域中应用的理解和总结,在此分享。其中必然有局限性,欢迎各种交流,随便拍。

      Deep Learning 算法已经在图像和音频领域取得了惊人的成果,但是在 NLP 领域中尚未见到如此激动人心的结果。关于这个原因,引一条我比较赞同的微博。

    @王威廉:Steve Renals算了一下icassp录取文章题目中包含deep learning的数量,发现有44篇,而naacl则有0篇。有一种说法是,语言(词、句子、篇章等)属于人类认知过程中产生的高层认知抽象实体,而语音和图像属于较为底层的原始输入信号,所以后两者更适合做deep learning来学习特征。
    2013年3月4日 14:46

      第一句就先不用管了,毕竟今年的 ACL 已经被灌了好多 Deep Learning 的论文了。第二句我很认同,不过我也有信心以后一定有人能挖掘出语言这种高层次抽象中的本质。不论最后这种方法是不是 Deep Learning,就目前而言,Deep Learning 在 NLP 领域中的研究已经将高深莫测的人类语言撕开了一层神秘的面纱。
      我觉得其中最有趣也是最基本的,就是“词向量”了。

      将词用“词向量”的方式表示可谓是将 Deep Learning 算法引入 NLP 领域的一个核心技术。大多数宣称用了 Deep Learning 的论文,其中往往也用了词向量。

     

    0. 词向量是什么

      自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化。
      NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
      举个栗子,
      “话筒”表示为 [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 领域的各种主流任务。
      当然这种表示方法也存在一个重要的问题就是“词汇鸿沟”现象:任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,哪怕是话筒和麦克这样的同义词也不能幸免于难。

      Deep Learning 中一般用到的词向量并不是刚才提到的用 One-hot Representation 表示的那种很长很长的词向量,而是用 Distributed Representation(不知道这个应该怎么翻译,因为还存在一种叫“Distributional Representation”的表示方法,又是另一个不同的概念)表示的一种低维实数向量。这种向量一般长成这个样子:[0.792, −0.177, −0.107, 0.109, −0.542, ...]。维度以 50 维和 100 维比较常见。这种向量的表示不是唯一的,后文会提到目前计算出这种向量的主流方法。
      (个人认为)Distributed representation 最大的贡献就是让相关或者相似的词,在距离上更接近了。向量的距离可以用最传统的欧氏距离来衡量,也可以用 cos 夹角来衡量。用这种方式表示的向量,“麦克”和“话筒”的距离会远远小于“麦克”和“天气”。可能理想情况下“麦克”和“话筒”的表示应该是完全一样的,但是由于有些人会把英文名“迈克”也写成“麦克”,导致“麦克”一词带上了一些人名的语义,因此不会和“话筒”完全一致。

    1. 词向量的来历

      Distributed representation 最早是 Hinton 在 1986 年的论文《Learning distributed representations of concepts》中提出的。虽然这篇文章没有说要将词做 Distributed representation,(甚至我很无厘头地猜想那篇文章是为了给他刚提出的 BP 网络打广告,)但至少这种先进的思想在那个时候就在人们的心中埋下了火种,到 2000 年之后开始逐渐被人重视。
      Distributed representation 用来表示词,通常被称为“Word Representation”或“Word Embedding”,中文俗称“词向量”。真的只能叫“俗称”,算不上翻译。半年前我本想翻译的,但是硬是想不出 Embedding 应该怎么翻译的,后来就这么叫习惯了-_-||| 如果有好的翻译欢迎提出。Embedding 一词的意义可以参考维基百科的相应页面(链接)。后文提到的所有“词向量”都是指用 Distributed Representation 表示的词向量。

      如果用传统的稀疏表示法表示词,在解决某些任务的时候(比如构建语言模型)会造成维数灾难[Bengio 2003]。使用低维的词向量就没这样的问题。同时从实践上看,高维的特征如果要套用 Deep Learning,其复杂度几乎是难以接受的,因此低维的词向量在这里也饱受追捧。
      同时如上一节提到的,相似词的词向量距离相近,这就让基于词向量设计的一些模型自带平滑功能,让模型看起来非常的漂亮。

    2. 词向量的训练

      要介绍词向量是怎么训练得到的,就不得不提到语言模型。到目前为止我了解到的所有训练方法都是在训练语言模型的同时,顺便得到词向量的
      这也比较容易理解,要从一段无标注的自然文本中学习出一些东西,无非就是统计出词频、词的共现、词的搭配之类的信息。而要从自然文本中统计并建立一个语言模型,无疑是要求最为精确的一个任务(也不排除以后有人创造出更好更有用的方法)。既然构建语言模型这一任务要求这么高,其中必然也需要对语言进行更精细的统计和分析,同时也会需要更好的模型,更大的数据来支撑。目前最好的词向量都来自于此,也就不难理解了。
      这里介绍的工作均为从大量未标注的普通文本数据中无监督地学习出词向量(语言模型本来就是基于这个想法而来的),可以猜测,如果用上了有标注的语料,训练词向量的方法肯定会更多。不过视目前的语料规模,还是使用未标注语料的方法靠谱一些。
      词向量的训练最经典的有 3 个工作,C&W 2008、M&H 2008、Mikolov 2010。当然在说这些工作之前,不得不介绍一下这一系列中 Bengio 的经典之作。

    2.0 语言模型简介

      插段广告,简单介绍一下语言模型,知道的可以无视这节。
      语言模型其实就是看一句话是不是正常人说出来的。这玩意很有用,比如机器翻译、语音识别得到若干候选之后,可以利用语言模型挑一个尽量靠谱的结果。在 NLP 的其它任务里也都能用到。
      语言模型形式化的描述就是给定一个字符串,看它是自然语言的概率 P(w1,w2,,wt)w1到 wt 依次表示这句话中的各个词。有个很简单的推论是:
    P(w1,w2,,wt)=P(w1)×P(w2|w1)×P(w3|w1,w2)××P(wt|w1,w2,,wt1)
      常用的语言模型都是在近似地求 P(wt|w1,w2,,wt1)。比如 n-gram 模型就是用 P(wt|wtn+1,,wt1) 近似表示前者。
      顺便提一句,由于后面要介绍的每篇论文使用的符号差异太大,本博文里尝试统一使用 Bengio 2003 的符号系统(略做简化),以便在各方法之间做对比和分析。

    2.1 Bengio 的经典之作

      用神经网络训练语言模型的思想最早由百度 IDL 的徐伟于 2000 提出。(感谢 @余凯_西二旗民工 博士指出。)其论文《Can Artificial Neural Networks Learn Language Models?》提出一种用神经网络构建二元语言模型(即 P(wt|wt1))的方法。文中的基本思路与后续的语言模型的差别已经不大了。

      训练语言模型的最经典之作,要数 Bengio 等人在 2001 年发表在 NIPS 上的文章《A Neural Probabilistic Language Model》。当然现在看的话,肯定是要看他在 2003 年投到 JMLR 上的同名论文了。

      Bengio 用了一个三层的神经网络来构建语言模型,同样也是 n-gram 模型。如图1。

    Bengio 2003
    图1(点击查看大图)

     

      图中最下方的 wtn+1,,wt2,wt1 就是前 n1 个词。现在需要根据这已知的 n1 个词预测下一个词 wtC(w) 表示词 w 所对应的词向量,整个模型中使用的是一套唯一的词向量,存在矩阵 C(一个 |V|×m 的矩阵)中。其中 |V| 表示词表的大小(语料中的总词数),m 表示词向量的维度。w 到 C(w) 的转化就是从矩阵中取出一行。
      网络的第一层(输入层)是将 C(wtn+1),,C(wt2),C(wt1) 这 n1 个向量首尾相接拼起来,形成一个 (n1)m 维的向量,下面记为 x
      网络的第二层(隐藏层)就如同普通的神经网络,直接使用 d+Hx 计算得到。d 是一个偏置项。在此之后,使用 tanh 作为激活函数。
      网络的第三层(输出层)一共有 |V| 个节点,每个节点 yi 表示 下一个词为 i 的未归一化 log 概率。最后使用 softmax 激活函数将输出值 y 归一化成概率。最终,y 的计算公式为:

     

    y=b+Wx+Utanh(d+Hx)

     

      式子中的 U(一个 |V|×h 的矩阵)是隐藏层到输出层的参数,整个模型的多数计算集中在 U和隐藏层的矩阵乘法中。后文的提到的 3 个工作,都有对这一环节的简化,提升计算的速度。
      式子中还有一个矩阵 W|V|×(n1)m),这个矩阵包含了从输入层到输出层的直连边。直连边就是从输入层直接到输出层的一个线性变换,好像也是神经网络中的一种常用技巧(没有仔细考察过)。如果不需要直连边的话,将 W 置为 0 就可以了。在最后的实验中,Bengio 发现直连边虽然不能提升模型效果,但是可以少一半的迭代次数。同时他也猜想如果没有直连边,可能可以生成更好的词向量。

      现在万事俱备,用随机梯度下降法把这个模型优化出来就可以了。需要注意的是,一般神经网络的输入层只是一个输入值,而在这里,输入层 x 也是参数(存在 C 中),也是需要优化的。优化结束之后,词向量有了,语言模型也有了。
      这样得到的语言模型自带平滑,无需传统 n-gram 模型中那些复杂的平滑算法。Bengio 在 APNews 数据集上做的对比实验也表明他的模型效果比精心设计平滑算法的普通 n-gram 算法要好 10% 到 20%。

      在结束介绍 Bengio 大牛的经典作品之前再插一段八卦。在其 JMLR 论文中的未来工作一段,他提了一个能量函数,把输入向量和输出向量统一考虑,并以最小化能量函数为目标进行优化。后来 M&H 工作就是以此为基础展开的。
      他提到一词多义有待解决,9 年之后 Huang 提出了一种解决方案。他还在论文中随口(不是在 Future Work 中写的)提到:可以使用一些方法降低参数个数,比如用循环神经网络。后来 Mikolov 就顺着这个方向发表了一大堆论文,直到博士毕业。
      大牛就是大牛。

    2.2 C&W 的 SENNA

      Ronan Collobert 和 Jason Weston 在 2008 年的 ICML 上发表的《A Unified Architecture for Natural Language Processing: Deep Neural Networks with Multitask Learning》里面首次介绍了他们提出的词向量的计算方法。和上一篇牛文类似,如果现在要看的话,应该去看他们在 2011 年投到 JMLR 上的论文《Natural Language Processing (Almost) from Scratch》。文中总结了他们的多项工作,非常有系统性。这篇 JMLR 的论文题目也很霸气啊:从头开始搞 NLP。他们还把论文所写的系统开源了,叫做 SENNA(主页链接),3500 多行纯 C 代码也是写得非常清晰。我就是靠着这份代码才慢慢看懂这篇论文的。可惜的是,代码只有测试部分,没有训练部分。

      实际上 C&W 这篇论文主要目的并不是在于生成一份好的词向量,甚至不想训练语言模型,而是要用这份词向量去完成 NLP 里面的各种任务,比如词性标注、命名实体识别、短语识别、语义角色标注等等。
      由于目的的不同,C&W 的词向量训练方法在我看来也是最特别的。他们没有去近似地求 P(wt|w1,w2,,wt1),而是直接去尝试近似 P(w1,w2,,wt)。在实际操作中,他们并没有去求一个字符串的概率,而是求窗口连续 n 个词的打分 f(wtn+1,,wt1,wt)。打分 f 越高的说明这句话越是正常的话;打分低的说明这句话不是太合理;如果是随机把几个词堆积在一起,那肯定是负分(差评)。打分只有相对高低之分,并没有概率的特性。
      有了这个对 f 的假设,C&W 就直接使用 pair-wise 的方法训练词向量。具体的来说,就是最小化下面的目标函数。

    xXwDmax{0,1f(x)+f(x(w))}

     

      X 为训练集中的所有连续的 n 元短语,D 是整个字典。第一个求和枚举了训练语料中的所有的 n 元短语,作为正样本。第二个对字典的枚举是构建负样本。x(w) 是将短语 x 的最中间的那个词,替换成 w。在大多数情况下,在一个正常短语的基础上随便找个词替换掉中间的词,最后得到的短语肯定不是正确的短语,所以这样构造的负样本是非常可用的(多数情况下确实是负样本,极少数情况下把正常短语当作负样本也不影响大局)。同时,由于负样本仅仅是修改了正样本中的一个词,也不会让分类面距离负样本太远而影响分类效果。再回顾这个式子,x 是正样本,x(w) 是负样本,f(x)是对正样本的打分,f(x(w)) 是对负样本的打分。最后希望正样本的打分要比负样本的打分至少高 1 分。

      f 函数的结构和 Bengio 2003 中提到的网络结构基本一致。同样是把窗口中的 n 个词对应的词向量串成一个长的向量,同样是经过一层网络(乘一个矩阵)得到隐藏层。不同之处在于 C&W 的输出层只有一个节点,表示得分,而不像 Bengio 那样的有 |V| 个节点。这么做可以大大降低计算复杂度,当然有这种简化还是因为 C&W 并不想做一个真正的语言模型,只是借用语言模型的思想辅助他完成 NLP 的其它任务。(其实 C&W 的方法与 Bengio 的方法还有一个区别,他们为了程序的效率用 HardTanh 代替 tanh 激活函数。)

      他们在实验中取窗口大小 n=11,字典大小 |V|=130000,在维基百科英文语料和路透社语料中一共训练了 7 周,终于得到了这份伟大的词向量。
      如前面所说 C&W 训练词向量的动机与其他人不同,因此他公布的词向量与其它词向量相比主要有两个区别:
      1.他的词表中只有小写单词。也就是说他把大写开头的单词和小写单词当作同一个词处理。其它的词向量都是把他们当作不同的词处理的。
      2.他公布的词向量并不直接是上述公式的优化结果,而是在此基础上进一步跑了词性标注、命名实体识别等等一系列任务的 Multi-Task Learning 之后,二次优化得到的。也可以理解为是半监督学习得到的,而非其他方法中纯无监督学习得到的。

      不过好在 Turian 在 2010 年对 C&W 和 M&H 向量做对比时,重新训练了一份词向量放到了网上,那份就没上面的两个“问题”(确切的说应该是差别),也可以用的更放心。后面会详细介绍 Turian 的工作。

      关于这篇论文其实还是有些东西可以吐槽的,不过训练词向量这一块没有,是论文其他部分的。把吐槽机会留给下一篇博文了。

    2.3 M&H 的 HLBL

      Andriy Mnih 和 Geoffrey Hinton 在 2007 年和 2008 年各发表了一篇关于训练语言模型和词向量的文章。2007 年发表在 ICML 上的《Three new graphical models for statistical language modelling》表明了 Hinton 将 Deep Learning 战场扩展到 NLP 领域的决心。2008 年发表在 NIPS 上的《A scalable hierarchical distributed language model》则提出了一种层级的思想替换了 Bengio 2003 方法中最后隐藏层到输出层最花时间的矩阵乘法,在保证效果的基础上,同时也提升了速度。下面简单介绍一下这两篇文章。

      Hinton 在 2006 年提出 Deep Learning 的概念之后,很快就来 NLP 最基础的任务上试了一把。果然,有效。M&H 在 ICML 2007 上发表的这篇文章提出了“Log-Bilinear”语言模型。文章标题中可以看出他们其实一共提了 3 个模型。从最基本的 RBM 出发,一点点修改能量函数,最后得到了“Log-Bilinear”模型。
      模型如果用神经网络的形式写出来,是这个样子:

     

    h=i=1t1HiC(wi)

    yj=C(wj)Th

     

      这里的两个式子可以合写成一个 yj=i=1n1C(wj)THiC(wi)C(w) 是词 w 对应的词向量,形如 xTMy 的模型叫做 Bilinear 模型,也就是 M&H 方法名字的来历了。

      为了更好地理解模型的含义,还是来看这两个拆解的式子。h 在这里表示隐藏层,这里的隐藏层比前面的所有模型都更厉害,直接有语义信息。首先从第二个式子中隐藏层能和词向量直接做内积可以看出,隐藏层的维度和词向量的维度是一致的(都是 m 维)。Hi 就是一个 m×m 的矩阵,该矩阵可以理解为第 i 个词经过 Hi 这种变换之后,对第 t 个词产生的贡献。因此这里的隐藏层是对前 t1 个词的总结,也就是说隐藏层 h 是对下一个词的一种预测。
      再看看第二个式子,预测下一个词为 wj 的 log 概率是 yj,它直接就是 C(wj) 和 h 的内积。内积基本上就可以反应相似度,如果各词向量的模基本一致的话,内积的大小能直接反应两个向量的 cos 夹角的大小。这里使用预测词向量 h 和各个已知词的词向量的相似度作为 log 概率,将词向量的作用发挥到了极致。这也是我觉得这次介绍的模型中最漂亮的一个。

      这种“Log-Bilinear”模型看起来每个词需要使用上文所有的词作为输入,于是语料中最长的句子有多长,就会有多少个 H 矩阵。这显然是过于理想化了。最后在实现模型时,还是迫于现实的压力,用了类似 n-gram 的近似,只考虑了上文的 3 到 5 个词作为输入来预测下一个词。

      M&H 的思路如前面提到,是 Bengio 2003 提出的。经过大牛的实现,效果确实不错。虽然复杂度没有数量级上的降低,但是由于是纯线性模型,没有激活函数(当然在做语言模型的时候,最后还是对 yj 跑了一个 softmax),因此实际的训练和预测速度都会有很大的提升。同时隐藏层到输出层的变量直接用了词向量,这也就几乎少了一半的变量,使得模型更为简洁。最后论文中 M&H 用了和 Bengio 2003 完全一样的数据集做实验,效果有了一定的提升。

     

    ——————–两篇文章中间是不是应该有个分割线?——————–

     

      2008 年 NIPS 的这篇论文,介绍的是“hierarchical log-bilinear”模型,很多论文中都把它称作简称“HLBL”。和前作相比,该方法使用了一个层级的结构做最后的预测。可以简单地设想一下把网络的最后一层变成一颗平衡二叉树,二叉树的每个非叶节点用于给预测向量分类,最后到叶节点就可以确定下一个词是哪个了。这在复杂度上有显著的提升,以前是对 |V| 个词一一做比较,最后找出最相似的,现在只需要做 log2(|V|) 次判断即可。

      这种层级的思想最初可见于 Frederic Morin 和 Yoshua Bengio 于 2005 年发表的论文《Hierarchical probabilistic neural network language model》中。但是这篇论文使用 WordNet 中的 IS-A 关系,转化为二叉树用于分类预测。实验结果发现速度提升了,效果变差了。
      有了前车之鉴,M&H 就希望能从语料中自动学习出一棵树,并能达到比人工构建更好的效果。M&H 使用一种 bootstrapping 的方法来构建这棵树。从随机的树开始,根据分类结果不断调整和迭代。最后得到的是一棵平衡二叉树,并且同一个词的预测可能处于多个不同的叶节点。这种用多个叶节点表示一个词的方法,可以提升下一个词是多义词时候的效果。M&H 做的还不够彻底,后面 Huang 的工作直接对每个词学习出多个词向量,能更好地处理多义词。

    2.4 Mikolov 的 RNNLM

      前文说到,Bengio 2003 论文里提了一句,可以使用一些方法降低参数个数,比如用循环神经网络。Mikolov 就抓住了这个坑,从此与循环神经网络结下了不解之缘。他最早用循环神经网络做语言模型是在 INTERSPEECH 2010 上发表的《Recurrent neural network based language model》里。Recurrent neural network 是循环神经网络,简称 RNN,还有个 Recursive neural networks 是递归神经网络(Richard Socher 借此发了一大堆论文),也简称 RNN。看到的时候需要注意区分一下。不过到目前为止,RNNLM 只表示循环神经网络做的语言模型,还没有歧义。
      在之后的几年中,Mikolov 在一直在RNNLM 上做各种改进,有速度上的,也有准确率上的。现在想了解 RNNLM,看他的博士论文《Statistical Language Models based on Neural Networks》肯定是最好的选择。

      循环神经网络与前面各方法中用到的前馈网络在结构上有比较大的差别,但是原理还是一样的。网络结构大致如图2。

    RNNLM
    图2(点击查看大图)

     

      左边是网络的抽象结构,由于循环神经网络多用在时序序列上,因此里面的输入层、隐藏层和输出层都带上了“(t)”。w(t) 是句子中第 t 个词的 One-hot representation 的向量,也就是说 w 是一个非常长的向量,里面只有一个元素是 1。而下面的 s(t1) 向量就是上一个隐藏层。最后隐藏层计算公式为:

    s(t)=sigmoid(Uw(t)+Ws(t1))

      从右图可以看出循环神经网络是如何展开的。每来一个新词,就和上一个隐藏层联合计算出下一个隐藏层,隐藏层反复利用,一直保留着最新的状态。各隐藏层通过一层传统的前馈网络得到输出值。

     

      w(t) 是一个词的 One-hot representation,那么 Uw(t) 也就相当于从矩阵 U 中选出了一列,这一列就是该词对应的词向量。

      循环神经网络的最大优势在于,可以真正充分地利用所有上文信息来预测下一个词,而不像前面的其它工作那样,只能开一个 n 个词的窗口,只用前 n 个词来预测下一个词。从形式上看,这是一个非常“终极”的模型,毕竟语言模型里能用到的信息,他全用上了。可惜的是,循环神经网络形式上非常好看,使用起来却非常难优化,如果优化的不好,长距离的信息就会丢失,甚至还无法达到开窗口看前若干个词的效果。Mikolov 在 RNNLM 里面只使用了最朴素的 BPTT 优化算法,就已经比 n-gram 中的 state of the art 方法有更好的效果,这非常令人欣慰。如果用上了更强的优化算法,最后效果肯定还能提升很多。

      对于最后隐藏层到输出层的巨大计算量,Mikolov 使用了一种分组的方法:根据词频将 |V| 个词分成 |V| 组,先通过 |V| 次判断,看下一个词属于哪个组,再通过若干次判断,找出其属于组内的哪个元素。最后均摊复杂度约为 o(|V|),略差于 M&H 的 o(log(|V|)),但是其浅层结构某种程度上可以减少误差传递,也不失为一种良策。

      Mikolov 的 RNNLM 也是开源的(网址)。非常算法风格的代码,几乎所有功能都在一个文件里,工程也很好编译。比较好的是,RNNLM 可以完美支持中文,如果语料存成 UTF-8 格式,就可以直接用了。

      最后吐槽一句,我觉得他在隐藏层用 sigmoid 作为激活函数不够漂亮。因为隐藏层要和输入词联合计算得到下一个隐藏层,如果当前隐藏层的值全是正的,那么输入词对应的参数就会略微偏负,也就是说最后得到的词向量的均值不在 0 附近。总感觉不好看。当然,从实验效果看,是我太强迫症了。

    2.5 Huang 的语义强化

      与前几位大牛的工作不同,Eric H. Huang 的工作是在 C&W 的基础上改进而成的,并非自成一派从头做起。他这篇发表在 ACL 2012 上的《Improving Word Representations via Global Context and Multiple Word Prototypes》试图通过对模型的改进,使得词向量富含更丰富的语义信息。他在文中提出了两个主要创新来完成这一目标:(其实从论文标题就能看出来)第一个创新是使用全文信息辅助已有的局部信息,第二个创新是使用多个词向量来表示多义词。下面逐一介绍。

      Huang 认为 C&W 的工作只利用了“局部上下文(Local Context)”。C&W 在训练词向量的时候,只使用了上下文各 5 个词,算上自己总共有 11 个词的信息,这些局部的信息还不能充分挖掘出中间词的语义信息。Huang 直接使用 C&W 的网络结构计算出一个得分,作为“局部得分”。
      然后 Huang 提出了一个“全局信息”,这有点类似传统的词袋子模型。词袋子模型是把文章中所有词的 One-hot Representation 加起来,形成一个向量(就像把词全都扔进一个袋子里),用来表示文章。Huang 的全局模型是将文章中所有词的词向量求个加权平均(权重是词的 idf),作为文章的语义。他把文章的语义向量和当前词的词向量拼接起来,形成一个两倍长度的向量作为输入,之后还是用 C&W 的网络结构算出一个打分。
      有了 C&W 方法的得到的“局部得分”,再加上在 C&W 方法基础上改造得到的“全局得分”,Huang 直接把两个得分相加,作为最终得分。最终得分使用 C&W 提出的 pair-wise 目标函数来优化。
      加了这个全局信息有什么用处呢?Huang 在实验中发现,他的模型能更好地捕捉词的语义信息。比如 C&W 的模型中,与 markets 最相近的词为 firms、industries;而 Huang 的模型得到的结果是 market、firms。很明显,C&W 的方法由于只考虑了临近词的信息,最后的结果是词法特征最相近的词排在了前面(都是复数形式)。不过我觉得这个可能是英语才有的现象,中文没有词形变化,如果在中文中做同样的实验还不知道会有什么效果。

      Huang 论文的第二个贡献是将多义词用多个词向量来表示。Bengio 2003 在最后提过这是一个重要的问题,不过当时他还在想办法解决,现在 Huang 给出了一种思路。
      将每个词的上下文各 5 个词拿出来,对这 10 个词的词向量做加权平均(同样使用 idf 作为权重)。对所有得到的上下文向量做 k-means 聚类,根据聚类结果给每个词打上标签(不同类中的同一个词,当作不同的词处理),最后重新训练词向量。
      当然这个实验的效果也是很不错的,最后 star 的某一个表示最接近的词是 movie、film;另一个表示最接近的词是 galaxy、planet。
      
      这篇文章还做了一些对比实验,在下一章评价里细讲。

    2.999 总结

      //博主道:本节承上启下,不知道应该放在第 2 章还是第 3 章,便将小节号写为 2.999。

      讲完了大牛们的各种方法,自己也忍不住来总结一把。当然,为了方便对比,我先列举一下上面提到的各个系统的现有资源,见下表。对应的论文不在表中列出,可参见最后的参考文献。

    名称
    训练语料及规模
    词向量
    特点
    资源
    C&W English Wikipedia 
    + Reuters RCV1
    共 631M + 221M 词
    130000 词
    50 维
    不区分大小写;
    经过有监督修正;
    训练了 7 周
    测试代码、
    词向量
    [链接]
    C&W - Turian Reuters RCV1
    63M 词
    268810 词
    25、50、
    100、200 维
    区分大小写;
    训练了若干周
    训练代码、
    词向量
    [链接]
    M&H - Turian Reuters RCV1 246122 词
    50、100 维
    区分大小写;
    用GPU训练了7天
    词向量
    [链接]
    Mikolov Broadcast news 82390 词
    80、640、
    1600 维
    不区分大小写;
    训练了若干天
    训练、测试代码、
    词向量
    [链接]
    Huang 2012 English Wikipedia 100232 词
    50 维
    不区分大小写;
    最高频的6000词,
    每词有10种表示
    训练、测试代码、
    语料及词向量
    [链接]
    显示第 1 至 5 项结果,共 5 项

      Turian 的工作前面只是提了一下,他在做 C&W 向量与 H&M 向量的对比实验时,自己按照论文重新实现了一遍他们的方法,并公布了词向量。后来 C&W 在主页上强调了一下:尽管很多论文把 Turian 实现的结果叫做 C&W 向量,但是与我发布的词向量是不同的,我这个在更大的语料上训练,还花了两个月时间呢!
      Turian 公布的 H&M 向量是直接请 Andriy Mnih 在 Turian 做好的语料上运行了一下 HLBL,所以没有代码公布。同时 Turian 自己实现了一份 LBL模型,但是没有公布训练出来的词向量。(这是根据他主页上描述推测的结果,从 Turian 的论文中看,他应该是实现了 HLBL 算法并且算出词向量的。)
      RCV1 的词数两篇文章中所写的数据差距较大,还不知道是什么原因。

      Holger Schwenk 在词向量和语言模型方面也做了一些工作,看起来大体相似,也没仔细读过他的论文。有兴趣的读作可以直接搜他的论文。

      事实上,除了 RNNLM 以外,上面其它所有模型在第一层(输入层到隐藏层)都是等价的,都可以看成一个单层网络。可能形式最为特别的是 M&H 的模型,对前面的每个词单独乘以矩阵 Hi,而不是像其它方法那样把词向量串接起来乘以矩阵 H。但如果把 H 看成 Hi 的拼接: [H1H2...Ht],则会有以下等式:

    [H1H2...Ht]C(w1)C(w2)...C(wt)=H1C(w1)+H2C(w2)++HtC(wt)

      这么看来还是等价的。

     

      所以前面的这么多模型,本质是非常相似的。都是从前若干个词的词向量通过线性变换抽象出一个新的语义(隐藏层),再通过不同的方法来解析这个隐藏层。模型的差别主要就在隐藏层到输出层的语义。Bengio 2003 使用了最朴素的线性变换,直接从隐藏层映射到每个词;C&W 简化了模型(不求语言模型),通过线性变换将隐藏层转换成一个打分;M&H 复用了词向量,进一步强化了语义,并用层级结构加速;Mikolov 则用了分组来加速。

      每种方法真正的差别看起来并不大,当然里面的这些创新,也都是有据可循的。下一章就直接来看看不同模型的效果如何。

    3. 词向量的评价

      词向量的评价大体上可以分成两种方式,第一种是把词向量融入现有系统中,看对系统性能的提升;第二种是直接从语言学的角度对词向量进行分析,如相似度、语义偏移等。

    3.1 提升现有系统

      词向量的用法最常见的有两种:
      1. 直接用于神经网络模型的输入层。如 C&W 的 SENNA 系统中,将训练好的词向量作为输入,用前馈网络和卷积网络完成了词性标注、语义角色标注等一系列任务。再如 Socher 将词向量作为输入,用递归神经网络完成了句法分析、情感分析等多项任务。
      2. 作为辅助特征扩充现有模型。如 Turian 将词向量作为额外的特征加入到接近 state of the art 的方法中,进一步提高了命名实体识别和短语识别的效果。
      具体的用法理论上会在下一篇博文中细讲。
      
      C&W 的论文中有一些对比实验。实验的结果表明,使用词向量作为初始值替代随机初始值,其效果会有非常显著的提升(如:词性标注准确率从 96.37% 提升到 97.20%;命名实体识别 F 值从 81.47% 提升到 88.67%)。同时使用更大的语料来训练,效果也会有一些提升。

      Turian 发表在 ACL 2010 上的实验对比了 C&W 向量与 M&H 向量用作辅助特征时的效果。在短语识别和命名实体识别两个任务中,C&W 向量的效果都有略微的优势。同时他也发现,如果将这两种向量融合起来,会有更好的效果。除了这两种词向量,Turian 还使用 Brown Cluster 作为辅助特征做了对比,效果最好的其实是 Brown Cluster,不过这个已经超出本文的范围了。

    3.2 语言学评价

      Huang 2012 的论文提出了一些创新,能提升词向量中的语义成分。他也做了一些实验对比了各种词向量的语义特性。实验方法大致就是将词向量的相似度与人工标注的相似度做比较。最后 Huang 的方法语义相似度最好,其次是 C&W 向量,再然后是 Turian 训练的 HLBL 向量与 C&W 向量。这里因为 Turian 训练词向量时使用的数据集(RCV1)与其他的对比实验(Wiki)并不相同,因此并不是非常有可比性。但从这里可以推测一下,可能更大更丰富的语料对于语义的挖掘是有帮助的。

      还有一个有意思的分析是 Mikolov 在 2013 年刚刚发表的一项发现。他发现两个词向量之间的关系,可以直接从这两个向量的差里体现出来。向量的差就是数学上的定义,直接逐位相减。比如 C(king)C(queen)C(man)C(woman)。更强大的是,与 C(king)C(man)+C(woman) 最接近的向量就是 C(queen)
      为了分析词向量的这个特点, Mikolov 使用类比(analogy)的方式来评测。如已知 a 之于 b 犹如 c 之于 d。现在给出 a、b、c,看 C(a)C(b)+C(c) 最接近的词是否是 d。
      在文章 Mikolov 对比了词法关系(名词单复数 good-better:rough-rougher、动词第三人称单数、形容词比较级最高级等)和语义关系(clothing-shirt:dish-bowl)。
      在词法关系上,RNN 的效果最好,然后是 Turian 实现的 HLBL,最后是 Turian 的 C&W。(RNN-80:19%;RNN-1600:39.6%;HLBL-100:18.7%;C&W-100:5%;-100表示词向量为100维)
      在语义关系上,表现最好的还是 RNN,然后是 Turian 的两个向量,差距没刚才的大。(RNN-80:0.211;C&W-100:0.154;HLBL-100:0.146)
      但是这个对比实验用的训练语料是不同的,也不能特别说明优劣。

      这些实验结果中最容易理解的是:语料越大,词向量就越好。其它的实验由于缺乏严格控制条件进行对比,谈不上哪个更好哪个更差。不过这里的两个语言学分析都非常有意思,尤其是向量之间存在这种线性平移的关系,可能会是词向量发展的一个突破口。

    参考文献

    Yoshua Bengio, Rejean Ducharme, Pascal Vincent, and Christian Jauvin. A neural probabilistic language model. Journal of Machine Learning Research (JMLR), 3:1137–1155, 2003. [PDF]

    Ronan Collobert, Jason Weston, Léon Bottou, Michael Karlen, Koray Kavukcuoglu and Pavel Kuksa.Natural Language Processing (Almost) from Scratch. Journal of Machine Learning Research (JMLR), 12:2493-2537, 2011. [PDF]

    Andriy Mnih & Geoffrey Hinton. Three new graphical models for statistical language modelling. International Conference on Machine Learning (ICML). 2007. [PDF]
    Andriy Mnih & Geoffrey Hinton. A scalable hierarchical distributed language model. The Conference on Neural Information Processing Systems (NIPS) (pp. 1081–1088). 2008. [PDF]

    Mikolov Tomáš. Statistical Language Models based on Neural Networks. PhD thesis, Brno University of Technology. 2012. [PDF]

    Turian Joseph, Lev Ratinov, and Yoshua Bengio. Word representations: a simple and general method for semi-supervised learning. Proceedings of the 48th Annual Meeting of the Association for Computational Linguistics (ACL). 2010. [PDF]

    Eric Huang, Richard Socher, Christopher Manning and Andrew Ng. Improving word representations via global context and multiple word prototypes. Proceedings of the 50th Annual Meeting of the Association for Computational Linguistics: Long Papers-Volume 1. 2012. [PDF]

    Mikolov, Tomas, Wen-tau Yih, and Geoffrey Zweig. Linguistic regularities in continuous space word representations. Proceedings of NAACL-HLT. 2013. [PDF]


      断断续续写了这么多,如果有人看加上自己有时间的话,还会有续集《Deep Learning in NLP (二)模型及用法》,也是介绍几篇文章,从模型的层次做一些粗浅的分析。
    展开全文
  • DeepNLP的表示学习·嵌入来龙去脉·深度学习(Deep Learning)·自然语言处理(NLP)·表示(Representation) 向量、word embedding、分布式表示、word2vec、glove 术语解释! 自然语言处理表示学习 向量、...

    DeepNLP的表示学习·

    词嵌入来龙去脉·

    深度学习(Deep Learning)·自然语言处理(NLP)·表示(Representation)


    原创作品, 转载请注明出处:[ Mr.Scofield  http://blog.csdn.net/scotfield_msn/article/details/69075227  ]

    From RxNLP.


    Indexing:

    〇、序
    一、DeepNLP的核心关键:语言表示(Representation)
    二、NLP词的表示方法类型

            1、词的独热表示one-hot representation
            2、词的分布式表示distributed representation
    三、NLP语言模型
    四、词的分布式表示

            1. 基于矩阵的分布表示
            2. 基于聚类的分布表示
            3. 基于神经网络的分布表示,词嵌入( word embedding)
    五、词嵌入( word embedding)
            1、概念
            2、理解
    六、神经网络语言模型与word2vec
            1、神经网络语言模型
            2.word2vec与CBOW、Skip-gram
            3.个人对word embedding的理解
    七、后言
    References



    〇、序
            之前一段时间,在结合深度学习做NLP的时候一直有思考一些问题,其中有一个问题算是最核心一个:究竟深度网络是怎么做到让各种NLP任务解决地如何完美呢?到底我的数据在NN中发什么了什么呢?


            并且,不少的terms like: 词向量、word embedding、分布式表示、word2vec、glove等等,这一锅粥的名词术语分别代表什么,他们具体的关系是什么,他们是否处于平级关系?


            出于对知识结构追求完整梳理的强迫症的老毛病,于是不停地查资料、思考、keep revolving……


            然后就感觉有一点小进展了。想到,不如将个人对其的理解,无论对错,先拿出来跟peer分享下,或许能交换出更有意义的东西呢?


            整篇文章的构架是按照属于概念在逻辑上的先后大小顺序,一层一层一级一级地往下剖析、比较、说明。

            
            另外说明下,here整篇文字内容相对是比较入门,甚至有的点可能描述的不太客观正确,限于当前的认知水平……还请您海涵,希望您在评论中指正!




    一、DeepNLP的核心关键:语言表示(Representation)
            最近有一个新名词:Deep Learning + NLP =  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能够处理的数据类型。


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

     
            在语音中,用音频频谱序列向量所构成的matrix作为前端输入喂给NN进行处理,good;在图像中,用图片的像素构成的matrix展平成vector后组成的vector序列喂给NN进行处理,good;那在自然语言处理中呢?噢你可能知道或者不知道,将每一个词用一个向量表示出来!想法是挺简单的,对,事实上就是这么简单,然而真有这么简单吗?可能没这么简单。


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


            那么据上是不是可以自信地下一个结论呢:如何有效地表示出语言句子是决定NN能发挥出强大拟合计算能力的关键前提!




    二、NLP词的表示方法类型
            接下来将按照上面的思路,引出各种词的表示方法。按照现今目前的发展,词的表示分为独热表示one-hot、分布式表示distributed。


    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 领域的各种主流任务。


            现在我们分析他的不当处。1、向量的维度会随着句子的词的数量类型增大而增大;2、任意两个词之间都是孤立的,根本无法表示出在语义层面上词语词之间的相关信息,而这一点是致命的。


    2、词的分布式表示distributed representation

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


            到目前为止,基于分布假说的词表示方法,根据建模的不同,主要可以分为三类:基于矩阵的分布表示、基于聚类的分布表示和基于神经网络的分布表示。尽管这些不同的分布表示方法使用了不同的技术手段获取词表示,但由于这些方法均基于分布假说,它们的核心思想也都由两部分组成:一、选择一种方式描述上下文;二、选择一种模型刻画某个词(下文称“目标词”)与其上下文之间的关系。





    三、NLP语言模型
            在详细介绍词的分布式表示之前,需要将NLP中的一个关键概念描述清楚:语言模型。语言模型包括文法语言模型和统计语言模型。一般我们指的是统计语言模型。之所以要将语言模型摆在词表示方法之前,是因为后面的表示方法马上要用到这一概念。


            统计语言模型: 统计语言模型把语言(词的序列)看作一个随机事件,并赋予相应的概率来描述其属于某种语言集合的可能性。给定一个词汇集合 V,对于一个由 V 中的词构成的序列S = ⟨w1, · · · , wT ⟩ ∈ Vn,统计语言模型赋予这个序列一个概率P(S),来衡量S 符合自然语言的语法和语义规则的置信度。


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


            就是这么简单。常见的统计语言模型有N元文法模型(N-gram Model),最常见的是unigram model、bigram model、trigram model等等。形式化讲,统计语言模型的作用是为一个长度为 m 的字符串确定一个概率分布 P(w1; w2; :::; wm),表示其存在的可能性,其中 w1 到 wm 依次表示这段文本中的各个词。一般在实际求解过程中,通常采用下式计算其概率值:

     
            同时通过这些方法均也可以保留住一定的词序信息,这样就能把一个词的上下文信息capture住。


            具体的语言模型详情属于街货,详细请自行搜索。





    四、词的分布式表示
    1. 基于矩阵的分布表示
            基于矩阵的分布表示通常又称为分布语义模型,在这种表示下,矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。由于分布假说认为上下文相似的词,其语义也相似,因此在这种表示下,两个词的语义相似度可以直接转化为两个向量的空间距离。


            常见到的Global Vector 模型( GloVe模型)是一种对“词-词”矩阵进行分解从而得到词表示的方法,属于基于矩阵的分布表示。


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


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


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





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


            前面提到过,为了选择一种模型刻画某个词(下文称“目标词”)与其上下文之间的关系,我们需要在词向量中capture到一个词的上下文信息。同时,上面我们恰巧提到了统计语言模型正好具有捕捉上下文信息的能力。那么构建上下文与目标词之间的关系,最自然的一种思路就是使用语言模型。从历史上看,早期的词向量只是神经网络语言模型的副产品。


            2001年, Bengio 等人正式提出神经网络语言模型( Neural Network Language Model ,NNLM),该模型在学习语言模型的同时,也得到了词向量。所以请注意一点:词向量可以认为是神经网络训练语言模型的副产品


    2、理解
            前面提过,one-hot表示法具有维度过大的缺点,那么现在将vector做一些改进:1、将vector每一个元素由整形改为浮点型,变为整个实数范围的表示;2、将原来稀疏的巨大维度压缩嵌入到一个更小维度的空间。如图示:

     
            这也是词向量又名词嵌入的缘由了。





    六、神经网络语言模型与word2vec
            好了,到目前为止我们已经对的分布式表示以及词嵌入的概念的层级关系有了个理性的认识了,那这跟word2vec有什么联系?


    1、神经网络语言模型
            上面说,通过神经网络训练语言模型可以得到词向量,那么,究竟有哪些类型的神经网络语言模型呢?个人所知,大致有这么些个:


    a) Neural Network Language Model ,NNLM
    b) Log-Bilinear Language Model, LBL
    c) Recurrent Neural Network based Language Model,RNNLM
    d) Collobert 和 Weston 在2008 年提出的 C&W 模型
    e) Mikolov 等人提出了 CBOW( Continuous Bagof-Words)和 Skip-gram 模型


            到这,估计有人看到了两个熟悉的term:CBOW、skip-gram,有看过word2vec的同学应该对此有所了解。我们继续。


    2.word2vec与CBOW、Skip-gram

            现在我们正式引出最火热的另一个term:word2vec。


            上面提到的5个神经网络语言模型,只是个在逻辑概念上的东西,那么具体我们得通过设计将其实现出来,而实现CBOW( Continuous Bagof-Words)和 Skip-gram 语言模型的工具正是well-known word2vec!另外,C&W 模型的实现工具是SENNA。


            所以说,分布式词向量并不是word2vec的作者发明的,他只是提出了一种更快更好的方式来训练语言模型罢了。分别是:连续词袋模型Continous Bag of Words Model(CBOW)和Skip-Gram Model,这两种都是可以训练出词向量的方法,再具体代码操作中可以只选择其一,不过据论文说CBOW要更快一些。


            顺便说说这两个语言模型。统计语言模型statistical language model就是给你几个词,在这几个词出现的前提下来计算某个词出现的(事后)概率。CBOW也是统计语言模型的一种,顾名思义就是根据某个词前面的C个词或者前后C个连续的词,来计算某个词出现的概率。Skip-Gram Model相反,是根据某个词,然后分别计算它前后出现某几个词的各个概率。


            以“我爱北京天安门”这句话为例。假设我们现在关注的词是“爱”,C=2时它的上下文分别是“我”,“北京天安门”。CBOW模型就是把“我” “北京天安门” 的one hot表示方式作为输入,也就是C个1xV的向量,分别跟同一个VxN的大小的系数矩阵W1相乘得到C个1xN的隐藏层hidden layer,然后C个取平均所以只算一个隐藏层。这个过程也被称为线性激活函数(这也算激活函数?分明就是没有激活函数了)。然后再跟另一个NxV大小的系数矩阵W2相乘得到1xV的输出层,这个输出层每个元素代表的就是词库里每个词的事后概率。输出层需要跟ground truth也就是“爱”的one hot形式做比较计算loss。这里需要注意的就是V通常是一个很大的数比如几百万,计算起来相当费时间,除了“爱”那个位置的元素肯定要算在loss里面,word2vec就用基于huffman编码的Hierarchical softmax筛选掉了一部分不可能的词,然后又用nagetive samping再去掉了一些负样本的词所以时间复杂度就从O(V)变成了O(logV)。Skip gram训练过程类似,只不过输入输出刚好相反。


            补充下,Word embedding的训练方法大致可以分为两类:一类是无监督或弱监督的预训练;一类是端对端(end to end)的有监督训练。无监督或弱监督的预训练以word2vec和auto-encoder为代表。这一类模型的特点是,不需要大量的人工标记样本就可以得到质量还不错的embedding向量。不过因为缺少了任务导向,可能和我们要解决的问题还有一定的距离。因此,我们往往会在得到预训练的embedding向量后,用少量人工标注的样本去fine-tune整个模型。


            相比之下,端对端的有监督模型在最近几年里越来越受到人们的关注。与无监督模型相比,端对端的模型在结构上往往更加复杂。同时,也因为有着明确的任务导向,端对端模型学习到的embedding向量也往往更加准确。例如,通过一个embedding层和若干个卷积层连接而成的深度神经网络以实现对句子的情感分类,可以学习到语义更丰富的词向量表达。


    3.个人对word embedding的理解
            现在,词向量既能够降低维度,又能够capture到当前词在本句子中上下文的信息(表现为前后距离关系),那么我们对其用来表示语言句子词语作为NN的输入是非常自信与满意的。


            另外一点很实用的建议,在你做某一项具体的NLP任务时如你要用到词向量,那么我建议你:要么1、选择使用别人训练好的词向量,注意,得使用相同语料内容领域的词向量;要么2、自己训练自己的词向量。我建议是前者,因为……坑太多了。





    七、后言
            说到这里,其实我并没有想继续说下去的打算了,即并没有打算将word2vec的数学原理、详解啥的统统来一顿讲了,因为我发现网上关于讲解word2vec的文章实在是太多了,多到几乎所有的文章都是一样的。所以我也没有必要再copy一份过来咯。


            所以,要详细了解word2vec、cbow、skip-gram细节的请您仔细搜索。我相信,在了解了这一系列的前提上下文知识的背景下,你再去读word2vec相关的细节文章时,一定不会感到有多吃力。


            另外这也反映出来了一个更大的问题,即网络文章缺少critical思维的原创性。


            网上随便一搜“word2vec”、“词向量”,然后一大堆的关于word2vec、cbow、skip-gram数学公式的讲解,并且还都是千篇一律的东西……但最让人无法理解的是,基本上没有人去详细地提一提这些东西他的出现他的存在的上下文、他的发展的过程、他在整个相关技术框架的所处位置等等。这让我很郁闷……


            其实顺便分享下,在我个人的方法论思维中,一个带有完整上下文以及结构构建良好的知识框架,在某种程度上,比一些细枝末节的详细知识点来的重要的多了!因为,一旦构建了一个完备的知识结构框架,那么剩下你要做的是将一些零零碎碎的细节进行填补而已;而反过来却根本不行,知识堆砌只会让你思维混乱,走不了多远。


            所以here我也呼吁各位blogger,大家能充分发挥自己的能动性,主动去创造一些没有的东西,分享一些独有的思维见解,也算是对中国网络blog以及CS事业的推动贡献啊!I mean,即便是copy别人的原来的东西,也最好是咀嚼咀嚼,消化后加上自己的东西再share啊!








    References:
    《How to Generate a Good Word Embedding?》,Siwei Lai, Kang Liu, Liheng Xu, Jun Zhao
    《基于神经网络的词和文档语义向量表示方法研究》,来斯惟
    《面向自然语言处理的分布式表示学习》,邱锡鹏
    《Deep Learning 实战之 word2vec》

    http://www.cnblogs.com/iloveai/p/word2vec.html
    http://www.hankcs.com/nlp/word2vec.html
    http://licstar.net/archives/328
    https://zhuanlan.zhihu.com/p/22477976
    http://blog.csdn.net/itplus/article/details/37969519
    http://www.tuicool.com/articles/fmuyamf
    http://licstar.net/archives/620#comment-1542
    http://blog.csdn.net/ycheng_sjtu/article/details/48520293









    展开全文
  • 转自:[Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec向量模型 阅读目录 1. 向量 2.Distributed representation向量表示 3.向量模型 4.word2vec算法思想 5.doc2vec算法...
  • 知识表示

    千次阅读 2018-07-05 11:58:47
    http://pelhans.com/2018/03/16/xiaoxiangkg-note2/本讲首先对早期的知识...知识表示历史知识的概念早期的知识表示方法一阶谓词逻辑产生式系统框架表示法语义网络基于语义网的知识表示框架RDF简介RDF概念RDF和RDFSO...
  • 摘要 最近引入的连续Skip-gram...通过对频繁进行重复采样我们可以极大地提升学习速度,学习到更有规律的单词表示。我们还描述了一种分层softmax的简单代替方案称作负抽样。  单词表示的内在局限是它们对单词顺序
  • 第一个,我室友,上课以外的时间都是看漫画,看小说,画画,睡觉,吃零食。但是成绩就是好,她化学进了学校的竞赛培训班,数学也好,但是平时完全没有死命学的迹象。 第二个,另一个寝室的,我们是寄宿学校要求...
  • 但是它的优点也非常明显,在文本分类任务中,fastText(浅层网络)往往能取得和深度网络相媲美的精度,却在训练时间上比深度网络快许多数量级。在标准的多核CPU上, 能够训练10亿级别语料库的向量在10分钟之内,...
  • 向量2.Distributed representation向量表示3.向量模型4.word2vec算法思想5.doc2vec算法思想6.参考内容 深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展。深度学习...
  • 《文本嵌入式表示方法实战》系列文章是基于2017年我于研一下半学期做的两场长时间的组会汇报ppt上形成的文章(学习和实验长达3个月,因为当时主要以上课为主,实验都是课余时间做的。。),由于当时我正处于入门阶段...
  • 一个良好的表示是内容充分高效表达的基础,作为沟通计算机与现实世界的桥梁,计算机行业人员每时每刻都在研究事物的表示。比如:编程语言,早期的机器语言和现在的高级程序语言可以看作是指令的两种不同表示方式,从...
  • 网络表示学习简单总结(一)

    千次阅读 2019-03-06 17:39:50
    1. 网络表示学习的定义 简单来说,网络表示学习就是通过相关算法将网络中的节点用一个低维稠密的向量空间表示(其中向量空间的维度远远小于节点的总个数),并且能够保持原有网络的相关结构和特征,然后再输入到...
  • 系统学习NLP(十二)--文本表示综述

    千次阅读 2019-03-10 11:23:02
    词表示 关于文本表示,研究者从不同的角度出发,提出大量的文本表示模型。本文重点梳理现有模型,大致分为三类,即基于向量空间模型、基于主题模型和基于神经网络的方法。 基于向量空间模型的...
  • NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了...
  • 知识表示方法
  • 文本表示简介

    千次阅读 2018-10-08 22:42:50
    文本分类是自然语言处理中研究最为广泛的任务之一,通过构建模型实现对文本内容进行自动分类,有多应用场景,比如新闻文章主题分类,产品评论情感分类,检索中用户查询的意图分类等等。文本分类的大致流程:文本...
  • 知识图谱入门 (二) 知识表示与知识建模

    万次阅读 多人点赞 2018-04-20 16:04:59
    欢迎大家关注我的博客 http://pelhans.com/ ,所有文章都会第一时间发布在那里哦~ 本讲首先对早期的知识表示做了一个简单介绍,而后详细介绍了基于语义网的知识表示框架,如RDF和RDFS和查询语言SQARQL。最终给出...
  • mysql 查询当前时间是星期几

    万次阅读 2017-03-22 12:02:47
    MySQL中DATE_FORMAT(date, format)函数可根据format字符串格式化日期或日期和时间值date,返回结果串。  也可用DATE_FORMAT( ) 来格式化DATE 或DATETIME 值,以便得到所希望的格式。根据format字符串格式化date值
  • 数字的表示方法

    千次阅读 2007-09-27 10:59:00
    数词主要分为基数和序数... 表示数目的称为基数。其形式如下:  A.从1——10  one,two,three,four,five,six,seven,eight,nine,ten.  B.从 11——19  eleven...
  • 多模态特征表示和融合

    千次阅读 2020-12-15 16:51:41
    值得注意的是,在最近的工作中,对于像深度神经网络这样的模型,多模态表示和融合之间的界限已经模糊了,其中表示学习与分类或回归目标交织在一起 多模态融合的优势 1.对于同一任务,能够应用多种模态的数据,可以...
  • 文本深度表示模型Word2Vec

    千次阅读 2015-11-26 15:27:21
    文本深度表示模型Word2Vec 简介 Word2vec 是 Google 在 2013 年年中开源的一款将表征为实数值向量的高效...Word2vec输出的向量可以被用来做多 NLP 相关的工作,比如聚类、找同义、词性分析等等。如果换
  • GCN:网络表示学习NRL与图神经网络GNN的简介、应用、经典案例之详细攻略 目录 网络表示学习NRL与图神经网络GNN的简介 1、网络表示学习与图神经网络的重要进展 1.1、1986年的Distributed Representation 1.2...
  • R语言实现时间序列分析

    千次阅读 2019-11-11 20:11:45
    一、时间序列分析导论图: 处理方式: 1.对于原始数据进行季节性处理和差分,以形成平稳序列;期间如果遇到了随机序列,则停止时间序列建模 2.对于给定的序列进行自相关函数和偏自相关函数分析(在不同的滞后...
  • 产品读书《把时间当朋友》

    千次阅读 2019-01-17 10:45:55
    在读这本书的时候刚好是在听罗胖的跨年演讲(当然是2018年的),罗胖的以时间的朋友为主题的演讲一定程度上谈论了当前的互联网事件发展趋势--小趋势,“时间的朋友”为主题的跨年演讲主要是想让我们用我们自己的岁月...
  • 动态规划-时间规整算法

    千次阅读 2015-01-22 09:25:50
    DTW(Dynamic Time Warping,动态时间归整)算法,该算法基于动态规划(DP)的思想,解决了发音长短不一的模板匹配问题,是语音识别中出现较、较为经典的一种算法。
  • Word2vec——文本深度表示模型

    千次阅读 2016-04-26 11:45:55
    简介 Word2vec 是 Google 在 2013 年年中开源的一款将表征为实数值向量的...Word2vec输出的向量可以被用来做多 NLP 相关的工作,比如聚类、找同义、词性分析等等。如果换个思路, 把当做特征,那么Word2v

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,068
精华内容 24,027
关键字:

很早是表示时间的词吗