首页 > 其他分享 >NLP深度网络中self.embedding(x)词嵌入后降维方法

NLP深度网络中self.embedding(x)词嵌入后降维方法

时间:2023-04-19 17:33:39浏览次数:48  
标签:NLP seq dim self 张量 降维 length embedding size

在自然语言处理中的循环神经网络中,经常使用torch定义类,self.embedding(x)中,x是输入,介绍self.embedding(x)返回结果,以及结果的形状,并解释这个形状

在自然语言处理中的循环神经网络中,使用PyTorch定义类时通常会包含一个嵌入层(embedding layer)。在嵌入层中,使用self.embedding(x)语句将一个整数张量x作为输入,并将其转换为一个浮点数张量。

具体来说,嵌入层将每个整数x映射到一个长度为embedding_dim的浮点数向量,其中embedding_dim是嵌入向量的维度。这些浮点数向量可以被认为是嵌入空间中的点,表示输入序列中每个单词的语义信息。因此,嵌入层的作用是将整数序列转换为连续向量空间中的向量表示。

self.embedding(x)返回的结果是一个形状为[batch_size, seq_length, embedding_dim]的三维浮点数张量,
其中:

batch_size表示输入数据的批次大小,
seq_length表示输入序列的长度,
embedding_dim表示嵌入向量的维度。

例如,如果我们有一个批次大小为32、序列长度为10、嵌入向量维度为100的输入张量x,则self.embedding(x)将返回一个形状为[32, 10, 100]的浮点数张量。这个张量的每个元素都是一个浮点数值,表示输入序列中每个单词在嵌入空间中的向量表示。

需要注意的是,这个张量的形状可能会根据输入的大小和模型的设计而有所不同。但总体来说,这个张量的形状反映了嵌入层将输入序列转换为连续向量空间中的向量表示的结果。

如何将[batch_size, seq_length, embedding_dim]张量,按照dim=0展开,对每一个[seq_length, embedding_dim]2维张量进行处理,最后将所有dim=0展开处理后的结果,重新组成3维张量

可以使用PyTorch中的view和permute函数来完成这个操作。具体步骤如下:

  • 使用view函数将[batch_size, seq_length, embedding_dim]张量变形为[batch_size*seq_length, embedding_dim]二维张量。

  • 对变形后的二维张量进行处理,比如可以使用全连接层进行处理。

  • 使用view函数将处理后的二维张量变形为[batch_size, seq_length, processed_dim]张量,其中processed_dim为处理后的结果维度。

  • 使用permute函数将维度顺序恢复为[batch_size, seq_length, processed_dim]。

下面是代码示例:

import torch

# 定义处理函数
def process_func(input):
    # 对二维张量进行处理,这里使用全连接层进行处理
    processed = torch.nn.Linear(input.shape[1], 128)(input)
    return processed

# 输入张量
input_tensor = torch.randn(4, 10, 32)

# 将张量展开为二维张量
batch_size, seq_length, embedding_dim = input_tensor.shape
flat_input = input_tensor.view(batch_size*seq_length, embedding_dim)

# 对二维张量进行处理
processed = process_func(flat_input)

# 将处理后的二维张量变形为三维张量
processed_dim = processed.shape[1]
output_tensor = processed.view(batch_size, seq_length, processed_dim).permute(0, 1, 2)

# 输出结果
print(output_tensor.shape)

这段代码首先将[batch_size, seq_length, embedding_dim]的张量变形为[batch_size*seq_length, embedding_dim]的二维张量,然后使用process_func函数对二维张量进行处理,最后将处理后的结果变形为[batch_size, seq_length, processed_dim]的三维张量,并恢复维度顺序。

NLP深度网络中self.embedding(x)词嵌入后降维方法_二维

标签:NLP,seq,dim,self,张量,降维,length,embedding,size
From: https://blog.51cto.com/guog/6207030

相关文章

  • 介绍ServiceSelf项目
    ServiceSelf做过服务进程功能的同学应该接触过Topshelf这个项目,它在.netframework年代神一搬的存在,我也特别喜欢它。遗憾的是在.netcore时代,这个项目对.netcore程序的支持没有跟进,最近项目也存档停止更新了。我在开源的一些工具里实现放了自安装和卸载服务的功能的代码,本着够用......
  • 【NLP开发】Python实现聊天机器人(OpenAI,开发指南笔记)
    1、开始使用1.1介绍OpenAIAPI几乎可以应用于任何涉及理解或生成自然语言或代码的任务。我们提供一系列具有不同功率水平的型号,适用于不同的任务,并能够微调您自己的定制模型。这些模型可用于从内容生成到语义搜索和分类的所有内容。提示和完成(Promptsandcompletions)compl......
  • UVa 10049 Self-describing Sequence (自描述序列&二分递推)
    10049-Self-describingSequenceTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=34&page=show_problem&problem=990SolomonGolomb's self­describingsequence  istheonlynon­decreas......
  • nlp推理后处理中的一些技术细节
    前言:在一些序列生成任务中,比如seq2seq的机器翻译模型,或者是验证码识别的CTC算法中,输出的每一个时间步都会有一个分布。最终的序列会使用BeamSearch或者Viterbi等算法搜索Top-K概率的序列。这类方法介于逐时间步argmax的完全贪心策略和全局动态规划的优化策略之间。常......
  • NLP新范式(Prompt/Instruct)
    NLP的四范式NLP发展到今天已经进入到了LLM的时代,随着模型越来越大,在zero-shot/few-shot的情形下也表现的越来越好,NLP也进入到了新的研究范式里面。学术界按发展时间线将NLP归纳到四个范式:1),传统的基础学习范式。2),基于word2vec,cnn,rnn的全监督深度学习范式。......
  • 解密prompt系列5. APE+SELF=自动化指令集构建代码实现
    上一章我们介绍了不同的指令微调方案,这一章我们介绍如何降低指令数据集的人工标注成本!这样每个人都可以构建自己的专属指令集,哈哈当然我也在造数据集进行时~介绍两种方案SELFInstruct和AutomaticPromptEngineer,前者是基于多样的种子指令,利用大模型的上下文和指令理解能力,......
  • 投影是一种降维方法
    这里像是去掉无用的维度。   ......
  • 机器学习(五):混合高斯聚类(求聚类标签)+PCA降维(3维降2维)习题
    使用混合高斯模型GMM,计算如下数据点的聚类过程:\(Data=np.array([1,2,6,7])\)均值初值为:\(\mu_1,\mu_2=1,5\)权重初值为:\(w_1,w_2=0.5,0.5\)方差:\(std_1,std_2=1,1\)\(K=2\)10次迭代后数据的聚类标签是多少?采用python代码实现:fromscipyimport......
  • Sequential Recommendation via Stochastic Self-Attention
    目录概符号说明MotivationSTOSA代码FanZ.,LiuZ.,WangA.,NazariZ.,ZhengL.,PengH.andYuP.S.Sequentialrecommendationviastochasticself-attention.InternationalWorldWideWebConference(WWW),2022.概Stochasticembeddings和Wassersteinattent......
  • A C++ program that prints itself
    #include<iostream>usingnamespacestd;intmain(){strings="cout<<\"#include<iostream>\\nusingnamespacestd;\\n\\nintmain(){\\nstrings=\\\"\";\nfor(chari:s)\nif(i==�......