CS224n-word2vec

简介

关于这门课的笔记整理的博客非常的多,但是看别人的整理总没有自己整理来的印象深刻。我是一个看到新的知识必须完全吃透的人,所以决定详细的理一理word2vec的相关内容。在整理内容的过程中,会好好吸收一下别的优秀博客的精华,力保整篇文章看起来清晰。

首先介绍一下CS224n这门课程,这门课程全称是 “Natural Language Processing With Deep Learning”,也就是主要讲的是目前是如何利用最热门的深度学习来进行自然语言处理的。该课程的第一节课主要讲的是自然语言处理有什么应用场景等。涉及到公式推导的话就要从第二节课开始,因此我也从第二节课的内容开始进行整理。

统计语言模型

在开始介绍word2vec之前,不得不介绍统计语言模型。统计语言模型即是用来描述词、语句乃至于整个文档这些不同的语法单元的概率分布的模型,能够用于衡量某句话或者词序列是否符合所处语言环境下人们日常的行文说话方式。简单来说,统计语言模型是用来计算一个句子的概率的概率模型

假设 W=(w1,w2,...,wn) W = ( w 1 , w 2 , . . . , w n ) 是一个由n个词组成的一个句子,那么这个句子的概率就是这n个词的联合概率。

p(W)=p(w1,w2,...,wn) p ( W ) = p ( w 1 , w 2 , . . . , w n )
上面的式子就是W这个句子的概率,根据贝叶斯公式可以得到:
p(W)=p(w1)p(w2|w1)p(w3|w1,w2)...p(wn|w1,w2,...,wn1) p ( W ) = p ( w 1 ) p ( w 2 | w 1 ) p ( w 3 | w 1 , w 2 ) . . . p ( w n | w 1 , w 2 , . . . , w n − 1 )
如果这些参数都已经求出来了就可以得到一个句子的概率了。下面介绍一个最简单的计算这些条件概率的方法,也是nlp中最简单的方法。

n-gram模型

上面提到需要计算条件概率。那么现在考虑 P= p(wk|w1,...,wk1) p ( w k | w 1 , . . . , w k − 1 ) 的近似计算。根据贝叶斯公式有:

P=p(w1,...,wk)p(w1,...,wk1) P = p ( w 1 , . . . , w k ) p ( w 1 , . . . , w k − 1 )
当我们的语料足够多的时候,P可近似表示为
Pcount(w1,...,wk)count(w1,...,wk1) P ≈ c o u n t ( w 1 , . . . , w k ) c o u n t ( w 1 , . . . , w k − 1 )
从上面的公式可以看出 wk w k 和它前面的所有单词都相关,这在实际中并不合理。 这里就涉及到了n-gram的基本思想:假定一个词出现的概率只与它前面固定数目的词语相关。假设一个词出现的概率就只与它前面的 n-1 个词相关。那么就有下面的等式:
p(wk|w1,...,wk1)=p(wk|wkn+1,...,wk1) p ( w k | w 1 , . . . , w k − 1 ) = p ( w k | w k − n + 1 , . . . , w k − 1 )
一般n会取4以内,当n取1的时候,一个词出现的概率和前一个词语相关。上面就是最简单的n-gram的模型,总的来说它的具体工作就是在语料中统计各种词串出现的次数,将概率值计算好之后就存储起来以便计算一个句子的概率。这个是最基本的统计语言模型,下面将介绍近几年来热门的语言模型——神经概率语言模型。

神经概率语言模型

该模型最先在Bengio的一篇论文中提出,模型中用到了一个重要的工具——词向量。现实生活中的语言其实是一系列符号的集合,而这样的集合是具有内容的,用英文来说就是meaning。然而机器不仅无法直接读取我们的语言(也就是一个句子甚至是一个单词),更无法识别到语言的内容以及含义。所以我们的首要任务是要将语言转换成机器能够识别的格式,然后再建模。那么所谓的机器能够识别的格式就是词向量,也就是包含一系列实数的一个向量,问题是这样的向量该怎么构建呢?

  1. one-hot编码
    在nlp(自然语言处理)中,普遍认为单词是最小的单位,所以我们怎么来表示一个单词呢?

    这里需要给出几个定义,我们有一个足够大的词典D并且词典大小为 |V| | V | ,词典中每个单词都是不重复并且有自己唯一索引号的。所以我们可以使用一个 R|V|x1 R | V | x 1 的向量来表示一个单词。具体的做法是假如 motel 是词典中的第11个词,hotel 是词典中的第8个词。

    那么motel的词向量在11这一个索引取值为1,在其他索引的取值都为0。同理hotel的词向量在8索引取值为1,其他索引的取值为0。

    但这种词向量表示具有一些缺点,比如容易造成维数灾难(如果字典长度是万级的,一个向量就变的非常稀疏);不能很好刻画词和词之间的相似性(不同词语之间的欧式距离永远是 2 2 )。

  2. 分布式词向量
    nlp中有一句很著名的话, “You shall know a word by the company it keeps”。也就是说某个词的含义可以通过它旁边的词得知。针对特定的训练预料,每一个单词都会映射成一个固定长度的短向量(这里的短意味着远小于常见的词典长度),这些短向量里面的值不是稀疏的,通过将词语的信息分布到不同维度上来表征这个词语。

    说到这里可能会有些迷糊,为什么这样的词向量就可以表示一个词语呢?这个词向量的可解释性的确不强,但是实用性却是相当的好,我目前还没有想明白这一点。值得注意的是,一个词的词向量并不惟一,取决于训练预料以及训练算法。

在我们的神经概率语言模型中就需要用到上面两种词向量。下面先好好说一说神经概率语言模型。在介绍之前需要再明确一下我们的目的,和n-gram中类似,现在我们是给定一个词的上下文,然后来预测这个词。用符号的形式表示就是 max p(w|context(w)) max   p ( w | c o n t e x t ( w ) ) 。明确这一个目标非常重要噢。

首先说到神经,其实就是神经网络。下图给出一个简单的神经网络示意图。

上面的神经网络的数据流如下:

  • w的前n-1个词语都表示成one-hot向量从输入层传进网络。
  • 将这n-1个one-hot向量按照顺序拼接起来成一个(n-1)*|V|长度的向量 xw x w
  • 隐藏层的输入是 xw x w 和权值矩阵W的内积,也就是 zw=g(Wxw+p) z w = g ( W x w + p ) ,其中g是激活函数。
  • 输出层的输出是 zw z w 和权值矩阵U的内积,也就是 yw=Uzw+q y w = U z w + q
  • 由于最后我们需要得到的是一个概率值,也就是 yw y w 的各个分量之和要为1。在这里体现为一个多分类问题,所以最后的 yw y w 要扔进softmax里面转换成概率。

这样上面神经网络的大致工作流程已经说明白了。下面就详细介绍一下word2vec,一个流行的训练词向量的模型。

word2vec

word2vec其实只是一个称呼,意味着将word转换成vector,它里面其实包含了两个重要的模型:

  • CBOW (Continuous Bag of Words):通过一个固定窗口大小的上下文单词来预测一个目标单词。
  • SG(Skip-grams):通过一个中心单词来预测固定长度的上下文单词。

这两个模型的网络结构图如下:

其中目前又有两种高效的训练方法,也就是说总共有四种模型:

  • Hierarchical softmax
  • Negative sampling
Naive softmax

我们首先来讲最基本的训练方法,也就是朴素的softmax而不是上面两种方法。而这个方法就用SG来说明,SG和CBOW其实是想通的,只说明其中一个另一个也可以直接类推。

在一个语料库中,对于任意的词语t,要预测窗口大小为 m 的上下文,那么目标函数如下,目标函数的意义是所有预测结果的概率值相乘,也就是似然函数,目标函数中的 θ θ 代表了所有需要我们去优化的神经网络参数:

J(θ)=t=1Tmjmp(wt+j|wt) J ( θ ) = ∏ t = 1 T ∏ − m ≤ j ≤ m p ( w t + j | w t )
在机器学习里面我们习惯将乘转换成和,将最大化似然函数转换成最小化代价函数,所以我们就使用负对数似然函数作为我们的目标函数:
J(θ)=1Tt=1Tmjmlog(p(wt+j|wt)) J ( θ ) = − 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m l o g ( p ( w t + j | w t ) )
接下来我们需要知道怎么表示 p(wt+j|wt) p ( w t + j | w t ) ,这样我们才可以得到一个直接的表达式。我们上面说过最后要使用softmax函数来表示概率,下面的一个softmax类型的概率就能够表示 p(wt+j|wt) p ( w t + j | w t )
p(o|c)=exp(uTovc)Vw=1exp(uwvc) p ( o | c ) = e x p ( u o T v c ) ∑ w = 1 V e x p ( u w v c )
这里面值得注意的是,分子使用上下文词语o的输出词向量和中心词v的输入词向量作点乘,如果点乘出来的值越大,说明两个词越相近。最后除以所有输出词向量和输入词向量的点乘的和转换成概率值。下面一幅图详细展示了实际程序中是怎么计算的。

输入是一个长度为7的one-hot向量,注意到这个向量在这里的作用就是选出来输入层和隐藏层中间的权值矩阵的第5列出来,然后隐藏层并没有激活函数所以是一个线形层,然后隐藏层的输出和隐藏层到输出层的权值矩阵相乘得到一个长度为字典长度的向量,注意到图中没进入softmax的三个向量是一模一样的。最后再分别比较softmax层的输出向量和真实的要预测的词语的one-hot向量的损失,由于一般是使用交叉熵损失函数,又由于真实的向量是one-hot的,所以对于一个单词来说,它的损失就是对应索引位上的预测概率值。最后总的损失将所有单词的预测概率值相加就可以了。

知道了大致的流程以后就要知道怎么更新我们的神经网络参数了,就是利用梯度来更新啦~现在我们就要对 J(θ) J ( θ ) 使用梯度下降让他取极小值。

<script type="math/tex; mode=display" id="MathJax-Element-7689"></script>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
PyTorch是一个开源的Python机器学习库,可以用于创建神经网络模型和训练深度学习模型。Word2Vec是一种用于处理自然语言处理任务的词嵌入模型。 在PyTorch中实现Word2Vec的步骤如下: 1. 数据准备:收集和预处理用于训练Word2Vec模型的文本数据。可以使用任何合适的文本数据集,如语料库或文章集。 2. 数据预处理:对文本数据应用必要的预处理步骤,如分词、去除停用词、标点符号等。 3. 构建词汇表:通过遍历预处理后的文本数据,创建一个词汇表,包含所有唯一的词汇。 4. 创建训练样本:将文本数据转换为模型需要的训练样本格式。一种常用的方法是创建一个滑动窗口,在滑动窗口内部的词汇用作输入,目标词汇用作输出。 5. 定义模型:使用PyTorch构建Word2Vec模型。模型可以由一个嵌入层和一个线性层组成。嵌入层用于将输入词嵌入为低维向量,线性层用于将嵌入向量映射回词汇表。 6. 定义损失函数和优化器:为模型定义适当的损失函数和优化器。在Word2Vec中,常用的损失函数是负对数似然损失函数(Negative Log Likelihood Loss)。 7. 训练模型:使用训练数据和定义的损失函数和优化器进行模型训练。迭代训练样本,并更新模型参数以最小化损失函数。 8. 保存模型:在训练完成后,保存训练好的Word2Vec模型。 9. 应用模型:可以使用训练好的Word2Vec模型进行各种自然语言处理任务,如文本分类、语义相似度计算等。 总结:通过PyTorch实现Word2Vec模型需要进行数据准备和预处理、构建词汇表、创建训练样本、定义模型、损失函数和优化器、训练模型,最后保存和应用模型。使用Word2Vec可以将文本数据转换为向量表示,从而在自然语言处理任务中提供更好的特征表示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值