Notes of Hugging face
本文最后更新于:1 年前
Hugging face 笔记
Transformer models
pipeline()
第一个参数为模型用途,第二个参数为社区中的模型名字,从而获取模型各种接口
GPT, BERT, BART/T5 使用不同策略,回归、编码、seq2seq
causal/masked language modeling 预测后面/中间
预训练白手起家,微调增加限定,领域适应
Pretrained -- fine-tuning the knowledge inside the model transfer
Transferring the knowledge of a pretrained model to a new model by initializing the second model with the first model's weights.
编码(理解语句)解码(输出语句)对应不同需求
- 仅编码(预训练遮盖词语):词句分类、命名识别
- 仅解码(只知道前面的词语):文本生成
- 编码+解码(T5单一单词随机遮盖不同跨度单词):翻译、总结
语言模型通常是自监督的(通过预测下一个单词或者完形填空)
BERT 编码架构,mask words,擅长事实性问题
GPT 解码架构,自回归模型
T5 解码-编码架构,多语言架构
Architecture of Transformers
Tokenizers 将自然语言转换成 ID Tensor,将参数传递给模型(一般维度很大)做预测,Tokenizers 再次将 IDs 转换为自然语言
分词三种:单词、字母、子单词
padding 需要结合 attention-masking 保证输出的稳定性
model-head 将预测结果转换为目标输出
Finetune models
分批次使用 Dataset.map(model, batch=true)
增加缓存,在多线程下以及多次访问下加速
若训练前类型和模型不匹配,训练头部会随机增加权重
Dataset library
Dataset.map()
操作数据,使用 lambda
函数省去较小函数的构造
常用 filter()
和 map()
函数
内存映射是指将一个文件映射成应用程序地址空间内某个地址范围
Tokenizer library
使用 (example['train'] for example in dataset)
获得生成器,减少内存消耗
DistilBERT,使用知识蒸馏技术
tokenizer 不同
规范化(初始处理多空格、Unicode)、预标记化(拆分为单词)、后处理(掩码)
BERT | GPT | T5 |
---|---|---|
忽略双空格 | 不忽略双空格 | 不忽略双空格 |
空格删除,不可逆 | 空格替换为 Ġ,可逆 | 空格替换为 _,可逆 |
Wordpiece 算法 | BPE 算法 | Unigram 算法(Viterbi 算法) |
\(\displaystyle \max_{i}\left(\dfrac{N_{i,\text{merge}}}{N_{i,\text{left}}\cdot N_{i,\text{right}}}\right)\to \{V\}\) | \(\displaystyle \max_{i}(N_{i,\text{merge}})\to \{V\}\) | \(\displaystyle\min\left[ -N\log \left (\prod_{\bigsqcup_{j} \text{Sub}_j\in\{\text{Words}\}}P(\text{Sub}_j)\right)\right]\) |
子串 | 子串和合并规则 | 子串 |
选取最长有效子串 | 合并有效分词 | 选取损失最小有效子串 |
词汇量小 | 词汇量小 | 词汇量大 |
Main NLP tasks
翻译任务:BLEU 分数衡量(双语互译质量评估辅助工具)① precision 生成答案中有多大比例重合,存在常用词干扰,例如 \(\text{the the the the the the the}\) 分数为 \(100\%\) ② modified precision 考虑词语在参考翻译中出现次数截断计数 ③ 加入惩罚,避免词语短得分高 ③ n-gram 增加翻译流畅性,与前者求几何平均 ④ Sentence brevity penalty 短惩罚 \[ \mathrm{BP}=\begin{cases} 1 & \text { if } c>r \\ e^{(1-r / c)} & \text { if } c \leq r \end{cases} , \mathrm{BLEU}=\mathrm{BP} \cdot \exp \left(\sum_{n=1}^N w_n \log p_n\right) . \] 摘要:ROUGE 分数,recall 标准答案中有多大比例重合,precision 生成答案中有多大比例重合,两者综合考量,取调和平均 \(F_1=\dfrac{2P_1P_2}{P_1+P_2}\)。
因果推断模型:数据集中设置
max_length
问答系统:合并为 [CLS] question [SEP] context [SEP] 作为训练输入
Ask for questions
CUDA 出 bug 在 CPU 上跑,因为前者是异步的
过拟合用于 debug,损失函数降为 0
Hugging face course 问题
一、BERT/GPT/T5 的架构和区别
\[ \begin{array}{|c|c|c|} \hline \text { BERT } & \text { GPT } & \text { T5 } \\ \hline \text { incoder 架构 } & \text { decoder 架构 } & \text { incoder-decoder 架构 } \\ \hline \text { 编码模型 } & \text { 自回归模型 } & \text { Seq2seq 模型 } \\ \hline \text { 获取所有可见词 } & \text { 获取前面词语 } & \text { 获取前面词语 } \\ \hline \text { 分类, Full-mask } & \text { 文本生成 } & \text { 跨多语言, 翻译总结 } \\ \hline \end{array} \]
tokenizer 预训练方法不同(子词算法不同)
二、不同架构一定对应不同任务吗?
不同架构可以用来训练非匹配任务,但效果欠佳;当架构与任务类型匹配时,效果好。
三、Tokenizer 怎么拿到词语和数字的关系?
- 规范化(初始处理多空格、Unicode)、预标记化(拆分为单词)
- 使用不同字词切分算法:按字词划分,按字符划分,按子串划分(例如 Wordpiece, BPE, Unigram 算法)结合语料训练构建得到词汇表(一般不超过 \(50000\) 个词汇)
- 依据词汇表以及对应策略分词得到切片(##前缀处理)
- 后处理:标记掩码、偏移映射(每个标记的文本跨度)等索引
四、掩码模型的微调方法以及种类
- 导入数据
- 切片张量化(小的
max_length
占用内存小,有重叠划分) - 随机屏蔽(设定屏蔽比例,标记掩码和全词掩码)
衡量方法:perplexity,交叉熵指数,数值越小意味着语法正确的句子概率更高
\[ \operatorname{perplexity}(S)=p\left(w_1, w_2, w_3, \ldots, w_m\right)^{-1 / m} \]
困惑度 perplexity 可以理解为,如果每个时间步都根据语言模型计算的概率分布随机挑词,那么平均情况下,挑多少个词才能挑到正确的那个。
五、各种衡量指标
\[ \begin{array}{|c|c|c|} \hline \text { BLEU } & \text { ROUGE } & \text { perlexity } \\ \hline \text { 翻译 } & \text { 摘要总结 } & \text { 掩码模型 } \\ \hline \text { 常用词干扰、长度短惩罚 } & \text { recall + precision } & \text { 交叉熵指数 } \\ \hline \mathrm{BP} \cdot \exp \left(\sum_{n=1}^N w_n \log p_n\right) & \dfrac{2 P_1 P_2}{P_1+P_2} & p\left(w_1, \cdots, w_m\right)^{-1 / m} \\ \hline \text { 高代表准确、流畅 } & \text { 高代表准确、精炼 } & \text { 高代表偏离统计模型 } \\ \hline \end{array} \]