☰
GloVe 词向量训练与使用完全指南:从预训练向量下载到自定义语料训练与评估
2026/10/15 17:27:00 网站建设 项目流程
  • NLP
  • 机器学习

【免费下载链接】GloVe

Software in C and data files for the popular GloVe model for distributed word representations, a.k.a. word vectors or embeddings

项目地址:https://gitcode.com/gh_mirrors/gl/GloVe
点击查看免费下载

本指南以 GloVe(Global Vectors for Word Representation)开源仓库的 README.md 为骨架,系统讲解"下载预训练词向量"与"在自定义语料上从零训练"两条完整路径:前者覆盖 2024 年新增的 5 套向量与经典 Web 语料向量,后者深入vocab_count → cooccur → shuffle → glove四步 C 工具流水线的全部参数与底层实现。读完本文,你将能够复现 demo.sh 的端到端训练流程、按需配置大语料训练脚本、解读词向量输出格式,并用仓库自带的类比评测脚本验证向量质量。

一、GloVe 是什么:基于全局共现统计的词向量模型

GloVe 通过矩阵分解的思想学习词表示:它不依赖局部的滑动窗口预测任务(如 word2vec 的 CBOW/Skip-gram),而是直接对"词-词共现矩阵"建模,让词向量捕获全局统计信息。模型名字"Global Vectors"即点明这一特点——词向量由全语料的共现统计共同塑造,而非单个上下文窗口。

README 开头的表格直观展示了训练完成后的两个典型能力:

  • 最近邻语义:frog(青蛙)的最近邻向量是Litoria、Leptodactylidae、Rana、Eleutherodactylus等蛙类物种名,说明向量空间按语义聚类;
  • 线性类比几何:man → woman、city → zip(城市→邮编)、comparative → superlative(比较级→最高级)均呈现稳定的向量平移关系,这正是后续基于向量加减法做词类比评测的基础。

本仓库提供该模型的完整 C 实现、预训练向量发布物与配套评测工具。更详细的算法原理可参见项目主页与论文(README 中给出的项目资料),本仓库则聚焦于工程实现。

二、直接使用:下载预训练词向量

如果只是想在下游 NLP 任务中使用词向量,而不关心训练过程,直接下载预训练向量即可。README 明确指出:面向海量 Web 语料训练的向量,只需下载对应文本文件即可使用。所有预训练向量的下载链接均列在仓库根目录 README.md 中。

2.1 2024 年新增向量(NEW 2024 VECTORS)

仓库于 2024 年重新训练并发布了一批新向量,覆盖 5 个规格:

向量文件训练语料Token 规模词表大小大小写维度下载体积
glove.2024.dolma.300dDolma220B tokens1.2Muncased300d约 1.6 GB
glove.2024.wikigiga.300dWikipedia + Gigaword 511.9B tokens1.2Muncased300d约 1.6 GB
glove.2024.wikigiga.200dWikipedia + Gigaword 511.9B tokens1.2Muncased200d约 1.1 GB
glove.2024.wikigiga.100dWikipedia + Gigaword 511.9B tokens1.2Muncased100d约 560 MB
glove.2024.wikigiga.50dWikipedia + Gigaword 511.9B tokens1.2Muncased50d约 290 MB

这批向量的训练脚本与数据预处理管线记录在 Training_README.md 中(详见本文第七节),配套的分析与文档说明见 README 中引用的技术报告。

2.2 经典 Web 语料向量

除了 2024 新向量,README 还提供沿用多年的经典向量:

向量文件训练语料Token 规模词表大小大小写维度下载体积
glove.42B.300dCommon Crawl42B tokens1.9Muncased300d约 1.75 GB
glove.840B.300dCommon Crawl840B tokens2.2Mcased300d约 2.03 GB
glove.6BWikipedia 2014 + Gigaword 56B tokens400Kuncased300d约 822 MB
glove.twitter.27BTwitter(2B 条推文)27B tokens1.2Muncased200d约 1.42 GB

这些向量以Public Domain Dedication and License(公有领域奉献协议)发布,可自由使用。

选择建议:追求最新语料与词表覆盖度选 2024 系列;需要超大 Web 语料覆盖选 Common Crawl 840B;中英文通用场景可先试 glove.6B(体积适中、社区兼容性最好);社交网络文本场景选 Twitter 版本。

三、快速上手:编译与端到端 demo

如果现有预训练向量不符合业务语料的语义分布,就需要在自己的语料上训练。README 给出的最快路径是三行命令:

$ git clone https://gitcode.com/gh_mirrors/gl/GloVe.git $ cd GloVe && make $ ./demo.sh

执行前需确认以下前置依赖(README 明确列出):

  • GNU Make:驱动 Makefile 的构建流程;
  • GCC:C 编译器(Clang 伪装成 GCC 也可以);
  • Python 与 NumPy:用于跑词类比评测脚本。

3.1 Makefile 构建细节

make会在build/目录下编译出 4 个可执行文件:vocab_count、cooccur、shuffle、glove。构建参数见 Makefile:

  • 默认CC = gcc,CFLAGS = -pthread -O3 -march=native -funroll-loops -Wall -Wextra -Wpedantic;
  • 文件顶部注释中保留了-Ofast的备选方案,并特别警告:-Ofast会开启-ffinite-math-only,使程序中的 NaN/Inf 检查永远返回 false,因此默认不使用,以保证训练过程中的数值安全检测有效;
  • Makefile 会自动检测 Apple Silicon(Darwin + arm64),并为非 Apple Silicon 平台附加-march=native(Apple 自带的 clang 不支持该选项);
  • 四个二进制均链接src/common.o,公共代码来自 src/common.c 与 src/common.h。

3.2 demo.sh 做了什么

demo.sh 是官方示例脚本(set -e保证任一步失败即退出),完整演示了"下载语料 → 构建词表 → 统计共现 → 打乱 → 训练 → 评测"的全流程:

  1. 下载语料:若当前目录没有text8,则下载 text8.zip 并解压。text8 是维基百科前 100M 字符的样本语料(README 原文描述),作为小型演示语料;
  2. 构建词表:vocab_count -min-count 5 -verbose 2 < text8 > vocab.txt;
  3. 统计共现:cooccur -memory 4.0 -vocab-file vocab.txt -verbose 2 -window-size 15 < text8 > cooccurrence.bin;
  4. 打乱共现:shuffle -memory 4.0 -verbose 2 < cooccurrence.bin > cooccurrence.shuf.bin;
  5. 训练:glove -save-file vectors -threads 8 -input-file cooccurrence.shuf.bin -x-max 10 -iter 15 -vector-size 50 -binary 2 -vocab-file vocab.txt -verbose 2;
  6. 评测:默认调用python eval/python/evaluate.py;也可传参指定评测后端——./demo.sh matlab或./demo.sh octave分别使用 eval/matlab/read_and_evaluate.m 与 eval/octave/read_and_evaluate_octave.m。

关于自定义语料的完整说明,可进一步阅读 demo.sh 与 src/README.md。

四、在自定义语料上训练:四步工具流水线

src/README.md 明确了训练自建 GloVe 向量的语料格式要求与四步流水线:

语料格式要求:将语料整理为单个文本文件,所有词之间用空格或 Tab 分隔;若语料包含多篇文档,文档之间用换行符分隔——共现上下文不会跨越换行符(该约束在 src/common.c 的get_word()中实现:遇到\n视为文档结束标记,返回 1)。

注意:vocab_count要求输入语料已按空白切分为 token,原始文本需先经分词器处理(如 Stanford Tokenizer)。

4.1 工具 1:vocab_count —— 统计 unigram 频次

从语料构建 unigram 词频统计,可选地按词表总大小或最小频次截断词表。实现见 src/vocab_count.c。

命令行参数(源码main()中解析):

参数含义默认值
-verbose <int>输出详细程度:0、1 或 22
-max-vocab <int>词表大小上限,保留最频繁的<int>个词;超出时低频词被随机采样以保证词在字母表上均匀分布(源码先用无平局排序截断,再按频率+字母序排序)0(不限制)
-min-count <int>频次低于<int>的词被丢弃1

实现要点(src/vocab_count.c):get_counts()用哈希表统计 token 频次,遇到<unk>会报错并提示先用sed -e 's/<unk>/<raw_unk>/g'替换;统计完成后按频次降序排序,并按-max-vocab/-min-count截断,输出形如word count两列文本到标准输出。

4.2 工具 2:cooccur —— 统计词-词共现

从语料构建词-词共现统计,输入是vocab_count产出的词表文件。实现见 src/cooccur.c。

命令行参数(源码main()中解析):

参数含义默认值
-verbose <int>0、1、2(默认)或 32
-symmetric <int>0 = 只使用左侧上下文;1 = 左右上下文都用1
-window-size <int>上下文窗口大小(左侧及右侧各取多少个词)15
-vocab-file <file>词表文件(vocab_count产物)vocab.txt
-memory <float>内存软限制(GB),基于简单启发式估算,并不十分精确4.0
-max-product <int>稠密共现数组大小上限,即两词频次乘积的最大值;覆盖-memory的自动估算,通常仅超大语料需要调整自动估算
-overflow-length <int>稀疏溢出缓冲区的长度上限,缓冲区存满后落盘;覆盖-memory估算自动估算
-overflow-file <file>临时文件前缀(不含扩展名)overflow
-distance-weighting <int>0 = 共现计数不按距离加权;1 = 按词距的倒数加权1

实现要点:

  • 内存管理(src/cooccur.c):-memory通过迭代求解n * (log(n) + 0.1544313298)估算max_product,并令overflow_length ≈ rlimit/6,从而在稠密数组(bigram_table)与稀疏溢出缓冲之间分配内存;
  • 加权共现(src/cooccur.c):距离加权时每个共现计数的贡献为1.0/(j-k)(j-k 为词距),对称模式下还会交换两个词的角色(等价于同时统计右上下文);
  • 稀疏记录处理:频次乘积过大的词对存进溢出缓冲,缓冲满后排序并写临时文件overflow_XXXX.bin,最后通过多路归并(priority queue)合并去重(src/cooccur.c)。

4.3 工具 3:shuffle —— 打乱共现数据

cooccur输出的共现记录按词对排序,而随机梯度下降(SGD)需要随机顺序,因此必须打乱。实现见 src/shuffle.c。

命令行参数(源码main()中解析):

参数含义默认值
-verbose <int>0、1 或 22
-memory <float>内存软限制(GB)4.0
-array-size <int>分块打乱缓冲长度;覆盖-memory的自动估算自动估算
-temp-file <file>临时文件前缀temp_shuffle
-seed <int>随机种子;不设置则按当前时间随机化按时间

实现要点:大文件按块处理——缓冲区填满后先做 Fisher-Yates 洗牌(src/shuffle.c)写入临时文件,最后把各临时文件分段读入再混合洗牌输出(shuffle_merge())。-memory与缓冲区大小的换算见 src/shuffle.c:array_size = 0.95 * memory * 1GB / sizeof(CREC)。

4.4 工具 4:glove —— 训练词向量

在(shuffle打乱后的)共现数据上训练 GloVe 模型。这是四步流水线的核心,实现见 src/glove.c,训练入口为train_glove()(src/glove.c)。

命令行参数(源码main()中解析,完整清单见 src/glove.c 的 usage 输出):

参数含义默认值
-verbose <int>0、1 或 22
-write-header <int>1 = 在输出首行写入vocab_size vector_size(供 gensim 等库直接加载);0 = 不写0
-vector-size <int>词向量维度(不含 bias 项)50
-threads <int>训练线程数(pthreads)8
-iter <int>完整遍历共现矩阵的轮数25
-eta <float>初始学习率0.05
-alpha <float>加权函数的指数参数0.75
-x-max <float>加权函数的截断值100.0
-grad-clip <float>梯度分量裁剪,裁剪到[-grad-clip, grad-clip]100.0
-binary <int>输出格式:0 = 文本、1 = 二进制、2 = 两者都输出0
-model <int>文本输出的向量内容:0 = 词向量+上下文向量+偏置全量;1 = 仅词向量(无偏置);2 = 词向量+上下文词向量(无偏置);3 = 词向量与上下文向量按行拼接2
-input-file <file>打乱后的共现二进制输入(cooccur+shuffle产物)cooccurrence.shuf.bin
-vocab-file <file>词表文件(vocab_count产物)vocab.txt
-save-file <file>输出文件名前缀(不含扩展名)vectors
-gradsq-file <file>累积梯度平方输出文件名前缀gradsq
-save-gradsq <int>是否保存累积梯度平方(指定-gradsq-file时自动开启)0(关闭)
-checkpoint-every <int>每隔<int>轮保存一次模型检查点0(关闭)
-load-init-param <int>是否从-init-param-file加载初始参数0
-save-init-param <int>是否在训练前保存初始参数(即第 0 轮检查点)0
-init-param-file <file>初始参数二进制文件vectors.000.bin
-load-init-gradsq <int>是否加载初始累积梯度平方0
-init-gradsq-file <file>初始梯度平方二进制文件gradsq.000.bin
-seed <int>随机种子;不设置则按当前时间随机化按时间

训练核心原理(glove_thread(),src/glove.c):

  1. 参数布局:词向量、上下文词向量与各自的 bias 存储在一个连续数组W中,大小2 * vocab_size * (vector_size + 1);上下文词向量通过偏移vocab_size索引(src/glove.c)。初始化时参数取(rand()/RAND_MAX - 0.5) / vector_size的均匀随机值(src/glove.c);
  2. 损失计算(src/glove.c):对每条共现记录(word1, word2, val),先计算词向量内积与 log 共现值的残差diff = dot + b1 + b2 - log(val),再用加权函数fdiff = (val > x_max) ? diff : pow(val/x_max, alpha) * diff缩放,得到带权平方损失0.5 * fdiff * diff;
  3. 自适应梯度更新(src/glove.c):采用 AdaGrad 风格的按维累积梯度平方(gradsq),更新量temp = clip(fdiff * 对侧向量) * eta / sqrt(gradsq),并同步累积gradsq += temp^2;梯度分量先裁剪到[-grad-clip, grad-clip];
  4. 并行:每轮迭代把共现矩阵按行数均分给num_threads个线程(fseeko定位分片起点),采用无锁异步 SGD,每轮结束后汇总各线程 cost 并输出iter: 00X, cost: ...(src/glove.c);
  5. 数值安全:check_nan()会捕获 NaN/Inf 更新并跳过(src/glove.c),这也是 Makefile 刻意避开-Ofast的原因。

五、词向量输出格式与 gensim 兼容

glove的最终输出由-binary与-model两个参数共同决定(实现见 src/glove.c 的save_params()):

  • 文本格式(-binary 0或 2):每行一个词,格式为词 token 后接 vector_size 个浮点数;词向量默认取"词向量 + 上下文词向量"之和(model 2),这是社区通用的 GloVe 文本格式;
  • 二进制格式(-binary 1或 2):保存全部2 * vocab_size * (vector_size + 1)个参数(词向量、上下文向量及 bias),文件后缀.bin,可用于-load-init-param断点续训;
  • 写 header(-write-header 1):在文本文件首行写入vocab_size vector_size,使 gensim 等库可以直接KeyedVectors.load_word2vec_format(file, no_header=False)加载;
  • <unk>向量:当use_unk_vec=1(默认)时,输出文件末尾会自动追加一行<unk>,其向量为词表中最后 100 个(不足 100 则取全部)稀有词向量的均值(src/glove.c),用于兜底 OOV 词。

检查点机制:-checkpoint-every N会在每 N 轮保存save-file.00N.txt/.bin中间结果,配合-load-init-param与-load-init-gradsq可实现中断续训。

六、训练质量验证:词类比评测

demo 流程的最后一步是运行评测脚本,验证词向量的类比推理质量。默认 Python 实现位于 eval/python/evaluate.py。

6.1 评测原理

evaluate.py 会读取vocab.txt与vectors.txt,将词向量归一化到单位长度,然后在 eval/question-data 目录的 14 个类比测试集上计算 Top-1 准确率。每个测试行包含 4 个词a b c d,语义为"a 之于 b,如同 c 之于 d";预测时计算pred_vec = b - a + c,在全词表中用余弦相似度(归一化后等价于点积)找最近邻(排除 a、b、c 自身)作为预测词,与正确答案 d 比对(eval/python/evaluate.py)。

14 个测试集分为两组:

  • 语义类比(前 5 个):capital-common-countries(首都-国家)、capital-world、currency(国家-货币)、city-in-state(城市-州)、family(家庭关系);
  • 句法类比(后 9 个):gram1-adjective-to-adverb、gram2-opposite、gram3-comparative、gram4-superlative、gram5-present-participle、gram6-nationality-adjective、gram7-past-tense、gram8-plural、gram9-plural-verbs。

输出逐文件ACCURACY TOP1,并汇总Semantic accuracy、Syntactic accuracy与Total accuracy。脚本对每个文件按 100 条一批切分计算,以避免内存溢出。

6.2 交互式探索工具

  • eval/python/word_analogy.py:交互式输入 3 个词(如man woman king),返回最接近woman - man + king的 Top-100 词及余弦距离;
  • eval/python/distance.py:交互式输入一个词或一句话,返回余弦相似度最近的 Top-100 词,用于快速检查向量空间的局部语义;
  • MATLAB/Octave 用户可使用 eval/matlab/ 与 eval/octave/ 下的等价脚本。

七、复现 2024 向量:官方训练脚本解读

Training_README.md 记录了 2024 年 5 套向量的完整训练配方,是面向大规模语料训练的权威参数参考。

7.1 数据下载与预处理

  • Wikipedia 部分:使用 2024 年 7 月 22 日的 dump,经 Wikiextractor 提取纯文本(python -m wikiextractor.WikiExtractor ... --no-templates --output output_dir/);
  • Gigaword 部分:使用第五版 Gigaword;Dolma 部分:使用 Dolma v1.6,取 5% Common Crawl、40% C4、100% Reddit、100% Project Gutenberg;
  • 分词:使用 Stanford 的 Stanza tokenizer(4.4.1 版),等价于 PTBTokenizer 命令edu.stanford.nlp.process.PTBTokenizer -preserveLines -lowerCase -options 'untokenizable=allKeep'(保留空行、转小写、不可分词内容全部保留);
  • 语料配比:合并 Wikipedia 与 Gigaword 时,Gigaword 数据被加入两次,以平衡 Wikipedia 相对旧语料的数据增量。

7.2 训练脚本模板

官方使用的 bash 脚本变量如下(对应上一节四个工具的参数映射):

CORPUS=<wikigiga, dolma> VOCAB_FILE=vocab.txt COOCCURRENCE_FILE=cooccurrence.bin COOCCURRENCE_SHUF_FILE=cooccurrence.shuf.bin BUILDDIR=build SAVE_FILE=vectors.txt OVERFLOW_FILE=overflow VERBOSE=2 MEMORY=4.0 VOCAB_MIN_COUNT=20 VECTOR_SIZE=<50, 100, 200, 300> MAX_ITER=<50,100> WINDOW_SIZE=10 BINARY=2 NUM_THREADS=8 X_MAX=10 SEED=<123, 2024> ALPHA=0.75 ETA=<0.05, 0.075> $BUILDDIR/vocab_count -min-count $VOCAB_MIN_COUNT -verbose $VERBOSE < $CORPUS > $VOCAB_FILE $BUILDDIR/cooccur -memory $MEMORY -overflow-file $OVERFLOW_FILE -vocab-file $VOCAB_FILE -verbose $VERBOSE -window-size $WINDOW_SIZE < $CORPUS > $COOCCURRENCE_FILE $BUILDDIR/shuffle -memory $MEMORY -seed $SEED -verbose $VERBOSE < $COOCCURRENCE_FILE > $COOCCURRENCE_SHUF_FILE $BUILDDIR/glove -eta $ETA -alpha $ALPHA -save-file $SAVE_FILE -threads $NUM_THREADS -input-file $COOCCURRENCE_SHUF_FILE -x-max $X_MAX -iter $MAX_ITER -vector-size $VECTOR_SIZE -binary $BINARY -vocab-file $VOCAB_FILE -verbose $VERBOSE -seed $SEED -checkpoint-every 10

7.3 关键差异说明

  • 词表规模:Dolma 通过向vocab_count传-max-vocab标志把词表上限限制为 1.2M;
  • 随机种子:Wiki Giga 50d 使用随机种子 123、学习率 0.075;其余所有向量使用种子 2024、学习率 0.05;
  • 超参数组合:VOCAB_MIN_COUNT=20、WINDOW_SIZE=10、X_MAX=10、ALPHA=0.75、MEMORY=4.0、NUM_THREADS=8、BINARY=2(文本+二进制双输出)、MAX_ITER取 50 或 100,训练过程每 10 轮保存检查点。

对比 demo.sh 的小语料配置(VOCAB_MIN_COUNT=5、WINDOW_SIZE=15、VECTOR_SIZE=50、MAX_ITER=15、X_MAX=10)可以看出:大语料倾向于收紧最小词频(20 vs 5)、减小窗口(10 vs 15),并显式固定-seed保证可复现。

八、可复现性与随机种子控制

shuffle与glove都支持-seed参数(不设置时按当前时间随机化)。仓库自带的 randomization.test.sh 是验证随机可控性的自动化测试脚本,覆盖以下断言:

  • shuffle 的种子控制:相同种子产出完全相同的打乱结果,不同种子结果不同(cmp逐字节比对二进制输出);
  • glove 的种子控制:相同种子 + 单线程(-threads 1,多线程返回顺序不受控故必须单线程)产出相同向量,不同种子结果不同;
  • 参数/梯度断点续训:-save-init-param+-load-init-param组合可保存并加载初始参数;-load-init-gradsq配合-checkpoint-every保存的.bin检查点,可将训练精确续接到任意轮次(脚本对 2、4、6 轮结果逐一比对验证)。

这意味着只要固定语料、-seed、-threads 1,训练结果完全可复现,适合实验对照与审计。

九、许可证

仓库内全部内容以 Apache License, Version 2.0 授权,详见 LICENSE 文件。预训练词向量本身则以公有领域奉献协议(Public Domain Dedication and License)发布,两者在使用与分发上有不同约定,落地前请分别确认。

结语

从"下载即用"到"自建语料四步训练",再到 2024 大语料配方的复现,GloVe 仓库提供了一条完整的词向量生产链路。核心要点可归纳为:语料须按空白分词且文档间以换行分隔;cooccur的-memory/-symmetric/-window-size决定共现统计的质量与内存占用;glove的-x-max/-alpha/-eta/-vector-size主导训练效果;训练后务必用evaluate.py的语义/句法准确率做质量验收。更深入的算法细节与最新向量分析,可继续阅读 src/README.md、Training_README.md 及各工具源码 src/glove.c、src/cooccur.c、src/shuffle.c、src/vocab_count.c。

  • NLP
  • 机器学习

【免费下载链接】GloVe

Software in C and data files for the popular GloVe model for distributed word representations, a.k.a. word vectors or embeddings

项目地址:https://gitcode.com/gh_mirrors/gl/GloVe
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询