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. 龙哥收集的Github资源——Python量化不要自己造轮子

      打开github后,在搜索框中输入下面的项目作者及项目名称,然后点一下 All Github 搜索 格式 user:xxxxx in:name xxxxxxxxxxxxx 举例 user:Cken ...

  2. Qt开发经验小技巧206-210

    有时候需要对文本进行分散对齐显示,相当于无论文字多少,尽可能占满整个空间平摊占位宽度,但是在对支持对齐方式的控件比如QLabel调用 setAlignment(Qt::AlignJustify | Q ...

  3. IM开发者的零基础通信技术入门(十五):理解定位技术,一篇就够

    [来源申明]本文引用了微信公众号"鲜枣课堂"的<老司机揭秘手机定位技术,这下彻底明白啦!>文章内容.为了更好的内容呈现,下文在引用和收录时内容有改动,转载时请注明原文来 ...

  4. 即时通讯技术文集(第34期):IM群聊技术合集(Part1) [共15篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第34 期. [- 1 -] 快速裂变:见证微信强大后台架构从0到1的演进历程(一) [链接]  ...

  5. WPF 查找大小相同文件/图片

    假设文件大小一样就表示文件一模一样,是重复文件 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  6. 高并发编程-ReentrantReadWriteLock深入解析

    要点解说ReentrantLock在并发情况下只允许单个线程执行受保护的代码,而在大部分应用中都是读多写少,所以,如果使用ReentrantLock实现这种对共享数据的并发访问控制,将严重影响整体的性 ...

  7. 玩转云端 | AccessOne实用窍门之三步搞定门户网站防护与加速

    随着互联网的飞速发展,网站建设已成为企事业单位推广.提供服务的重要途径之一.在数字技术快速迭代的当下,如何在保障网站安全的前提下提供高效服务,是企事业单位需要着重考虑的内容. 网站安全防护是网站建设后 ...

  8. 解决当前标识(IIS APPPOOL\XXXX)没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files”的写访问权限的问题

    1.问题描述 在Windows Server2019数据中心版中搭建IIS项目,访问的时候出现如下所示的错误: 当前标识(IIS APPPOOL\XXXX)没有对"C:\Windows\Mi ...

  9. Q: USB无线网卡搜不到路由器WiFi,但也能搜索到少部分信号。

    原因分析:一般在路由器的配置的无线信道是自动,路由器的2.4G频段有13个左右交叠的信道.由于USB无线网卡的设置信道区间可能不在无线信道范围内,导致无线网卡搜索不到对应wifi. 解决问题:鼠标右键 ...

  10. pkill 踢出某个终端

    是ps命令和kill命令的结合,按照进程名来杀死指定进程 选项 -o:仅向找到的最小(起始)进程号发送信号: -n:仅向找到的最大(结束)进程号发送信号: -P:指定父进程号发送信号: -g:指定进程 ...