这 ma adaption pretrain代码和论文完全不一样啊
按照论文的意思,第一步应该是让语言模型理解语音的语义,所以使用speechTokenizer去获得语音的离散化token表示,讲道理是应该将speechtokenizer codebook的表示project后(因为hidden dim可能不一致,需要project)添加到 语言模型的embedding层中,然后使用自回归形式预测语音token。但我在code中没有看到任何关于speechtokenizer的部分,并且tokenize部分 更像是在扩大词表,训speech的文本语料,我实在不能理解。
# line 230 ~ 250
text_column_name = "text" if "text" in column_names else column_names[0]
def tokenize_function(examples):
output = tokenizer(examples[text_column_name])
return output
tokenized_cache_file_names = {
"train":os.path.join(model_args.cache_dir, 'tokenized', 'train', 'processed_train.arrow'),
"validation":os.path.join(model_args.cache_dir, 'tokenized', 'valid', 'processed_valid.arrow'),
}
with training_args.main_process_first(desc="dataset map tokenization"):
if not data_args.streaming:
tokenized_datasets = raw_datasets.map(
tokenize_function,
batched=True,
num_proc=data_args.preprocessing_num_workers,
remove_columns=column_names,
load_from_cache_file=not data_args.overwrite_cache,
desc="Running tokenizer on dataset",
cache_file_names=tokenized_cache_file_names
)
是我理解有误吗?有懂的麻烦解释一下
可能是因为默认语音数据已经转换为token数据了
可能是因为默认语音数据已经转换为token数据了
这样确实是可以的,提前提取audio token,以类似 “audio” 的token占位,但是这样的话必须修改model 的数据prepare,即在forward中根据token id 插入 project后的audio feature,但是code中显然没有这一步,直接是 LLamaForCausalLLM,显然是不合理的
可能是因为默认语音数据已经转换为token数据了
这样确实是可以的,提前提取audio token,以类似 “audio” 的token占位,但是这样的话必须修改model 的数据prepare,即在forward中根据token id 插入 project后的audio feature,但是code中显然没有这一步,直接是 LLamaForCausalLLM,显然是不合理的
根据tree/main/speechgpt#train-speechgpt的stage1部分,首先将音频使用hubert转换为语音标签,然后将这些所有的标签作为大模型的预训练部分的输入数据,来做next token的预测训练。完成这步骤后,大模型应该是已经学习到了怎么理解语音token了。
然后在stage2中,使用语音+文本的混合指令数据,进一步训练大模型的跨模态sft能力。stage3好像是输入语音数据,返回也是语音数据的进一步微调。
以上是个人理解,如有错误请大神指导
”tokenize部分 更像是在扩大词表,训speech的文本语料。“原文就是这样写的啊。train部分