Multi-instance learning¶
Note
The MIL algorithms themselves live in the companion package milearn. Its own documentation is not published yet, so the methods QSARmil relies on are summarized here instead.
All methods below take a list of bags (one array of instance descriptors
per molecule) and a matching list of target values, and follow the same
model.fit(x, y) / model.predict(x) interface. Each is available as
a ...Regressor (continuous targets) or ...Classifier (binary
targets), e.g. AdditiveAttentionNetworkRegressor /
AdditiveAttentionNetworkClassifier.
MLP wrappers¶
BagWrapperMLPNetwork— pools each bag into a single vector first (mean/sum/max/lse), then applies an MLP to that pooled vector.InstanceWrapperMLPNetwork— applies an MLP to every instance individually (each instance inherits its bag’s label during training), then pools the per-instance predictions (mean) into a bag prediction.
These two exist for benchmarking, not because they’re expected to be the
best-performing option. Both are built on the exact same underlying PyTorch
training code (the same instance transformer + estimator layers, optimizer,
and training loop) as the networks below — only the pooling
strategy/placement differs. That makes it possible to isolate the effect of
where and how pooling happens from everything else. Wrapping a real
scikit-learn MLPRegressor/MLPClassifier instead would not give a
fair comparison, since scikit-learn’s MLP implementation (initialization,
optimizer, training loop) differs from milearn’s PyTorch one in ways
unrelated to the pooling strategy being studied.
Networks¶
BagNetwork— transforms instances, pools them into a bag embedding (mean/sum/max/lse), then scores the pooled embedding. No learned weighting between instances.InstanceNetwork— transforms and scores each instance individually, then pools the per-instance scores (mean/sum/max) into a bag prediction. No learned weighting between instances.AdditiveAttentionNetwork— learns a per-instance attention score via a small MLP, softmax-normalized across the bag, and combines instances into a bag embedding as a weighted sum.SelfAttentionNetwork— instances attend to each other via scaled dot-product self-attention (query/key/value projections), then are combined into a bag embedding.HopfieldAttentionNetwork— a single learned query vector attends to every instance in the bag (Hopfield-style associative attention).DynamicPoolingNetwork— combines instances via iterative dynamic routing (capsule-network-style), rather than a single attention pass.
Unlike the two networks above, the attention-based networks and
DynamicPoolingNetwork produce genuine per-instance weights that can be
inspected after training — see Key instance detection.
Parameters¶
Common to every method above (set at initialization):
hidden_layer_sizes(default(256, 128, 64)) — sizes of the hidden layers of the instance transformer.max_epochs(default1000) — maximum training epochs.batch_size(default128) — training batch size.activation(default"gelu") — one of"relu","gelu","leakyrelu","elu","silu".learning_rate(default0.001).early_stopping(defaultTrue) — stop training when validation loss stops improving (patience of 10 epochs).weight_decay(default0.0).instance_dropout(default0.0) — probability of randomly dropping real instances from a bag during training (at least one instance per bag is always kept).accelerator(default"cpu") —"cpu"or"gpu".verbose(defaultFalse) — print training progress.random_seed(default42).num_workers(default0) — dataloader worker processes.
Additional, method-specific:
pool—BagNetwork/BagWrapperMLPNetworksupport"mean"/"sum"/"max"/"lse";InstanceNetworksupports"mean"/"sum"/"max";InstanceWrapperMLPNetworkonly supports"mean".tau(default1.0) — attention temperature/scale, forAdditiveAttentionNetwork,SelfAttentionNetwork, andHopfieldAttentionNetworkonly. Lower values sharpen the attention distribution.