多任务弱监控的训练数据快速生成系统
snorkel-metal的Python项目详细描述
浮潜金属
v0.5.0
公告(3/20):我们很高兴在胶水基准及其四个使用浮潜金属的组件任务上获得了最新的分数。 查看相应的博客文章,了解我们是如何做到的。 我们用来完成这一任务的代码是Snorkel Metal中多任务端模型的重要重组的一部分,它使在不同粒度和任意大量任务上执行大规模多任务学习(MMTL)变得尽可能容易。 mmtl包已作为snorkel metal v0.5的一部分发布,同时发布了一个基本的教程。 在以后的小版本更新中将发布更多显示更高级用法的教程(例如,使用预先训练的bert网络作为共享输入模块、使用多个标签集、同时在令牌和句子级别进行监控等)。尽管这种功能已经得到支持。
请在我们的项目登录页上关注浮潜生态系统的其他发展:snorkel.stanford.edu
开始
- 快速设置您的环境
- 尝试教程
- 查看开发人员指南
动机
本项目以浮潜为基础,试图了解多任务管理和学习如何改变人们的计划方式。 多任务学习(mtl)是一种已建立的技术,它通过在相关任务之间共享表示来有效地汇集样本,从而在较少的训练数据的情况下获得更好的性能(对于最新的研究进展来说,请参见本调查。 然而,大多数现有的多任务系统依赖于两个或三个固定的、手工标记的训练集。 相反,弱监控打开了闸门,允许用户任意添加多个弱监控任务。 我们将此设置称为大规模多任务学习(massively multitask learning),并设想了具有数十个或数百个任务的模型,这些任务具有各种各样的质量监控。 我们浮潜金属项目的目标是了解这一新机制及其所需的编程模型。
更具体地说,snorkel metal是一个使用多任务弱监控(mts)的框架,由用户以应用于未标记数据的标记函数的形式提供,用于训练多任务模型。 Snorkel Metal可以使用在Snorkel中开发和执行的标记函数的输出,也可以采用任意的标记矩阵表示来自未知质量的多个来源的弱监管。然后用它来训练自动编译的mtl网络。
Snorkel Metal使用一种新的矩阵近似方法来学习具有未知精度、任意依赖结构和结构化mul任务输出。 这使得它比我们以前的方法具有更大的可扩展性。
参考文献
- 最佳参考资料:培训具有多任务弱监管的复杂模型[aaai 2019]
- 浮潜金属:多任务学习的薄弱监管[sigmod deep 2018]
- 浮潜:在弱监管下快速创建培训数据[VLDB 2018]
- 数据编程:快速创建大型训练集[Neurips 2016]
博客文章
- [2019年3月22日]使用浮潜金属进行大规模多任务学习:提供更多监督
- [2/4/2019]多任务学习系统中的新兴主题
问答
如果您正在寻求有关如何使用特定类或方法的帮助,最好的参考资料是(按顺序):
- 该类的docstrings
- 金属戒律
tests/
中的相应单元测试
- "问题"页(我们标记可能对"参考问题"标签)
示例用法
此示例用于单个任务问题。 有关多任务示例,请参见tutorials/multi task.ipynb。
"""
n = # data points
m = # labeling functions
k = cardinality of the classification task
Load for each split:
L: an [n,m] scipy.sparse label matrix of noisy labels
Y: an n-dim numpy.ndarray of target labels
X: an n-dim iterable (e.g., a list) of end model inputs
"""
from metal.label_model import LabelModel, EndModel
# Train a label model and generate training labels
label_model = LabelModel(k)
label_model.train_model(L_train)
Y_train_probs = label_model.predict_proba(L_train)
# Train a discriminative end model with the generated labels
end_model = EndModel([1000,10,2])
end_model.train_model(train_data=(X_train, Y_train_probs), valid_data=(X_dev, Y_dev))
# Evaluate performance
score = end_model.score(data=(X_test, Y_test), metric="accuracy")
对浮潜用户的注意:浮潜金属,即使是在单一任务情况下,学习的标签模型也与浮潜略有不同(例如,在这里,我们学习每个lf的类条件精度等)——因此,期望稍有不同(希望更好!)结果。
发行说明
v0.5的主要变化:
- 在教程中介绍了大规模多任务学习(mmtl)包。
- 对v0.4的额外测井改进
v0.4的主要变化:
- 升级至pytorch v1.0
- 改进了对日志/检查点/验证的控制
- 更多模块化代码、单独的记录器、检查点、日志编写器类
- 支持用户定义的验证/检查点指标
- 日志记录频率现在可以基于秒、示例、批或时间段
- 命名约定更改:硬(int)标签->;preds,软(float)标签->;probs
设置
[1]安装水蟒:
说明如下:https://www.anaconda.com/download/
[2]克隆存储库:
git clone https://github.com/HazyResearch/metal.git
cd metal
[3]创建虚拟环境:
conda env create -f environment.yml
source activate metal
[4]运行单元测试:
nosetests
如果测试成功运行,您将看到50多个点,后跟"OK"。
查看教程以熟悉浮潜金属代码库!
或者,要在另一个项目中使用浮潜金属,请使用pip:
pip install snorkel-metal
开发人员指南
首先,请阅读金属规则,其中描述了浮潜金属的主要设计原则、术语和样式指南。
如果您有兴趣贡献浮潜金属(我们欢迎通过拉请求全心全意的贡献!),请遵循上面的设置指南,然后运行以下附加命令:
make dev
这将安装一些额外的工具,帮助确保您提交的任何提交或拉取请求都符合我们建立的标准。我们使用以下软件包:
运行make dev
以安装必要的工具后,您可以运行make check
以查看您所做的任何更改是否违反回购标准,并运行make fix
以修复与isort/black相关的任何更改。需要手动修复Flake8冲突。
GPU使用
Metal支持使用GPU,但不包括在自动运行测试中;要运行这些测试,请首先在tests/gpu/requirements.txt中安装要求,然后运行:
nosetests tests/gpu