一文吃透它!从古老的统计方法,到如今炙手可热的大模型Embedding,再到实践中的各种骚操作,还有DS-Qwen1.5B Embedding的“真容”,全都给你安排得明明白白!

文章结构如下,请查收:

  • 啥是Embedding?

  • 理想Embedding长啥样?

  • 传统Embedding:老骥伏枥,志在千里 

  • 静态Embedding:曾经的王者 

  • 上下文Embedding:更懂你的心思 

  • 大模型Embedding:站在AI之巅 

  • DS-Qwen1.5B Embedding:解剖“网红” 

  • Embedding的“图”个啥? 

  • 总结:不学不是网络安全人! 

啥是Embedding?

在网络安全任务中,要处理各种文本,比如日志、报告、威胁情报等等,都需要先把每个单词变成对应的数字表示。「简单来说,Embedding就是把单词或者“token”变成向量」。不同的Embedding技术,区别就在于它们怎么玩转这个“单词→向量”的转换。

但Embedding的野心可不止于文本,图片、音频、甚至网络拓扑结构,它都能搞定!「从广义上讲,Embedding就是把任何类型的数据都变成向量的过程」。当然啦,不同类型的数据,Embedding的方法也各有千秋。本文咱们聚焦的,还是文本Embedding。

别以为Embedding是LLM时代才冒出来的新鲜玩意儿,它早就混迹江湖多年了。下面这张图,带你快速了解各种Embedding技术:

说到Embedding,你肯定会听到「静态Embedding」「动态(或上下文化)Embedding」这两个词。要搞清楚,「token Embedding(LLM一开始就给输入token分配的固定向量)是静态的,而模型深层生成的上下文表示是动态的,它会随着模型每一层的变化而变化,捕捉输入的完整上下文」。有些论文里也把这些上下文输出叫做“嵌入”,新手很容易搞混。

理想Embedding长啥样?

对于LLM来说,Embedding就像它的“语言词典”。好的Embedding,能让模型更好地理解咱们人类的网络安全语言。那么,理想的Embedding应该具备哪些素质呢?

  • 「语义表示」:优秀的Embedding能捕捉单词之间的语义关系。意思相近的词,在向量空间里也会靠得更近。比如,“病毒”和“木马”的向量,肯定比“病毒”和“冰淇淋”的向量更相似。

  • 「维度」:嵌入向量的大小多少才合适?15?50?还是300?这可不是随便拍脑袋决定的。维度太小,信息不够;维度太大,又容易过拟合。像GPT-2模型,嵌入大小至少是768。

传统Embedding:老骥伏枥,志在千里

各种词向量嵌入技术,都依赖于海量文本数据来学习词语之间的关系。早期的词向量嵌入,主要靠统计方法,分析文本中词语出现的频率。这种方法基于一个朴素的假设:如果两个词经常一起出现,那它们的关系肯定不一般!这种方法简单粗暴,计算量也不大。TF-IDF就是其中的代表。

TF-IDF(词频-逆文档频率):网络安全界的“老中医”

TF-IDF的核心思想是,通过考虑两个因素来评估单词在文档中的重要性:

  • 「词频 (TF)」:单词在文档中出现的频率。TF越高,说明这个词对文档越重要。

  • 「逆文档频率 (IDF)」:单词在文档中的稀缺性。如果一个词只出现在少数文档中,那它就比那些在所有文档中都出现的词更重要。

TF-IDF的计算公式如下:

其中: 表示一个单词, 表示一个文档, 表示单词 在文档 中出现的次数, 表示文档 中所有单词的总次数, 表示语料库中总文档数, 表示包含单词 的文档数。

举个栗子:

假设我们有一个包含10篇网络安全报告的语料库,“漏洞”这个词只出现在其中的2篇报告中。“漏洞”的IDF就是:

如果在一篇特定的报告中,“漏洞”在总共100个单词中出现了5次,那么它的TF=5/100=0.05。因此,这篇报告中“漏洞”的最终TF-IDF得分就是:

这个得分告诉我们,“漏洞”这个词对于这篇报告,相对于整个语料库来说,有多重要。得分越高,说明这个词在这篇报告中出现的频率越高,而且在所有报告中相对较少出现,因此它在描述报告内容方面可能更有意义。

为了更直观地理解TF-IDF,咱们用一个例子来演示一下。

# load the dataset with open("network_security_reports.txt", "r") as file: corpus = file.read() print(f"Text corpus includes {len(corpus.split())} words.") # to simulate multiple documents, we chunk up the corpus into 10 pieces N = len(corpus) // 10 documents = [corpus[i:i+N] for i in range(0, len(corpus), N)] documents = documents[:-1] #last document is residue # now we have N documents from the corpus # Text corpus includes 202651 words. from sklearn.feature_extraction.text import TfidfVectorizer # 默认会将文本中的单词转换为小写,并去除停用词(如the, is等)。在这个例子中,我们没有指定停用词,因此它会处理所有单词。 vectorizer = TfidfVectorizer() #首先会计算每个单词在文档中的TF-IDF值。它会生成一个稀疏矩阵,每一行代表一个文档,每一列代表一个单词。稀疏矩阵中的值是该单词在对应文档中的TF-IDF值。 embeddings = vectorizer.fit_transform(documents) words = vectorizer.get_feature_names_out() print(f"Word count: {len(words)} e.g.: {words[:10]}") print(f"Embedding shape: {embeddings.shape}") ### OUTPUT ### # Word count: 11446 e.g.: ['abandon' 'abase' 'abate' 'abated' 'abbey' 'abbot' 'abed' 'abel' 'abet' 'abhor'] # Embedding shape: (10, 11446)

这段代码会生成一个10维的嵌入向量,每个向量对应一个文档(可以理解为一句话)。为了更好地理解TF-IDF嵌入向量,我们用PCA把10维空间映射到2维空间,方便可视化。

从图中可以发现:

  • 大多数单词都挤在一起,说明它们的嵌入向量很相似,缺乏区分度。
  • 这些嵌入向量之间没有语义联系,单词之间的距离和它们的含义没有关系。

由于TF-IDF只关注单词出现的频率,所以语义上接近的词(比如“漏洞”和“弱点”)在向量空间中并没有关联。不过,TF-IDF的简单性也让它在信息检索、关键词提取和基本文本分析等场景中非常实用。

 这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

静态Embedding:曾经的王者

word2vec:网络安全界的“老炮儿”

word2vec是一种比TF-IDF更高级的技术。顾名思义,它是一个旨在将单词转换为嵌入向量的网络。它通过定义一个辅助目标来实现这一点,即优化网络的目标。

例如,「在CBOW(连续词袋)中,word2vec网络被训练成在给定一个单词的相邻词作为输入时预测该单词」。你可以根据单词周围的词来推断出这个单词的嵌入。除了CBOW,还有Skipgram,它的工作方式正好相反:通过给定一个单词作为输入来预测它的邻近单词。

word2vec的架构非常简单:先通过一个隐藏层提取嵌入,再加一个输出层,预测词汇表中所有单词的概率。表面上看,这个网络是为了根据相邻词预测正确的缺失词,但实际上,它的目的是训练网络的隐藏层,为每个单词找到正确的嵌入向量。训练完成后,最后一层就可以扔掉了,因为我们真正想要的是Embedding向量。

CBOW word2vec的工作流程是这样的:

  • 选择一个上下文窗口(比如上图的上下文窗口是4)。

  • 把特定单词前后两个单词作为输入。

  • 把这四个上下文单词编码成one-hot向量。

  • 把编码后的向量传给隐藏层,这一层使用线性激活函数。

  • 聚合隐藏层的输出(比如用lambda均值函数)。

  • 把聚合后的输出输入到最后一层,这一层使用Softmax预测每个可能单词的概率。

  • 选择概率最高的token作为网络的最终输出。

隐藏层就是存储Embedding的地方。当我们把一个单词的one-hot向量(一个除了一个元素是1,其他都是0的向量)传给网络时,这个1会触发该单词的嵌入传递到下一层。下面是一个简洁的word2vec网络实现。

由于word2vec依赖于上下文中词语之间的关系,而不是像TF-IDF那样依赖于单词出现的频率,所以它能够捕捉词语之间的语义关系。如果你感兴趣,可以去Google官网下载训练好的模型版本(下载链接:https://code.google.com/archive/p/word2vec/)。下面是实际使用word2vec的代码:

# 下载预训练的embedding向量模型,看看它是如何使用的。 import gensim model = gensim.models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin.gz', binary=True) print(f"The embedding size: {model.vector_size}") print(f"The vocabulary size: {len(model)}") # italy - rome + london = england model.most_similar(positive=['london', 'italy'], negative=['rome']) ### OUTPUT ### [('england', 0.5743448734283447), ('europe', 0.537047266960144), ('liverpool', 0.5141493678092957), ('chelsea', 0.5138063430786133), ('barcelona', 0.5128480792045593)] model.most_similar(positive=['woman', 'doctor'], negative=['man']) ### OUTPUT ### [('gynecologist', 0.7093892097473145), ('nurse', 0.6477287411689758), ('doctors', 0.6471460461616516), ('physician', 0.6438996195793152), ('pediatrician', 0.6249487996101379)]

为了高效地训练word2vec,尤其是在词汇量很大的情况下,可以使用一种叫做负采样的优化技术。负采样不是在整个词汇表上计算完整的softmax(这计算成本很高),而是通过只更新少量负样本(随机选择的与上下文无关的词语)和正样本来简化任务。这样可以加快训练速度,提高可扩展性。

上下文Embedding:更懂你的心思

BERT:网络安全界的“变形金刚”

BERT(Bidirectional Encoder Representations from Transformers)在自然语言处理领域,尤其是网络安全领域,几乎无处不在。现在大模型的一些理念方法都有BERT的影子,彻底了解BERT能帮你更好地理解大模型。

BERT源自“Attention is all you need”这篇文章中介绍的Transformer架构,它只用Transformer编码器,通过预训练来生成语义表征,理解语言。BERT可以解决QA问答、文本摘要、分类等任务。

BERT是一个只用编码器的Transformer模型,由四个主要部分组成:

  • 分词器 (Tokenizer):把文本切分成整数序列。

  • 嵌入 (Embedding):把离散标记转换成向量的模块。

  • 编码器 (Encoder):一堆带有自注意力机制的Transformer模块。

  • 任务头 (Task Head):编码器完成表征后,这个特定于任务的头会处理这些表征,完成标记生成或分类任务。

在预训练阶段,BERT需要同时学习两个任务:

「掩码语言模型」(Masked Language Model,MLM):预测句子中被掩码的单词(我之前 [MASKED] 过这本书 -> 阅读过)。

「下一句预测」(Next Sentence Prediction,NSP):给定两个句子,预测A是否在B之前。在两个句子之间添加特殊的 [SEP] 标记来分隔它们,这个任务类似于二分类。

注意另一个特殊标记 [CLS]。这个特殊标记有助于分类任务。随着模型逐层处理输入,[CLS]会成为所有输入标记的集合,可以用来进行分类。

BERT之所以这么重要,是因为它是基于Transformer的语境化动态嵌入的首批应用之一。当输入一个句子时,BERT模型的各层会利用自注意力机制和前馈机制来更新并整合句子中所有其他token的语境。每个Transformer层的最终输出,就是这个单词的语境化表示。

大模型Embedding:站在AI之巅

现在,Embedding仍然是大型语言模型的基础组件,也是一个广义的术语。这里我们重点介绍“嵌入”,也就是把词条转换成向量表征的模块,而不是隐藏层中的潜在空间。

Embedding在LLM中扮演什么角色?其实大模型的Embedding属于上下文Embedding的一种。简单来说,在基于Transformer的模型中,“嵌入”可以指静态嵌入和动态上下文表征:

「静态Embedding」往往是在第一层生成,它把词条嵌入(表示词条的向量)和位置嵌入(编码词条在序列中位置的向量)结合起来,比如BERT模型就属于静态嵌入。

「动态上下文Embedding」。当输入词条经过自注意力层和前馈层时,它们的嵌入会被更新,和上下文关联起来。这些动态表征会根据词条周围的上下文来捕捉它的含义。比如,“Bank”这个词既可以出现在“river bank”这个短语中,也可以在“bank robbery”这个短语中。虽然“bank”这个词的标记嵌入在这两种情况下是相同的,但它在网络各层中进行转换时,会考虑到“bank”出现的具体上下文。

LLM的Embedding是在训练过程中进行优化的。虽然我们也可以用Word2Vec等预训练模型为机器学习模型生成嵌入,但LLM通常会生成自己的Embedding,这些嵌入是输入层的一部分,并在训练过程中进行更新。把嵌入优化作为LLM训练的一部分,而不是使用Word2Vec,优势在于这些嵌入会根据特定任务和数据进行优化。

「LLM中的嵌入层相当于一个向量索引表」。给定一个索引列表(token id),它会返回相应的嵌入,如下图所示:

PyTorch中大模型嵌入层的代码实现是用torch.nn.Embedding完成的,它就像一个简单的查找表。它不用进行one-hot编码,而是直接用索引作为输入,其实这一层和简单的线性层相比没什么特别之处。嵌入层只是一个使用索引的线性层。

上面说不用one-hot编码,主要原因是如果采用one-hot编码,原理其实是一样的,直接用索引会更方便。下面是采用one-hot编码获取嵌入向量的示例:

DS-Qwen1.5B的Embedding:解剖“网红”

实际的大模型Embedding层是什么样的呢?咱们来扒一扒Qwen模型中DeepSeek-R1精简版的Embedding。首先,从Hugging Face加载deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B模型,并保存嵌入。

然后加载使用Qwen1.5B模型的嵌入层。把嵌入和模型的其他部分分离、保存和加载,是为了更快、更高效地获取输入的嵌入,而不是对模型进行完整的前向传递。

接着,看看如何把一个句子分词,然后进行向量化。

在上面的代码中,我们对句子进行了分词,并打印了分词的嵌入。这些嵌入是1536维向量。这里有一个简单的例子,以“HTML coders are not considered programmers”这句话为例。

最后,让我们看看如何找到和某个单词最相似的嵌入。由于嵌入是向量,我们可以用余弦相似度来找到和某个单词最相似的嵌入。然后,我们可以用torch.topk函数来找到前k个最相似的嵌入。

Embedding的“图”个啥?

我们如何看待Embedding?一种方法是把嵌入层看作一个网络,每个Token是一个节点;如果两个Token的向量距离比较近,就假设它们的节点可以通过边连接。

比如,我们把“*AI agents will be the most hot topic of artificial intelligence in 2025.*”这句话进行Token化,把Token转换成Embedding向量,然后找到和已有的每个嵌入最相似的20个嵌入,就会得到下面的嵌入图:

实际上,你可以在文章开头看到一个更全面的示例,其中映射了50个标记及其最接近的标记。

在上面的图示例中,我们忽略了“Token变体”。一个标记或单词可能有许多不同的变体,每个变体都有各自的嵌入向量。比如,标记“list”可能有许多不同的变体,每个变体都有各自的嵌入,比如“_list”、“List”等等。这些变体通常具有和原始标记非常相似的嵌入。下图是标记“列表”及其近邻(包括其变体)的图表。

总结:不学不是网络安全人!

Embedding仍然是自然语言处理和现代大语言模型的基础。虽然LLM领域的研究每天都在探索新的方法和技术,但Embedding在大型语言模型中却没有太大变化。尽管如此,它们仍然至关重要,「因为它是把文本、图像、语音等内容转换至大模型可理解维度的必经之路」

总之,本文主要介绍了关于Embedding的基础知识,以及它们从传统统计方法演变为当今大语言模型 (LLM) 用例的过程。希望通过本文,你能对Embedding有一个全面的了解,在网络安全领域玩转AI!
```

之前商界有位名人说过:“站在风口,猪都能吹上天”。这几年,AI大模型领域百家争鸣,百舸争流,明显是这个时代下一个风口!

那如何学习大模型&AI产品经理?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

只要你是真心想学AI大模型,我这份资料就可以无偿共享给你学习。大模型行业确实也需要更多的有志之士加入进来,我也真心希望帮助大家学好这门技术,如果日后有什么学习上的问题,欢迎找我交流,有技术上面的问题,我是很愿意去帮助大家的!

如果你也想通过学大模型技术去帮助就业和转行,可以点扫描下方链接👇👇
大模型重磅福利:入门进阶全套104G学习资源包免费分享!
在这里插入图片描述

01.从入门到精通的全套视频教程

包含提示词工程、RAG、Agent等技术点
在这里插入图片描述

02.AI大模型学习路线图(还有视频解说)

全过程AI大模型学习路线

在这里插入图片描述

​​在这里插入图片描述

03.学习电子书籍和技术文档

市面上的大模型书籍确实太多了,这些是我精选出来的

在这里插入图片描述

04.大模型面试题目详解

在这里插入图片描述

在这里插入图片描述

05.这些资料真的有用吗?

这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。

所有的视频由智泊AI老师录制,且资料与智泊AI共享,相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

在这里插入图片描述
在这里插入图片描述

智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念‌,通过动态追踪大模型开发、数据标注伦理等前沿技术趋势‌,构建起"前沿课程+智能实训+精准就业"的高效培养体系。

课堂上不光教理论,还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事‌!

在这里插入图片描述
如果说你是以下人群中的其中一类,都可以来智泊AI学习人工智能,找到高薪工作,一次小小的“投资”换来的是终身受益!

应届毕业生‌:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。

零基础转型‌:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界‌。

业务赋能 ‌突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型‌。

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐