Embedding #notebook

Embedding

上一个篇章huggingface tokenizer #notebook我们讲解了tokenizer的使用,这一个篇章我们继续讲解所谓的embedding,这是通向模型的第一个层,它实际上就是一个全连接层,那么从一个text文本’我爱中南大学’,经过tokenizer得到了每个token在vocab.txt中的id编码,即[101, 2769, 4263, 704, 1298, 1920, 2110, 102] (ps:别忘了101和102在bert词表中的含义),那么接下来经过embedding层的时候会得到什么呢?

整个过程可以如下图所示:

在这里插入图片描述

一个batch的文本有b个,每个文本的长度为l,那么经过tokenizer得到了一个 b × l b\times l b×l的token id矩阵,接着通过embedding层,这个embedding层是 n × d n \times d n×d的全连接层(其中n代表词表的大小,d映射成的词向量的维度),得所谓的token embedding,它的形状是 b × l × d b \times l \times d b×l×d,这个时候就有人会困惑了, b × l b \times l b×l的矩阵与 n × d n \times d n×d的矩阵是通过怎样的计算得到 b × l × d b \times l \times d b×l×d的矩阵的呢?这貌似也不是矩阵乘法啊?

下面我们就来解惑:

来龙去脉还得从embedding的来历说起,此处省略一万字,详情可以知乎之[手动\dog]。

当我们得到所谓的token id的时候,不能只把他看成一个number,而是要看成一个one-hot编码的向量,这么一说是不是就恍然大悟了,这个形状为 b × l b \times l b×l的token id矩阵其实还有一个维度,那就是在每个token上可以张成一个 1 × n 1 \times n 1×n的one-hot编码向量,每个token在各自token id处的one-hot向量取值为1,其余地方都为0,举个例子,比如上面"我爱中南大学"中的"我"在词表中的id是2769,假设整个词表有3000个token,那么"我"的one-hot编码就是
[ 0 , … , 0 ⏟ 2769 个 , 1 , 0 , … , 0 ⏟ 230 个 ] \underbrace{[0,\ldots,0}_{2769\text{个}},1,\underbrace{0,\ldots,0}_{230\text{个}}] 2769 [0,,0,1,230 0,,0]
那么在计算的时候呢,就是每个这样的one-hot向量与embedding进行矩阵乘法,这就很简单了 1 × n 1 \times n 1×n的行向量与 n × d n \times d n×d的矩阵相乘得到 1 × d 1 \times d 1×d的token embedding,也就是俗称的词向量

一个简单的例子如下:
( 0 1 0 0 0 0 0 1 0 0 ) ⏟ Token的one-hot编码 × ( w 11 w 12 w 13 w 21 w 22 w 23 w 31 w 32 w 33 w 41 w 42 w 43 w 51 w 52 w 53 ) = ( w 21 w 22 w 23 w 31 w 32 w 33 ) ⏟ Token的embedding编码 \underbrace{\begin{pmatrix} &0 &1 &0 &0 &0 \\ &0 &0 &1 &0 &0 \end{pmatrix}}_{\text{Token的one-hot编码}}\times \begin{pmatrix} &w_{11} &w_{12} &w_{13} \\ &w_{21} &w_{22} &w_{23} \\ &w_{31} &w_{32} &w_{33} \\ &w_{41} &w_{42} &w_{43} \\ &w_{51} &w_{52} &w_{53} \\ \end{pmatrix}= \underbrace{\begin{pmatrix} &w_{21} &w_{22} &w_{23} \\ &w_{31} &w_{32} &w_{33} \\ \end{pmatrix}}_{\text{Token的embedding编码}} Tokenone-hot编码 (0010010000)× w11w21w31w41w51w12w22w32w42w52w13w23w33w43w53 =Tokenembedding编码 (w21w31w22w32w23w33)

好了,有了这个直观的认识,下面来写写代码吧!

pytorch中embedding

pytorch中nn模块已经实现了embedding层

参考代码如下:

import torch
import torch.nn as nn

# 创建一个词汇表大小为10,嵌入维度为3的词嵌入层
# 换句话说embedding的形状是n*d(10*3)
embedding = nn.Embedding(num_embeddings=10, embedding_dim=3)
# 获取权重
embedding_weights = embedding.weight
print(embedding_weights)
# 随机生成一个包含6个单词索引的张量
# 换句话说 input_indices的形状是b*l(5*6)
input_indices = torch.randint(0, 10, (5,6))
print(input_indices)
# 通过词嵌入层获取对应的嵌入向量
embedded_vectors = embedding(input_indices)
# 得到的embedded_vectors形状肯定是b*l*d(5*6*3)
print(embedded_vectors.shape)
# 得到第一个句子中所有token的词向量
print(embedded_vectors[0,:,:])

参考输出如下:

Parameter containing:
tensor([[-0.1934,  0.6466,  0.5258],
        [ 0.5738, -0.9027,  0.4368],
        [-1.0536, -0.4649,  0.2745],
        [-0.8986, -1.9465,  0.6572],
        [ 0.4368,  0.7227, -0.1527],
        [ 0.2178, -0.2536, -0.6115],
        [-0.1638, -0.0326,  0.0175],
        [ 0.4321, -0.0515,  0.9138],
        [-0.2880,  0.6950,  0.9472],
        [ 0.4437,  1.4020, -0.4609]], requires_grad=True)
tensor([[8, 0, 9, 6, 1, 1],
        [4, 8, 2, 6, 8, 8],
        [2, 1, 0, 8, 7, 7],
        [2, 1, 7, 2, 6, 0],
        [8, 3, 4, 1, 5, 4]])
torch.Size([5, 6, 3])
tensor([[-0.2880,  0.6950,  0.9472],
        [-0.1934,  0.6466,  0.5258],
        [ 0.4437,  1.4020, -0.4609],
        [-0.1638, -0.0326,  0.0175],
        [ 0.5738, -0.9027,  0.4368],
        [ 0.5738, -0.9027,  0.4368]], grad_fn=<SliceBackward0>)

不难看出,第一个句子[8, 0, 9, 6, 1, 1]中每一个token id对应的词向量的取值在embedding层的行标与token id是一致。

可以手动验证一下计算的对不对。


当然,在现在的语言模型中embedding层所做的事情远不止编码这么简单,就以bert为例,除了得到token embedding,还会得到position embedding,token_type_embedding,以及还会进行LN和dropout等等。这些就留给读者自己探索吧!

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

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

相关文章

【微服务】以模块化单体架构开发微服务应用

目录 推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战我们知道,起初,单体应用有显著的优势:它们更容易开发和部署。从开发人员的角度来看,这种简单性是有益的。一切都是集中的,可以快速更新任何部分的业务逻辑并立即看到结果。这种开…

matlab 去除海图的右上角的刻度

matlab 去除海图的右上角的刻度 matlab 去除海图的右上角的刻度 去除&#xff1a; 图片 未去除&#xff1a; 本期不提供图片的代码&#xff1a;以后收费发布&#xff1b;整理中&#xff1b; 本期思路解决方法来自物理海洋科研群中 只需要把m_grid的代码484-485和569-570行…

Redis消息队列与thinkphp/queue操作

业务场景 场景一 用户完成注册后需要发送欢迎注册的问候邮件、同时后台要发送实时消息给用户对应的业务员有新的客户注册、最后将用户的注册数据通过接口推送到一个营销用的第三方平台。 遇到两个问题&#xff1a; 由于代码是串行方式&#xff0c;流程大致为&#xff1a;开…

蓝桥杯day12刷题日记

P8720 [蓝桥杯 2020 省 B2] 平面切分 思路&#xff1a;首先借用dalao的图解释一下&#xff0c;又多出一条与当前平面任意一条直线都不重合线时&#xff0c;多了的平面是交点数1&#xff0c;所以用双层循环每次往里面加一条直线&#xff0c;计算交点 #include <iostream>…

生日悖论与概率分析:如何运用随机算法解答生日问题

生日&#xff0c;这个我们每年都会庆祝的特殊日子&#xff0c;在概率学和随机算法中却隐藏着许多有趣的秘密。今天&#xff0c;我们就来探讨一下如何利用概率分析和随机算法来解决与生日有关的几个常见问题&#xff1a;一次聚会需要邀请多少人&#xff0c;才能让其中3人的生日很…

嵌入式多层总线矩阵结构介绍

嵌入式系统中&#xff0c;多层总线矩阵结构是一种常见的总线连接方式&#xff0c;用于连接处理器核、内存、外设和其他系统组件&#xff0c;以实现数据传输和控制信号的交换。本文将介绍嵌入式多层总线矩阵结构的基本概念、主要特点以及在实际应用中的优势。 以下是我整理的关…

阿里云服务器价格购买价格表,2024新版报价查询

2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

【算法每日一练]-动态规划(保姆级教程 篇17 状态压缩)#POJ1185:炮兵阵地 #互不侵犯

目录 今日知识点&#xff1a; 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1和i-2行进行不断转移 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1行进行状态匹配&#xff0c;然后枚举国王数转移 POJ1185&#xff1a;炮兵阵地 思路&#xff1a; 题目&#xff1a;互…

代码随想录|Day27|贪心02|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

122.买卖股票的最佳时机II 本题可以将最终利润分解为每日利润&#xff1a; 假如第 0 天买入&#xff0c;第 3 天卖出&#xff0c;那么利润为&#xff1a;prices[3] - prices[0]。 相当于(prices[3] - prices[2]) (prices[2] - prices[1]) (prices[1] - prices[0])。 如下图所…

机器人流程自动化技术(RPA)金融应用指南

1 范围 本文件提供了机器人流程自动化技术在金融领域应用的参考框架、技术设计、场景应用、安全管理、 成效评估等指南。 本文件适用于金融机构开展机器人流程自动化技术应用的产品设计、软件开发、系统评估等。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成…

深入探索JDK动态代理:从入门到原理的全面解析

文章目录 基本概念入门案例实现JDK动态代理的步骤入门实操拓展--动态生成代理类的几种方法方式一&#xff1a;通过getProxyClass方法获取代理实例方式二&#xff1a;通过newProxyInstance方法获取代理实例&#xff08;常用&#xff01;&#xff09;方式三&#xff1a;通过Lambd…

python--初学函数

函数&#xff08;function&#xff09;&#xff1a; 什么是函数&#xff1f; 具有名称的&#xff0c;是为了解决某一问题&#xff0c;功能代码的集合&#xff0c;叫做函数 python中函数如何定义&#xff1a;def>define function定义函数 def function_name([args临时变量…

Oracle 11G备份集中控制文件和spfile被异常删除

坐标大理&#xff0c;苍山下&#xff0c;洱海旁&#xff0c;风花雪月&#xff01;&#xff01; 今日一大早就接到一个case&#xff0c;根据客户描述&#xff0c;大概意思是昨天晚上发现18号的ctl和spfile无故消失&#xff0c;备份策略是一周一个0级增量备份&#xff0c;每日进…

数据库系统原理实验报告3 | 数据定义

整理自博主本科《数据库系统原理》专业课自己完成的实验报告&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 专业课本&#xff1a; ———— 本次实验使用到的图形化工具&#xff1a;Heidisql 目录 一、实验目的 二、实验内容及步骤 1、创建数据库educ及其基…

自媒体洗稿软件文心一言api洗稿软件介绍

大家好&#xff0c;我是淘小白~ 这几天给一个客户写了一个文心一言api洗稿的软件。 一、客户要求&#xff1a; 1、采集头条文章&#xff08;软件内置可采集头条文章网址、微信文章网址、搜狐文章网址&#xff09; 2、调用文心一言api 3、多线程并发 4、逐段改写文章 5、…

关于YOLOv9项目中使用已有模块自由改进的教程

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 1. 文件说明 在YOLOv5-v9&#xff0c;模型的结构是以yaml文件的存储。我们可以在原有的yaml基础上增、减、改模块&#xff0c;创作我们自己的模型。 …

springboot3+jdk17+MP整合最新版jersey详细案例,正真做到拿来即用

如题&#xff0c;springboot3.x java17 MP 整合最新jersey&#xff0c;各种请求类型&#xff08;实战/详解&#xff09; 文件上传下载 jersey资源注册 拦截器&#xff08;JWT&#xff09; 跨域处理 全局异常 Valid注解校验 等等 &#xff0c;除非你必须整合security&am…

五、分布式锁-redission

源码仓库地址&#xff1a;gitgitee.com:chuangchuang-liu/hm-dingping.git 1、redission介绍 目前基于redis的setnx特性实现的自定义分布式锁仍存在的问题&#xff1a; 问题描述重入问题同一个线程无法多次获取统一把锁。当方法A成功获取锁后&#xff0c;调用方法B&#xff0…

深度学习pytorch——GPU加速(持续更新)

使用 .to(device)&#xff0c;以前使用 .cuda() &#xff0c;但是现在基本不使用了。 代码示例&#xff1a; 查看电脑GPU运行情况&#xff1a; 使用Ctrl Shift ESC快捷键&#xff1a;

【DP】01背包问题与完全背包问题

一、01背包问题 有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&…