学习总结
文章目录
- 学习总结
- 一、nn.Embedding
- 二、代码栗子
* - 2.1 通过embedding降维
- 2.2 RNN中用embedding改进
- 2.3 deepFM模型中embedding
- Reference
一、nn.Embedding
CLASStorch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False, _weight=None, device=None, dtype=None)[
torch.nn.Embedding
经常用来存储单词embedding,使用对应indices进行检索对应的embedding。从上面的官方参数看:
- 输入(最重要的还是前三个参数):
- torch.nn.Embedding(
- num_embeddings, – 词典的大小尺寸,比如总共出现5000个词,那就输入5000。此时index为(0-4999
- embedding_dim,– 嵌入向量的维度,即用多少维来表示一个符号。
- padding_idx=None,– 填充id,比如,输入长度为100,但是每次的句子长度并不一样,后面就需要用统一的数字填充,而这里就是指定这个数字,这样,网络在遇到填充id时,就不会计算其与其它符号的相关性。(初始化为0)
- (不常用)max_norm=None, – 最大范数,如果嵌入向量的范数超过了这个界限,就要进行再归一化。
- (不常用)norm_type=2.0, – 指定利用什么范数计算,并用于对比max_norm,默认为2范数。
-
scale_grad_by_freq=False, 根据单词在mini-batch中出现的频率,对梯度进行放缩。默认为False.
-
sparse=False, – 若为True,则与权重矩阵相关的梯度转变为稀疏张量。
- _weight=None)
- 输出:[规整后的句子长度,样本个数(batch_size),词向量维度]
注:
- 对句子进行规整,即对长度不满足条件的句子进行填充pad(填充的值也可以自己选定),另外句子结尾的EOS也算作一个词。
- 可以通过
weight
看对应的embedding字典矩阵对应的初始化数值,一般是通过正态分布进行初始化。
二、代码栗子
2.1 通过embedding降维
独热编码向量:维度会太高、向量系数、硬编码。
通过embedding将向量编码为低维、稠密的向量(从data中学习)。
一个1乘4维度矩阵传入10乘3的nn.embedding中,然后得到1乘4乘3矩阵:
embedding = nn.Embedding(10, 3, padding_idx=2)
print(embedding.weight, "\n")
input = torch.LongTensor([[0,2,0,5]])
print(input.shape, "\n")
ans2 = embedding(input)
ans2.shape
ans2
对应的结果如下,可以看到分别检索出对应的第0,2,0,5行embedding默认的初始权重数据:
Parameter containing:
tensor([[-0.8261, 1.9007, 1.4342],
[ 1.6798, -0.3864, -1.0726],
[ 0.0000, 0.0000, 0.0000],
[-0.9938, 0.3280, 0.1925],
[-0.2799, -0.9858, -0.7124],
[ 0.4406, 0.3621, -0.1915],
[-0.1846, 0.2060, -0.4933],
[-0.4918, 0.0625, -0.5818],
[ 0.6995, 0.6223, -1.4094],
[ 0.3378, -1.0894, -0.7570]], requires_grad=True)
torch.Size([1, 4])
tensor([[[-0.8261, 1.9007, 1.4342],
[ 0.0000, 0.0000, 0.0000],
[-0.8261, 1.9007, 1.4342],
[ 0.4406, 0.3621, -0.1915]]], grad_fn=<EmbeddingBackward0>)
如果input是对应的2乘4矩阵:
import torch
import torch.nn as nn
from torch.autograd import Variable
embedding = nn.Embedding(10, 3)
input1 = torch.LongTensor([[1, 2, 4, 5],
[4, 3, 2, 9]])
emb1 = embedding(input1)
print(emb1)
print(emb1.shape)
print('-' * 60)
embedding = nn.Embedding(10, 3, padding_idx = 0)
input2 = Variable(torch.LongTensor([[0, 2, 0, 5]]))
emb2 = embedding(input2)
print(emb2)
print(emb2.shape)
`python
tensor([[[ 0.3004, -0.7126, 0.8605],
[ 0.1484, -0.9476, 1.0352],
[ 2.2382, -0.3619, -1.6866],
[-0.2713, 0.3627, 0.4067]],
[[ 2.2382, -0.3619, -1.6866],
[ 1.2409, 0.6028, 0.0371],
[ 0.1484, -0.9476, 1.0352],
[-0.5018, 0.3566, -0.6405]]], grad_fn=<EmbeddingBackward>)
torch.Size([2, 4, 3])
Original: https://blog.csdn.net/qq_35812205/article/details/125303611
Author: 山顶夕景
Title: 【Pytorch基础教程28】浅谈torch.nn.embedding
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/707536/
转载文章受原作者版权保护。转载请注明原作者出处!