自己实现了一个bert4keras
By 苏剑林 | 2019-08-27 | 174172位读者 |分享个人实现的bert4keras:
https://github.com/bojone/bert4keras这是笔者重新实现的keras版的bert,致力于用尽可能清爽的代码来实现keras下调用bert。
说明 #
目前已经基本实现bert,并且能成功加载官方权重,经验证模型输出跟keras-bert一致,大家可以放心使用。
本项目的初衷是为了修改、定制上的方便,所以可能会频繁更新。
因此欢迎star,但不建议fork,因为你fork下来的版本可能很快就过期了。
使用 #
快速安装;
pip install git+https://www.github.com/bojone/bert4keras.git
参考代码:
#! -*- coding: utf-8 -*- # 测试代码可用性 from bert4keras.models import build_transformer_model from bert4keras.tokenizers import Tokenizer import numpy as np config_path = '../../kg/bert/chinese_L-12_H-768_A-12/bert_config.json' checkpoint_path = '../../kg/bert/chinese_L-12_H-768_A-12/bert_model.ckpt' dict_path = '../../kg/bert/chinese_L-12_H-768_A-12/vocab.txt' tokenizer = Tokenizer(dict_path) # 建立分词器 model = build_transformer_model(config_path, checkpoint_path) # 建立模型,加载权重 # 编码测试 token_ids, segment_ids = tokenizer.encode(u'语言模型') print(model.predict([np.array([token_ids]), np.array([segment_ids])]))
之前在《当Bert遇上Keras:这可能是Bert最简单的打开姿势》中基于keras-bert给出的例子,仍适用于本项目,只需要将base_model的加载方式换成本项目的。
目前只保证支持Python 2.7,实验环境是Tesorflow 1.8+以及Keras 2.2.4+。
(有朋友测试过,python 3也可以直接用,没报错,反正python 3的用户可以直接试试。但我自己没测试过,所以不保证。)当然,乐于贡献的朋友如果发现了某些bug的话,也欢迎指出修正甚至Pull Requests~
背景 #
之前一直用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的源码,在此衷心感谢大佬的无私奉献。
转载到请包括本文地址:https://kexue.fm/archives/6915
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Aug. 27, 2019). 《自己实现了一个bert4keras 》[Blog post]. Retrieved from https://kexue.fm/archives/6915
@online{kexuefm-6915,
title={自己实现了一个bert4keras},
author={苏剑林},
year={2019},
month={Aug},
url={\url{https://kexue.fm/archives/6915}},
}
你也许还对下面的内容感兴趣
智能搜索
最近评论
- lodestar: 苏神您好,我想复现一下这篇博客的结果,请问可以发一份源码到我邮箱吗?
- yzlnew: 博主对于用小尺寸的代理模型通过 mup 搜参的方式确定目标模型目标 batch size 的 ...
- Kiro: 虽然不做这个方向,但是也去看了一下原文。 从结果来看,我感觉似乎C其实是weight vect...
- vii: 这个是对称的吗? 为什么感觉是排列等变的 $$ self\_attention(Perm(\m...
- jiyubo: 苏神这个知识关联能力真强,真的深入思考了
- rain bing: 好的,苏老师。我已发送至您spaces邮箱,请您查收!再次感谢苏老师可以批评指正
- light_sun: 哦哦,我好像明白了,谢谢苏神!
- qhmiao: 嗯嗯是的,我试了一下loraga对超参数比lora稳定的多
- cc3: [comment=25800]苏剑林[/comment] CDF,累积概率函数
- 苏剑林: 抱歉,这点我倒是没了解到,不过这至少说明LoRA-GA给出了近乎最优的初始化,减少了debug...
September 21st, 2020
苏老师,我用您的预训练代码(pretraining目录)进行训练后,生成的模型文件,无法加载,加载就会报错tensorflow.python.framework.errors_impl.NotFoundError: Key bert/embeddings/word_embeddings not found in checkpoint
用save_weights_as_checkpoint转。
January 27th, 2021
苏神您好 , 目前bert4keras仅支持两句话的编码是把(就是segment_id只有0和1) , 如果我想拼接第三句话的话 , 在bert4keras中有这种解决方案吗? 是不是可以把tokenizers.py中的encode函数中多几个third_text = None , fourth_text = None呢
t1, s1 = tokenizer.encode(text1)
t2, s2 = tokenizer.encode(text2)
t3, s3 = tokenizer.encode(text3)
t4, s4 = tokenizer.encode(text4)
token_ids = t1 + t2[1:] + t3[1:] + t4[1:]
segment_ids = s1 + s2[1:] + s3[1:] + s4[1:]
自己动动手,想拼接多少句都行,非要等现成?
刚从"看和改"源码 过度到 "写" , 所以没什么思路 , 谢谢苏神指点
February 26th, 2021
请教一下苏老师,在keras4bert中可以得到tokenizer._token_mask_id,但是我没有找到这个属性(pycharm也跳转不到),只在TokenizerBase类中找到了tokenizer._token_mask。请苏老师指点一二,tokenizer._token_mask_id是怎么得到的?
没有keras4bert这个库。
如果你说的是bert4keras,那么请去学习一下python的setattr、getattr等方法,同时远离ide(我想你没有找到tokenizer._token_mask_id是因为ide的提示吧?)。
for token in ['pad', 'unk', 'mask', 'start', 'end']:
try:
_token_id = token_dict[getattr(self, '_token_%s' % token)]
setattr(self, '_token_%s_id' % token, _token_id)
except:
pass
March 29th, 2021
苏老师,您好,刚来学习bert4keras,想请问老师bert4keras是只支持中文数据集的bert预训练吗?是否支持英文的bert-cased
请注意,bert4keras只是一个帮助你搭建keras下的bert模型的框架,它不依赖于语种。至于支持什么语种的预训练,取决于个人的开发,它并不是bert4keras本身的开发任务。bert4keras下的pretraining提供了中文预训练的参考脚本,用户可以参考脚本来实现任意语种的预训练。
March 29th, 2021
感谢苏老师的回复,我明白了,接下来会好好研究例子学习。
December 9th, 2021
运行 pretraining.py 时,在tensorflow 1.14.0 环境下,报错“AttributeError: 'tuple' object has no attribute 'layer'”, 能请教一下可从什么角度解决吗?
检查tf.keras和keras是否混用?
October 18th, 2022
[...]https://spaces.ac.cn/archives/6915[...]
November 30th, 2022
感谢博主的努力分享。
想询问下,可否支撑新版本tf和keras?现在的版本看着都不太新 ;)
不可以。对于最新显卡(如3090、A100等)支持得最好的tf版本,依旧是tf 1.15(nvidia的),所以支持更新的版本基本上是浪费时间。
June 26th, 2023
大佬,佩服你呀,可以加你的微信吗
August 23rd, 2023
这个样例代码需要多大的显存啊?
我这8GB的显卡报错了
failed to run cuBLAS routine: CUBLAS_STATUS_EXECUTION_FAILED
Internal: Blas xGEMMBatched launch failed : a.shape=[12,6,64], b.shape=[12,64,6], m=6, n=6, k=64, batch_size=12
[[{{node Transformer-0-MultiHeadSelfAttention/einsum/MatMul}}]]
哪个?