常规的机器学习Machine Learning升级发展到了一定的阶段后,深度学习慢慢发展起来,
对于数据特征表示问题。机器学习通过人工设计大量的特征解决数据的有效表示问题。而对于深度学习,一步到位,hyper-parameter自动帮你选择寻找关键的特征参数。
对于情感分析,自然语言处理之类的问题,我们要先把语言表示这一关过了——如何让语言表示成为深度学习能够处理的数据类型。
NLP词的表示分为独热表示one-hot、分布式表示distributed。
独热表示one-hot
NLP 中最直观的方法,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,这里简单举个栗子说明:
“话筒”表示为 [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。缺点:1、向量的维度会随着句子的词的数量类型增大而增大;2、任意两个词之间都是孤立的,根本无法表示出在语义层面上词语词之间的相关信息,而这一点是致命的。
分布式表示distributed
根据建模的不同,主要可以分为三类:基于矩阵的分布表示、基于聚类的分布表示和基于神经网络的分布(词嵌入)表示。它们的核心思想也都由两部分组成:一、选择一种方式描述上下文;二、选择一种模型刻画某个词与其上下文之间的关系。
基于神经网络的分布表示一般称为词向量、词嵌入( word embedding)或分布式表示( distributed representation)。这正是我们的主角today。核心依然是上下文的表示以及上下文与目标词之间的关系的建模
1.将vector每一个元素由整形改为浮点型,变为整个实数范围的表示;
2.将原来稀疏的巨大维度压缩嵌入到一个更小维度的空间。
词嵌入与word2vec有什么联系?
通过神经网络训练语言模型可以得到词向量,那么,究竟有哪些类型的神经网络语言模型呢?个人所知,大致有这么些个:
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 模型
上面提到的5个神经网络语言模型,只是个在逻辑概念上的东西,那么具体我们得通过设计将其实现出来,而实现CBOW( Continuous Bagof-Words)和 Skip-gram 语言模型的工具word2vec。word2vec的作者提出了一种更快更好的工具word2vec来训练语言模型得到词向量,分别是:连续词袋模型Continous Bag of Words Model(CBOW)和Skip-Gram Model。
词向量既能够降低维度,又能够capture到当前词在本句子中上下文的信息(表现为前后距离关系),那么我们对其用来表示语言句子词语作为NN的输入是非常自信与满意的。
另外一点很实用的建议,在你做某一项具体的NLP任务时如你要用到词向量,那么我建议你:要么1、选择使用别人训练好的词向量,注意,得使用相同语料内容领域的词向量;要么2、自己训练自己的词向量。我建议是前者,因为……坑太多了。