大模型基础补全计划(二)---词嵌入(word embedding)
PS:要转载请注明出处,本人版权所有。
PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。
环境说明
无
前言
本文是这个系列第二篇,它们是:
- 《大模型基础补全计划(一)---重温一些深度学习相关的数学知识》https://www.cnblogs.com/Iflyinsky/p/18717317
本系列虽然是大模型相关内容,但是主要还是大语言模型,对于大语言模型来说,其输入是我们值得关心的。
自然语言的基本单位是词或者字,对于模型来说,是没有办法直接输入文字的,因此我们需要一种方法将文字转换为LLM所能接受的格式,我们将词转换为向量的表达这种技术叫做词嵌入(word embedding)。
下面我们介绍一种在后续例子中会出现的一种直观词嵌入方法:one_hot向量。
one_hot向量
其含义非常的简单,如果有5个不同的词,那么生成5个0,1的向量即可,例如:\([1,0,0,0,0]\)或者\([0,0,0,0,1]\),通过这样简单的向量,就可以标识所有的字。
虽然其看起来简单,但是有些缺陷,例如:现在我们来考虑一个问题,我们用one_hot向量A表示‘似’,用one_hot向量B表示‘像’,然后我们求其余弦相似度 \(\cos{\theta} = \frac{A^TB}{|A||B|} = 0\) ,难道现在我们可以说‘似’和‘像’是无关联的吗?
根据上面的这个疑问,很明显要解决这个问题,需要把词映射为像人脸识别中的人脸特征向量这样的特征向量。下面我们介绍word2vec这个工具,注意词向量的表达有很多越来越好的方法,这里我们只需要了解一个基本即可。
word2vec
word2vec工具可以将每个词映射为固定长度的向量,这些向量能够表达词的相似性关系。如果大家做过人脸识别,那就对这个相似性概念一点也不陌生。
word2vec工具包含了两个模型:跳元模型(skip-gram),连续词袋(CBOW)。这些模型的训练依赖于条件概率,且由于是不带标签的数据,他们是自监督模型。
下面我们只简单分析一个简单的:跳元模型(skip-gram)。
跳元模型(skip-gram)
跳元模型假设一个词可以用来在文本序列中生成其周围的单词。我们以文本序列:“自太古以来”为例,给定中心词“古”,给定上下文窗口是2,跳元模型考虑生成上下文词“自”,“太”,“以”,“来”的条件概率是:\(P(“自”,“太”,“以”,“来”|“古”) = P(“自”|“古”)*P(“太”|“古”)*P(“以”|“古”)*P(“来”|“古”)\)。
在跳元模型中,对于词表V中索引为i的的词\(w_i\),其有两个向量\(v_i\)和\(u_i\),他们分别表示为\(w_i\)做为中心词、上下文词时的向量。此时我们给定中心词\(w_c\),生成上下文词\(w_o\)的条件概率可以使用u,v向量的点积和softmax来建模:\(P(w_o|w_c) = \frac{exp(u_o^T v_c)}{\sum_{i\in{V}} exp(u_i^T v_c)}\)
现在我们给定词表V,时间步t处的词表示为\(w_t\),给定上下文窗口是m,跳元模型的似然函数是在给定任何中心词的情况下生成所有上下文词的概率:\(\prod\limits_{t-1}^{T} \prod\limits_{-m\le j \le m, j \ne 0} P(w_{t+j}|w_{t})\)
然后我们就通过最大化似然函数来学习模型参数,相当于最小化负对数似然函数,然后得到损失函数是:\(-\sum\limits_{t-1}^{T} \sum\limits_{-m\le j \le m, j \ne 0} log(P(w_{t+j}|w_{t}))\)。
最后当我们使用随机梯度下降来最小化损失时,我们选取一个短的序列来计算该序列的梯度。注意,我们的模型定义为:\(P(w_o|w_c) = \frac{exp(u_o^T v_c)}{\sum_{i\in{V}} exp(u_i^T v_c)}\),我们给定\(v_c\),求\(v_o\)的梯度。
为了方便计算,我们对模型取对数,可得到:\(log(P(w_o|w_c)) = u_o^T v_c - log(\sum_{i\in{V}} exp(u_i^T v_c))\)
然后我们求相对于\(v_c\)的微分,可以得到:\(\frac{\partial}{\partial v_c}(log(P(w_o|w_c))) = \frac{\partial}{\partial v_c}(u_o^T v_c) - \frac{\partial}{\partial v_c}(log(\sum_{i\in{V}} exp(u_i^T v_c))) = u_o - \frac{1}{\sum_{i\in{V}} exp(u_i^T v_c)} * \frac{\partial}{\partial v_c}(\sum_{i\in{V}} exp(u_i^T v_c)) = u_o - \frac{1}{\sum_{i\in{V}} exp(u_i^T v_c)} * (\sum_{j\in{V}} exp(u_j^T v_c)*u_j) = u_o - \sum\limits_{j\in{V}}(\frac{exp(u_j^T v_c)*u_j}{\sum_{i\in{V}} exp(u_i^T v_c)}) = u_o - \sum\limits_{j\in{V}}(\frac{exp(u_j^T v_c)}{\sum_{i\in{V}} exp(u_i^T v_c)})*u_j = u_o - \sum\limits_{j\in{V}} P(w_j|w_c)u_j\)
注意中间关于对数的求导计算:令\(f(v_c) = \sum_{i\in{V}} exp(u_i^T v_c)\),可以通过
\(\frac{\partial}{\partial v_c}(log f(v_c)) = u_o - \frac{1}{f(v_c)} * \frac{\partial}{\partial v_c}(f(v_c))\)得到上面的结果。
Tokenizer
注意,在这些把词生成向量的过程,我们上文已经提到了。但是这里忽略了一个大问题,就是我们默认将语句拆分了词或者字。
因此在做向量化之前,有一个关键的动作是分词,从2025/03现在来看,分词的主要作用是将字转换(浓缩为)为token id。现在简单理解就是:tokenid可能是一个字、词或者零点几个字、词。
以后有机会再挖这个的坑吧,现在先简单这样理解。
后记
虽然现在有更加先进的模型代替了这些基础的模型,但是对于我们初学者来说,可以通过这样的一个简单的模型来知道词嵌入过程做了什么是非常有意义的。
此外从上面的过程我们可以知道,我们在用大语言模型时,需要做预处理文字,非常的像使用CV模型前,对图像进行预处理。而这个预处理过程就是:分词+向量化。
参考文献
打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
PS: 请尊重原创,不喜勿喷。
PS: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。
大模型基础补全计划(二)---词嵌入(word embedding)的更多相关文章
- DL基础补全计划(二)---Softmax回归及示例(Pytorch,交叉熵损失)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- DL基础补全计划(三)---模型选择、欠拟合、过拟合
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- DL基础补全计划(六)---卷积和池化
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 词向量 词嵌入 word embedding
词嵌入 word embedding embedding 嵌入 embedding: 嵌入, 在数学上表示一个映射f:x->y, 是将x所在的空间映射到y所在空间上去,并且在x空间中每一个x有y ...
- DL基础补全计划(一)---线性回归及示例(Pytorch,平方损失)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- [DeeplearningAI笔记]序列模型2.1-2.2词嵌入word embedding
5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.1词汇表征 Word representation 原先都是使用词汇表来表示词汇,并且使用1-hot编码的方式来表示词汇 ...
- DL基础补全计划(五)---数值稳定性及参数初始化(梯度消失、梯度爆炸)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- OSPF补全计划-0 preface
哇靠,一看日历吓了我一跳,我这一个月都没写任何东西,好吧,事情的确多了点儿,同事离职,我需要处理很多untechnical的东西,弄得我很烦,中间学的一点小东西(关于Linux的)也没往这里记,但是我 ...
- Xcode括号自动补全以及二次编译后不显示输入
今天遇到了一个大坑,在使用栈来进行计算表达式的时候,发现输入括号就报错,以及二次编译后不显示. 测试了好久,经过无数次debug后. 二次编译不显示还是没搞明白,不过输入倒是没什么问题,就是不显示出来 ...
- 通过trie树单词自动补全(二)
经常使用iciba进行单词查询, 关于他的搜索建议是通过单词前缀做的索引, 所以自己想动手实现下, 当然如果借助mysql的话,一条sql语句就能实现, 网上查询了下trie正适合做这个,所以通过C语 ...
随机推荐
- 龙哥量化:AI时代到来,百度的文心一言能AI选股吗,让AI写一个选股公式20日涨幅>=30%,AI弱智,垃圾。在通达信测试对比一下
如果您需要代写技术指标公式, 请联系我. 龙哥QQ:591438821 龙哥微信:Long622889 选股要求:20日涨幅>=30% 首先看我写的 HH:=HHV(H,20); LL:=LLV ...
- Qt数据库应用20-csv文件转xls
一.前言 最近又多了个需求就是将csv格式的文件转xls,需求一个接着一个,还好都是真实的需求,而且都是有用的需求,并不是不靠谱的需求,不靠谱的需求就比如程序自动识别手机壳颜色自动换背景颜色或者边框颜 ...
- 关于Qt国产化系统开发的几点总结
随着国产化的兴起,各种国产系统和国产数据库等逐渐进入开发者的世界,科普几个要点. 中标麒麟neokylin基于fedora. 银河麒麟kylin早期版本比如V2基于freebsd,新版本V4.V10基 ...
- Qt编写地图综合应用50-获取区域边界
一.前言 区域边界也是一些坐标点集合,而且不同的行政区划得到的区域边界点数组集合个数不同,觉得部分都是一个集合,少部分有一些飞地之类的,需要多个闭合区域,所以会得到多个数组集合,绘制的时候都要分别取出 ...
- 模拟数据生成器mock.js入门
1.在某一指定目录下,按下shift+鼠标右键,,点击"在此处打开Powershell窗口(S)",启动命令行窗口.如下图: 2.在窗口中输入以下命令以便创建项目:vue crea ...
- RabbitMQ-限流
1.简介 为什么要对消费端进行限流? 其实很好理解,比如我们常能接触到的消费场景:春运期间12306火车票的抢购,双11期间的下单等.这些场景都有一个共同点就是都会导致短暂时间内请求数激增,如果我们的 ...
- abp.vNext mvc版中的js和css
在创建vNextmvc版本后运行起来,F12可以看到如下js.css请求 这些文件来源: XXXX.Web/libs文件夹 /libs/abp/aspnetcore-mvc-ui-theme-shar ...
- biancheng-Spring Boot框架
目录http://c.biancheng.net/spring_boot/ 1Spring Boot是什么2创建Spring Boot项目3Spring Boot starter4YAML5Sprin ...
- 从Linux零拷贝深入了解I/O
转载&学习文章:从Linux零拷贝深入了解I/O 本文将从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程.优化手段以及实际应用. 前言 存储器是计算机的核心部件之一,在完全理想 ...
- react报错Can't resolve 'react' in 'E:\reactweb\preact\my-app\node_modules\react-dom\cjs'
执行如下: npm install -g react npm install react --save 类似这种依赖项(react,react-dom 等)报错,哪个报错执行哪个即可 执行上述两句就 ...