第3讲、大模型如何理解和表示单词:词嵌入向量原理详解

1. 引言

大型语言模型(Large Language Models,简称LLM)如GPT-4、Claude和LLaMA等近年来取得了突破性进展,能够生成流畅自然的文本、回答复杂问题、甚至编写代码。但这些模型究竟是如何理解人类语言的?它们如何表示和处理单词?本文将深入探讨大模型的基础机制——词嵌入向量,揭示AI是如何"理解"文字的。

2. 从符号到向量:语言表示的基础

2.1 词向量的概念

在传统自然语言处理中,单词通常被表示为独热编码(One-Hot Encoding)——一个只有一个元素为1,其余都为0的稀疏向量。例如,在一个有10000个单词的词汇表中,"苹果"这个词可能被表示为一个长度为10000的向量,其中只有第345位是1,其余都是0。

然而,这种表示方法存在明显缺陷:向量维度过高且稀疏,更重要的是,无法表达单词之间的语义关系。例如,"苹果"和"梨"在语义上很接近,但它们的独热编码向量可能完全不同,计算相似度时得到的结果是0。

2.2 词嵌入向量的基本原理

词嵌入向量(Word Embedding)解决了上述问题,它是"通过将离散空间向连续空间映射后得到的词向量"。每个单词被映射到一个低维度(通常为几百维)的稠密向量空间中,这些向量捕捉了单词的语义和句法特性。

词嵌入向量的核心优势在于:语义上相似的词在向量空间中的距离也相近。这种特性使得模型能够理解词与词之间的关系,从而更好地处理自然语言。

3. 词嵌入向量的实现方式

3.1 Word2Vec

Word2Vec是由Google在2013年开源的词嵌入技术,它通过两种模型来学习词向量:

  1. CBOW (Continuous Bag of Words):使用上下文预测目标词。给定一个词的上下文(周围的词),预测这个词是什么。
  2. Skip-gram:与CBOW相反,使用目标词预测上下文。给定一个词,预测它周围可能出现的词。

Word2Vec能够捕捉到丰富的语义关系,最著名的例子是向量的代数运算能够表示语义关系:

vector('国王') - vector('男人') + vector('女人') ≈ vector('女王')
vector('巴黎') - vector('法国') + vector('意大利') ≈ vector('罗马')

这种现象表明,词嵌入不仅能够捕捉相似性,还能捕捉词汇之间的语义关系和类比关系。

####案例代码

import streamlit as st
import pandas as pd
from sklearn.decomposition import PCA
from openai import OpenAI
from dotenv import load_dotenv
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import matplotlib# 指定中文字体路径(macOS)
font_path = "/System/Library/Fonts/PingFang.ttc"  # macOS 中文字体
my_font = fm.FontProperties(fname=font_path)# 设置 matplotlib 默认字体
matplotlib.rcParams['font.family'] = my_font.get_name()
matplotlib.rcParams['axes.unicode_minus'] = False
# 加载环境变量
load_dotenv()# OpenAI 客户端
client = OpenAI(
)# 嵌入生成函数
def get_word_embeddings(words, model="text-embedding-3-large"):try:response = client.embeddings.create(input=words, model=model)return [item.embedding for item in response.data]except Exception as e:st.error(f"Error occurred: {e}")return []# 主界面
st.title("🧠 词嵌入向量空间可视化")st.write("输入一些单词,看看它们在二维空间里的分布!")# 文本输入
user_input = st.text_area("请输入单词(每行一个单词):","国王\n皇后\n男人\n女人\n猫\n狗\n苹果\n橙子"
)if user_input:words = [w.strip() for w in user_input.split("\n") if w.strip()]if len(words) < 2:st.warning("请输入至少两个单词!")else:with st.spinner("生成词嵌入向量中..."):embeddings = get_word_embeddings(words)if embeddings:st.success("嵌入向量生成成功!")st.write(f"每个单词的向量维度:**{len(embeddings[0])}**")# 用 PCA 降到 2Dpca = PCA(n_components=2)reduced = pca.fit_transform(embeddings)# 转成 DataFramedf = pd.DataFrame(reduced, columns=["x", "y"])df["word"] = words# 画出散点图fig, ax = plt.subplots(figsize=(10, 6))ax.scatter(df["x"], df["y"], color="blue")# 在点旁边标注单词for i, word in enumerate(df["word"]):ax.text(df["x"][i]+0.01, df["y"][i]+0.01, word, fontsize=12)ax.set_title("词嵌入二维空间可视化")ax.set_xlabel("主成分1 (PCA1)")ax.set_ylabel("主成分2 (PCA2)")st.pyplot(fig)# 图的解释st.subheader("图表解释 🧠")st.markdown("""- 每个点代表一个单词在嵌入空间中的位置。- **相近的单词**,在二维平面上会靠得更近,表示语义相似。- 方向和距离代表潜在的语义关系,比如“国王-男人+女人≈皇后”。- 注意:因为是降维展示,实际高维特征被简化了,但依然可以直观感知单词间的语义结构。""")

3.2 GloVe

GloVe (Global Vectors for Word Representation) 是由斯坦福大学开发的另一种流行的词嵌入模型。与Word2Vec不同,GloVe结合了全局矩阵分解和局部上下文窗口方法的优点。

GloVe基于共现矩阵——记录每个单词与其上下文词的共现频率,然后通过矩阵分解技术学习词向量。这使得GloVe能够更好地捕捉全局统计信息。

3.3 FastText

FastText是Facebook AI Research开发的一种改进型词嵌入模型。它的主要创新在于将单词分解为子词(subword)单元,通常是字符n-gram。

例如,单词"apple"的3-gram表示为:<ap, app, ppl, ple, le>。这种方法的优势在于:

  1. 能够处理词汇表外的词(OOV问题)
  2. 对拼写错误有一定的容忍度
  3. 特别适合处理形态丰富的语言(如芬兰语、土耳其语等)

4. 大模型中的词嵌入技术

在现代大型语言模型(如BERT、GPT系列、LLaMA等)中,词嵌入技术得到了进一步的发展和应用。

4.1 上下文相关的词嵌入

传统的Word2Vec等模型为每个词生成一个固定的向量,而不考虑上下文。这意味着多义词(如"苹果"可以指水果或公司)只有一个表示。

而现代大模型采用了上下文相关的词嵌入技术。例如,BERT模型会根据词出现的上下文生成不同的表示:

"我喜欢吃苹果" → vector("苹果") 表示水果意义
"苹果公司发布新产品" → vector("苹果") 表示公司意义

这种动态表示极大地提高了模型理解语言的能力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.2 Transformer中的词嵌入

在Transformer架构(现代大模型的基础)中,词嵌入通常包含三个部分:

  1. 词嵌入 (Token Embeddings):单词本身的向量表示
  2. 位置嵌入 (Positional Embeddings):表示单词在序列中的位置
  3. 段嵌入 (Segment Embeddings):用于区分不同段落或句子(主要用于BERT等模型)

这三种嵌入向量相加后,形成了输入Transformer各层的初始表示。位置嵌入特别重要,因为它使模型能够了解单词的顺序,这对于理解语言至关重要。

5. 大模型中的Token化过程

大模型处理文本的第一步是将输入分解为"token"。这些token可以是完整单词、子词单元(subword units)或单个字符。

5.1 BPE算法

字节对编码(Byte Pair Encoding, BPE)是GPT等模型常用的分词算法。BPE首先将每个单词分解为字符序列,然后反复合并最常见的字符对,形成新的子词单元。

BPE的优势在于能够平衡词汇表大小和表示能力,有效处理罕见词和复合词。

例如,英文单词"unhappiness"可能被分解为:["un", "happiness"]["un", "happy", "ness"],而中文"人工智能"可能被分解为:["人工", "智能"]

5.2 SentencePiece和WordPiece

SentencePiece和WordPiece是其他常用的子词分词算法,它们与BPE类似,但在细节实现上有所不同。这些算法都允许模型处理开放词汇表,提高了模型的灵活性和泛化能力。

6. 词嵌入向量的特性与误区

6.1 重要特性

  1. 语义相似性:语义相近的词在向量空间中距离较近
  2. 类比关系:向量间的关系可以表示语义关系
  3. 降维可视化:通过t-SNE等技术降维后,可以直观地看到词汇聚类

6.2 常见误区

注意点: 词嵌入向量并不直接表示语义,而是词与词之间语义的相似度。因此,不必去纠结每个向量值到底代表什么意思。

许多人误以为词向量的每个维度对应某种具体的语义属性(如第一维表示性别,第二维表示生物/非生物等)。实际上,词嵌入空间通常是高度纠缠的,单个维度很少有明确的语义解释。

词嵌入是在特定任务和数据集上学习得到的分布式表示,它们捕捉的是词与词之间的相对关系,而非绝对语义。

7. 词嵌入向量的实际应用

词嵌入技术被广泛应用于各种自然语言处理任务:

  1. 文本分类:通过词向量表示文档,进行情感分析、主题分类等
  2. 命名实体识别:识别文本中的人名、地名、组织名等专有名词
  3. 机器翻译:作为神经机器翻译系统的基础表示
  4. 问答系统:帮助理解问题和生成答案
  5. 文本相似度计算:判断两段文本的语义相似程度

7.1 实战案例:使用Python实现词向量计算

下面我们通过一个实际案例,展示如何使用Python和预训练模型来计算和使用词向量。我们将使用流行的Gensim库和预训练的Word2Vec模型来演示:

import streamlit as st
import gensim.downloader as api
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import matplotlib# 指定中文字体路径(macOS)
font_path = "/System/Library/Fonts/PingFang.ttc"
my_font = fm.FontProperties(fname=font_path)# 设置 matplotlib 中文字体和负号显示
matplotlib.rcParams['font.family'] = my_font.get_name()
matplotlib.rcParams['axes.unicode_minus'] = False# 设置页面配置
st.set_page_config(page_title="Word2Vec 词向量可视化", layout="wide")@st.cache_resource(show_spinner=True)
def load_model():return api.load('word2vec-google-news-300')# 加载模型
model = load_model()st.title("📌 Word2Vec 词向量可视化工具")# 分页
tab1, tab2, tab3, tab4 = st.tabs(["词向量查询", "词语相似度", "类比推理", "向量可视化"])# --- 1. 词向量查询 ---
with tab1:st.header("🔍 查看词向量")word = st.text_input("输入一个英文单词:", "computer")if st.button("获取词向量"):if word in model:vec = model[word]st.write(f"词向量维度: {vec.shape}")st.write("前10个维度的值:", vec[:10])else:st.error("词不在词汇表中,请尝试其他单词")# --- 2. 词语相似度 ---
with tab2:st.header("🔗 计算词语相似度")col1, col2 = st.columns(2)with col1:word1 = st.text_input("单词1", "computer")with col2:word2 = st.text_input("单词2", "laptop")if st.button("计算相似度"):if word1 in model and word2 in model:sim = model.similarity(word1, word2)st.success(f"'{word1}' 和 '{word2}' 的余弦相似度为:{sim:.4f}")else:st.error("一个或两个词不在词汇表中")# --- 3. 类比推理 ---
with tab3:st.header("🧠 类比推理(word1 - word2 + word3 ≈ ?)")col1, col2, col3 = st.columns(3)with col1:w1 = st.text_input("词1 (如 king)", "king")with col2:w2 = st.text_input("词2 (如 man)", "man")with col3:w3 = st.text_input("词3 (如 woman)", "woman")if st.button("进行类比推理"):try:result = model.most_similar(positive=[w3, w1], negative=[w2], topn=5)st.write(f"'{w1}' 之于 '{w2}',相当于 '{w3}' 之于:")for word, score in result:st.write(f"- {word}: {score:.4f}")except KeyError as e:st.error(f"词汇错误: {e}")# --- 4. 向量可视化 ---
with tab4:st.header("📈 词向量可视化(PCA降维)")words_input = st.text_area("输入一组英文单词,用逗号分隔(如:king,queen,man,woman,computer)","king, queen, man, woman, computer, banana, apple, orange, prince, princess")raw_words = [w.strip() for w in words_input.split(",")]words = [w for w in raw_words if w in model]skipped = [w for w in raw_words if w not in model]if st.button("生成可视化图像"):if len(words) < 2:st.warning("请至少输入两个词,并确保它们在词汇表中")else:vectors = [model[w] for w in words]pca = PCA(n_components=2)reduced = pca.fit_transform(vectors)fig, ax = plt.subplots(figsize=(12, 8))ax.set_facecolor("#f9f9f9")  # 浅色背景ax.grid(True, linestyle='--', alpha=0.5)  # 显示网格线# 绘制点ax.scatter(reduced[:, 0], reduced[:, 1],color="#1f77b4", s=100, alpha=0.7, edgecolor='k', linewidth=0.5)# 标签字体大小适配数量font_size = max(8, 14 - len(words) // 5)# 添加标签for i, word in enumerate(words):ax.annotate(word, xy=(reduced[i, 0], reduced[i, 1]),fontsize=font_size, fontproperties=my_font,xytext=(5, 2), textcoords='offset points',bbox=dict(boxstyle='round,pad=0.3', edgecolor='gray', facecolor='white', alpha=0.6),arrowprops=dict(arrowstyle='->', color='gray', lw=0.5))ax.set_title("📌 Word2Vec 词向量 2D 可视化 (PCA)", fontsize=18, pad=15)st.pyplot(fig)if skipped:st.info(f"以下词不在模型词汇表中,已跳过:{', '.join(skipped)}")# 自动分析生成说明st.subheader("🧠 分析说明")explanation = []# 简单聚类分析:找最近的词对from scipy.spatial.distance import euclideanpairs = []for i in range(len(words)):for j in range(i + 1, len(words)):dist = euclidean(reduced[i], reduced[j])pairs.append(((words[i], words[j]), dist))pairs.sort(key=lambda x: x[1])top_similar = pairs[:3]  # 取最相近的三个词对for (w1, w2), dist in top_similar:explanation.append(f"🔹 **{w1}** 和 **{w2}** 在图中非常接近,表明它们在语义上可能较为相关(距离约为 {dist:.2f})。")# 计算均值中心,找偏离大的词(即“异类”)center = reduced.mean(axis=0)dists_to_center = [(words[i], euclidean(reduced[i], center)) for i in range(len(words))]dists_to_center.sort(key=lambda x: x[1], reverse=True)outlier_word, max_dist = dists_to_center[0]explanation.append(f"🔸 **{outlier_word}** 与其他词的平均距离最大(约为 {max_dist:.2f}),可能表示它语义上偏离较远。")# 输出说明for line in explanation:st.markdown(line)

运行结果示例


这个案例展示了词向量的四个核心应用:

  1. 获取词语的向量表示
  2. 计算词语之间的语义相似度
  3. 进行词向量的代数运算来发现类比关系
  4. 可视化词向量空间的语义结构

通过这个例子,我们可以直观地理解词嵌入如何捕捉单词之间的语义关系,以及如何在实际应用中利用这些关系。这种能力是大模型理解自然语言的基础。

8. 总结与展望

词嵌入向量技术是大模型理解人类语言的基础。从最初的Word2Vec到现代Transformer架构中的上下文相关表示,词嵌入技术不断发展,使AI能够更精确地理解和生成自然语言。

未来,词嵌入技术可能会向以下方向发展:

  1. 多模态嵌入:将文本、图像、音频等不同模态的信息统一表示
  2. 知识增强型嵌入:融合结构化知识库信息的词嵌入
  3. 更高效的计算方法:降低大模型中词嵌入计算的资源消耗
  4. 多语言统一表示:开发能够跨语言捕捉语义的通用嵌入空间

通过深入理解词嵌入向量的原理,我们不仅能更好地应用大模型,也能洞察人工智能是如何"思考"的,为未来的AI发展提供思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java面试笔记:进阶】19.Java并发包提供了哪些并发工具类?

Java 并发包(java.util.concurrent)提供了一系列强大的工具类,用于简化多线程编程、提升并发性能并确保线程安全。 1. Java 并发包的核心内容 并发包概述:java.util.concurrent 包及其子包提供了丰富的并发工具类,用于简化多线程编程。主要组成部分: 高级同步结构:如 C…

Matlab数字信号处理——小波阈值法去噪分析系统

&#x1f527; 系统简介 本系统通过 MATLAB GUI 图形界面&#xff0c;集成了 小波阈值去噪算法 的各个核心模块&#xff0c;可以实现以下功能&#xff1a; 打开语音文件&#xff1a;支持常见音频格式读取&#xff1b; 模拟加噪&#xff1a;系统内置白噪声模拟功能&#xff0…

EDI 如何与 ERP,CRM,WMS等系统集成

在数字化浪潮下&#xff0c;与制造供应链相关产业正加速向智能化供应链转型。传统人工处理订单、库存和物流的方式已难以满足下单客户对响应速度和数据准确性的严苛要求。EDI技术作为企业间数据交换的核心枢纽&#xff0c;其与ERP、CRM、WMS等业务系统的深度集成&#xff0c;成…

计算机组成原理-408考点-数的表示

常见题型&#xff1a;C语言中的有符号数和无符号数的表示。 【例】有如下C语言程序段: short si-32767&#xff1b;unsigned short usisi&#xff1b;执行上述两条语句后&#xff0c;usi的值为___。short和unsigned short均使用16位二进制数表示。 【分析】考点&#xff1a;同…

企业级AI开发利器:Spring AI框架深度解析与实战

企业级AI开发利器&#xff1a;Spring AI框架深度解析与实战 一、前言&#xff1a;Java生态的AI新纪元 在人工智能技术爆发式发展的今天&#xff0c;Java开发者面临着一个新的挑战&#xff1a;如何将大语言模型&#xff08;LLMs&#xff09;和生成式AI&#xff08;GenAI&#…

【金仓数据库征文】——选择金仓,选择胜利

目录 第一部分&#xff1a;金仓数据库——开创数据库技术的新时代 1.1 金仓数据库的技术底蕴 1.2 高可用架构与灾备能力 1.3 分布式架构与弹性扩展能力 第二部分&#xff1a;金仓数据库助力行业数字化转型 2.1 电信行业&#xff1a;核心系统国产化替代 2.2 医疗行业&…

用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。

一、思路概要和知识回顾 1.思路概要 ①中缀表达式计算&#xff1a; 需要处理运算符的优先级&#xff0c;可能需要用到栈结构。 ❗❗如何将中缀表达式转换为后缀表达式&#xff1f;或者直接计算&#xff1f; 通常&#xff0c;中缀转后缀&#xff08;逆波兰式&#xff09;再…

Langchain_Agent+数据库

本处使用Agent数据库&#xff0c;可以直接执行SQL语句。可以多次循环查询问题 前文通过chain去联系数据库并进行操作&#xff1b; 通过链的不断内嵌组合&#xff0c;生成SQL在执行SQL再返回。 初始化 import os from operator import itemgetterimport bs4 from langchain.ch…

Python 爬虫如何伪装 Referer?从随机生成到动态匹配

一、Referer 的作用与重要性 Referer 是 HTTP 请求头中的一个字段&#xff0c;用于标识请求的来源页面。它在网站的正常运行中扮演着重要角色&#xff0c;例如用于统计流量来源、防止恶意链接等。然而&#xff0c;对于爬虫来说&#xff0c;Referer 也可能成为被识别为爬虫的关…

Post-Processing PropertySource instance详解 和 BeanFactoryPostProcessor详解

PropertySourcesBeanFactoryPostProcessor详解 1. 核心概念 BeanFactoryPostProcessor 是 Spring 框架中用于在 BeanFactory 初始化阶段 对 Environment 中的 PropertySource 进行后处理的接口。它允许开发者在 Bean 创建之前 对属性源进行动态修改&#xff0c;例如添加、删除…

[C]基础13.深入理解指针(5)

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对比 2、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1 代码12.2.2 代码22.2.3 代码32.2.4 …

赛灵思 XCKU115-2FLVB2104I Xilinx Kintex UltraScale FPGA

XCKU115-2FLVB2104I 是 AMD Xilinx Kintex UltraScale FPGA&#xff0c;基于 20 nm 先进工艺&#xff0c;提供高达 1 451 100 个逻辑单元&#xff08;Logic Cells&#xff09;&#xff0c;77 721 600 bit 的片上 RAM 资源&#xff0c;以及 5 520 个 DSP 切片&#xff08;DSP48E…

CAPL编程_03

1_文件操作的相关函数&#xff1a; 读文本文件内容 读取文本文件操作的三部曲 1&#xff09;打开文件 —— openFileRead ( ) 2&#xff09;逐行读取 —— fileGetString ( ) 、fileGetStringSZ ( ) 3&#xff09;关闭文件 —— fileClose ( ) char content[100];…

2025年江西建筑安全员A证适合报考人群

江西建筑安全员A证适合报考人群 江西省建筑安全员A证&#xff08;建筑施工企业主要负责人安全生产考核合格证书&#xff09;主要面向建筑行业管理人员&#xff0c;适合以下人员报考&#xff1a; 1. 企业主要负责人 法人代表、总经理、分管安全副总&#xff1a;依法需持A证&a…

Docker安装(Ubuntu22版)

前言 你是否还在为Linux上配置Docker而感到烦恼&#xff1f; 你是否还在为docker search&#xff0c;docker pull连接不上&#xff0c;而感到沮丧&#xff1f; 本文将解决以上你的所有烦恼&#xff01;快速安装好docker&#xff01; Docker安装 首先&#xff0c;我们得先卸载…

Ubuntu18.04配置C++环境和Qt环境

Ubuntu18.04配置C环境和Qt环境 1、前言3.2 安装其他库3.3 查看有没有安装成功3.4测试C环境 4、配置Qt环境4.1 安装相关的库4.2 测试 5、总结 1、前言 记录一下Ubuntu18.04配置C环境和Qt环境的过程&#xff0c;方便自己日后回顾&#xff0c;也可以给有需要的人提供帮助。 # 2…

ACWing——算法基础课

置顶思考&#xff1a; 算法的本质是什么样的思想&#xff1f; 这种思想可以解决哪类问题&#xff1f; 有没有其他的解决思路&#xff1f; 关注数值范围&#xff0c;思考可不可以针对性解决问题&#xff1f; 目录 https://leetcode.cn/circle/discuss/RvFUtj/ 滑动窗口与双指针…

私钥连接服务器(已经有服务器私钥

前言&#xff1a;假设我们已经有了服务器的私钥&#xff0c;我们怎么配置呢&#xff1f; 下面我会从vsc的配置角度来写 ✅ 步骤一&#xff1a;准备工作 安装 VS Code&#xff08;如果还没装&#xff09; &#x1f449; https://code.visualstudio.com/ 安装插件&#xff1a;Re…

Redis LFU 策略参数配置指南

一、基础配置步骤‌ 设置内存上限‌ 在 redis.conf 配置文件中添加以下指令&#xff0c;限制 Redis 最大内存使用量&#xff08;例如设置为 4GB&#xff09;&#xff1a; maxmemory 4gb选择 LFU 淘汰策略‌ 根据键的作用域选择策略&#xff1a; # 所有键参与淘汰 maxmemory-…

嵌入式 C 语言面试核心知识点全面解析:基础语法、运算符与实战技巧

在嵌入式面试中&#xff0c;C 语言基础是重中之重。本文针对经典面试题进行详细解析&#xff0c;帮助新手系统掌握知识点&#xff0c;提升面试应对能力。 一、数据结构逻辑分类 题目 在数据结构中&#xff0c;从逻辑上可以把数据结构分为&#xff08; &#xff09;。 A、动态…