Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

NLP-fork/bert4keras

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

1,631 Commits

Repository files navigation

bert4keras

说明

这是笔者重新实现的keras版的transformer模型库,致力于用尽可能清爽的代码来实现结合transformer和keras。

本项目的初衷是为了修改、定制上的方便,所以可能会频繁更新。

因此欢迎star,但不建议fork,因为你fork下来的版本可能很快就过期了。

功能

目前已经实现:

  • 加载bert/roberta/albert的预训练权重进行finetune;
  • 实现语言模型、seq2seq所需要的attention mask;
  • 丰富的examples;
  • 从零预训练代码(支持TPU、多GPU,请看pretraining);
  • 兼容keras、tf.keras

使用

安装稳定版:

pip install bert4keras

安装最新版:

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〜

权重

目前支持加载的权重:

注意事项

  • 注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字段)。

更新

  • 2020年12月04日: PositionEmbedding引入层次分解,可以让BERT直接处理超长文本,在build_transformer_model中传入参数hierarchical_position=True启用。
  • 2020年11月19日: 支持GPT2模型,参考CPM_LM_bert4keras项目。
  • 2020年11月14日: 新增分参数学习率extend_with_parameter_wise_lr,可用于给每层设置不同的学习率。
  • 2020年10月27日: 支持T5.1.1Multilingual 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的源码,在此衷心感谢大佬的无私奉献。

交流

QQ交流群:808623966,微信群请加机器人微信号spaces_ac_cn

About

keras implement of transformers for humans

Resources

License

Stars

Watchers

Forks

Packages

Contributors

Languages

  • Python 100.0%

AltStyle によって変換されたページ (->オリジナル) /