词嵌入向量和位置编码向量的整合

词嵌入向量和位置编码向量的整合

flyfish

文本序列 -> 输入词嵌入向量(Word Embedding Vector)-> 词向量 + 位置编码向量(Positional Encoding Vector)

Embedding 的维度使用了3 可以输出打印看结果

from collections import Counter 
import torch
import torch.nn as nn 
import numpy as np
from collections import Counter
import torch
import torch.nn as nn
# 定义 TranslationCorpus 类
class TranslationCorpus:
 
    def __init__(self, sentences):
        self.sentences = sentences
        # 计算源语言和目标语言的最大句子长度,并分别加 1 和 2 以容纳填充符和特殊符号
        self.src_len = max(len(sentence[0].split()) for sentence in sentences) + 1
        self.tgt_len = max(len(sentence[1].split()) for sentence in sentences) + 2
        # 创建源语言和目标语言的词汇表
        self.src_vocab, self.tgt_vocab = self.create_vocabularies()
        # 创建索引到单词的映射
        self.src_idx2word = {v: k for k, v in self.src_vocab.items()}
        self.tgt_idx2word = {v: k for k, v in self.tgt_vocab.items()}
    # 定义创建词汇表的函数
    def create_vocabularies(self):
        # 统计源语言和目标语言的单词频率
        src_counter = Counter(word for sentence in self.sentences for word in sentence[0].split())
        tgt_counter = Counter(word for sentence in self.sentences for word in sentence[1].split())        
        # 创建源语言和目标语言的词汇表,并为每个单词分配一个唯一的索引
        src_vocab = {'<pad>': 0, **{word: i+1 for i, word in enumerate(src_counter)}}
        tgt_vocab = {'<pad>': 0, '<sos>': 1, '<eos>': 2, 
                     **{word: i+3 for i, word in enumerate(tgt_counter)}}        
        return src_vocab, tgt_vocab
    # 定义创建批次数据的函数
    def make_batch(self, batch_size, test_batch=False):
        input_batch, output_batch, target_batch = [], [], []
        # 随机选择句子索引
        sentence_indices = torch.randperm(len(self.sentences))[:batch_size]
        for index in sentence_indices:
            src_sentence, tgt_sentence = self.sentences[index]
            # 将源语言和目标语言的句子转换为索引序列
            src_seq = [self.src_vocab[word] for word in src_sentence.split()]
            tgt_seq = [self.tgt_vocab['<sos>']] + [self.tgt_vocab[word] \
                         for word in tgt_sentence.split()] + [self.tgt_vocab['<eos>']]            
            # 对源语言和目标语言的序列进行填充
            src_seq += [self.src_vocab['<pad>']] * (self.src_len - len(src_seq))
            tgt_seq += [self.tgt_vocab['<pad>']] * (self.tgt_len - len(tgt_seq))            
            # 将处理好的序列添加到批次中
            input_batch.append(src_seq)
            output_batch.append([self.tgt_vocab['<sos>']] + ([self.tgt_vocab['<pad>']] * \
                                    (self.tgt_len - 2)) if test_batch else tgt_seq[:-1])
            target_batch.append(tgt_seq[1:])        
          # 将批次转换为 LongTensor 类型
        input_batch = torch.LongTensor(input_batch)
        output_batch = torch.LongTensor(output_batch)
        target_batch = torch.LongTensor(target_batch)            
        return input_batch, output_batch, target_batch
    


sentences = [
    ['like tree like fruit','羊毛 出在 羊身上'],
    ['East west home is best', '金窝 银窝 不如 自己的 草窝'],
 ]    
# 创建语料库类实例
d_embedding = 3 # Embedding 的维度
corpus = TranslationCorpus(sentences)

# 生成正弦位置编码表的函数,用于在 Transformer 中引入位置信息
def get_sin_enc_table(n_position, embedding_dim):
    #------------------------- 维度信息 --------------------------------
    # n_position: 输入序列的最大长度
    # embedding_dim: 词嵌入向量的维度
    #-----------------------------------------------------------------    
    # 根据位置和维度信息,初始化正弦位置编码表
    sinusoid_table = np.zeros((n_position, embedding_dim))    
    # 遍历所有位置和维度,计算角度值
    for pos_i in range(n_position):
        for hid_j in range(embedding_dim):
            angle = pos_i / np.power(10000, 2 * (hid_j // 2) / embedding_dim)
            sinusoid_table[pos_i, hid_j] = angle    
    # 计算正弦和余弦值
    sinusoid_table[:, 0::2] = np.sin(sinusoid_table[:, 0::2])  # dim 2i 偶数维
    sinusoid_table[:, 1::2] = np.cos(sinusoid_table[:, 1::2])  # dim 2i+1 奇数维    
    #------------------------- 维度信息 --------------------------------
    # sinusoid_table 的维度是 [n_position, embedding_dim]
    #----------------------------------------------------------------   
    return torch.FloatTensor(sinusoid_table)  # 返回正弦位置编码表


print(corpus.src_len)#'6
print(corpus.src_vocab)#{'<pad>': 0, 'like': 1, 'tree': 2, 'fruit': 3, 'East': 4, 'west': 5, 'home': 6, 'is': 7, 'best': 8}
print("get_sin_enc_table:",get_sin_enc_table(corpus.src_len+1, d_embedding))
src_emb = nn.Embedding(len(corpus.src_vocab), d_embedding) # 词嵌入层
pos_emb = nn.Embedding.from_pretrained( get_sin_enc_table(corpus.src_len+1, d_embedding), freeze=True) # 位置嵌入层
# src_emb: Embedding(9, 3)
# pos_emb: Embedding(7, 3)
print("src_emb:",src_emb.weight)
print("pos_emb:",pos_emb.weight)


#-----------------------------------------------------------------
# 创建一个从 1 到 source_len 的位置索引序列
enc_inputs, dec_inputs, target_batch = corpus.make_batch(batch_size=1,test_batch=True) 
print("enc_inputs:",enc_inputs)
pos_indices = torch.arange(1, enc_inputs.size(1) + 1).unsqueeze(0).to(enc_inputs)
print("pos_indices:",pos_indices)
#------------------------- 维度信息 --------------------------------
# pos_indices 的维度是 [1, source_len]
#-----------------------------------------------------------------             
# 对输入进行词嵌入和位置嵌入相加 [batch_size, source_len,embedding_dim]
a= src_emb(enc_inputs) 
b= pos_emb(pos_indices)
print("src_emb(enc_inputs)",a)
print("pos_emb(pos_indices)",b)
enc_outputs = a+b 
print("enc_outputs:",enc_outputs)
6
{'<pad>': 0, 'like': 1, 'tree': 2, 'fruit': 3, 'East': 4, 'west': 5, 'home': 6, 'is': 7, 'best': 8}
get_sin_enc_table: tensor([[ 0.0000,  1.0000,  0.0000],
        [ 0.8415,  0.5403,  0.0022],
        [ 0.9093, -0.4161,  0.0043],
        [ 0.1411, -0.9900,  0.0065],
        [-0.7568, -0.6536,  0.0086],
        [-0.9589,  0.2837,  0.0108],
        [-0.2794,  0.9602,  0.0129]])
src_emb: Parameter containing:
tensor([[-1.2816e+00, -6.5114e-01,  2.9241e-01],
        [-9.8684e-01, -7.9353e-01,  5.9976e-01],
        [-1.1094e+00,  7.7750e-02,  7.6362e-01],
        [-1.4485e+00, -7.4217e-01,  1.5868e+00],
        [ 6.2311e-02,  3.3751e-01, -2.4862e-01],
        [-2.1817e-01, -4.4703e-01, -6.0495e-01],
        [ 1.0660e+00, -1.3480e-03, -1.8772e-01],
        [ 1.0988e+00, -1.7080e-01, -2.7901e-01],
        [-8.7047e-01,  1.2164e+00, -1.3154e+00]], requires_grad=True)
pos_emb: Parameter containing:
tensor([[ 0.0000,  1.0000,  0.0000],
        [ 0.8415,  0.5403,  0.0022],
        [ 0.9093, -0.4161,  0.0043],
        [ 0.1411, -0.9900,  0.0065],
        [-0.7568, -0.6536,  0.0086],
        [-0.9589,  0.2837,  0.0108],
        [-0.2794,  0.9602,  0.0129]])
enc_inputs: tensor([[4, 5, 6, 7, 8, 0]])
pos_indices: tensor([[1, 2, 3, 4, 5, 6]])
src_emb(enc_inputs) tensor([[[ 0.0623,  0.3375, -0.2486],
         [-0.2182, -0.4470, -0.6049],
         [ 1.0660, -0.0013, -0.1877],
         [ 1.0988, -0.1708, -0.2790],
         [-0.8705,  1.2164, -1.3154],
         [-1.2816, -0.6511,  0.2924]]], grad_fn=<EmbeddingBackward0>)
pos_emb(pos_indices) tensor([[[ 0.8415,  0.5403,  0.0022],
         [ 0.9093, -0.4161,  0.0043],
         [ 0.1411, -0.9900,  0.0065],
         [-0.7568, -0.6536,  0.0086],
         [-0.9589,  0.2837,  0.0108],
         [-0.2794,  0.9602,  0.0129]]])
enc_outputs: tensor([[[ 0.9038,  0.8778, -0.2465],
         [ 0.6911, -0.8632, -0.6006],
         [ 1.2071, -0.9913, -0.1813],
         [ 0.3420, -0.8244, -0.2704],
         [-1.8294,  1.5001, -1.3047],
         [-1.5610,  0.3090,  0.3053]]], grad_fn=<AddBackward0>)

在这里插入图片描述
假如 transformer 使用了 512 维的词向量 word embeddings
也就是上面的
对输入进行词嵌入和位置嵌入相加 [batch_size, source_len,embedding_dim]

 enc_outputs = src_emb(enc_inputs) + pos_emb(pos_indices)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/433110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Python操作MySQL的各种功能?高级用法?

当今互联网时代&#xff0c;数据处理已经成为了一个非常重要的任务。而MySQL作为一款开源的关系型数据库&#xff0c;被广泛应用于各种场景。本篇博客将介绍如何使用Python操作MySQL的各种功能&#xff0c;以及一些高级用法。 连接MySQL 在Python中&#xff0c;我们可以使用p…

不同用户同时编辑商品资料导致的db并发覆盖

背景 这个问题的背景来源于有用户反馈&#xff0c;他在商品系统中对商品打的标签不见了&#xff0c;影响到了前端页面上商品的资料显示 不同用户编辑同一商品导致的数据覆盖问题分析 查询操作日志发现用户B确实编辑过商品资料&#xff0c;并且日志显示确实打上了标签&#x…

【论文阅读】Mamba:选择状态空间模型的线性时间序列建模(二)

文章目录 3.4 一个简化的SSM结构3.5 选择机制的性质3.5.1 和门控机制的联系3.5.2 选择机制的解释 3.6 额外的模型细节A 讨论&#xff1a;选择机制C 选择SSM的机制 Mamba论文 第一部分 Mamba:选择状态空间模型的线性时间序列建模(一) 3.4 一个简化的SSM结构 如同结构SSM&#…

C++入门项目:通讯录管理系统

文章目录 一、步骤拆分1.系统需求2.显示菜单3.添加联系人4.显示联系人5.删除联系人6.查找联系人7.修改联系人8.清空通讯录9.退出功能 二、完整代码&#xff08;200行&#xff09;三、手把手视频教程 一、步骤拆分 1.系统需求 利用C来实现一个通讯录管理系统&#xff0c;系统中…

[计算机效率] 软件优化及垃圾清理

1.7 软件优化及垃圾清理 1.7.1 Advanced SystemCare(优化清理) Advanced SystemCare是一款功能强大的系统性能优化软件&#xff0c;可以全方位诊断系统&#xff0c;找到性能瓶颈并进行有针对性的优化&#xff0c;提升系统运行速度和网络速度&#xff0c;还可以清理加速和保护…

串联谐振电路基础知识2(总结篇)

我们发现对于串联谐振电路,整个电路来讲,不是纯感性,也不是纯容性,也不一定是纯阻性 如果,感抗=容抗,那么感抗容抗刚好抵消,谐振电路呈纯阻性了 如果是,感抗>容抗,那么串联谐振电路就是,感抗抵消容抗之后还剩下部分感抗。对于这个串联谐振电路而言,他就是等效成感…

基于springboot的作业管理系统论文

摘 要 使用旧方法对作业管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在作业管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的作业管理系统有…

七牛云 上传 文件 file is empty

问题 七牛云 上传 文件 file is empty 详细问题 笔者进行Android 开发&#xff0c;使用URI上传文件&#xff0c;上传核心代码 具体报错信息 {ver:8.7.0,ResponseInfo:1709276329412131,status:-6, reqId:, xlog:null, xvia:null, host:null, time:1709276329,error:file is…

运维知识点-ACCESS

ACCESS access 扫出后缀为asp的数据库文件 迅雷下载&#xff0c;直接改后缀为.mdbMicrosoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点&#xff0c;是 Microsoft Office 的系统程序之一。 Microsoft Off…

JavaScript变量声明提升,网站前端开发学习

第一个阶段&#xff0c;开发环境和工具准备 浏览器 &#xff08;Google&#xff0c;FireFox&#xff0c;…&#xff09;下载&#xff0c;安装前端开发工具vscode&#xff0c;下载、安装 node、npm、webpack、webpack-cli、cnpm&#xff0c;配置前端开发环境下载、配置PHP和MyS…

【数据结构】队列 循环队列 双端队列——顺序队列+链式队列完整代码(创建、入队、出队)

2.队列 2.1 队列的定义 定义 只允许在一端进行插入&#xff0c;另一端删除的线性表。 特征&#xff1a;先进先出&#xff08;First In First Out->FIFO&#xff09; 重要术语&#xff1a;队头、队尾、空队列 2.2 队列的顺序存储 2.2.1 初始化 结构体 typedef struct{…

unity学习(44)——选择角色菜单——顺利收到服务器的数据

本节的思路参考自&#xff0c;内容并不相同&#xff1a;13ARPG网络游戏编程实践&#xff08;十三&#xff09;&#xff1a;角色选择UI及创建面板制作&#xff08;四&#xff09;_哔哩哔哩_bilibili 现在的代码写在MessageManager.cs中&#xff0c;函数名UserHandler(是从OnMess…

蓝牙系列三:BLE协议栈各层数据格式解析

继续蓝牙的学习,本篇还是根据韦东山老师的视频理解以及整理。 对于BLE系统,它分为上下两块。上面那一块,我们称为host主机。下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片。如下图所示(Host + Controller,他们的接口是HCI) 对于host这一块,它运行于linu…

YOLOv8-Openvino-ByteTrack【CPU】

纯检测如下&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 注&#xff1a;YOLOv8和YOLOv9代码内容基本一致&#xff01; 全部代码Github&…

OJ_链表合并

题干 C实现 #include <stdio.h> #include <list>using namespace std;int main() {int s1, s2, val;scanf("%d", &s1);list<int> ls1, ls2;for (int i 0; i < s1; i) {scanf("%d", &val);ls1.push_back(val);}scanf("…

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor

arxiv 2023 08的论文 1 intro 1.1 人类流动性的独特性 人类流动性的独特特性在于其固有的规律性、随机性以及复杂的时空依赖性 ——>准确预测人们的行踪变得困难近期的研究利用深度学习模型的时空建模能力实现了更好的预测性能 但准确性仍然不足&#xff0c;且产生的结果…

GIS之深度学习06:CUDA12安装(适配版)

CUDA&#xff08;Compute Unified Device Architecture&#xff09;是NVIDIA开发的并行计算平台和编程模型&#xff0c;用于利用NVIDIA GPU的并行计算能力&#xff0c;它允许开发者使用类似于C语言的编程语言编写并行程序&#xff0c;利用GPU的大规模并行计算能力加速各种类型的…

3D行业趋势2024

3D 行业似乎总是想出新的方法来加快自身的变革速度&#xff0c;并一路上给我们带来惊喜。 2024 年&#xff0c;3D 景观将会发生前所未有的变化&#xff0c;但仍有一些线索可以帮助我们指明正确的方向。 话虽如此&#xff0c;以下是 3D 工程行业正在着手、扩大或可能在来年深入参…

矩阵爆破逆向-条件断点的妙用

不知道你是否使用过IDA的条件断点呢&#xff1f;在IDA进阶使用中&#xff0c;它的很多功能都有大作用&#xff0c;比如&#xff1a;ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大&#xff0c;配合IDA-python的输出语句能够大杀特杀&#xff01; 那么本文就介绍一下这个…

Kaggle竞赛入门级---泰坦尼克号飞船(0.80)

由于数据集需要翻墙&#xff0c;先附上数据集 链接&#xff1a;https://pan.baidu.com/s/10MTlK_3kXMRw6JsSTT8tVg?pwd6666 提取码&#xff1a;6666 注意正文会讲述我的步骤处理思路&#xff08;代码可能并不会完整的放在正文中&#xff08;这过于繁琐了&#xff09;&#…
最新文章