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

news2025/1/23 4:55:12

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

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.coloradmin.cn/o/1494099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sylar高性能服务器-日志(P57-P60)内容记录

文章目录 P57-P60&#xff1a;序列化模块Varint&#xff08;编码&#xff09;Zigzag&#xff08;压缩&#xff09;class ByteArrayNode&#xff08;链表结构&#xff09;成员变量构造函数写入读取setPositionaddCapacity 测试 P57-P60&#xff1a;序列化模块 ​ 序列化模块通常…

【Java EE】文件内容的读写⸺数据流

目录 &#x1f334;数据流的概念&#x1f338;数据流分类 &#x1f333;字节流的读写&#x1f338;InputStream&#xff08;从文件中读取字节内容)&#x1f33b;示例1&#x1f33b;示例2&#x1f33b;利用 Scanner 进行字符读取 &#x1f338;OutputStream(向文件中写内容&…

当CV遇上transformer(一)ViT模型

当CV遇上transformer(一)ViT模型 我们知道计算机视觉(Computer Vision)&#xff0c;主要包括图像分类、目标检测、图像分割等子任务。 自AlexNet被提出以来&#xff0c;CNN成为了计算机视觉领域的主流架构。CNN网络结构主要由卷积层、池化层以及全连接层3部分组成&#xff0c;其…

Uni-ControlNet: All-in-One Control toText-to-Image Diffusion Models——【论文笔记】

本文发表于NeurIPS 2023 项目官网&#xff1a;Uni-ControlNet: All-in-One Control to Text-to-Image Diffusion Models 一、Introduction 近两年来&#xff0c;扩散模型在图像合成任务中表现优异&#xff0c;尤其是文本到图像&#xff08;T2I&#xff09;扩散模型已成为合成高…

腾达路由器检测环境功能破解MISP基础

在虚拟机上用qemu运行腾达路由器的网站固件会遇到无法识别网络的问题&#xff0c;这篇主要是破解这个功能&#xff0c;使腾达路由器成功在虚拟机上运行&#xff0c;方便漏洞复现 本次用到的腾达路由器版本&#xff1a; https://www.tenda.com.cn/download/detail-3683.html下…

Python 开发图形界面程序

用 Python 语言开发图形界面的程序&#xff0c;有2种选择&#xff1a; Tkinter 基于Tk的Python库&#xff0c;这是Python官方采用的标准库&#xff0c;优点是作为Python标准库、稳定、发布程序较小&#xff0c;缺点是控件相对较少。 PySide2/PySide6 基于Qt 的Python库&#x…

玩家至上:竞技游戏设计如何满足现代玩家的需求?

文章目录 一、现代玩家需求分析二、以玩家体验为核心的游戏设计三、个性化与定制化服务四、强化社交互动与社区建设五、持续更新与优化《游戏力&#xff1a;竞技游戏设计实战教程》亮点编辑推荐内容简介目录获取方式 随着科技的飞速发展和游戏产业的不断壮大&#xff0c;现代玩…

软件测试之Web自动化测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、自动化测试基本介绍 1、自动化测试概述&#xff1a; 什么…

Android布局优化之include、merge、ViewStub的使用,7年老Android一次坑爹的面试经历

前言 开发10年&#xff0c;老码农&#xff0c;曾经是爱奇艺架构 点击领取完整开源项目《安卓学习笔记总结最新移动架构视频大厂安卓面试真题项目实战源码讲义》 师&#xff0c;东芝集团高级工程师&#xff0c;三星架构师。5年之内频繁被辞退。内心拔凉拔凉的&#xff0c;在这五…

Android大厂高级面试题灵魂100问,带你彻底弄明白

“2020年技术没有成长&#xff0c;我今年一定要好好努力学习&#xff01;” “在现在这个公司都工作了3年了&#xff0c;一毛钱工资都没有涨…” “年前真倒霉&#xff0c;老板嫌我工资高&#xff0c;被优化了&#xff0c;年后又遇到了疫情&#xff0c;现在都还没有找到合适的工…

141.乐理基础-男声女声音域、模唱、记谱与实际音高等若干问题说明

上一个内容&#xff1a;140.乐理基础-音程的转位-CSDN博客 上一个内容练习的答案&#xff1a;红色箭头指向的是转为&#xff0c;比如第一个只要写成c低g高都是正确的&#xff0c;不一定非要和图中一样 首先在 12.音域、1C到底是那一组的C 里面写了人声的音域&#xff0c;大致默…

最强照片AI无损放大工具

使用人工智能的能力来放大图像&#xff0c;同时为惊人的结果添加自然的细节。 使用深度学习技术&#xff0c;A.I.GigaPixEL可以放大图像并填满其他调整大小的产品所遗漏的细节。 下载地址&#xff1a;最强照片AI无损放大工具.zip

dolphinscheduler试用(一)(边用边修bug。。。。create tenant error)

&#xff08;作者&#xff1a;陈玓玏&#xff09; 前提&#xff1a;部署好了dolphinscheduler&#xff0c;部署篇见https://blog.csdn.net/weixin_39750084/article/details/136306890?spm1001.2014.3001.5501 官方文档见&#xff1a;https://dolphinscheduler.apache.org/…

MyBatis操作数据库(SQL注入)

本文主要来讲解6大标签&#xff0c;以便更好的MyBatis操作数据库&#xff01; <if>标签<trim>标签<where>标签<set>标签<foreach>标签<include>标签 前提需求&#xff1a; MyBatis是一个持久层框架&#xff0c;和Spring没有任何关系&…

【LeetCode】升级打怪之路 Day 14:二叉树的遍历

今日题目&#xff1a; 144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515. 在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针117. …

Fiddler入门:下载、安装、配置、抓包、customize rules

一、fiddler下载安装 安装包下载链接&#xff1a;https://www.telerik.com/download/fiddler 随便选个用途&#xff0c;填写邮箱&#xff0c;地区选择China&#xff0c;勾选“I accept the Fiddler End User License Agreement”&#xff0c;点击“DownLoad for windows”&…

⭐每天一道leetcode:28.找出字符串中第一个匹配项的下标(简单;暴力解;KMP算法,有难度)

⭐今日份题目 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例1 输入&#xff1a;haystack &q…

3.6作业

作业要求&#xff1a;数据库操作的增、删、改 程序代码&#xff1a; #include<myhead.h> int main(int argc, const char *argv[]) {//定义数据库句柄指针sqlite3 * ppDb NULL;//打开数据库&#xff0c;如果数据库不存在&#xff0c;则创建数据库//将数据库句柄由参数…

移动开发:图像查看器

一、新建ImageViewer模块&#xff0c;添加p1-p9图片(注意mdpi后缀) 二、相关代码 1.MainActivity.java文件代码 package com.example.imageviewer;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.view.MotionEvent; import and…

Jacob使用教程--通过宏来寻找变量名

说明: 这里做个随比,参考资料请见前面的系列文章 问题展示: 对于一个操作,当我们不知道怎么利用jacob写代码时,而且网上也找不到,可以按照如下操作: 比如,我们要删除 word中的文本框 我们根本不知道文本框,这个变量叫什么,在Microsoft文档哪个父目录下面, 可以通过…