深度学习-nlp-NLP之trainsformer位置编码与余弦距离--77

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()}")
posted @ 2024-05-22 23:28  jack-chen666  阅读(3)  评论(0编辑  收藏  举报