《Transformers库-入门到熟悉》系列的参考学习资料:https://transformers.run/。如下内容是对于各章节的总结:
第四章 开箱即用的pipelines
几种pipeline
1、情感分析
2、零训练样本分类
3、文本生成:前缀模板 (Prefix Prompt)生成
4、遮盖词填充:基于填充模板 (Cloze Prompt)-先构建模板然后运用模型来完善模板,预测句子中被mask的文本
5、命名实体
6、抽取式问答:从给定的上下文中抽取答案,而非生成答案
7、自动摘要:旨在将长文本压缩成短文本,并且还要尽可能保留原文的主要信息
补充说明:根据形式的不同,自动问答 (QA) 系统可以分为三种:
-
抽取式 QA (extractive QA):假设答案就包含在文档中,因此直接从文档中抽取答案;
-
多选 QA (multiple-choice QA):从多个给定的选项中选择答案,相当于做阅读理解题;
-
无约束 QA (free-form QA):直接生成答案文本,并且对答案文本格式没有任何限制
重要组件
Pipeline的两个重要组件:模型(Models 类)和分词器(Tokenizers 类)。背后做了哪些事情:
1、预处理 (preprocessing),将原始文本转换为模型可以接受的输入格式;
2、将处理好的输入送入模型;
3、对模型的输出进行后处理 (postprocessing),将其转换为人类方便阅读的格式。
模型的输出是一个维度为 (Batch size, Sequence length, Hidden size) 的三维张量。可以像上面那样通过属性访问,也可以通过键(outputs["last_hidden_state"]),甚至索引访问(outputs[0])。
第五章 模型与分词器
模型
包含加载、保存模型。Transformers 库封装了很多不同的模型结构,常见的有:
1、*Model (返回 hidden states)
2、*ForCausalLM (用于条件语言模型)
3、*ForMaskedLM (用于遮盖语言模型)
4、*ForMultipleChoice (用于多选任务)
5、*ForQuestionAnswering (用于自动问答任务)
6、*ForSequenceClassification (用于文本分类任务)
7、*ForTokenClassification (用于 token 分类任务,例如 NER)
分词器
1、分词策略:按词切分 (Word-based),按字符切分 (Character-based),按子词切分 (Subword)
2、Padding
3、attention mask
4、添加新token
5、token embedding初始化
6、调整embedding矩阵
-
向词表中添加新 token 后,必须重置模型 embedding 矩阵的大小,也就是向矩阵中添加新 token对应的embedding,这样模型才可以正常工作,将token 映射到对应embedding
-
调整 embedding 矩阵通过 resize_token_embeddings() 函数来实现
-
在默认情况下,新添加 token 的 embedding 是随机初始化的。新 token 会添加在词表的末尾,因此只需打印出最后两行
-
可以直接赋值初始化token 对应的 embedding
补充说明:
1、部分模型的 Hub 页面中会包含很多文件,我们通常只需要下载模型对应的 config.json 和 pytorch_model.bin,以及分词器对应的 tokenizer.json、tokenizer_config.json 和 vocab.txt
2、分词器实现编码 (Encoding),其包含两个步骤:
使用分词器 (tokenizer) 将文本按词、子词、字符切分为 tokens
将所有的 token 映射到对应的 token ID。
3、分词器会自动在序列的首尾添加了[CLS]和[SEP] token
第六章 必要的pytorch知识
基础知识
1、张量:张量的加减乘除是按照元素进行的
2、自动微分:执行 tensor.backward(),就会自动通过反向传播
3、调整张量形状(各方法对比如下)
-
view:将张量转换为新的形状。执行view 操作的张量必须是连续的 (contiguous),可以调用 is_conuous 来判断张量是否连续;如果非连续,需要先通过 contiguous 函数将其变为连续的
-
reshape:它与 view 功能几乎一致,并且能够自动处理非连续张量
-
transpose:交换张量中的两个维度
-
permute: 区别于transpose只交换两个维度,可以直接设置新的维度排列方式
4、广播机制
5、索引与切片
6、升维与降维
-
升维:torch.unsqueeze
-
降维:torch.squeeze。在不指定 dim 时,张量中所有形状为 1 的维度都会被删除,例如
(A, 1, B, 1, C)会变成(A, B, C);当给定 dim 时,只会删除给定的维度(形状必须为 1),例如对于(A, 1, B),squeeze(input, dim=0) 会保持张量不变,只有 squeeze(input, dim=1) 形状才会变成(A, B)。
加载数据
1、数据集类:Dataset或 IterableDataset负责存储样本以及它们对应的标签。包含:迭代型、映射型数据集
2、数据加载类:DataLoader负责迭代地访问数据集中的样本
1、DataLoader
参数包含:
dataset(数据集)
batch_size (batch 大小)
shuffle:是否打乱数据集
sampler:采样器,也就是一个索引上的迭代器
collate_fn:批处理函数,用于对采样出的一个 batch 中的样本进行处理(例如前面提过的 Padding 操作)
2、sampler
常见的 Sampler 对象包括序列采样器 SequentialSampler 和随机采样器 RandomSampler,它们都通过传入待采样的数据集来创建
训练模型
Pytorch 所有的模块(层)都是 nn.Module的子类。通过 __init__() 初始化模型中的层和参数,在 forward() 中定义模型的操作:
-
损失函数:Pytorch 实现了很多常见的损失函数,例如:
-
用于回归任务的均方误差 (Mean Square Error) nn.MSELoss
-
用于分类任务的负对数似然 (Negative Log Likelihood) nn.NLLLoss
-
同时结合了 nn.LogSoftmax 和 nn.NLLLoss 的交叉熵损失 (Cross Entropy) nn.CrossEntropyLoss 等。
-
-
优化器:Pytorch 实现了很多优化器,例如 SGD、ADAM、RMSProp 等。
每一轮迭代 (Epoch) 实际上包含了两个步骤:
训练循环 (The Train Loop) 在训练集上进行迭代,尝试收敛到最佳的参数;
验证/测试循环 (The Validation/Test Loop) 在测试/验证集上进行迭代以检查模型性能有没有提升。
在训练循环中,优化器通过以下三个步骤进行优化:
调用 optimizer.zero_grad() 重设模型参数的梯度。默认情况下梯度会进行累加,为了防止重复计算,在每个训练阶段开始前都需要清零梯度;
通过 loss.backwards() 反向传播预测结果的损失,即计算损失对每一个参数的偏导;
调用 optimizer.step() 根据梯度调整模型的参数。
保存模型
本章核心代码存储于:How-to-use-Transformers/train_model_FashionMNIST.py
结尾
亲爱的读者朋友:感谢您在繁忙中驻足阅读本期内容!您的到来是对我们最大的支持❤️
正如古语所言:"当局者迷,旁观者清"。您独到的见解与客观评价,恰似一盏明灯💡,能帮助我们照亮内容盲区,让未来的创作更加贴近您的需求。
若此文给您带来启发或收获,不妨通过以下方式为彼此搭建一座桥梁: ✨ 点击右上角【点赞】图标,让好内容被更多人看见 ✨ 滑动屏幕【收藏】本篇,便于随时查阅回味 ✨ 在评论区留下您的真知灼见,让我们共同碰撞思维的火花
我始终秉持匠心精神,以键盘为犁铧深耕知识沃土💻,用每一次敲击传递专业价值,不断优化内容呈现形式,力求为您打造沉浸式的阅读盛宴📚。
有任何疑问或建议?评论区就是我们的连心桥!您的每一条留言我都将认真研读,并在24小时内回复解答📝。
愿我们携手同行,在知识的雨林中茁壮成长🌳,共享思想绽放的甘甜果实。下期相遇时,期待看到您智慧的评论与闪亮的点赞身影✨!
万分感谢🙏🙏您的点赞👍👍、收藏⭐🌟、评论💬🗯️、关注❤️💚~
自我介绍:一线互联网大厂资深算法研发(工作6年+),4年以上招聘面试官经验(一二面面试官,面试候选人400+),深谙岗位专业知识、技能雷达图,已累计辅导15+求职者顺利入职大中型互联网公司。熟练掌握大模型、NLP、搜索、推荐、数据挖掘算法和优化,提供面试辅导、专业知识入门到进阶辅导等定制化需求等服务,助力您顺利完成学习和求职之旅(有需要者可私信联系)