一、词向量模型

因为计算机不能理解词语,所以我们需要用词向量表示一个词。
词向量有一个发展历程:从one-hot到word embedding。

1 one-hot

设词典的大小为n(词典中有n个词),假如某个词在词典中的位置为k,则设立一个n维向量,第k维置1,其余维全都置0。这个思想就是one-hot编码,中文叫独热编码(茫茫0海中有一个1,不就是孤独的热点吗)。

比如这里有三句话,即三个样本:

“我喜欢你”;

“你喜欢你的狗狗”;

“你是狗狗”。

假设已经分词完成,那么如果我们要从这三个样本中挖掘信息的话,根据词袋模型的思想:

首先就要将这些句子中出现过的词构建一个词典。这个词典依次包含[我,喜欢,你,的,是,狗狗]这六个词。根据one-hot编码,“我”就会被编码为[1,0,0,0,0,0],而“喜欢”就被编码为[0,1,0,0,0,0],以此类推。

那么如何继续推进,利用one-hot编码来生成特征向量呢?

一个样本的特征向量等于该样本中的每个单词的one-hot向量直接相加。这三个样本的特征向量便会表示为:

我喜欢你:[1,1,1,0,0,0]

你喜欢你的狗狗:[0,1,2,1,0,1]

你是狗狗:[0,0,1,0,1,1]

其中,第二个句子中“你”出现了两次,因此第三维的值为2。但是注意一下,在有的机器学习模型,比如贝努利分布的朴素贝叶斯模型中,仅考虑每个词出现与否,此时第二个句子的词袋模型就变成了[0,1,1,1,0,1]。

看,特征向量构建完成啦,剩下的就交给机器学习吧
(原文链接:https://blog.csdn.net/xixiaoyaoww/article/details/105459590)

优点:思路简单。
缺点:一般词库是一个很大的库。例如词库会达到30万,那就需要一个30万维度的向量表示一个词。这样计算量很大。同时整个矩阵会是一个稀疏矩阵。极大的浪费内存与计算力。

2 TF-IDF

第二种是使用词出现的频率,以及逆文档频率表示一个词。
TF=某个词在文章中出现的频率/文章的总次数
IDF=log{语料库的总文档数/出现该词的文档数}
TF−IDF=TF∗IDFTF-IDF=TF*IDFTFIDF=TFIDF
对于一句话,就是把句子中的词的TF-IDF拼起来,形成一个向量。

优点:简单快速,结果比较符合实际
缺点:单纯考虑词频,忽略了词与词的位置信息以及词与词之间的相互关系。

3 bi-gram和n-gram

优点:考虑了词的顺序
缺点:词表膨胀,无法衡量向量之间的相似性

4 word embedding

用固定长度的向量表示一个词。
这个向量需要能够保证相似的词,距离近;在不同语言中,空间分布很相似;向量能够做加减运算:Vking−Vqueen+Vwomen=VmanV_{king}-V{queen}+V_{women}=V_{man}VkingVqueen+Vwomen=Vman

流行的训练算法是Word2Vec。具体有两种形式:CBOW和skip-gram。它们很类似,这里介绍skip-gram。

  • skip-gram

在这里插入图片描述

用中心词预测周围单词。
输入第t个词,用一层的神经网络,预测周围的词,也就是第t-2个,t-1个,t+1个,t+2个…。

对于模型:
输入:一个单词的int表示。假设词表大小为N。
projection:将单词映射为一个词向量,维度是embedding_size.这里会产生一个形状为Nxembedding_size 的参数W。这个参数就是本次任务最重要的输出。作为词向量,提供给下游。
output:将这个词向量做线性变化后,得到在每个单词上的概率。希望在周围词上的概率最大。

在这里插入图片描述

目标函数:找到在给定wtw_twt的情况下wt+jw_{t+j}wt+j出现的概率:p(wt+j∣wt)p(w_{t+j}|w_t)p(wt+jwt),再对这个概率取log。对所有窗口范围内的概率log和取最大值。t是从1到T的,再对这所有和,取和。
具体概率的计算方式是uou_ouo是输出的词向量,vcv_cvc是输入词向量。
p(o∣c)=exp(uoTvc)∑w=1Wexp(uwTvc)p(o|c)=\dfrac{exp(u_o^Tv_c)}{\sum_{w=1}^W exp(u_w^Tv_c)}p(oc)=w=1Wexp(uwTvc)exp(uoTvc)

c:表示中心词
o:表示周为此
vcv_cvc表示输入词向量
uou_ouo表示输出词向量
用两个词向量的点积表示o这个单词可能出现的概率:uo∗vcu_o*v_cuovc

损失函数:上面的概率越大越好,作为损失函数,就是将该函数取反,求最小值。
在这里插入图片描述

这里最大的问题是p(o|c)的分母是很大的。要计算vcv_cvc与词库中每一个单词的词向量的和。如果词库有50万个单词,那就要计算50万次。计算量很大。看损失函数的最后一项,也是一样的。

可以采取的措施是负例采样。
我们的输入input embeding是一个50万x100维的矩阵。(假设我们用100维的向量表示一个词)。输出output embedding是一个50万x100维的矩阵。

我们把任务换一个角度。对于wtw_twt不要计算周围单词在整个词库上的概率。我们将词库的单词分为周围单词和非周围单词两类。这样就把一个50万分类问题变为2分类问题。如果单词uku_kukwtw_twt的周围单词,那就概率高一些。否则概率低一些。
在这里插入图片描述

用周为词向量点乘中心词向量,对结果做sigmoid,表示w是c的周围词的概率。对于需要连续计算m个周围词的概率的乘积,可以转为对概率求log和。因此出现了上面的公式。

我们希望目标函数越大越好。
对于负例我们从词库中采样一部分单词即可。采样后的概率做了一下变换才参与到计算中。
最后对我们有用的数据是输入的embedding,这是词的稠密向量。可以很好的表示词之间的相关性。

最后模型代码实现。

class EmbeddingModel(nn.Module):def __init__(self, vocab_size, embed_size):super(EmbeddingModel, self).__init__()self.vocab_size = vocab_sizeself.embed_size = embed_sizeinitrange = 0.5 / self.embed_sizeself.out_embed = nn.Embedding(self.vocab_size, self.embed_size, sparse=False)self.out_embed.weight.data.uniform_(-initrange, initrange)self.in_embed = nn.Embedding(self.vocab_size, self.embed_size, sparse=False)self.in_embed.weight.data.uniform_(-initrange, initrange)def forward(self, input_labels, pos_labels, neg_labels):# input_labels:[batch_size]# pos_labels:[batch_size, c-1]# neg_labels:[batch_size, (c-1)*K]batch_size = input_labels.size(0)input_embedding = self.in_embed(input_labels) # [batch_size,embedding_size]pos_embedding = self.out_embed(pos_labels) # [batch_size,c*2-1,embedding_size]neg_embedding = self.out_embed(neg_labels) # [batch_size,(c*2-1)*K,embedding_size]input_embedding = input_embedding.unsqueeze(2) # [batch_size,embedding_size,1]#  bmm((b×n×m), (b x m x p)) = (b x n x p)pos_dot = torch.bmm(pos_embedding, input_embedding) # [batch_size,c*2-1,1]neg_dot = torch.bmm(neg_embedding, -input_embedding)pos_dot = pos_dot.squeeze() # [batch_size,c*2-1]neg_dot = neg_dot.squeeze() # [batch_size,(c*2-1)*K]log_pos = F.logsigmoid(pos_dot).sum(1) # [batch_size]log_neg = F.logsigmoid(neg_dot).sum(1) # [batch_size]loss = log_pos + log_neg# 因为希望概率越大越好,所以损失就是越小越好,所以加负号。return -lossdef input_embeddings(self):return self.in_embed.weight.data.cpu().numpy()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【广告】我妹妹导演的毕设——数字传媒摄影作品

我妹妹涂华思宇导演的作品,也是她的本科毕业设计~ https://www.xinpianchang.com/a10452218 欢迎各位点击! 涂华思宇,initiated四川文化艺术学院 2019/6/30 tz,postedcroplab,HZAU 2019/7/16转载于:https://www.cnblogs.com/acm-icpcer/p/111…

spring mvc学习(36):jstl的jar包的下载

1. 我们在使用spring框架的时候导入jstl标签库需要使用到jstl的jar包,假如没有加入到eclipse的lib目录下,使用alt /的时候不会有提示,所以我们需要把这个jar包加进来 首先登陆网址:http://tomcat.apache.org/taglibs/ 找到下面的…

二、语言模型

文章目录1 语言模型2 语言模型评价指标:Perplexity3 基于神经网络的语言模型3.1 RNN3.2 LSTM3.3 GRU4 优化函数5 模型代码6 用途与评价1 语言模型 语言模型的任务是判断一句话出现的概率(也就是说一句话是不是人说的),可以表示为…

DM入门之Apriori小结

Apriori算法:使用候选项找频繁项集Apriori算法是关联分析中一种基本算法,用于挖掘布尔关联规则频繁项集。原理:利用频繁项集的先验知识,使用逐层搜索的迭代方法,使用k项集探索(k1)项集。这里先看哈二维Apriori算法。&a…

三、自然语言分类

文章目录1 数据准备1.1 数据集拆分1.2 创建词库vocabulary1.3 batch数据,创建Iterator2 Word Averaging模型3 RNN模型4 CNN三种分类方式:Word Averaging模型、RNN、CNN。1 数据准备 第一步是准备数据。代码中用到的类库有spacy、torchtext。 torchtext中…

spring mvc学习(38):Unknow tag(c:forEach)错误解决办法,jstl.jar包以及standard.jar包下载与导入

解决问题步骤&#xff1a; ①&#xff1a;下载jstl.jar和standard.jar 点击下载jstl.jar 点击下载standard.jar ②&#xff1a;将两个包剪切到项目中的WEB-INF/lib文件夹内 右键加到eclipse环境中---bulidpath--add to path 第一行代码<% pagelanguage"java" im…

nlp中的经典深度学习模型(一)

文章目录1 DNN与词向量1.1 DNN1.2 skip-gram1.3 简单句子分类模型DAN2 RNNLSTMGRU2.1 RNN2.2 LSTM2.3 LSTM变种2.4 递归神经网络2.5 双向RNN2.6 堆叠RNN1 DNN与词向量 1.1 DNN 神经网络中每一个神经单元是一个线性变化加一个激活函数 sUTasU^TasUTa af(z)af(z)af(z) zWxbzWxb…

spring mvc学习(39):restful的crud实现删除方式

上图是目录结构&#xff0c;本节是有问同学的&#xff0c;当好好总结 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0…

像程序员一样地思考

在成为程序员的道路上&#xff0c;要经历四个坎坷&#xff0c;让我们用四个境界来标明他们。 第一境界&#xff0c;就是前面所说的&#xff0c;掌握一门或则几门编程语言&#xff0c;会模仿例子来实现程序代码&#xff0c;并且让代码在计算机系统中运行起来。达到这个境界的人…

nlp中的经典深度学习模型(二)

attention和transformer都是面试重点。 文章目录3 seq2seqAttention3.1 Sequence to Sequence Model3.1.2 模型介绍3.1.2 模型训练3.2注意力机制3.2.1介绍3.2.1“Bahdanau” style attention3.2.2“Luong” style attention4 Transformer4.1 Multi-head Attention4.1.1 自注意力…

spring mvc学习(40):restful的crud实现增加方式

上图是目录结构&#xff0c;本节是有问同学的&#xff0c;当好好总结 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0…

spring mvc学习(41):restful的crud的项目原型介绍

上图是目录结构&#xff0c;本节是有问同学的&#xff0c;当好好总结 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

nlp中的经典模型(三)

文章目录5 NLP中的卷积神经网络5.1 卷积5.2 多通道5.2 max pooling5 NLP中的卷积神经网络 RNN的问题&#xff1a; 1 时间复杂度高 2 最后一个向量包含所有信息。有点不可靠 CNN可以通过卷积核捕捉局部特征&#xff0c;那是不是可以用于句子&#xff0c;表示特定长度的词序列呢…

第一百二十九期:阿里内部员工,排查Java问题常用的工具单

平时的工作中经常碰到很多疑难问题的处理&#xff0c;在解决问题的同时&#xff0c;有一些工具起到了相当大的作用&#xff0c;在此书写下来&#xff0c;一是作为笔记&#xff0c;可以让自己后续忘记了可快速翻阅&#xff0c;二是分享&#xff0c;希望看到此文的同学们可以拿出…

第一百三十期:14种常见编程语言的优缺点及应用范围

C语言是一门通用计算机编程语言&#xff0c;应用广泛。面向过程的&#xff0c;数据与算法分开。它的重点在于算法和数据结构。1972年由美国贝尔实验室在B语言的基础上设计出。 作者&#xff1a;编程小新 C 概述:C语言是一门通用计算机编程语言&#xff0c;应用广泛。面向过程…

第一百三十一期:2019年容器使用报告:Docker 和 Kubernetes 王者地位不倒!

近日&#xff0c;容器创业公司 Sysdig 发布了 2019 年容器使用报告。这是 Sysdig 第三年发布容器年度使用报告&#xff0c;与之前不同的是&#xff0c;今年的调查结合了更多的数据源&#xff0c;并深入挖掘了 Kubernetes 的使用模式。 作者&#xff1a;高效开发运维 近日&…

Flask 路由映射对于双斜线的处理 //a//b

例子 from flask import Flask import time from tornado.wsgi import WSGIContainer from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoopapp Flask(__name__)app.route(//abc//a) def index():# time.sleep(5)return OKapp.route(/abc//a) def in…

⼤规模⽆监督预训练语⾔模型与应⽤(上)

文章目录1 单词作为语言模型的基本单位的缺点2 character level modeling3预训练句子向量3.1 skip-thought3.2 InferSent3.3 句子向量评价数据集4 预训练文档向量5 ELMO1 单词作为语言模型的基本单位的缺点 单词量有限&#xff0c;遇到没有见过的单词只能以UNK表示。 模型参数…

第一百三十二期:MySQL系列:一句SQL,MySQL是怎么工作的?

当我们在mysql窗口或者数据库连接工具中输入一句sql后&#xff0c;我们就可以获取到想要的数据&#xff0c;这中间MySQL到底是怎么工作的呢&#xff1f; 作者&#xff1a;Java架构学习交流 对于MySQL而言&#xff0c;其实分为客户端与服务端。 服务端&#xff0c;就是MySQL应…

Visual Studio 2005 Tip:编辑项目文件

原文参考自&#xff1a;http://blogs.msdn.com/shawnfa/archive/2006/04/26/582326.aspx很多时候我们需要手动修改VS的项目文件&#xff08;.csproj/.vbproj&#xff09;&#xff0c;这时大多数人会简单的使用记事本&#xff08;notepad&#xff09;打开并编辑。虽然这没什么不…