Multi-task fine-tuning trains one model on several related tasks at the same time. A shared backbone learns reusable language patterns; the tasks can support each other instead of fighting in separate silos.
Example for a support assistant: train intent classification, slot filling, and FAQ matching together. All three need similar customer-language understanding, so sharing a backbone often helps.
Here is what those three related tasks look like on one customer message:
Message: "My card was charged twice for order 5567 on Monday."
Intent classification -> billing_dispute
Slot filling -> {order_id: 5567, issue: duplicate_charge, date: Monday}
FAQ matching -> "What to do about duplicate charges"
All three need the model to understand the same sentence. Training them together means that understanding is learned once and reused three times.
| Prefer multi-task when… | Be careful when… |
|---|---|
| Tasks are clearly related | Tasks pull the model in opposite directions |
| You want shared language features | One task dominates the data mix |
| Labels exist for each task | You have no way to balance sampling |
Imagine this data mix:
| Task | Examples | Share of training |
|---|---|---|
| Intent classification | 90,000 | 90% |
| Slot filling | 8,000 | 8% |
| FAQ matching | 2,000 | 2% |
The model quickly learns that getting intent right pays off far more than anything else, so it optimises for intent and lets FAQ matching drift. The average score still looks respectable — which is exactly the trap.
A common fix is to sample rather than simply concatenate: draw roughly equal numbers of examples from each task per batch, even when the underlying datasets are very different sizes.
Watching per-task scores makes the problem visible immediately:
Epoch 3
intent_accuracy 0.94 (up)
slot_f1 0.81 (flat)
faq_accuracy 0.42 (down) <- this task is being crushed
Multi-task fine-tuning shares one backbone across related tasks so they can borrow useful features from each other.