1. Collator数据处理
- 目的:将dataset的初始数据进行规范化批量处理,用以后续的前向计算
|
|
常见的关键字段包括:
input_ids
: 编码后的序列token idattention_mask
: 注意力的掩码标注。例如会对pad填充字符,标记为0,表示不参与注意力计算labels
: 监督学习任务的样本标签,-100表示掩码/填充token,在计算损失时予以忽略token_type_ids
: 用于区分句子对
tokenizer
对于一个批量的序列数据,数据预处理的首先最重要的一步是将不同长度的序列,进行填充至相同长度。此外根据需要,也包括trunc截取操作。
在huggingface的Transformer中提供了标准的API工具。
- https://huggingface.co/transformers/v4.6.0/_modules/transformers/tokenization_utils_base.html
- https://huggingface.co/docs/transformers/pad_truncation
在相关API调用时,常见三个参数 padding, max_length, truncation
padding参数:
- 逻辑值
True
或者字符串"longest"
表示填充到批量内最长序列的长度(如果是单个序列,则不填充) - 字符串
"max_length"
表示填充到预设的最大长度(此时需要设置max_length参数) - 逻辑值
False
表示不填充
“longest"填充策略本质上相当于将max_length参数设置为批量内序列最长序列长度的"max_length"填充策略。
truncation参数:
- 逻辑值
True
或者字符串"longest_first"
表示根据预设的最大限制长度(max_length参数)进行截取操作。 - 逻辑值
False
或者字符串"do_not_truncate"
表示不进行截取
collator
-
collators是最终的接口形式,一般都会将tokenizer作为其参数之一,完成全流程的数据预处理操作。根据不同的任务类型与输入类型,可以对Collator以及tokenizer进行个性化修改。
-
虽然huggingface中提供了成熟的tokenizer(e.g. PreTrainedTokenizer),但尝试之后觉得单细胞组学模型处理不太适用,需要个性化修改。先前尝试了自定义的修改,出现各种问题
-
这里参考Geneformer的代码。其在第一步已经将单细胞数据,按非零基因表达从高到低排序,并截取排名靠前的基因(e.g. 2048)、将基因名转换为token id,保存为dataset。所以理论上仅需要考虑pad操作(不需要trunc),再结合特定任务进行修改。已将相关代码
gene_pad_tokenizer.py
整理,上传,方便后续的调用。如下为使用演示
|
|
方法1:分步
- tokenzier
|
|
- collator,这里直接使用huggingface提供的用于mlm任务的掩码处理 (也可以自定义,例如Geneformer的collator_for_classification.py)
|
|
方法2:一步到位
|
|
方法3:DataLoader
|
|
在个性化的下游任务中,可根据需要修改上述Collator与tokenizer。目前的学习经验是,如果是更适合对批量数据整体进行操作,则修改Collator部分即可。如果是需要对每个批量内样本进行修改,则修改tokenizer的pad方法(核心是修改
_pad()
)
2. Model
|
|
BertConfig
- Bert模型配置 - BertConfig [Default]
vocab_size
: 词汇表大小 [30522]
hidden_size
: 隐藏层/嵌入维度 [768]
num_hidden_layers
: 注意力层的数量 [12]
num_attention_heads
: 注意力头的个数 [12]
intermediate_size
: FFN的维度 [3072]
hidden_act
: 激活函数 [“gelu”]
hidden_dropout_prob
: 隐藏层的Dropout概率 [0.1]
attention_probs_dropout_prob
: 注意力的Dropout概率 [0.1]
max_position_embeddings
: 最大序列长度 [512]
num_labels
: 分类任务的类别数 [2]
output_hidden_states
: 是否输出全部隐藏层状态 [False]
output_attentions
: 是否输出注意力MAP [False]
**kwargs
: 支持添加、设置自定义的模型配置
BertModel
- 基础模型 - BertModel,为bert模型的encoder部分,不包括head任务头
|
|
BertForPreTraining
- 标准预训练模型 - BertForPreTraining
- 包括MLM与NSP两部分
|
|
BertForMaskedLM
- MLM预训练模型 - BertForMaskedLM
|
|
BertForNextSentencePrediction
- NSP预训练模型 - BertForNextSentencePrediction
|
|
BertForSequenceClassification
- 句子分类微调模型 - BertForSequenceClassification
- 对于cls token的分类器
|
|
BertForTokenClassification
- token分类微调模型 - BertForTokenClassification
- 对于所有token的分类器
|
|
3. Trainer
Hugging Face 的 Trainer
类是其 Transformers 库中用于简化模型训练和评估的核心组件之一。
如下为一个简单示例,相关重要参数包括:
-
model:训练模型,例如上面学习的模型类
-
args:训练超参数,如学习率、批量大小、epoch 数。【要与上面的模型超参数区别开】
-
data_collator:小批量数据预处理。【填充+任务特定的操作,详见上】
-
train_dataset:训练数据集,huggingface的datasets格式
-
eval_dataset:验证数据集
-
compute_metrics:计算除了loss以外的评估指标
参考
compute_metrics
from geneformer/classifier_utils.py
|
|
如果使用想直接使用model预测:
1 2 3 4 5 6 7 8 9 10
padded_batch.set_format(type="torch") input_data_batch = padded_batch["input_ids"] attn_msk_batch = padded_batch["attention_mask"] label_batch = padded_batch[label_name] with torch.no_grad(): outputs = model( input_ids=input_data_batch.to("cuda"), attention_mask=attn_msk_batch.to("cuda"), labels=label_batch.to("cuda"), )
TrainingArguments常见超参数选项
output_dir="./result"
模型和检查点文件保存的目录num_train_epochs = 3
训练轮数,可以小数per_device_train_batch_size = 8
训练集批量数per_device_eval_batch_size = 64
验证集批量数gradient_accumulation_steps = 1
梯度累计步数learning_rate = 5e-5
(最大)学习率lr_scheduler_type = "cosine"
学习率规划方式warmup_steps = 10000
学习率预热步数weight_decay = 0.01
权重衰减logging_steps = 500
记录log日志的频数save_steps = 500
模型检查点的频数evaluation_strategy = "epoch"/"steps"/no
验证集评估维度eval_steps = 500
验证集评估步数(if “steps”)