PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

环境说明

  无

前言


  本文是这个系列第二篇,它们是:

  本系列虽然是大模型相关内容,但是主要还是大语言模型,对于大语言模型来说,其输入是我们值得关心的。

  自然语言的基本单位是词或者字,对于模型来说,是没有办法直接输入文字的,因此我们需要一种方法将文字转换为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)的更多相关文章

  1. DL基础补全计划(二)---Softmax回归及示例(Pytorch,交叉熵损失)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  2. DL基础补全计划(三)---模型选择、欠拟合、过拟合

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  3. DL基础补全计划(六)---卷积和池化

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  4. 词向量 词嵌入 word embedding

    词嵌入 word embedding embedding 嵌入 embedding: 嵌入, 在数学上表示一个映射f:x->y, 是将x所在的空间映射到y所在空间上去,并且在x空间中每一个x有y ...

  5. DL基础补全计划(一)---线性回归及示例(Pytorch,平方损失)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  6. [DeeplearningAI笔记]序列模型2.1-2.2词嵌入word embedding

    5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.1词汇表征 Word representation 原先都是使用词汇表来表示词汇,并且使用1-hot编码的方式来表示词汇 ...

  7. DL基础补全计划(五)---数值稳定性及参数初始化(梯度消失、梯度爆炸)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  8. OSPF补全计划-0 preface

    哇靠,一看日历吓了我一跳,我这一个月都没写任何东西,好吧,事情的确多了点儿,同事离职,我需要处理很多untechnical的东西,弄得我很烦,中间学的一点小东西(关于Linux的)也没往这里记,但是我 ...

  9. Xcode括号自动补全以及二次编译后不显示输入

    今天遇到了一个大坑,在使用栈来进行计算表达式的时候,发现输入括号就报错,以及二次编译后不显示. 测试了好久,经过无数次debug后. 二次编译不显示还是没搞明白,不过输入倒是没什么问题,就是不显示出来 ...

  10. 通过trie树单词自动补全(二)

    经常使用iciba进行单词查询, 关于他的搜索建议是通过单词前缀做的索引, 所以自己想动手实现下, 当然如果借助mysql的话,一条sql语句就能实现, 网上查询了下trie正适合做这个,所以通过C语 ...

随机推荐

  1. checker jenkins 启动配置

    chmod -R 755 bin scp target/*.jar ubuntu@x:/home/ubuntu/checker/ scp config/*.yml ubuntu@x:/home/ubu ...

  2. Qt编写音频播放示例(带音频曲线/振幅/传输/录制等)

    一.功能特点 自动计算音频振幅,绘制音频振幅曲线和音频数据曲线. 支持音频录制,可选音频输入设备.采样频率.通道等参数,Qt5默认保存wav格式,Qt6默认保存mp3格式,Qt6可选wma.aac等格 ...

  3. 昔日移动端IM明星 “米聊” 即将停止服务

    2021年1月19日,小米旗下米聊宣布,将于2021年2月19日12点停止米聊的服务. 1.以下消息来自米聊官网   2.关于米聊 米聊是小米科技出品的一款免费即时通讯工具,推出时间为:2010年12 ...

  4. WxPython跨平台开发框架之图标选择界面

    在使用 wxPython 开发跨平台桌面应用程序时,创建一个图标选择界面通常用于让用户从图标资源库中选择图标,我们可以把图标分为自定义的图标资源和系统的图标资源两大类,最终我们把它们整合一起使用,在框 ...

  5. clip-retrieval检索本地数据集

    clip-retrieval检索本地数据集 from clip_retrieval.clip_client import ClipClient, Modality from tqdm import t ...

  6. vs2017 iisexpress 绑定自定义域名

    1.项目根目录找到 项目/.vs/config/applicationhost.config 2.添加绑定域名 <site name="demo" id="2&qu ...

  7. Solution Set -「Public NOIP Round #3 (Div. 1)」

    \(\mathscr{A}\sim\) 移除石子   Tags:「A.构造」「C.细节」   "显然" 直接按 \((x,y)\) 二元组排序后两两组成正方形! 喜提 \(90\t ...

  8. 理解Java的接口和抽象类

    深入理解Java的接口和抽象类   对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多 不同的地方.很多人在 ...

  9. G1原理—8.如何优化G1中的YGC

    大纲 1.5千QPS的数据报表系统发生性能抖动的优化(停顿时间太小导致新生代上不去) 2.由于产生大量大对象导致系统吞吐量降低的优化(大对象太多频繁Mixed GC) 3.YGC其他相关参数优化之TL ...

  10. Kotlin:【初始化】主构造函数、在主构造函数里定义属性、次构造函数、默认参数、初始化块、初始化顺序