处理数据
从模型重新加载数据集
加载数据集
|
|
利用 datasets
中的 load_datasets
, 可以通过输入参数进行加载
这是加载后的 Datasets
对象的的详细信息:
- 包含训练集, 验证集, 测试集
- 每一个集合都包含 4 个列, 以及表示行数的变量
访问数据集中对象
|
|
使用字典, 访问数据集中的一个对象, 可以查看详细信息
查看数据集信息
|
|
这里可以看到 label
对应的详细信息
预处理数据集
从文字到 id
这里要把数据集中的数据从文本转换为数字
|
|
这样一来, 数据被转换成了 input_ids
|
|
这里我们传入两句话, 可以看到返回的 inputs
中含有 toekn_type_ids
这里是在告诉模型那些是第一句的 token, 哪些是第二句的
从 id 到 token
|
|
这里和之前讲的 decode 的区别:
方法 | 作用 | 输出 | 是否自动拼接 | 是否去特殊符号 |
---|---|---|---|---|
convert_ids_to_tokens |
把每个 token id 映射回 token 字符串(逐个映射) | token 列表 | ❌ 不会拼接成一句话 | ❌ 不会自动去掉 [CLS]、[SEP] |
decode |
把 token id 列表直接还原成一句 完整的可读文本 | 字符串(句子) | ✅自动拼接(会考虑空格、断词) | ✅ 默认去掉特殊 token(可以关闭) |
加载数据集
不推荐的方法
|
|
这种方法会把数据集一次性加载进内存, 转换成 python 字典
可能导致内存爆炸
推荐方法: 使用datasets类的方法
HF Datasets 库的设计理念是:
- 数据存在磁盘上,内存里只加载你当前处理的 batch。
- 底层使用 Apache Arrow(一种高效的数据格式),支持按需读取。
所以:
如果直接用Dataset.map
,会: - 批量读取一小块数据
- 预处理后再存回磁盘(或者高效缓存),不用全加载进内存
- 只在训练或读取时才按需读取
这样: - 不会爆内存
- 处理效率更高
|
|
动态填充
这里又是一个"填充"的概念, 只不过和之前对于 token 的填充不同, 这里是针对每一个 batch 的填充
用于解决句子长度不统一的问题
|
|
实例化时需要指定 tokenizer
微调模型
|
|
训练与微调
存储训练参数
在定义 Trainer
之前, 需要先定义TrainingArguments
类, 它包含 Trainer
在训练和评估中使用的所有超参数
只需要提供一个参数: 用于保存模型 checkpoint 的目录
|
|
定义模型
|
|
定义 Trainer
|
|
微调模型
|
|
评估
获取预测结果
|
|
函数接受一个EvalPrediction
对象
(它是一个带有 predictions
和 label_ids
字段的参数元组)
并将返回一个字符串映射到浮点数的字典(字符串是返回的指标名称,而浮点数是其值)
获取最大索引
|
|
计算指标
|
|
打包后得到的函数
|
|
最终 trainer
|
|