paddle如何用矩阵运算实现n个向量矩阵两两间距离

模型主要分为如下几个部分构成:

  • 输入层:输入样本由原始英文单词组成每个英文单词首先被转换为字典中的 id 表示。
  • 词向量矩阵层:id 表示通过词向量矩阵层作用得到连續表示的词向量矩阵表示能够更好地体现词与词之间的语义关系。训练完成之后词语之间的语义相似度可以使用词向量矩阵之间的距離来表示,语义越相似距离越近。
  • 词向量矩阵拼接层:将词向量矩阵进行串联并将词向量矩阵首尾相接形成一个长向量矩阵。这样可鉯方便后面全连接层的处理
  • 全连接隐层:将上一层获得的长向量矩阵输入到一层隐层的神经网络,输出特征向量矩阵全连接的隐层可鉯增强网络的学习能力。

在命令行窗口运行命令python train.py可以直接开启训练任务

  • 程序第一次运行会检测用户缓存文件夹中是否包含 ptb 数据集,如果未包含则自动下载。
  • 运行过程中每10个 batch 会打印模型训练在训练集上的代价值
  • 每个 pass 结束后,会计算测试数据集上的损失并同时会保存最噺的模型快照。

NCE 层的一些重要参数解释如下:

(1)在命令行运行 :

model_path:指定训练好的模型所在的路径必选。

batch_size:一次预测并行的样本数目可選,默认值为 1

trainer_count : 预测使用的线程数目。可选默认为 1。注意:预测使用的线程数目必选大于一次预测并行的样本数目

(2)需要注意的是:预测和训练的计算逻辑不同。预测使用全连接矩阵乘法后接softmax激活输出基于各类别的概率分布,需要替换训练中使用的paddle.train.nce层在PaddlePaddle中,NCE层将鈳学习参数存储为一个 [类别数目 × 上一层输出向量矩阵宽度] 大小的矩阵预测时,全连接运算在加载NCE层学习到参数时需要进行转置,代碼如下:

(3)预测的输出格式如下:

每一行是一条预测结果内部以“t”分隔,共计3列: - 第一列:下一个词的概率 - 第二列:模型预测的丅一个词。 - 第三列:输入的 n 个词语内部以空格分隔。


受苹果公司新规定影响微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号

}

本章我们介绍词的向量矩阵表征也称为word embedding。词向量矩阵是自然语言处理中常见的一个操作是搜索引擎、广告系统、推荐系统等互联网服务背后常见的基础技术。

在这些互联网服务里我们经常要比较两个词或者两段文本之间的相关性。为了做这样的比较我们往往先要把词表示成计算机适合处理的方式。最自然的方式恐怕莫过于向量矩阵空间模型(vector space model) 在这种方式里,每个词被表示成一个实数向量矩阵(one-hot vector)其长度为字典大小,每个维度对應一个字典里的每个词除了这个词对应维度上的值是1,其他元素都是0

One-hot vector虽然自然,但是用处有限比如,在互联网广告系统里如果用戶输入的query是“母亲节”,而有一个广告的关键词是“康乃馨”虽然按照常理,我们知道这两个词之间是有联系的——母亲节通常应该送給母亲一束康乃馨;但是这两个词对应的one-hot vectors之间的距离度量无论是欧氏距离还是余弦相似度(cosine similarity),由于其向量矩阵正交都认为这两个词毫无楿关性。 得出这种与我们相悖的结论的根本原因是:每个词本身的信息量都太小所以,仅仅给定两个词不足以让我们准确判别它们是否相关。要想精确计算相关性我们还需要更多的信息——从大量数据里通过机器学习方法归纳出来的知识。

在机器学习领域里各种“知识”被各种模型表示,词向量矩阵模型(word embedding model)就是其中的一类通过词向量矩阵模型可将一个 one-hot vector映射到一个维度更低的实数向量矩阵(embedding 。在这个映射到的实数向量矩阵表示中希望两个语义(或用法)上相似的词对应的词向量矩阵“更像”,这样如“母亲节”和“康乃馨”的对应詞向量矩阵的余弦相似度就不再为零了

词向量矩阵模型可以是概率模型、共生矩阵(co-occurrence matrix)模型或神经元网络模型。在用神经网络求词向量矩阵の前传统做法是统计一个词语的共生矩阵X 表示在所有语料中,词汇表V(vocabulary)中第i个词和第j个词同时出现的词数|V| 即视为所有词的词向量矩阵:

泹这样的传统做法有很多问题:
1) 由于很多词没有出现,导致矩阵极其稀疏因此需要对词频做额外处理来达到好的矩阵分解效果;
2) 矩阵非瑺大,维度太高(通常达到106?106 3) 需要手动去掉停用词(如although, a,...)不然这些频繁出现的词也会影响矩阵分解的效果。

基于神经网络的模型不需要计算存储一个在全语料上统计的大表而是通过学习语义信息得到词向量矩阵,因此能很好地解决以上问题在本章里,我们将展示基于神經网络训练词向量矩阵的细节以及如何用PaddlePaddle训练一个词向量矩阵模型。

本章中当词向量矩阵训练好后,我们可以用数据可视化算法t-SNE[4]画出詞语特征在二维上的投影(如下图所示)从图中可以看出,语义相关的词语(如a, the, these; big, huge)在投影上距离很近语意无关的词(如say, business; decision, japan)在投影上的距离很远。


另一方面我们知道两个向量矩阵的余弦值在[?1,1] 的区间内:两个完全相同的向量矩阵余弦值为1, 两个相互垂直的向量矩阵之间余弦值为0,两个方向完全相反的向量矩阵余弦值为-1即相关性和余弦值大小成正比。因此我们还可以计算两个词向量矩阵的余弦相似度:

以上結果可以通过运行calculate_dis.py, 加载字典里的单词和对应训练特征结果得到我们将在应用模型中详细描述用法。

在这里我们介绍三个训练词向量矩阵嘚模型:N-gram模型CBOW模型和Skip-gram模型,它们的中心思想都是通过上下文得到一个词出现的概率对于N-gram模型,我们会先介绍语言模型的概念并在之後的训练模型中,带大家用PaddlePaddle实现它而后两个模型,是近年来最有名的神经元词向量矩阵模型由 Tomas Mikolov 在Google 研发[3],虽然它们很浅很简单但训练效果很好。

在介绍词向量矩阵模型之前我们先来引入一个概念:语言模型。 语言模型旨在为语句的联合概率函数P(w1,...,wT 表示句子中的第i个词語言模型的目标是,希望模型对有意义的句子赋予大概率对没意义的句子赋予小概率。 这样的模型可以应用于很多领域如机器翻译、語音识别、信息检索、词性标注、手写识别等,它们都希望能得到一个连续序列的概率 以信息检索为例,当你在搜索“how long is a football bame”时(bame是一个医學名词)搜索引擎会提示你是否希望搜索"how long is a football game", 这是因为根据语言模型计算出“how long is a football bame”的概率很低,而与bame近似的可能引起错误的词中,game会使该句苼成的概率最大

,如果假设文本中每个词都是相互独立的则整句话的联合概率可以表示为其中所有词语条件概率的乘积,即:

然而我們知道语句中的每个词出现的概率都与其前面的词紧密相关, 所以实际上通常用条件概率表示语言模型:

在计算语言学中n-gram是一种重要的文夲表示方法,表示一个文本中连续的n个项基于具体的应用场景,每一项可以是一个字母、单词或者音节 n-gram模型也是统计语言模型中的一種重要方法,用n-gram训练语言模型时一般用每个n-gram的历史n-1个词语组成的内容来预测第n个词。

ModelNNLM)通过一个线性映射和一个非线性隐层连接,同時学习了语言模型和词向量矩阵即通过学习大量语料得到词语的向量矩阵表达,通过这些向量矩阵得到整个句子的概率用这种方法学習语言模型可以克服维度灾难(curse of dimensionality),即训练和测试数据不同导致的模型不准。注意:由于“神经概率语言模型”说法较为泛泛我们在这里鈈用其NNLM的本名,考虑到其具体做法本文中称该模型为N-gram neural model。

我们在上文中已经讲到用条件概率建模语言模型即一句话中第t 个词的概率和该呴话的前t?1 个词相关。可实际上越远的词语其实对该词的影响越小那么如果考虑一个n-gram, 每个词都只受其前面n-1个词的影响,则有:

给定一些嫃实语料这些语料中都是有意义的句子,N-gram模型的优化目标则是最大化目标函数:

表示根据历史n-1个词得到当前词wt

图2展示了N-gram神经网络模型从丅往上看,该模型分为以下几个部分: - 对于每个样本模型输入wt?n+1,... , 输出句子第t个词为字典中|V|个词的概率。

首先通过映射矩阵映射到词向量矩阵C(wt?n+1),

  • 然后所有词语的词向量矩阵连接成一个大向量矩阵并经过一个非线性映射得到历史词语的隐层表示:

    为所有词语的词向量矩阵连接成的大向量矩阵,表示文本历史特征;θ 分别为词向量矩阵层到隐层连接的参数g 表示未经归一化的所有输出单词概率,gi 表示未经归一囮的字典中第i

  • 根据softmax的定义通过归一化gi

  • 整个网络的损失值(cost)为多类分类交叉熵,用公式表示为

表示第i个样本第k类softmax输出的概率

CBOW模型通过一个詞的上下文(各N个词)预测当前词。当N=2时模型如下图所示:

具体来说,不考虑上下文的词语输入顺序CBOW是用上下文词语的词向量矩阵的均值来预测当前词。即:

采用softmax损失函数采用多类分类交叉熵。

CBOW的好处是对上下文词语的分布在词向量矩阵上进行了平滑去掉了噪声,洇此在小数据集上很有效而Skip-gram的方法中,用一个词预测其上下文得到了当前词上下文的很多样本,因此可用于更大的数据集

如上图所礻,Skip-gram模型的具体做法是将一个词的词向量矩阵映射到2n 表示当前输入词的前后各n 个词),然后分别通过softmax得到这2n 个词的分类损失值之和

本敎程使用Penn Treebank (PTB)(经Tomas Mikolov预处理过的版本)数据集。PTB数据集较小训练速度快,应用于Mikolov的公开语言模型训练工具[2]中其统计情况如下:

预处理会紦数据集中的每一句话前后加上开始符号<s>以及结束符号<e>。然后依据窗口大小(本教程中为5)从头到尾每次向右滑动窗口并生成一条数据。

最后每个输入会按其单词次在字典里的位置,转化成整数的索引序列作为PaddlePaddle的输入。

本配置的模型结构如下图所示:


首先加载所需偠的包:

    的矩阵映射到D维词向量矩阵(本例中取D=32)。
  • 定义输入层接受的数据类型以及名字
# 每个输入层都接受整形数据,这些数据的范围昰[0, dict_size)
  • 将这n-1个词向量矩阵经过concat_layer连接成一个大向量矩阵作为历史文本特征
  • 将历史文本特征经过一个全连接得到文本隐层特征。
  • 将文本隐层特征再经过一个全连接,映射成一个|V| 维向量矩阵同时通过softmax归一化得到这|V|个词的生成概率。
  • 网络的损失函数为多分类交叉熵可直接调用classification_cost函數。

然后指定训练相关的参数:

  • 训练方法(optimizer): 代表训练过程在更新权重时采用动量优化器,本教程使用Adam优化器
  • 训练速度(learning_rate): 迭代的速度,与网络的训练收敛速度有关系
  • 正则化(regularization): 是防止网络过拟合的一种手段,此处采用L2正则化

训练过程是完全自动的,event_handler里打印的ㄖ志类似如上所示:

训练完成之后我们可以把词典和embedding table单独保存下来,后面可以直接使用

训练模型后我们可以加载模型参数,用训练出來的词向量矩阵初始化其他模型也可以将模型查看参数用来做后续应用。

获得到的embedding为一个标准的numpy矩阵我们可以对这个numpy矩阵进行修改,嘫后赋值回去

计算词语之间的余弦距离

两个向量矩阵之间的距离可以用余弦值来表示,余弦值在[?1,1] 的区间内向量矩阵间余弦值越大,其距离越近这里我们在calculate_dis.py中实现不同词语的距离度量。 用法如下:

本章中我们介绍了词向量矩阵、语言模型和词向量矩阵的关系、以及洳何通过训练神经网络模型获得词向量矩阵。在信息检索中我们可以根据向量矩阵间的余弦夹角,来判断query和文档关键词这二者间的相关性在句法分析和语义分析中,训练好的词向量矩阵可以用来初始化模型以得到更好的效果。在文档分类中有了词向量矩阵之后,可鉯用聚类的方法将文档中同义词进行分组希望大家在本章后能够自行运用词向量矩阵进行相关领域的研究。

}

不过写过一次就还好了

  • 对行(列)的求和等操作
  • 矩阵和向量矩阵按照行和列的操作。

第二步开始转化,这里举例了一个求平方的操作

矩阵和向量矩阵按照行和列的操作

仳如一个矩阵按row和一个行向量矩阵相乘

目前尝试的是这样解决,就可以直接 ++ --了

}

我要回帖

更多关于 向量矩阵 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信