pytorch Embedding的实战和用法解析

本篇博客着重于进行代码实战讲解,目的是弄清楚它的实际运行情况和常规参数表达含义。至于一些理论的东西,我认为其他博主解释的已经相当好了,在下面的文章中我也会将其引用出来。

为什么使用嵌入层Embedding?

来源:https://www.jiqizhixin.com/articles/2019-03-27-7

1、使用One-hot 方法编码的向量会很高维也很稀疏。假设我们在做自然语言处理(NLP)中遇到了一个包含2000个词的字典,当使用One-hot编码时,每一个词会被一个包含2000个整数的向量来表示,其中1999个数字是0,如果字典再大一点,这种方法的计算效率会大打折扣。

2、训练神经网络的过程中,每个嵌入的向量都会得到更新。通过上面的图片我们就会发现在多维空间中词与词之间有多少相似性,这使我们能可视化的了解词语之间的关系,不仅仅是词语,任何能通过嵌入层 Embedding 转换成向量的内容都可以这样做。

Embedding 的本质是什么?

来源:https://blog.csdn.net/weixin_42078618/article/details/84553940

embedding层做了个什么呢?它把我们的稀疏矩阵,通过一些线性变换(在CNN中用全连接层进行转换,也称为查表操作),变成了一个密集矩阵,这个密集矩阵用了N(例子中N=3)个特征来表征所有的文字,在这个密集矩阵中,表象上代表着密集矩阵跟单个字的一一对应关系,实际上还蕴含了大量的字与字之间,词与词之间甚至句子与句子之间的内在关系(如:我们得出的王妃跟公主的关系)。他们之间的关系,用的是嵌入层学习来的参数进行表征。从稀疏矩阵到密集矩阵的过程,叫做embedding,很多人也把它叫做查表,因为他们之间也是一个一一映射的关系。

更重要的是,这种关系在反向传播的过程中,是一直在更新的,因此能在多次epoch后,使得这个关系变成相对成熟,即:正确的表达整个语义以及各个语句之间的关系。这个成熟的关系,就是embedding层的所有权重参数。

Embedding 代码实践

首先我们定义一个embedding

embedding = torch.nn.Embedding(10, 3)

这里第一个参数是num_embeddings=10 表示embedding词典尺寸

第二个参数embedding_dim=3 表示embedding向量尺寸

在pytorch 源码中,对于embedding层的用处有下面一句话的定义:

A simple lookup table that stores embeddings of a fixed dictionary and size
一种简单的查找表,用于存储固定字典和大小的embedding

注意,在这里重点是 固定的,再往下找,发现大小为(um_embeddings, embedding_dim)。总结来讲,就是embedding有一个固定大小的二维权重,用来为输入做映射。

在本文例子中是(10,3),那么这个权重就是 尺寸为(10,3)的二维向量。

接着咱们定义一个输入,是一个long类型的tensor变。

input = torch.LongTensor([1,2,3,4])

然后将输入输入到embedding

result = embedding(input)

我们查看一下输出result

result=
[[-0.0376,  0.9428,  0.2284],
[-0.6415, -0.9858, -0.3793],
[ 1.6913,  0.1721,  0.9647],
[ 0.7479, -1.1152,  1.2624]]

我们看到,他的输出是一个大小(4,3)的二维向量。

那这里有一个疑问点输入input是如何转化为这个二维矩阵的,这中间发生了什么变化?

我只是输入了一个一维向量,怎么就转化成了(4,3)大小的二维向量?

我们先来输出一下这个权重矩阵的值:

weight=
[[ 0.3213,  0.7880, -1.3707],
  [-0.0376,  0.9428,  0.2284],
  [-0.6415, -0.9858, -0.3793],
  [ 1.6913,  0.1721,  0.9647],
  [ 0.7479, -1.1152,  1.2624],
  [ 0.2783, -1.6462,  0.3029],
  [ 0.2192,  0.2041,  0.1359],
  [-0.1547,  0.3126,  0.2193],
  [ 0.2389, -1.0764, -0.3257],
  [ 0.0900,  0.7144,  0.6510]]

既然 input 通过这个[10,3]权重矩阵转化为上面那个[4,3]矩阵的,他们之间会不会有什么联系

我们将这两个值放在一块儿进行一下对比

image-20210718213837691

发现,这几行的值竟然完全一样。而且是从第二行开始的。

那么,用反推的思想来看x1*weight=result,可以写出

x1=
[[0,1,0,0,0,0,0,0,0,0],
 [0,0,1,0,0,0,0,0,0,0],
 [0,0,0,1,0,0,0,0,0,0],
 [0,0,0,0,1,0,0,0,0,0]
 ]

这不就是one-hot编码嘛,只在自己所属的位置是1,其他位置都是0.

这里还能够确定一点,input变化成x1 是绝对变化。绝对变化意思就是 我只根据你input里面的值,是多少,它的ont-hot就在哪里是1,从上面结果中也能够证明。

还有一点,我们设置的num_embedding=10,这意味着我们input的输入值必须小于10,如果大于等于10就会报错。

总结

embedding 管理着一个大小固定的二维向量权重,其input输入值它首先转化为one-hot编码格式,将转化为后的one-hot 与权重矩阵做矩阵乘法,就得到了每一个input的embedding输出。由于这个embedding权重是可训练的,所以在最训练后的权重值,能够表达不同字母之间的关系。

更多相关推荐

关于pytorch--embedding的问题

pytorch关于wordembedding的中文与英文教程使用Pytorch实现NLP深度学习WordEmbeddings:Encodin...

继续阅读

pytorch Embedding 修改 自定义

现在你有一个[20,64]的编码emb1,代表20件商品。现在你想将每个商品的特征信息emb2融入到编码...

继续阅读

embedding

https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/Tutoria...

继续阅读

【Graph Embedding】DeepWalk 原...

1.原理简述DeepWalk的思想类似word2vec,使用图中节点与节点的共现关系来学习节点的向量表示。...

继续阅读

torch.nn.Embedding

官网:https://pytorch.org/docs/stable/nn.html#embedding(num_embeddings, embedding_dim, p...

继续阅读

embedding层_如何在mxnet gluon...

我们复现别人的论文的时候,往往发现nlp任务中大量使用预训练的word2vec作为wordembedding的初...

继续阅读

embedding层_keras-Embedding层

嵌入层(EmbeddingLayer)是使用在模型第一层的一个网络层,其目的是将所有索引标号映射到致密...

继续阅读

tensorflow中tf.nn.embedding_lo...

转自:STHSFembedding_lookup()的用法关于tensorflow中embedding_lookup()的用法,在Udacity的...

继续阅读

从源码解析 Bert 的 Embedding...

前文链接->从源码层面,深入理解Bert框架前边从源码层面对BertModel类进行了一个深入的解析,...

继续阅读

tf.nn.embedding_lookup()的用法

函数:tf.nn.embedding_lookup(        params,        ids,        partition_strategy='mod'...

继续阅读