本文章不是模型微调,是从零构架大模型,是基于Bert架构的。
本文主要分两块,一个是tokenizer的构建。二是模型的构建和训练
第一部分 tokenizer分词器训练
bert的编码用的是WordPiece.
分词器训练分4个步骤,1:normalize; 2:pre_tokenizer预分词; 3:model; 4:post_processor后处理
step1 导包
1 | pyton复制代码from tokenizers import Tokenizer,processors |
step2 模型初始化,dataset(本文用的是文本)初始化
1 | python复制代码tokenizer = Tokenizer(WordPiece(unk_token="[UNK]")) |
step3 normalize
1 | python复制代码tokenizer.normalizer = BertNormalizer(lowercase=True) |
step4 预分词
1 | python复制代码tokenizer.pre_tokenizer = BertPreTokenizer() |
step 5 添加special_token并模型训练
1 | python复制代码special_tokens = ["[UNK]", "[PAD]", "[CLS]", "[SEP]", "[MASK]"] |
step 6 后处理及加入解码器
1 | python复制代码cls_token_id = tokenizer.token_to_id("[CLS]") |
step 7 模型保存
1 | python复制代码tokenizer.save("tokenizer.json") |
如果要在Transformers中使用这个分词器,我们需要将它包装在一个PreTrainedTokenizerFast中。在这我们使用特定的标记器类BertTokenizerFast
1 | python复制代码from transformers import BertTokenizerFast |
./bert文件夹下,新增了如下的文件
到此,分词器训练成功,我们的第一步完成,接下来是第二步,模型训练
第二部分 模型训练
step 1 导包
1 | python复制代码from transformers import BertConfig,BertLMHeadModel,BertTokenizer,LineByLineTextDataset,DataCollatorForLanguageModeling,Trainer, TrainingArguments |
step 2 加载第一部分训练的分词器
1 | python复制代码tokenizer = BertTokenizer.from_pretrained("./bert") |
step 3 模型配置
1 | python复制代码config = BertConfig( |
step 4 训练数据加载及处理
1 | python复制代码dataset = LineByLineTextDataset( |
step 5 训练参数,训练器等设定
1 | python复制代码training_args = TrainingArguments( |
step 6 模型保存
1 | python复制代码model.save_pretrained("./bert") |
训练完毕后,./bert文件夹下新增了如下文件
到此,我们已经构建并训练完成bert大模型了,我们推理一下看看
模型推理测试
1 | python复制代码from transformers import pipeline, set_seed |
再来一个
1 | python复制代码txt = generator("接着奏乐", max_length=50) |
看起来不错,比我参考的gpt2的强点,可能bert架构在小训练量的情况比gpt架构好点吧。。
具体代码,我会放到github上 ,地址davidhandsome86 (github.com)希望和感兴趣的小伙伴多沟通交流。。
参考
仅用61行代码,你也能从零训练大模型 - 知乎 (zhihu.com)
本文转载自: 掘金