This repository contains code for:
"PURL: Pairwise Unlearning with Reliability Learning for Noisy Correspondence in Supervised Contrastive Speaker Verification"
Anonymous submission to Interspeech 2026.
This repository is a pre-release research codebase.
- It is being prepared for public release and reproducibility.
- The corresponding Interspeech 2026 submission is under review (not yet accepted).
- APIs, configs, and default paths may still change.
PURL is a post-hoc, pair-level unlearning framework for supervised contrastive speaker verification under noisy correspondence.
- Problem: Positive pairs can be mismatched in large-scale data, which corrupts pairwise supervision.
- Stage 1 (reliability estimation): Fit a 2-component GMM on pairwise cosine similarities in a pretrained embedding space and compute pair confidence
w_ij. - Stage 2 (uncertainty-guided update):
- retain reliable pairs with SupCon objective
- suppress unreliable pairs with weighted cosine repulsion proportional to
(1 - w_ij)
- Goal: reduce harmful correspondences while preserving clean intra-speaker compactness.
In this codebase, this is implemented through NCUTrainer with ncu_loss_type: soft.
This public pre-release keeps four training configs:
configs/supcon.yamlconfigs/supcon_resnet34.yamlconfigs/ncu_30ep.yamlconfigs/ncu_30ep_resnet34.yaml
All machine-specific absolute paths were replaced with placeholders. Update them before running.
The retained configs correspond to the two backbones and post-hoc setup used in the paper:
- ECAPA-TDNN
- base SupCon pretraining:
configs/supcon.yaml - 30-epoch post-hoc update (PURL/NCU):
configs/ncu_30ep.yaml
- base SupCon pretraining:
- Thin ResNet-34
- base SupCon pretraining:
configs/supcon_resnet34.yaml - 30-epoch post-hoc update (PURL/NCU):
configs/ncu_30ep_resnet34.yaml
- base SupCon pretraining:
Python 3.10 is recommended.
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install -e .If you use conda:
conda create -n chns python=3.10 -y
conda activate chns
pip install -r requirements.txt
pip install -e .- Configs use class paths like
trainers.*, so run with:
PYTHONPATH=src python run_train.py ...
PYTHONPATH=src python run_test.py ...- NCU/PURL post-hoc runs assume a pretrained SupCon checkpoint via
--ckpt_path.
- Download VoxCeleb data from the official source: VoxCeleb download page.
- Convert source audio to the format expected by your experiments (commonly 16 kHz mono wav/flac).
- Create
spk2uttmapping files:
./scripts/make_spk2utt_and_utt2spk.sh /path/to/vox2_dev_wav/wav- Edit each config to set placeholders such as:
/path/to/vox2_dev_wav/wav/path/to/vox2_dev_wav/wav/spk2utt/path/to/vox1_test_wav/wav/path/to/voxceleb1_H.txt
- Ensure
spk2uttfiles are consistent with your data layout and path conventions.
SupCon (ECAPA):
PYTHONPATH=src python run_train.py --config configs/supcon.yamlSupCon (ResNet34):
PYTHONPATH=src python run_train.py --config configs/supcon_resnet34.yamlPURL post-hoc update (ECAPA, 30 epochs):
PYTHONPATH=src python run_train.py --config configs/ncu_30ep.yaml --ckpt_path /path/to/base_supcon.ckptPURL post-hoc update (ResNet34, 30 epochs):
PYTHONPATH=src python run_train.py --config configs/ncu_30ep_resnet34.yaml --ckpt_path /path/to/base_supcon_resnet34.ckptPYTHONPATH=src python run_test.py --config configs/ncu_30ep.yaml --ckpt_name epoch=XXX_step=YYYYor
PYTHONPATH=src python run_test.py --config configs/supcon.yaml --ckpt_name epoch=XXX_step=YYYY--ckpt_name should be the checkpoint filename stem under <save_dir>/checkpoints.
run_train.pysupports--ckpt_pathfor explicit resume.run_test.pyexpects--ckpt_nameand uses the checkpoint directory from logger config.- For smoke tests with
limit_test_batchesorfast_dev_run, only partial trial embeddings are computed. ncu_30ep*.yamlcurrently usesvoxceleb1_H-style placeholder for default test trials.
- Add final camera-ready paper link and BibTeX after decision/publication.
- Add exact benchmark scripts and standardized evaluation table templates for easier replication.
If you use this code, please cite the final paper once available.
Temporary reference:
PURL: Pairwise Unlearning with Reliability Learning for Noisy Correspondence in Supervised Contrastive Speaker Verification (Interspeech 2026 submission, under review)