在Huggingface transformers平台上微调BERT-wwm-ext
今天是本系列的最后一期。
transformer 与 transformers
为了避免命名带来的混淆,我们首先来厘清一下:transformer 与 transformers。
• transformer
在上一期里,我们已经做过介绍,transformer是一种具有多头自注意力机制的、可以取代RNN/LSTM的神经网络单元结构。
本质上它是一种深度学习技术。
• transformers
今天提到的transformers,是Huggingface🤗公司开发的一套python库包,它提供一个平台框架,使得transformer技术实现的各类模型能通过一致化的接口方式呈现和调用。在其主页上它是这么自我介绍的:
🤗 Transformers 提供 API 来轻松下载和训练最先进的预训练模型。使用预训练模型可以降低您的计算成本、碳足迹,并节省您从头开始训练模型的时间。这些模型可用于不同的模式,例如:
📝 文本:超过 100 种语言的文本分类、信息提取、问答、摘要、翻译和文本生成。
🖼️ 图像:图像分类、对象检测和分割。
🗣️ 音频:语音识别和音频分类。
🐙 多模态:表格问答、光学字符识别、从扫描文档中提取信息、视频分类和视觉问答。
该库支持三个最流行的深度学习库之间的无缝集成:PyTorch、TensorFlow和JAX。在一个框架中用三行代码训练模型,然后加载它以与另一个框架进行推理。
每个🤗 Transformers 架构都在独立的 Python 模块中定义,因此可以轻松定制它们以进行研究和实验。
本质上它是一种研发工具产品。
BERT-wwm-ext
Google在发布公开论文『Attention Is All You Need』的同时,推出了开源的transformer架构BERT(Bidirectional Encoder Representation from Transformers)。可以说BERT开辟了NLP的新时代,产学研界参考BERT推出了很多类似的变种模型,如:RoBERTa、BART等。
在中文的类BERT研究中,除了Google原生的bert-base-chinese之外,Bert-wwm、MacBert、ChineseBert等模型创新了不同的机制进行优化,具有比较大的知名度和影响力。
我们今天将基于哈工大与科大讯飞联合实验室(HFL)研发的Bert-wwm-ext进行微调,实现我们的场景任务目标——辨别新闻标题A和B的关系分类。
与原始的bert-base-chinese中文采用单字掩码方式不同,Bert-wwm-ext提供了所谓全词掩码(Whole Word Masking)的预训练方式。如下图所示:
全词掩码有两个优点:
1、部分解决了MLM独立性假设,使得预测token之间拥有了一定的关联性
2、提高了MLM任务难度,使得模型需要更多依赖远距离的上下文来判断掩码部分的内容
接下来将看到,使用🤗 Transformers 库将使我们的代码非常简化:虽然Bert-wwm-ext 的网络结构的复杂程度要远远超过前面的孪生LSTM网络,但实现的代码行数却会大大降低。
from huggingface_hub import snapshot_download
#从官方的huggingface_hub下载模型配置、参数、模型词库等信息
snapshot_download(repo_id="hfl/chinese-bert-wwm-ext", ignore_regex=["*.h5", "*.ot", "*.msgpack"])
c:\users\hp\appdata\local\programs\python\python37\lib\site-packages\huggingface_hub\utils\_deprecation.py:92: FutureWarning: Deprecated argument(s) used in 'snapshot_download': ignore_regex. Will not be supported from version '0.12'.
Please use `allow_patterns` and `ignore_patterns` instead.
warnings.warn(message, FutureWarning)
'C:\\Users\\HP/.cache\\huggingface\\hub\\models--hfl--chinese-bert-wwm-ext\\snapshots\\2a995a880017c60e4683869e817130d8af548486'
from transformers import AutoConfig,AutoTokenizer,AutoModel,AutoModelForSequenceClassification
model_name = 'C:\\Users\\HP/.cache\\huggingface\\hub\\models--hfl--chinese-Bert-wwm-ext\\snapshots\\2a995a880017c60e4683869e817130d8af548486'
config = AutoConfig.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=3) #新闻标题A和B的关系标签有3种类型
Some weights of the model che