Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bojone/bert4keras
keras implement of transformers for humans
https://github.com/bojone/bert4keras
Last synced: 3 days ago
JSON representation
keras implement of transformers for humans
- Host: GitHub
- URL: https://github.com/bojone/bert4keras
- Owner: bojone
- License: apache-2.0
- Created: 2019-08-26T03:27:19.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2024-11-11T15:41:47.000Z (about 1 month ago)
- Last Synced: 2024-12-03T09:00:09.075Z (10 days ago)
- Language: Python
- Homepage: https://kexue.fm/archives/6915
- Size: 9.65 MB
- Stars: 5,372
- Watchers: 73
- Forks: 929
- Open Issues: 164
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- ATPapers - bojone / bert4keras - bojone's (苏神) BERT Keras implementation (Pretrained Language Model / Repository)
- awesome-transformer-nlp - bojone/bert4keras - Light reimplement of BERT for Keras. (Transformer Implementations By Communities / Keras)
- StarryDivineSky - bojone/bert4keras
README
# bert4keras
- Our light reimplement of bert for keras
- 更清晰、更轻量级的keras版bert
- 个人博客:https://kexue.fm/
- 在线文档:http://bert4keras.spaces.ac.cn/ (还在构建中)## 说明
这是笔者重新实现的keras版的transformer模型库,致力于用尽可能清爽的代码来实现结合transformer和keras。本项目的初衷是为了修改、定制上的方便,所以可能会频繁更新。
因此欢迎star,但不建议fork,因为你fork下来的版本可能很快就过期了。
## 功能
目前已经实现:
- 加载bert/roberta/albert的预训练权重进行finetune;
- 实现语言模型、seq2seq所需要的attention mask;
- 丰富的examples;
- 从零预训练代码(支持TPU、多GPU,请看pretraining);
- 兼容keras、tf.keras## 使用
安装稳定版:
```shell
pip install bert4keras
```
安装最新版:
```shell
pip install git+https://www.github.com/bojone/bert4keras.git
```使用例子请参考examples目录。
之前基于keras-bert给出的例子,仍适用于本项目,只需要将`bert_model`的加载方式换成本项目的。
理论上兼容Python2和Python3,兼容tensorflow 1.14+和tensorflow 2.x,实验环境是Python 2.7、Tesorflow 1.14+以及Keras 2.3.1(已经在2.2.4、2.3.0、2.3.1、tf.keras下测试通过)。
**为了获得最好的体验,建议你使用Tensorflow 1.14 + Keras 2.3.1组合。**
关于环境组合
- 支持tf+keras和tf+tf.keras,后者需要提前传入环境变量TF_KERAS=1。- 当使用tf+keras时,建议2.2.4 <= keras <= 2.3.1,以及 1.14 <= tf <= 2.2,不能使用tf 2.3+。
- keras 2.4+可以用,但事实上keras 2.4.x基本上已经完全等价于tf.keras了,因此如果你要用keras 2.4+,倒不如直接用tf.keras。
当然,乐于贡献的朋友如果发现了某些bug的话,也欢迎指出修正甚至Pull Requests~
## 权重
目前支持加载的权重:
- Google原版bert: https://github.com/google-research/bert
- brightmart版roberta: https://github.com/brightmart/roberta_zh
- 哈工大版roberta: https://github.com/ymcui/Chinese-BERT-wwm
- Google原版albert[例子]: https://github.com/google-research/ALBERT
- brightmart版albert: https://github.com/brightmart/albert_zh
- 转换后的albert: https://github.com/bojone/albert_zh
- 华为的NEZHA: https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/NEZHA-TensorFlow
- 华为的NEZHA-GEN: https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/NEZHA-Gen-TensorFlow
- 自研语言模型: https://github.com/ZhuiyiTechnology/pretrained-models
- T5模型: https://github.com/google-research/text-to-text-transfer-transformer
- GPT_OpenAI: https://github.com/bojone/CDial-GPT-tf
- GPT2_ML: https://github.com/imcaspar/gpt2-ml
- Google原版ELECTRA: https://github.com/google-research/electra
- 哈工大版ELECTRA: https://github.com/ymcui/Chinese-ELECTRA
- CLUE版ELECTRA: https://github.com/CLUEbenchmark/ELECTRA
- LaBSE(多国语言BERT): https://github.com/bojone/labse
- Chinese-GEN项目下的模型: https://github.com/bojone/chinese-gen
- T5.1.1: https://github.com/google-research/text-to-text-transfer-transformer/blob/master/released_checkpoints.md#t511
- Multilingual T5: https://github.com/google-research/multilingual-t5/注意事项
- 注1:brightmart版albert的开源时间早于Google版albert,这导致早期brightmart版albert的权重与Google版的不完全一致,换言之两者不能直接相互替换。为了减少代码冗余,bert4keras的0.2.4及后续版本均只支持加载Google版以brightmart版中带Google字眼的权重。如果要加载早期版本的权重,请用0.2.3版本,或者考虑作者转换过的albert_zh。
- 注2:下载下来的ELECTRA权重,如果没有json配置文件的话,参考这里自己改一个(需要加上`type_vocab_size`字段)。## 更新
- 2023.03.06: [无穷大改np.inf;优化显存占用](https://github.com/bojone/bert4keras/commit/20a46946156b4bc15ceaa00671fcd00c8b702640)。将无穷大改为np.inf,运算更加准确,而且在低精度运算时不容易出错;同时合并了若干mask算子,减少了显存占用。实测在A100上训练base和large级别模型时,速度有明显加快,显存占用也有降低。
- 2022.03.20: 增加[RoFormerV2](https://kexue.fm/archives/8998)。
- 2022.02.28: 增加[GatedAttentionUnit](https://kexue.fm/archives/8934)。
- 2021.04.23: 增加[GlobalPointer](https://kexue.fm/archives/8373)。
- 2021.03.23: 增加[RoFormer](https://kexue.fm/archives/8265)。
- 2021.01.30: 发布0.9.9版,完善多GPU支持,增加多GPU例子:[task_seq2seq_autotitle_multigpu.py](https://github.com/bojone/bert4keras/blob/master/examples/task_seq2seq_autotitle_multigpu.py)。
- 2020.12.29: 增加`residual_attention_scores`参数来实现RealFormer,只需要在`build_transformer_model`中传入参数`residual_attention_scores=True`启用。
- 2020.12.04: `PositionEmbedding`引入层次分解,可以让BERT直接处理超长文本,在`build_transformer_model`中传入参数`hierarchical_position=True`启用。
- 2020.11.19: 支持GPT2模型,参考[CPM_LM_bert4keras](https://github.com/bojone/CPM_LM_bert4keras)项目。
- 2020.11.14: 新增分参数学习率`extend_with_parameter_wise_lr`,可用于给每层设置不同的学习率。
- 2020.10.27: 支持T5.1.1和Multilingual T5。
- 2020.08.28: 支持GPT_OpenAI。
- 2020.08.22: 新增`WebServing`类,允许简单地将模型转换为Web接口,详情请参考该类的说明。
- 2020.07.14: `Transformer`类加入`prefix`参数;`snippets.py`引入`to_array`函数;`AutoRegressiveDecoder`修改`rtype='logits'`时的一个隐藏bug。
- 2020.06.06: 强迫症作祟:将`Tokenizer`原来的`max_length`参数重命名为`maxlen`,同时保留向后兼容性,建议大家用新参数名。
- 2020.04.29: 增加重计算(参考keras_recompute),可以通过时间换空间,通过设置环境变量`RECOMPUTE=1`启用。
- 2020.04.25: 优化tf2下的表现。
- 2020.04.16: 所有example均适配tensorflow 2.0。
- 2020.04.06: 增加UniLM预训练模式(测试中)。
- 2020.04.06: 完善`rematch`方法。
- 2020.04.01: `Tokenizer`增加`rematch`方法,给出分词结果与原序列的映射关系。
- 2020.03.30: 尽量统一py文件的写法。
- 2020.03.25: 支持ELECTRA。
- 2020.03.24: 继续加强`DataGenerator`,允许传入迭代器时进行局部shuffle。
- 2020.03.23: 增加调整Attention的`key_size`的选项。
- 2020.03.17: 增强`DataGenerator`;优化模型写法。
- 2020.03.15: 支持GPT2_ML。
- 2020.03.10: 支持Google的T5模型。
- 2020.03.05: 将`tokenizer.py`更名为`tokenizers.py`。
- 2020.03.05: `application='seq2seq'`改名为`application='unilm'`。
- 2020.03.05: `build_bert_model`更名为`build_transformer_model`。
- 2020.03.05: 重写`models.py`结构。
- 2020.03.04: 将`bert.py`更名为`models.py`。
- 2020.03.02: 重构mask机制(用回Keras自带的mask机制),以便更好地编写更复杂的应用。
- 2020.02.22: 新增`AutoRegressiveDecoder`类,统一处理Seq2Seq的解码问题。
- 2020.02.19: transformer block的前缀改为Transformer(本来是Encoder),使得其含义局限性更少。
- 2020.02.13: 优化`load_vocab`函数;将`build_bert_model`中的`keep_words`参数更名为`keep_tokens`,此处改动可能会对部分脚本产生影响。
- 2020.01.18: 调整文本处理方式,去掉codecs的使用。
- 2020.01.17: 各api日趋稳定,为了方便大家使用,打包到pypi,首个打包版本号为0.4.6。
- 2020.01.10: 重写模型mask方案,某种程度上让代码更为简练清晰;后端优化。
- 2019.12.27: 重构预训练代码,减少冗余;目前支持RoBERTa和GPT两种预训练方式,详见pretraining。
- 2019.12.17: 适配华为的nezha权重,只需要在`build_bert_model`函数里加上`model='nezha'`;此外原来albert的加载方式`albert=True`改为`model='albert'`。
- 2019.12.16: 通过跟keras 2.3+版本类似的思路给低版本引入层中层功能,从而恢复对低于2.3.0版本的keras的支持。
- 2019.12.14: 新增Conditional Layer Normalization及相关demo。
- 2019.12.09: 各example的data_generator规范化;修复application='lm'时的一个错误。
- 2019.12.05: 优化tokenizer的do_lower_case,同时微调各个example。
- 2019.11.23: 将train.py重命名为optimizers.py,更新大量优化器实现,全面兼容keras和tf.keras。
- 2019.11.19: 将utils.py重命名为tokenizer.py。
- 2019.11.19: 想来想去,最后还是决定把snippets放到bert4keras.snippets下面去好了。
- 2019.11.18: 优化预训练权重加载逻辑,增加保存模型权重至Bert的checkpoint格式方法。
- 2019.11.17:分离一些与Bert本身不直接相关的常用代码片段到python_snippets,供其它项目共用。
- 2019.11.11: 添加NSP部分。
- 2019.11.05: 适配google版albert,不再支持非Google版albert_zh。
- 2019.11.05: 以RoBERTa为例子的预训练代码开发完毕,同时支持TPU/多GPU训练,详见roberta。欢迎在此基础上构建更多的预训练代码。
- 2019.11.01: 逐步增加预训练相关代码,详见pretraining。
- 2019.10.28: 支持使用基于sentencepiece的tokenizer。
- 2019.10.25: 引入原生tokenizer。
- 2019.10.22: 引入梯度累积优化器。
- 2019.10.21: 为了简化代码结构,决定放弃keras 2.3.0之前的版本的支持,目前只支持keras 2.3.0+以及tf.keras。
- 2019.10.20: 应网友要求,现支持直接用`model.save`保存模型结构,用`load_model`加载整个模型(只需要在`load_model`之前执行`from bert4keras.layers import *`,不需要额外写`custom_objects`)。
- 2019.10.09: 已兼容tf.keras,同时在tf 1.13和tf 2.0下的tf.keras测试通过,通过设置环境变量`TF_KERAS=1`来切换tf.keras。
- 2019.10.09: 已兼容Keras 2.3.x,但只是临时方案,后续可能直接移除掉2.3之前版本的支持。
- 2019.10.02: 适配albert,能成功加载albert_zh的权重,只需要在`load_pretrained_model`函数里加上`albert=True`。## 背景
之前一直用CyberZHG大佬的keras-bert,如果纯粹只是为了在keras下对bert进行调用和fine tune来说,keras-bert已经足够能让人满意了。然而,如果想要在加载官方预训练权重的基础上,对bert的内部结构进行修改,那么keras-bert就比较难满足我们的需求了,因为keras-bert为了代码的复用性,几乎将每个小模块都封装为了一个单独的库,比如keras-bert依赖于keras-transformer,而keras-transformer依赖于keras-multi-head,keras-multi-head依赖于keras-self-attention,这样一重重依赖下去,改起来就相当头疼了。
所以,我决定重新写一个keras版的bert,争取在几个文件内把它完整地实现出来,减少这些依赖性,并且保留可以加载官方预训练权重的特性。
## 鸣谢
感谢CyberZHG大佬实现的keras-bert,本实现有不少地方参考了keras-bert的源码,在此衷心感谢大佬的无私奉献。## 相关
[bert4torch](https://github.com/Tongjilibo/bert4torch):一个跟bert4keras风格很相似的pytorch-based的transofrmer库,使用pytorch的读者可以尝试。
## 引用
```
@misc{bert4keras,
title={bert4keras},
author={Jianlin Su},
year={2020},
howpublished={\url{https://bert4keras.spaces.ac.cn}},
}
```