FastText 词向量模型的训练和保存
1 课程概览
本课演示使用 FastText 进行词向量模型的训练和保存,通过 train_unsupervised 方法进行无监督训练,使用默认参数(Skip-Gram 模式、dim=100、epoch=5),并将模型保存为 .bin 二进制文件。同时解读训练日志的含义。
2 核心概念与定义
- 无监督训练(Unsupervised Training):
fasttext.train_unsupervised()方法,无需标签数据进行词向量训练。 - 二进制模型文件(.bin):FastText 模型保存格式,后续可通过
fasttext.load_model()加载。 - 训练日志(Training Log):训练过程中输出的统计信息,包括读取单词数、词汇量、标签数等。
3 模型与算法详解
训练与保存流程
- 导包:
import fasttext - 训练模型:
fasttext.train_unsupervised(data_path)使用无监督方式训练 - 保存模型:
model.save_model(path)保存为.bin二进制文件 - 加载模型(后续):
fasttext.load_model(path)加载已保存的模型
默认参数说明
通过查看 unsupervised_default 源码(439 行):
| 参数 | 默认值 | 说明 |
|---|---|---|
| model | skipgram | 训练模式(Skip-Gram) |
| lr | 0.05 | 学习率 |
| dim | 100 | 词向量维度(每个词用 100 个数字表示) |
| epoch | 5 | 训练轮数 |
训练日志解读
| 日志字段 | 含义 |
|---|---|
| Read 19M words | 读取了 19 兆(百万)个单词 |
| Number of words: 4万+ | 语料库中去重后的不同单词数量 |
| Number of labels: 0 | 标签数量(无监督训练为 0) |
训练时间
| 数据大小 | 训练时间 |
|---|---|
| 100MB | 约 2 分钟 |
| 680MB | 约 30 分钟(100MB 的 4-6 倍) |
4 数学原理与推导
Skip-Gram 训练目标
FastText 底层使用 Skip-Gram 模式,最大化上下文词的条件概率:
$$\max_\theta \frac{1}{T} \sum_{t=1}^{T} \sum_{-c \leq j \leq c, j \neq 0} \log p(w_{t+j} | w_t; \theta)$$
其中 $T$ 为词序列长度,$c$ 为上下文窗口大小,$\theta$ 为模型参数。
词向量维度
每个词用 $d=100$ 维向量表示:
$$\text{WordVector}(w_i) \in \mathbb{R}^{100}$$
5 代码示例
import fasttext
# 定义函数:训练词向量模型并保存
def dm01_train_save():
# 1. 无监督方式训练词向量模型
# 使用 100MB 的拆分数据文件
my_model = fasttext.train_unsupervised(
input="./data/wiki02_7A", # 数据路径
# 以下均为默认参数,可省略
model="skipgram", # 训练模式:Skip-Gram
lr=0.05, # 学习率
dim=100, # 词向量维度
epoch=5 # 训练轮数
)
# 2. 保存模型为二进制文件
my_model.save_model("./model/wiki02_7A_fail9.bin")
print("训练完毕,模型保存成功!")
# 测试
if __name__ == "__main__":
dm01_train_save()
训练日志示例
Read 19M words
Number of words: 45321
Number of labels: 0
Progress: 100.0% words/sec/thread: 156789 lr: 0.000000 avg.loss: 4.567890 ETA: 0h 0m 0s
训练完毕,模型保存成功!
6 重难点与易错提醒
- ❗重点:使用
train_unsupervised()进行无监督训练,默认参数为 skipgram + dim=100 + epoch=5。 - ⚠️易错:保存模型前需确保
model文件夹存在,否则报错。 - ⚠️易错:模型保存为
.bin格式(二进制文件),不是.txt或.model。 - 💡深入理解:日志中的 "Number of words" 是去重后的词汇量,不是总词数。
- 💡深入理解:训练时间与数据大小成正比,680MB 约为 100MB 的 4-6 倍时间。
7 课堂问答精选
Q1:FastText 默认使用哪种训练模式?
A:默认使用 Skip-Gram 模式(model="skipgram"),其他默认参数包括 lr=0.05(学习率)、dim=100(词向量维度)、epoch=5(训练轮数)。
Q2:训练日志中的 "Number of words" 是什么意思?
A:表示语料库中去重后的不同单词数量。例如 4 万+表示语料库中有 4 万多个不同的词。
Q3:模型保存为什么格式?
A:保存为 .bin 二进制文件,后续可通过 fasttext.load_model() 加载。例如 my_model.save_model("./model/wiki02_7A.bin")。
Q4:100MB 数据训练需要多长时间?
A:约 2 分钟。680MB 数据约为 30 分钟(100MB 的 4-6 倍)。
8 本课小结
- 训练方法:
fasttext.train_unsupervised(input=data_path)无监督训练。 - 默认参数:skipgram + lr=0.05 + dim=100 + epoch=5。
- 保存方法:
model.save_model(path)保存为.bin二进制文件。 - 训练日志:Read words(读取词数)、Number of words(去重后词汇量)、Number of labels(标签数,无监督为 0)。
- 100MB 数据训练约 2 分钟。
9 延伸思考
- 如何调整超参数(dim、epoch、lr)以优化词向量质量?
- 如何检验训练出的词向量模型的效果?(下节课介绍)