Fasttext 优化 - 自动调参
1 课程概览
本课讲解 Fasttext 优化手段六:自动调参。手动调参累且需要疯狂运行,自动调参让程序自己训练。类似交叉验证网格搜索,但不需要给范围。给程序一个时间限制(默认 300 秒,可改为 180 秒),程序自己搜索最优参数。但时间不是越长越好,可能过拟合。
2 核心概念与定义
- 自动调参(autotune):程序自己搜索最优参数。
- autotuneDuration:自动调参时长限制(秒),默认 300 秒。
- autotuneValidationFile:验证集路径。
3 模型与算法详解
手动调参 vs 自动调参
| 方法 | 优点 | 缺点 |
|---|---|---|
| 手动调参 | 可控 | 累、需要疯狂运行 |
| 自动调参 | 省事 | 耗时、可能不如手动 |
自动调参原理
类似交叉验证网格搜索,但不需要给范围。
- 给程序训练集和验证集
- 给一个时间限制
- 程序自己搜索最优参数
- 最后返回效果好的模型
类比:老大交代任务
老大只说三天后给结果,不要求具体步骤。
- 只给时间限制
- 不要求具体步骤
- 程序自己决定如何训练
autotuneDuration 参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| autotuneDuration | 300 秒 | 自动调参时长限制 |
时间不是越长越好
时间太长可能过拟合。
- 不是越长越好
- 可能过拟合
- 需要结合自己的情况来看
- 大厂不缺时间,但不会调一年
4 数学原理与推导
自动调参流程
1. 给定训练集和验证集
2. 给定时间限制
3. 程序自动搜索参数空间
4. 返回最优模型
过拟合
训练时间过长,模型在训练集上表现好,但在验证集上表现差。
$$\text{overfitting}: L_{\text{train}} \downarrow, L_{\text{val}} \uparrow$$
5 代码示例
import fasttext
def dm07_autotune():
"""优化手段六:自动调参"""
# 从手动调参改为自动调参
model = fasttext.train_supervised(
input="data/cooking_pre_train.txt", # 训练集路径
autotuneValidationFile="data/cooking_pre_validate.txt", # 验证集路径
autotuneDuration=180 # 自动调参时长(秒),默认 300
)
# 评估
metrics = model.test("data/cooking_pre_validate.txt")
print(f"Precision@1: {metrics[1]}")
return model
# 测试
if __name__ == "__main__":
print("=== 优化手段六:自动调参 ===")
print("自动调参中(180秒)...")
model = dm07_autotune()
print("自动调参完成")
代码说明
| 代码 | 说明 |
|---|---|
autotuneValidationFile | 验证集路径 |
autotuneDuration=180 | 自动调参时长(秒),默认 300 |
input | 训练集路径 |
6 重难点与易错提醒
- ❗重点:自动调参需要给训练集和验证集。
- ❗重点:autotuneDuration 是时长限制,默认 300 秒。
- ⚠️易错:时间不是越长越好,可能过拟合。
- 💡深入理解:自动调参类似交叉验证网格搜索,但不需要给范围。
7 课堂问答精选
Q1:为什么要用自动调参?
A:手动调参累且需要疯狂运行。自动调参让程序自己训练,给一个时间限制即可。
Q2:自动调参需要什么参数?
A:需要训练集路径(input)、验证集路径(autotuneValidationFile)、时长限制(autotuneDuration,默认 300 秒)。
Q3:自动调参的时间越长越好吗?
A:不是。时间太长可能过拟合。需要结合自己的情况来看,大厂不缺时间,但不会调一年。
Q4:自动调参和网格搜索有什么区别?
A:自动调参类似交叉验证网格搜索,但不需要给范围。程序自己搜索参数空间。
8 本课小结
- 自动调参:程序自己搜索最优参数。
- 需要:训练集、验证集、时长限制。
- autotuneDuration 默认 300 秒。
- 时间不是越长越好,可能过拟合。
9 延伸思考
- 多标签多分类如何处理?
- 如何保存和加载模型?