FastText
作用
- 进行文本分类
- 训练词向量
优势
保持较高精度的情况下, 快速的进行训练和预测
安装
pip install fasttext
文本分类
种类
- 二分类
- 单标签多分类
- 多标签多分类
过程
- 第一步: 获取数据
- 第二步: 训练集与验证集的划分
- 第三步: 训练模型
- 第四步: 使用模型进行预测并评估
- 第五步: 模型调优
- 思路:
- 数据再次清洗
- 增加训练轮数
- 调整学习率
- 增加n-gram特征
- 调整损失计算方式
- 自动参数调优
- 第六步: 模型保存与重加载
训练词向量
过程:
- 获取数据
- 训练词向量
- 模型超参数设定
- 模型效果检验
- 模型的保存与重加载
方法:
# 在训练词向量过程中, 我们可以设定很多常用超参数来调节我们的模型效果, 如:
# 无监督训练模式: 'skipgram' 或者 'cbow', 默认为'skipgram', 在实践中,skipgram模式在利用子词方面比cbow更好.
# 词嵌入维度dim: 默认为100, 但随着语料库的增大, 词嵌入的维度往往也要更大.
# 数据循环次数epoch: 默认为5, 但当你的数据集足够大, 可能不需要那么多次.
# 学习率lr: 默认为0.05, 根据经验, 建议选择[0.01,1]范围内.
# 使用的线程数thread: 默认为12个线程, 一般建议和你的cpu核数相同.
model = fasttext.train_unsupervised('data/fil9', "cbow", dim=300, epoch=1, lr=0.1, thread=8)
词向量迁移
可迁移词向量
- fasttext提供了157种语言的在CommonCrawl和Wikipedia语料上进行训练的可迁移词向量模型, 它们采用CBOW模式进行训练, 词向量维度为300维. 可通过该地址查看具体语言词向量模型: https://fasttext.cc/docs/en/crawl-vectors.html
- fasttext提供了294种语言的在Wikipedia语料上进行训练的可迁移词向量模型, 它们采用skipgram模式进行训练, 词向量维度同样是300维. 可通过该地址查看具体语言词向量模型: https://fasttext.cc/docs/en/pretrained-vectors.html
迁移学习
预训练模型(Pretrained model)
微调(Fine-tuning)
微调脚本(Fine-tuning script)
两种迁移方式:
- 直接使用预训练模型(适合普适任务)
- 预训练模型+微调
标准数据集
GLUE
- CoLA 数据集
- SST-2 数据集
- MRPC 数据集
- STS-B 数据集
- QQP 数据集
- MNLI 数据集
- SNLI 数据集
- QNLI 数据集
- RTE 数据集
- WNLI 数据集
- diagnostics数据集(官方未完善)
预训练模型
BERT
GPT
GPT-2
Transformer-XL
XLNet
XLM
RoBERTa
DistilBERT
ALBERT
T5
XLM-RoBERTa
加载和使用预训练模型的步骤
- 确定需要加载的预训练模型并安装依赖包.
- 加载预训练模型的映射器tokenizer.
- 加载带/不带头的预训练模型.
- 使用模型获得输出结果.
Example
import torch
from transformers import AutoTokenizer, AutoModel, AutoModelForMaskedLM, AutoModelForSequenceClassification, \
AutoModelForQuestionAnswering
from transformers import logging
logging.set_verbosity_error()
mirror = 'https://mirrors.tuna.tsinghua.edu.cn/help/hugging-face-models/'
def load_AutoQA():
# 1 加载 tokenizer
# 加载的预训练模型的名字
model_name = 'bert-base-chinese'
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese",mirror=mirror)
# 2 加载model
qa_model = AutoModelForQuestionAnswering.from_pretrained(model_name)
# 3 使用
# 使用带有问答模型头的模型进行输出时, 需要使输入的形式为句子对
# 第一条句子是对客观事物的陈述
# 第二条句子是针对第一条句子提出的问题
# 问答模型最终将得到两个张量,
# 每个张量中最大值对应索引的分别代表答案的在文本中的起始位置和终止位置
input_text1 = "我家的小狗是黑色的"
input_text2 = "我家的小狗是什么颜色的呢?"
# 映射两个句子
indexed_tokens = tokenizer.encode(input_text1, input_text2)
print("句子对的indexed_tokens:", indexed_tokens)
# 输出结果: [101, 2769, 2157, 4638, 2207, 4318, 3221, 7946, 5682, 4638, 102, 2769, 2157, 4638, 2207, 4318, 3221, 784, 720, 7582, 5682, 4638, 1450, 136, 102]
#
# 用0,1来区分第一条和第二条句子
segments_ids = [0] * 11 + [1] * 14
# 转化张量形式
segments_tensors = torch.tensor([segments_ids])
tokens_tensor = torch.tensor([indexed_tokens])
# 使用带有问答模型头的预训练模型获得结果
with torch.no_grad():
start_logits, end_logits = qa_model(tokens_tensor, token_type_ids=segments_tensors, return_dict=False)
print("带问答模型头的模型输出结果:", (start_logits, end_logits))
print("带问答模型头的模型输出结果的尺寸:", (start_logits.shape, end_logits.shape)) # (torch.Size([1, 25]), torch.Size([1, 25]))
if __name__ == '__main__':
load_AutoQA()
输出
心得:已经了解些基本概念,还需要实践加深印象