目录
1. 位置编码与词嵌入
import torch
import torch.nn as nn
import math
# 定义词向量嵌入的大小
d_model = 512
# 定义位置编码的维度
max_seq_len = 5000
# 定义词向量嵌入层
embedding = nn.Embedding(vocab_size, d_model)
# 定义位置编码函数
def positional_encoding(max_seq_len, d_model):
pe = torch.zeros(max_seq_len, d_model)
for pos in range(max_seq_len):
for i in range(0, d_model, 2):
pe[pos, i] = \
math.sin(pos / (10000 ** ((2 * i)/d_model)))
pe[pos, i + 1] = \
math.cos(pos / (10000 ** ((2 * (i + 1))/d_model)))
return pe
# 生成位置编码
pe = positional_encoding(max_seq_len, d_model)
# 合并词向量嵌入和位置编码
def forward(x):
# 获取词向量嵌入并乘以缩放因子
word_embeddings = embedding(x) * (d_model ** 0.5)
# 添加位置编码
embeddings = word_embeddings + pe[:x.size(0), :]
return embeddings
# 示例输入
input_tensor = torch.LongTensor([[100, 2, 3, 4, 5], [1, 2, 3, 4, 5]])
# 执行前向传播
output = forward(input_tensor)
print(output)
2.余弦距离
import torch
import torch.nn as nn
# 假设我们有一个预训练的词向量嵌入层
vocab_size = 10000 # 词汇表大小
embedding_dim = 100 # 词向量嵌入的维度
embedding = nn.Embedding(vocab_size, embedding_dim)
# 假设我们已经加载了预训练的词向量权重
# 这里我们只是随机初始化权重,实际应用中应该加载预训练的权重
embedding.weight.data.copy_(torch.randn(vocab_size, embedding_dim))
# 将单词转换为索引
# 假设"cat"和"dog"的索引分别是100和200
word_indices = torch.tensor([100, 200], dtype=torch.long)
# 获取词向量嵌入
word_embeddings = embedding(word_indices)
# 计算余弦相似度
def cosine_similarity(emb1, emb2):
return torch.nn.functional.cosine_similarity(emb1, emb2, dim=0)
# 计算"cat"和"dog"的余弦相似度
similarity = cosine_similarity(word_embeddings[0], word_embeddings[1])
print(f"Cosine similarity between 'cat' and 'dog': {similarity.item()}")
标签:nlp,嵌入,embeddings,NLP,torch,77,embedding,word,model
From: https://www.cnblogs.com/cavalier-chen/p/18207375