Snorkel MeTaL is the multi-task learning (MTL) extension of Snorkel prior to Snorkel v0.9, at which point the projects were merged.
The Snorkel project is more active than ever! With the release of Snorkel v0.9 in Aug. 2019, we added support for new training data operators (transformation functions and slicing functions, in addition to labeling functions), ported the label model algorithm first introduced in Snorkel MeTaL, added a Snorkel webpage with additional resources and fresh batch of tutorials, simplified installation options, etc.
As part of that major release, we integrated the best parts of Snorkel MeTaL back into the main Snorkel repository (including flexible MTL modeling), and improved upon many of them. For those starting new projects in Snorkel, we strongly recommend building on top of the main Snorkel repository.
At the same time, we recognize that many users built successful applications and extensions on Snorkel MeTaL. For that reason, we will continue to make that code available in this repository. However, this repository is officially in maintenance mode as of 15 Aug. 2019. We intend to keep the repository functioning with its current feature set to support existing applications built on it but will not be adding any new features or functionality.
If you would like to stay informed of progress in the Snorkel open source project, join the Snorkel email list for relatively rare announcements (e.g., major releases, new tutorials, etc.) or the Snorkel community forum on Spectrum for more regular discussion.
This project builds on Snorkel in an attempt to understand how massively multi-task supervision and learning changes the way people program. Multitask learning (MTL) is an established technique that effectively pools samples by sharing representations across related tasks, leading to better performance with less training data (for a great primer of recent advances, see this survey). However, most existing multi-task systems rely on two or three fixed, hand-labeled training sets. Instead, weak supervision opens the floodgates, allowing users to add arbitrarily many weakly-supervised tasks. We call this setting massively multitask learning, and envision models with tens or hundreds of tasks with supervision of widely varying quality. Our goal with the Snorkel MeTaL project is to understand this new regime, and the programming model it entails.
More concretely, Snorkel MeTaL is a framework for using multi-task weak supervision (MTS), provided by users in the form of labeling functions applied over unlabeled data, to train multi-task models. Snorkel MeTaL can use the output of labeling functions developed and executed in Snorkel, or take in arbitrary label matrices representing weak supervision from multiple sources of unknown quality, and then use this to train auto-compiled MTL networks.
Snorkel MeTaL uses a new matrix approximation approach to learn the accuracies of diverse sources with unknown accuracies, arbitrary dependency structures, and structured multi-task outputs. This makes it significantly more scalable than our previous approaches.
 Install anaconda: Instructions here: https://www.anaconda.com/download/
 Clone the repository:
git clone https://github.com/HazyResearch/metal.git cd metal
 Create virtual environment:
conda env create -f environment.yml source activate metal
 Run unit tests:
If the tests run successfully, you should see 50+ dots followed by "OK". Check out the tutorials to get familiar with the Snorkel MeTaL codebase!
Or, to use Snorkel Metal in another project, install it with pip:
pip install snorkel-metal
If you are looking for help regarding how to use a particular class or method, the best references are (in order):
This sample is for a single-task problem. For a multi-task example, see tutorials/Multitask.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")
Note for Snorkel users: Snorkel MeTaL, even in the single-task case, learns a slightly different label model than Snorkel does (e.g. here we learn class-conditional accuracies for each LF, etc.)---so expect slightly different (hopefully better!) results.
First, read the MeTaL Commandments, which describe the major design principles, terminology, and style guidelines for Snorkel MeTaL.
If you are interested in contributing to Snorkel MeTaL (and we welcome whole-heartedly contributions via pull requests!), follow the setup guidelines above, then run the following additional command:
This will install a few additional tools that help to ensure that any commits or pull requests you submit conform with our established standards. We use the following packages:
make dev to install the necessary tools, you can run
make check to see if any changes you've made violate the repo standards and
make fix to fix any related to isort/black. Fixes for flake8 violations will need to be made manually.
MeTaL supports GPU usage, but does not include this in automatically-run tests; to run these tests, first install the requirements in
tests/gpu/requirements.txt, then run: