transformer学习笔记-词嵌入embedding原理

.在学习transformer的时候,可以看到,输入通常需要对词token进行embedding处理,如果没有先了解embedding的原理可能会有疑问,这个embedding,到底怎么来的,怎么就把一个token 变成一个矩阵,这个矩阵到底暗藏了哪些信息。总不能随便给一个token配一个矩阵,self-attention机制就能处理吧?肯定不是的,接下来我们来尝试理解下embedding的奥秘。

一、词嵌入embedding基本原理

在机器学习领域,机器无法直接对自然语言、图片、语音等数据直接处理,往往需要对其进行编码,这里我们只讨论自然语言领域的词token编码。

1.1、one-hot编码

假设我们现在有一个词库(词汇表),里面有五个词[ I , love , programming , in, Python ],我们通过索引下标将其标识出来分别对应
[1, 2, 3, 4 , 5],但是这样的表示方法,基本很难帮助我们去发现他们之间的关系,比如相似性、多义性,所以我们引入向量空间,帮助我们更好表示不同词token,one-hot就是其中一种:
在这里插入图片描述
对于单个词token,比如:I,[ 1, 0, 0, 0, 0] 是个1* n的矩阵, n的值与词汇表中的词token个数相等。

可以看到,当m个token构成的m*n矩阵,起码有如下问题
1、随着词汇量增多,矩阵的维度(n的个数),占用空间将会特别大;
2、矩阵过于稀疏,元素含0太多,无法有效进行矩阵计算(两个矩阵一算内积全是0),比如计算相似性(余弦相似性);

聪明的人类发明了词嵌入embedding解决以上问题。

1.2、embedding编码

对于一个n维(也就是n列)的one-hot编码(),通过一个n*v嵌入矩阵,将n维向量转成v维向量。
在这里插入图片描述
假设这个嵌入矩阵是5 * 3的矩阵,然后对love 和in两个词embedding编码:
在这里插入图片描述

可以发现:
1、嵌入矩阵的行,就是词汇库的词token个数,列就是词token embedding后的维度(列数).,也就是v维向量。
2、one-hot矩阵的中token向量 1所在的位置,就是对应嵌入矩阵的第几行,也就是通过one-hot的index从嵌入矩阵查表。
3、实际上,就是通过嵌入矩阵的变换,将one-hot五维空间,投影到embedding三维空间。

我们如何理解这个embedding矩阵?
盲人摸象的故事我们都听过,每个盲人摸到大象的不同位置,对大象的形容就不一样,但是把不同位置的的形容合并到一起,大致就能说明大象的整体特征:
大象 = 鼻子长 + 耳朵大 + 高大 + 牙齿长]
回到嵌入矩阵,假设不同的列代表不同的特征,同时他也是在三维空间里的坐标如:(1.1,0.2,0.5)
在这里插入图片描述

以苹果为例:在不同场景中可能不一样,可能是水果、可能是手机、也可能是容貌相关的苹果肌。
假设特征1:是水果、特征2:是手机、特征3:是面貌,嵌入矩阵第一行代表苹果,那么

苹果 = 1.1水果 +0.2手机 +0.5*面貌

也就是说,embedding矩阵的每个元素,代表每个特征的权重,
当然我们也可以将其投射到三维空间中,通过位置关系,表示不同词token之间的相似性和关联度,通常我们采用余弦相似性原理:
在这里插入图片描述
也就是两个向量的夹角越小越相似。
回到上面苹果的例子,苹果向量跟水果、手机、面貌的向量位置,决定了在当前预料环境,苹果更可能表示的是哪个特征,也就是词token在空间中的位置,依赖不同语义场景的上下文关系。

实际上,当某一维度的语料越多,词token在空间中的位置就越往该维度调整(夹角越小),位置越靠近。

上面只是对高维稀疏空间投影到低维空间,同样更低维的向量的特征可能被压缩到一起,也可以通过嵌入矩阵将其投射到高维空间,将压缩到一起的特征分离。

那么我们怎么得到这个嵌入矩阵。

二、词嵌入矩阵训练

词嵌入矩阵是通过特定的词嵌入算法训练得到,比如word2vec、FastText、GloVe等,本文我们通过word2vec,大致了解嵌入矩阵的训练过程。

word2vec包含两种算法,一种是C-bow,一种是Skip-Gram,C-bow通过上下文预测目标词,而Skip-Gram通过目标词预测上下文。
当然,此处我们也只了解C-bow的原理,体会下如何得到嵌入矩阵。

在这里插入图片描述
C-bow主要通过上下文去预测中间位置的token,比如当窗口大小为1,以 love和in 两个词预测中间的programming,如果窗口大小为2,则已I 、love和in、Python四个词预测中间的词。具体的预测流程也是通过一个神经网络来实现:

在这里插入图片描述
预测通过 I ,love,in,Python,得到目标值programming
输入层:
输入层的每个词token是以one-hot编码的向量,也就是1*n的矩阵,图中为省空间,竖排展示,实际计算式按[1,0,0,0,0]横向的方式计算。
以上图为例:
分别将I、love、in、Python四个词token的one-hot编码输入嵌入矩阵

嵌入矩阵:
嵌入矩阵的行数与输入向量的列数相等,n列的输入矩阵,对应的嵌入向量就是n行,嵌入矩阵的维度v,也就是嵌入矩阵的列数,因此嵌入矩阵是一个n*v的矩阵。
图中的四个嵌入矩阵其实是同一个,图中为了表示每个词token单独计算词向量,此处我们使用上面的例子,我们初始化一个 5*3 的嵌入矩阵:(假设下图中的元素值都是随机生成的)
在这里插入图片描述
通过嵌入矩阵的变换,得到四个嵌入向量:I [1.1, 0.2 ,0.5],love [-1.7, 0.8 ,0.1],in [0.1, 0.9 ,-0.3],Python[1.3, -0.4 ,0.8]
在这里插入图片描述

隐藏层:
隐藏层对上下文中的嵌入向量求和取平均值,
这里,我们对得到四个对应的嵌入向量 ,求和再平均:
在这里插入图片描述
得到矩阵[0.2 ,0.375, 0.275]
然后在通过一个v*n的矩阵(一般使用嵌入矩阵的转置)然后通过softmax函数计算词库中每个词的概率分布
在这里插入图片描述
输出层
得到词汇表中每个词的概率输出,概率最大的词即为预测的值,此处0.5最高,对应第三个词programming。
但是预测值与真实值相差较大,那么需要根据损失函数反向传播调整嵌入矩阵。可以参考:transformer学习笔记-神经网络原理第二章和第三章。
经过多轮的反向传播调整后,得到最终的嵌入矩阵。

注意: 通过word2vec生成词嵌入,是比较固定的,因为一旦嵌入矩阵训练完成,除非重新训练,否则就是不变的了,因此在不同语境的句子中,同一个词的词嵌入是一样的,即便这个词嵌入同时包含了不同语境下的信息。因此word2vec在处理多义词场景效果不是很好,基于transformer架构的bert模型更擅长此类场景,bert可以动态结合上下文生成词嵌入。
学习完transformer的机制后,有机会我们再深入学习bert模型原理。本文主要为了通过word2vec更好理解我们为什么需要embedding。

三、示例代码

gensim已经封装了c-bow和skip-gram两种算法的实现,以下是示例代码,感兴趣的小伙伴也可以尝试自己实现一个。

import numpy as np
from gensim.models import Word2Vec
from gensim.utils import simple_preprocess# 准备数据
sentences = ["I love programming in Python","Python is a powerful language","JavaScript is also popular",
]# 预处理数据
processed_sentences = [simple_preprocess(sentence,min_len=1,max_len=16) for sentence in sentences]# 训练Word2Vec模型 (c-bow)
model = Word2Vec(sentences=processed_sentences, vector_size=4, window=2, min_count=1, workers=4)
#(skip-gram)
#model = Word2Vec(sentences=processed_sentences, vector_size=4, window=2, min_count=1, workers=4, sg=1)
# 获取词向量
word_vector = model.wv['python']
print(word_vector)word1 = 'python'
word2 = 'language'# 使用most_similar方法找到与这两个词最相似的词
similar_words1 = model.wv.most_similar(word1, topn=5)
similar_words2 = model.wv.most_similar(word2, topn=5)print(f"与 {word1} 最相似的词:")
for word, similarity in similar_words1:print(f"{word}: {similarity}")print(f"\n与 {word2} 最相似的词:")
for word, similarity in similar_words2:print(f"{word}: {similarity}")

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

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

相关文章

Apache Airflow 快速入门教程

Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反,由于它的简单性和可扩展性,它已经获得了普及。在本文中,我将尝试概述它的主要概念,并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …

python+django自动化部署日志采用‌WebSocket前端实时展示

一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…

[MySQL]流程控制语句

流程控制语句需要借助存储过程才有效。关于存储过程,我会在后续的文章详述,本篇文章只是阐述流程控制语句。因此,大家只需要注意存储过程中相应的流程控制语句即可。 如果文中阐述不全或不对的,多多交流。 参考笔记三&#xff0c…

使用 pycharm 新建使用 conda 虚拟 python 环境的工程

1. conda 常见命令复习: conda env list // 查看 conda 环境列表 conda activate xxxenv // 进入指定 conda 环境2. 环境展示: 2.1. 我的物理环境的 Python 版本为 3.10.9: 2.2. 我的 conda 虚拟环境 env_yolov9_python_3_8 中的 pyth…

上传镜像docker hub登不上和docker desktop的etx4.vhdx占用空间很大等解决办法

平时使用docker一般都在Linux服务器上,但这次需要将镜像上传到docker hub上,但是服务器上一直无法登录本人的账号,(这里的问题应该docker 网络配置中没有开代理的问题,因服务器上有其他用户使用,不可能直接…

时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式基本介绍 时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x =

【娱乐项目】竖式算术器

Demo介绍 一个加减法随机数生成器,它能够生成随机的加减法题目,并且支持用户输入答案。系统会根据用户输入的答案判断是否正确,统计正确和错误的次数,并显示历史记录和错题记录。该工具适合用于数学练习,尤其适合练习基…

Java抛出自定义运行运行

1.重新生成异常的.java文件 Empty:空 Exception:异常 加起来就是 空指针异常的文件 2.打上extends 运行的异常(异常的类型) 3.点击ctrlo,选着这两个快捷重写 4.在需要抛出异常的地方写上:th…

使用Github Action将Docker镜像转存到阿里云私有仓库,供国内服务器使用,免费易用

文章目录 一、前言二、 工具准备:三、最终效果示例四、具体步骤第一大部分是配置阿里云1. 首先登录阿里云容器镜像服务 [服务地址](https://cr.console.aliyun.com/cn-hangzhou/instances)2. 选择个人版本3. 创建 命名空间4. 进入访问凭证来查看,用户名字…

YOLO系列论文综述(从YOLOv1到YOLOv11)【第13篇:YOLOv10——实时端到端物体检测】

YOLOv10 1 摘要2 网络结构3 YOLOv1-v10对比 YOLO系列博文: 【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇:YOLO系列论文、代码和主要优缺点汇总】【第3篇:YOLOv1——YOLO的开山之作】【第4篇&#xff1a…

Figma入门-自动布局

Figma入门-自动布局 前言 在之前的工作中,大家的原型图都是使用 Axure 制作的,印象中 Figma 一直是个专业设计软件。 最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的,对…

零基础学安全--Burp Suite(4)proxy模块以及漏洞测试理论

目录 学习连接 一些思路 proxy模块 所在位置 功能简介 使用例子 抓包有一个很重要的点,就是我们可以看到一些在浏览器中看不到的传参点,传参点越多就意味着攻击面越广 学习连接 声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可…

CAD 文件 批量转为PDF或批量打印

CAD 文件 批量转为PDF或批量打印,还是比较稳定的 1.需要本地安装CAD软件 2.通过 Everything 搜索工具搜索,DWG To PDF.pc3 ,获取到文件目录 ,替换到代码中, originalValue ACADPref.PrinterConfigPath \ r"C:…

【Linux网络编程】TCP套接字

TCP与UDP的区别: udp是无连接的、面向数据报(通信时以数据报为单位传输)的传输层通信协议,其中每个数据报都是独立的,通信之前不需要建立连接,bind绑定套接字后直接可以进行通信。 tcp是面向连接的、基于字…

spring-boot-maven-plugin 标红

情况:创建好 Spring Boot 项目后,pom.xml 文件中 spring-boot-maven-plugin 标红。 解决方案:加上 Spring Boot 的版本即可解决。

xv6前置知识

fork函数 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分…

(11)(2.2) BLHeli32 and BLHeli_S ESCs(二)

文章目录 前言 1 传递支持 前言 BLHeli 固件和配置应用程序的开发是为了允许配置 ESC 并提供额外功能。带有此固件的 ESC 允许配置定时、电机方向、LED、电机驱动频率等。在尝试使用 BLHeli 之前,请按照 DShot 设置说明进行操作(DShot setup instructions)。 1 传…

Flink的双流join理解

如何保证Flink双流Join准确性和及时性、除了窗口join还存在哪些实现方式、究竟如何回答才能完全打动面试官呢。。你将在文中找到答案。 1 引子 1.1 数据库SQL中的JOIN 我们先来看看数据库SQL中的JOIN操作。如下所示的订单查询SQL,通过将订单表的id和订单详情表ord…

1.1 数据结构的基本概念

1.1.1 基本概念和术语 一、数据、数据对象、数据元素和数据项的概念和关系 数据:是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。 数据是计算机程序加工的原料。 数据对象:是具有相同性质的数据元素的集合&…

【程序人生】“阶段总结“-前路茫茫

岁月如白驹过隙,如指尖流沙,不知不觉已经离开了陪伴我度过四年岁月的学校,离开了那间堆满各种书籍的宿舍,离开了通宵开发的实验室,离开了教室里的最后一排课桌椅......(虽然,我并不是很喜欢它&a…