PyTorch中的nn.Embedding怎么使用


这篇“PyTorch中的nn.Embedding怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PyTorch中的nn.Embedding怎么使用”文章吧。太长不看版: NLP任务所依赖的语言数据称为语料库。详细介绍版: 语料库(Corpus,复数是Corpora)是组织成数据集的真实文本或音频的集合。 此处的真实是指由该语言的母语者制作的文本或音频。 语料库可以由从报纸、小说、食谱、广播到电视节目、电影和推文的所有内容组成。 在自然语言处理中,语料库包含可用于训练 AI 的文本和语音数据。为简便起见,假设我们的语料库只有三个英文句子并且均已经过处理(全部小写+去掉标点符号):我们往往需要将其词元化(tokenize)以成为一个序列,这里只需要简单的 split 即可:???? 这里我们是以单词级别进行词元化,还可以以字符级别进行词元化。词表不重复地包含了语料库中的所有词元,其实现方式十分容易:词表在NLP任务中往往并不是最重要的,我们需要为词表中的每一个单词分配唯一的索引并构建单词到索引的映射:word2idx。这里我们按照单词出现的频率来构建 word2idx。反过来,我们还可以构建 idx2word:对于 1.2 节中的 tokens,也可以转化为索引的表示:这种表示方式将在后续讲解 nn.Embedding 时提到。RNN无法直接处理单词,因此需要通过某种方法把单词变成数字形式的向量才能作为RNN的输入。这种把单词映射到向量空间中的一个向量的做法称为词嵌入(word embedding),对应的向量称为词向量(word vector)。我们首先讲解 nn.Embedding 中的基础参数,了解它的基本用法后,再讲解它的全部参数。基础参数如下:其中 num_embeddings 是词表的大小,即 len(vocab)embedding_dim 是词向量的维度。我们使用第一章节的例子,此时词表大小为 12 12 12,不妨设嵌入后词向量的维度是 3 3 3(即将单词嵌入到三维向量空间中),则 embedding 层应该这样创建:embedding 层中只有一个参数 weight,在创建时它会从标准正态分布中进行初免费云主机域名始化:这里我们可以把 weight 当作 embedding 层的一个权重。接下来再来看一下 nn.Embedding 的输入。直观来看,给定一个已经词元化的句子,将其中的单词输入到 embedding 层应该得到相应的词向量。事实上,nn.Embedding 接受的输入并不是词元化后的句子,而是它的索引形式,即第一章节中提到的 encoded_tokensnn.Embedding 可以接受任何形状的张量作为输入,但因为传入的是索引,所以张量中的每个数字都不应超过 len(vocab) - 1,否则就会报错。接下来,nn.Embedding 的作用就像一个查找表(Lookup Table)一样,通过这些索引在 weight 中查找并返回相应的词向量。细心的读者可能已经看出 nn.Embeddingnn.Linear 似乎很像,那它们到底有什么区别呢?回顾 nn.Linear,若不开启 bias,设输入向量为 x,nn.Linear.weight 对应的矩阵为 A(形状为 hidden_size input_size),则计算方式为:y=xAT其中 x , y 均为行向量。假如 x 是one-hot向量,第 i 个位置是 1 1 1,那么 y 就是 A T 的第 i i 行。现给定一个单词 w ,假设它在 word2idx 中的索引就是 i ,在 nn.Embedding 中,我们根据这个索引 i 去查找 emb.weight 的第 i 行。而在 nn.Linear 中,我们则是将这个索引 i 编码成一个one-hot向量,再去乘上对应的权重矩阵得到矩阵的第 i 行。请看下例:从中我们可以总结出:nn.Linear 接受向量作为输入,而 nn.Embedding 则是接受离散的索引作为输入;nn.Embedding 实际上就是输入为one-hot向量,且不带bias的 nn.Linear。此外,nn.Linear 在运算过程中做了矩阵乘法,而 nn.Embedding 是直接根据索引查表,因此在该情景下 nn.Embedding 的效率显然更高。???? 进一步阅读: [Stack Overflow] What is the difference between an Embedding Layer with a bias immediately afterwards and a Linear Layer in PyTorch?在查阅了PyTorch官方论坛和Stack Overflow的一些帖子后,发现有不少人对 nn.Embedding 中的权重 weight 是怎么更新的感到非常困惑。???? nn.Embedding 的权重实际上就是词嵌入本身事实上,nn.Embedding.weight 在更新的过程中既没有采用 Skip-gram 也没有采用 CBOW。回顾最简单的多层感知机,其中的 nn.Linear.weight 会随着反向传播自动更新。当我们把 nn.Embedding 视为一个特殊的 nn.Linear 后,其更新机制就不难理解了,无非就是按照梯度进行更新罢了。训练结束后,得到的词嵌入是最适合当前任务的词嵌入,而非像word2vec,GloVe这种更为通用的词嵌入。当然我们也可以在训练开始之前使用预训练的词嵌入,例如上述提到的word2vec,但此时应该考虑针对当前任务重新训练或进行微调。假如我们已经使用了预训练的词嵌入并且不想让它在训练过程中自我更新,那么可以尝试冻结梯度,即:???? 进一步阅读:[PyTorch Forums] How nn.Embedding trained?
[PyTorch Forums] How does nn.Embedding work?
[Stack Overflow] Embedding in pytorch
[Stack Overflow] What “exactly” happens inside embedding layer in pytorch?在这一章节中,我们会讲解 nn.Embedding 的所有参数并介绍如何使用预训练的词嵌入。官方文档:padding_idx我们知道,nn.Embedding 虽然可以接受任意形状的张量作为输入,但绝大多数情况下,其输入的形状为 batch_size sequence_length,这要求同一个 batch 中的所有序列的长度相同。回顾1.2节中的例子,语料库中的三个句子的长度相同(拥有相同的单词个数),但事实上这是博主特意选取的三个句子。现实任务中,很难保证同一个 batch 中的所有句子长度都相同,因此我们需要对那些长度较短的句子进行填充。因为输入到 nn.Embedding 中的都是索引,所以我们也需要用索引进行填充,那使用哪个索引最好呢?假设语料库为:我们可以在 word2idx 中新增一个词元 (代表填充词元),并为其分配新的索引:对 encoded_tokens 进行填充:创建 embedding 层并指定 padding_idx:可以看出填充词元对应的词向量是零向量,并且在训练过程中填充词元对应的词向量不会进行更新(始终是零向量)。padding_idx 默认为 None,即不进行填充。max_norm 如果词向量的范数超过了 max_norm,则将其按范数归一化至 max_normmax_norm 默认为 None,即不进行归一化。norm_type当指定了 max_norm 时,norm_type 决定采用何种范数去计算。默认是2-范数。scale_grad_by_freq若将该参数设置为 True,则对词向量 w w w 进行更新时,会根据它在一个 batch 中出现的频率对相应的梯度进行缩放:默认为 Falsesparse若设置为 True,则与 Embedding.weight 相关的梯度将变为稀疏张量,此时优化器只能选择:SGDSparseAdamAdagrad。默认为 False。有些情况下我们需要使用预训练的词嵌入,这时候可以使用 from_pretrained 方法,如下:如果要避免预训练的词嵌入在后续的训练过程中更新,可将 freeze 参数设置为 True:以上就是关于“PyTorch中的nn.Embedding怎么使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道。

相关推荐: vue开发客户端如何配置

这篇文章主要介绍了vue开发客户端如何配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue开发客户端如何配置文章都会有所收获,下面我们一起来看看吧。由于electr免费云主机域名on版本的未知性,可能存在serve可用而bui…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/18 19:23
下一篇 03/18 19:23

相关推荐