大语言模型(LLM)入门笔记:嵌入向量与位置信息
一、嵌入向量(Embeddings):让计算机"看懂"文字
1. 什么是嵌入向量?
你可以把嵌入向量理解成文字的"数字翻译器"。计算机看不懂"猫""狗"这些文字,只能处理数字,嵌入向量就负责把文字转换成一串数字(比如[0.2, 0.5, -0.3]
),同时还保留了文字的意思。
2. 为什么需要嵌入向量?
- 举个例子:用"One-Hot编码"表示"猫"可能是
[1,0,0,0,...]
(一万个数字里只有一个1),不仅浪费空间,还无法表示"猫"和"狗"都是动物的关系 - 嵌入向量的优势:
- 维度小(通常几百维),计算快
- 语义相似的词,向量也相似("猫"和"狗"的向量很接近)
- 能体现语义关系(比如"国王"-“男人”+“女人"≈"女王”)
3. 两种常见的嵌入向量
类型 | 特点 | 例子 |
---|---|---|
上下文无关 | 同一个词在任何句子里向量都一样 | Word2Vec、GloVe |
上下文相关 | 同一个词在不同句子里向量不同 | LLM(如BERT、GPT)中的嵌入 |
通俗例子:
"苹果"在"我吃苹果"和"苹果手机"中,上下文无关嵌入会给出相同向量,而上下文相关嵌入会给出不同向量(因为意思不同)
4. 在LLM中的作用
嵌入向量是模型处理文本的"第一道工序",所有文字都要先变成嵌入向量,模型才能开始后续计算。
二、位置信息(Positional Information):让模型知道"谁先谁后"
1. 什么是位置信息?
位置信息就是给句子中的每个词打上"位置标签",告诉模型这个词在句子中排第几。
2. 为什么需要位置信息?
- 关键原因:LLM的核心组件(Transformer)是"并行计算"的,默认不知道词的顺序
- 举个例子:
"我爱你"和"你爱我"用词完全相同,但意思相反,全靠词的顺序决定
3. 两种常见的位置编码方式
-
绝对位置编码(Transformer原论文用):
给每个位置(第1个、第2个…)分配一个固定向量,用正弦/余弦函数生成,位置越近向量越相似 -
相对位置编码(GPT等模型用):
不关心词在"第几个",只关心词之间的"距离"(比如A在B前面3个位置),更符合人类理解习惯
4. 在LLM中的作用
位置信息+嵌入向量,就像给模型同时提供了"词的意思"和"词的顺序",模型才能理解句子结构(比如主谓宾关系)。
三、小白必知的注意点和易错点
关于嵌入向量
-
维度不是越高越好:
维度太高会增加计算量,通常根据任务选择(比如768维、1024维) -
一词多义要靠上下文:
刚开始学容易以为一个词只有一个向量,实际上在LLM中,同一个词在不同语境下向量不同 -
预训练模型需要微调:
通用的嵌入向量在专业领域(如医学、法律)效果不好,需要针对性调整
关于位置信息
-
超过长度会失效:
每个模型都有最大处理长度(比如GPT-3是2048个词),超过这个长度,位置信息会出错 -
不是简单的序号:
刚开始可能以为位置编码就是1、2、3…其实是复杂的数学设计,目的是让模型更好地理解位置关系 -
与嵌入向量的结合方式:
通常是"相加"而不是"拼接",这样能同时保留语义和位置信息
常见误解
-
❌ 错误:嵌入向量只能表示单词
✅ 正确:可以表示任何文本单元(字、词、短语、句子甚至段落) -
❌ 错误:位置信息不重要,模型自己能猜出来
✅ 正确:没有位置信息,模型会把"我打你"和"你打我"当成一个意思
四、代码示例
1. 词嵌入示例(用Gensim库)
from gensim.models import Word2Vec
from sklearn.metrics.pairwise import cosine_similarity# 训练数据:几个简单句子
sentences = [["猫", "是", "一种", "动物"],["狗", "是", "一种", "动物"],["苹果", "是", "一种", "水果"]
]# 训练Word2Vec模型(生成嵌入向量)
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)# 获取词向量
cat_vec = model.wv["猫"]
dog_vec = model.wv["狗"]
apple_vec = model.wv["苹果"]# 计算相似度(值越大越相似)
print(f"猫和狗的相似度: {cosine_similarity([cat_vec], [dog_vec])[0][0]:.4f}") # 结果会比较大
print(f"猫和苹果的相似度: {cosine_similarity([cat_vec], [apple_vec])[0][0]:.4f}") # 结果会比较小
代码说明:这个例子能直观展示"语义相似的词,向量也相似"的特点
2. Transformer位置编码实现
import numpy as np
import matplotlib.pyplot as pltdef positional_encoding(position, d_model):"""生成Transformer原论文中的位置编码"""angle_rads = np.arange(position)[:, np.newaxis] / np.power(10000, np.arange(d_model)[np.newaxis, :] / np.float32(d_model))# 偶数索引用正弦,奇数用余弦angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2])angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2])pos_encoding = angle_rads[np.newaxis, ...]return pos_encoding# 可视化位置编码(能看到不同位置的编码模式)
pos_encoding = positional_encoding(50, 128)
plt.figure(figsize=(12, 8))
plt.pcolormesh(pos_encoding[0], cmap='viridis')
plt.xlabel('嵌入向量维度')
plt.xlim((0, 128))
plt.ylabel('位置')
plt.title('位置编码可视化')
plt.colorbar()
plt.show()
代码说明:运行后会显示一个彩色矩阵,每行代表一个位置的编码,能看到位置越近,颜色模式越相似
五、总结:嵌入向量 vs 位置信息
对比项 | 嵌入向量 | 位置信息 |
---|---|---|
核心功能 | 表示"词的意思" | 表示"词的顺序" |
比喻 | 文字的"数字指纹" | 队伍的"编号牌" |
模型依赖 | 所有LLM都必须有 | 基于Transformer的LLM必须有 |
常见问题 | 一词多义处理 | 长文本位置信息衰减 |
简单说:嵌入向量让模型"懂词义",位置信息让模型"懂语法",两者结合是LLM理解语言的基础。