<p align="center">
<br>
<img src="./docs/pics/logo.png" style="zoom:74%"/>
<br>
<p>
<p align="center">
<a>
<img src="https://img.shields.io/badge/build-passing-brightgreen">
</a>
<a>
<img src="https://img.shields.io/badge/version-v2.5.21-blue">
</a>
<a>
<img src="https://img.shields.io/badge/tensorflow-1.x\2.x-yellow">
</a>
<a>
<img src="https://img.shields.io/badge/license-Apache2.0-red">
</a>
</p>
兼容 Tensorflow1.x/2.x 的高层封装 (Transformer/GPT-2/BERT/ALBERT/UniLM/XLNet/ELECTRA 等),使用简单的代码完成语言模型/文本分类/文本生成/命名实体识别/机器阅读理解/机器翻译/序列标注/知识蒸馏任务。适用于 NLP 从业者。
### 特性
- 高效调用:三行代码完成训练及推理
- 高效运行:一行代码设置多进程/多 GPU 并行
- 品类丰富:支持 40+ 模型类
- 高分保证:提供对比学习、对抗式训练等多项训练技巧
- 可供部署:导出模型 PB 文件,供线上部署
### 安装
``` bash
git clone https://github.com/geyingli/unif
cd unif
python3 setup.py install --user
```
若需卸载,通过 `pip3 uninstall uf` 即可。
### 快速上手
``` python
import uf
# 建模
model = uf.BERTClassifier(config_file="./ref/bert_config.json", vocab_file="./ref/vocab.txt")
# 定义训练样本
X, y = ["久旱逢甘露", "他乡遇故知"], [1, 0]
# 训练
model.fit(X, y)
# 推理
print(model.predict(X))
```
## 模型列表
| 领域 | API | 说明 |
| :----------- | :----------- | :------------ |
| 语言模型|[`BERTLM`](./examples/tutorial/BERTLM.ipynb) | 结合 MLM 和 NSP 任务,随机采样自下文及其他文档 |
| |[`RoBERTaLM`](./examples/tutorial/RoBERTaLM.ipynb) | 仅 MLM 任务,采样至文档结束 |
| |[`ALBERTLM`](./examples/tutorial/ALBERTLM.ipynb) | 结合 MLM 和 SOP,随机采样自上下文及其他文档 |
| |[`ELECTRALM`](./examples/tutorial/ELECTRALM.ipynb) | 结合 MLM 和 RTD,生成器与判别器联合训练 |
| |[`VAELM`](./examples/tutorial/VAELM.ipynb) | 可生成语言文本负样本,也可提取向量用于聚类 |
| |[`GPT2LM`](./examples/tutorial/GPT2LM.ipynb) | 自回归式文本生成 | - |
| |[`UniLM`](./examples/tutorial/UniLM.ipynb) | 结合双向、单向及 Seq2Seq 建模的全能语言模型 |
| |[`UniLMPrompt`](./examples/tutorial/UniLMPrompt.ipynb) | 加入 prompt,进一步实现语言模型与下游任务的统一 |
|文本分类 / 单label|[`TextCNNClassifier`](./examples/tutorial/TextCNNClassifier.ipynb) | 小而快 |
|| [`RNNClassifier`](./examples/tutorial/RNNClassifier.ipynb) | 经典 RNN/LSTM/GRU |
|| [`BiRNNClassifier`](./examples/tutorial/BiRNNClassifier.ipynb) | 双向获取更优表征 |
|| [`BERTClassifier`](./examples/tutorial/BERTClassifier.ipynb) | - |
|| [`XLNetClassifier`](./examples/tutorial/XLNetClassifier.ipynb) | - |
|| [`ALBERTClassifier`](./examples/tutorial/ALBERTClassifier.ipynb) | - |
| |[`ELECTRAClassifier`](./examples/tutorial/ELECTRAClassifier.ipynb) | - |
| |[`WideDeepClassifier`](./examples/tutorial/WideDeepClassifier.ipynb) | 通过 Wide & Deep 架构融合句子级别特征 |
| |[`SemBERTClassifier`](./examples/tutorial/SemBERTClassifier.ipynb) | 通过 SemBERT 架构融合字级别的特征 |
| |[`UDAClassifier`](./examples/tutorial/UDAClassifier.ipynb) | 结合一致性学习的半监督学习算法 |
| |[`PerformerClassifier`](./examples/tutorial/PerformerClassifier.ipynb) | 基于正交随机向量快速计算 attention,实现加速 |
|文本分类 / 多label| [`BERTBinaryClassifier`](./examples/tutorial/BERTBinaryClassifier.ipynb) | - |
|| [`XLNetBinaryClassifier`](./examples/tutorial/XLNetBinaryClassifier.ipynb) | - |
| |[`ALBERTBinaryClassifier`](./examples/tutorial/ALBERTBinaryClassifier.ipynb) | - |
| |[`ELECTRABinaryClassifier`](./examples/tutorial/ELECTRABinaryClassifier.ipynb) | - |
| 回归| [`BERTRegressor`](./examples/tutorial/BERTRegressor.ipynb) | - |
|| [`WideDeepRegressor`](./examples/tutorial/WideDeepRegressor.ipynb) | 通过 Wide & Deep 架构融合句子级别特征 |
|序列标注|[`BERTSeqClassifier`](./examples/tutorial/BERTSeqClassifier.ipynb) | - |
|| [`ALBERTSeqClassifier`](./examples/tutorial/ALBERTSeqClassifier.ipynb) | - |
|| [`ELECTRASeqClassifier`](./examples/tutorial/ELECTRASeqClassifier.ipynb) | - |
|| [`BERTSeqCrossClassifier`](./examples/tutorial/BERTSeqCrossClassifier.ipynb) | 序列标注与文本分类相结合的多任务学习 |
| 命名实体识别|[`BERTNER`](./examples/tutorial/BERTNER.ipynb) | - |
|| [`BERTCRFNER`](./examples/tutorial/BERTCRFNER.ipynb) | 结合 CRF |
|| [`BERTCRFCascadeNER`](./examples/tutorial/BERTCRFCascadeNER.ipynb) | 实体识别与分类同时进行的级联架构 |
|机器阅读理解| [`BERTMRC`](./examples/tutorial/BERTMRC.ipynb) | - |
| |[`ALBERTMRC`](./examples/tutorial/ALBERTMRC.ipynb) | - |
| |[`SANetMRC`](./examples/tutorial/SANetMRC.ipynb) | 引入 sentence attention |
| |[`BERTVerifierMRC`](./examples/tutorial/BERTVerifierMRC.ipynb) | 抽取 answer span 的同时判断可答性 |
| |[`RetroReaderMRC`](./examples/tutorial/RetroReaderMRC.ipynb) | 抽取 answer span 的同时判断可答性 |
| 机器翻译| [`TransformerMT`](./examples/tutorial/TransformerMT.ipynb) | 共享词表,标准 Seq2Seq 架构 | - |
| 模型蒸馏|[`TinyBERTClassifier`](./examples/tutorial/TinyBERTClassifier.ipynb) | 大幅压缩模型参数,提速十倍以上 |
|| [`TinyBERTBinaryClassifier`](./examples/tutorial/TinyBERTBinaryClassifier.ipynb) | - |
|| [`FastBERTClassifier`](./examples/tutorial/FastBERTClassifier.ipynb) | 动态推理,易分样本提前离开模型 |
| 图像分类 / 单label | [`PNasNetClassifier`](./examples/tutorial/PNasNetClassifier.ipynb) | 基于 AutoML 搜索最佳网络结构 |
## 建模
实际上建模所需的参数不在少数,因模型而异。为了简便起见,大多数设置了默认值。了解每一项参数的含义是十分有必要的。参数的命名与原论文保持一致,如果遇到不明白的参数,除了看源代码外,可以前往原论文寻找答案。以 `BERTClassifier` 为例,包含以下参数:
```python
model = uf.BERTClassifier(
config_file, # json格式的配置文件,通常可以在预训练参数包里找到
vocab_file, # 一行一个字/词的txt文件
max_seq_length=128, # 切词后的最大序列长度
label_size=2, # label取值数
init_checkpoint=None, # 预训练参数的路径或目录
output_dir="./output", # 输出文件导出目录
gpu_ids="0,1,3,5", # GPU代号 (为空代表不使用GPU; 如果使用的是Nvidia显卡,需要预先安装CUDA及cuDNN,而后可以通过`nvidia-smi`指令查看可用GPU代号)
drop_pooler=False, # 建模时是否跳过 pooler 层
do_lower_case=True, # 英文是否进行小写处理
truncate_method="LIFO", # 输入超出`max_seq_length`时的截断方式 (LIFO:尾词先弃, FIFO:首词先弃, longer-FO:长文本先弃)
)
```
模型使用完毕后,若需要清理内存,可以使用 `del model` 删除模型,或通过 `model.reset()` 对模型进行重置。
## 训练
同样,训练也包含一些可自行调节的参数,有些参数甚至十分关键:
``` python
model.fit(
X=X, # 输入列表
y=y, # 输出列表
sample_weight=None, # 样本权重列表,放空则默认每条样本权重为1.0
X_tokenized=None, # 输入列表 (已预先分词处理的`X`)
batch_size=32, # 每训练一步使用多少数据
learning_rate=5e-05, # 学习率
target_steps=None, # 放空代表直接不间断地训练到`total_steps`;否则为训练停止的位置
total_s