• Stars
    star
    5,071
  • Rank 8,205 (Top 0.2 %)
  • Language
    Python
  • License
    Apache License 2.0
  • Created about 5 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

keras implement of transformers for humans

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

更新

  • 2023.03.06: 无穷大改np.inf;优化显存占用。将无穷大改为np.inf,运算更加准确,而且在低精度运算时不容易出错;同时合并了若干mask算子,减少了显存占用。实测在A100上训练base和large级别模型时,速度有明显加快,显存占用也有降低。
  • 2022.03.20: 增加RoFormerV2
  • 2022.02.28: 增加GatedAttentionUnit
  • 2021.04.23: 增加GlobalPointer
  • 2021.03.23: 增加RoFormer
  • 2021.01.30: 发布0.9.9版,完善多GPU支持,增加多GPU例子: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项目。
  • 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的源码,在此衷心感谢大佬的无私奉献。

相关

bert4torch:一个跟bert4keras风格很相似的pytorch-based的transofrmer库,使用pytorch的读者可以尝试。

引用

@misc{bert4keras,
  title={bert4keras},
  author={Jianlin Su},
  year={2020},
  howpublished={\url{https://bert4keras.spaces.ac.cn}},
}

交流

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

More Repositories

1

attention

some attention implements
Python
1,407
star
2

vae

a simple vae and cvae from keras
Python
1,092
star
3

kg-2019

2019年百度的三元组抽取比赛,“科学空间队”源码
Python
765
star
4

bert_in_keras

在Keras下微调Bert的一些例子;some examples of bert in keras
Python
650
star
5

SimCSE

SimCSE在中文任务上的简单实验
Python
536
star
6

word-discovery

速度更快、效果更好的中文新词发现
Python
476
star
7

BERT-whitening

简单的向量白化改善句向量质量
Python
437
star
8

SPACES

端到端的长本文摘要模型(法研杯2020司法摘要赛道)
Python
365
star
9

Capsule

A Capsule Implement with Pure Keras
Python
350
star
10

seq2seq

keras example of seq2seq, auto title
Python
330
star
11

CoSENT

比Sentence-BERT更有效的句向量方案
Python
284
star
12

gan

some demo of GANs
Python
264
star
13

crf

keras implementation of conditional random field
Python
246
star
14

lic2020_baselines

some baselines for lic2020 (http://lic2020.cipsc.org.cn/)
Python
221
star
15

kg-2019-baseline

2019年百度的三元组抽取比赛,一个baseline
Python
211
star
16

GlobalPointer

全局指针统一处理嵌套与非嵌套NER
Python
209
star
17

flow

Keras implement of flow-based models
Python
206
star
18

NBCE

Naive Bayes-based Context Extension
Python
177
star
19

keras_lookahead

lookahead optimizer for keras
Python
172
star
20

dgcnn_for_reading_comprehension

keras implement of dgcnn for reading comprehension
Python
166
star
21

t5_in_bert4keras

整理一下在keras中使用T5模型的要点
Python
164
star
22

Pattern-Exploiting-Training

Pattern-Exploiting Training在中文上的简单实验
Python
163
star
23

on-lstm

Keras implement of ON-LSTM (Ordered Neurons: Integrating Tree Structures into Recurrent Neural Networks)
Python
154
star
24

Keras-DDPM

生成扩散模型的Keras实现
Python
149
star
25

infomax

extract features by maximizing mutual information
Python
140
star
26

nlp-zero

基于最小熵原理的NLP工具包
Python
136
star
27

oppo-text-match

小布助手对话短文本语义匹配的一个baseline
Python
136
star
28

CLUE-bert4keras

真 · “Deep Learning for Humans”
Python
133
star
29

o-gan

O-GAN: Extremely Concise Approach for Auto-Encoding Generative Adversarial Networks
Python
124
star
30

P-tuning

P-tuning方法在中文上的简单实验
Python
124
star
31

labse

Language-agnostic BERT Sentence Embedding (LaBSE)
Python
122
star
32

ee-2019-baseline

面向金融领域的事件主体抽取(ccks2019),一个baseline
Python
121
star
33

accum_optimizer_for_keras

wrapping a keras optimizer to implement gradient accumulation
Python
120
star
34

tf_word2vec

a tensorflow version of Word2Vec with a new loss
Python
118
star
35

el-2019-baseline

2019年百度的实体链指比赛(ccks2019),一个baseline
Python
117
star
36

GPLinker

基于GlobalPointer的实体/关系/事件抽取
Python
117
star
37

gan-qp

GAN-QP: A Novel GAN Framework without Gradient Vanishing and Lipschitz Constraint
Python
117
star
38

el-2019

2019年百度的实体链接比赛,“科学空间队”源码
Python
107
star
39

perturbed_masking

基于BERT的无监督分词和句法分析
Python
105
star
40

margin-softmax

keras sparse implement of margin-softmax
Python
103
star
41

chinese-gen

中文生成式预训练模型
98
star
42

nezha_gpt_dialog

Python
95
star
43

r-drop

R-Drop方法在中文任务上的简单实验
Python
86
star
44

n2n-ocr-for-qqcaptcha

an n2n ocr for qq captcha, 端到端的腾讯验证码识别
Python
85
star
45

ape210k_baseline

用bert4keras来解小学数学应用题
73
star
46

keras_radam

RAdam optimizer for keras
Python
70
star
47

KgCLUE-bert4keras

基于“Seq2Seq+前缀树”的知识图谱问答
Python
67
star
48

albert_zh

转换 https://github.com/brightmart/albert_zh 到google格式
Python
62
star
49

CCL_CMRC2017

第一届“讯飞杯”中文机器阅读理解评测参考模型
Python
60
star
50

simple-chinese-ocr

A Simple Chinese OCR from tipdm contest
Python
60
star
51

CPM_LM_bert4keras

在bert4keras下加载CPM_LM模型
Python
51
star
52

univae

基于Transformer的单模型、多尺度的VAE模型
Python
51
star
53

unsupervised-text-generation

无监督文本生成的一些方法
Python
48
star
54

sohu2021-baseline

2021搜狐校园文本匹配算法大赛baseline
Python
45
star
55

keras_adversarial_training

Adversarial Training for NLP in Keras
Python
44
star
56

bytepiece

更纯粹、更高压缩率的Tokenizer
Python
43
star
57

infomap

a beautiful method for cluster or community detection
Python
43
star
58

gpt_cchess

bert4keras实现gpt下中国象棋
38
star
59

rnn

一些RNN的实现
Python
38
star
60

CDial-GPT-tf

用bert4keras加载CDial-GPT
Python
38
star
61

tiger

A Tight-fisted Optimizer
Python
38
star
62

T-GANs

Training Generative Adversarial Networks Via Turing Test
Python
37
star
63

keras_recompute

saving memory by recomputing for keras
Python
37
star
64

bert-of-theseus

bert-of-theseus via bert4keras
Python
30
star
65

shuffle

Python下shuffle几百G文件
Python
29
star
66

text_compare

用python比较两个字符串差异,高亮差异部分
Python
26
star
67

mydog

监控文件改动,随时自动备份,彻底防止误删
Python
22
star
68

pytorch_bert_to_tf

pytorch版bert权重转tf
Python
22
star
69

nezha

精简版NEZHA模型权重
21
star
70

keras_lazyoptimizer

Keras implement of Lazy optimizer
Python
21
star
71

unsupervised-vocabulary-search

完整的新词发现&词库构建例子
Python
20
star
72

adafactor

adafactor optimizer for keras
Python
19
star
73

NNCWS

Neutral Network based Chinese Segment System
Python
18
star
74

exposure_bias

some strategies for exposure bias in seq2seq
Python
17
star
75

vib

Variational Information Bottleneck
Python
15
star
76

antiminer

简单的挖矿病毒查杀脚本
Python
15
star
77

lic2021_baselines

目前只有阅读理解赛道的
Python
14
star
78

LST-CLUE

Ladder Side-Tuning在CLUE上的简单尝试
Python
14
star
79

FSQ

Keras implement of Finite Scalar Quantization
Python
12
star
80

baidu_dog_classifier

Python
12
star
81

analytical-classification

逻辑回归和单层softmax的解析解
Python
11
star
82

baidu-ner-contest

a bilstm-seq2seq ner script from baidu-ner contest
Python
10
star
83

memm

Keras implementation of Maximum Entropy Markov Model
Python
9
star
84

python-snippets

some frequently-used snippets for python
Python
8
star
85

adax

AdaX optimizer for keras
Python
7
star
86

beiguo

根据进程pid找对应的container
Python
6
star