Multi-task learning (MTL) представляет собой методику машинного обучения, при которой одна модель одновременно обучается решать несколько связанных задач. В контексте ConvNetJS это достигается через совместное использование параметров нейронной сети и адаптацию функции потерь под несколько целей. Такой подход позволяет моделям извлекать более обобщённые представления из данных и улучшает производительность на каждой отдельной задаче за счёт регуляризации через совместное обучение.
В Multi-task learning архитектура сети обычно делится на общую базовую часть (shared layers) и специализированные ветви (task-specific branches):
Примерная структура сети может выглядеть следующим образом:
Вход → Conv → ReLU → Pool → Conv → ReLU → Pool → Shared FC
├→ Task 1 FC → Output 1
└→ Task 2 FC → Output 2
ConvNetJS предоставляет гибкий интерфейс для создания и обучения многозадачных моделей. Важные шаги:
var layer_defs = [];
// Общие слои
layer_defs.push({type:'input', out_sx:32, out_sy:32, out_depth:3});
layer_defs.push({type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'conv', sx:5, filters:20, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'fc', num_neurons:100, activation:'relu'});
// Ветвь для Task 1
layer_defs.push({type:'fc', num_neurons:50, activation:'relu', task:'task1'});
layer_defs.push({type:'softmax', num_classes:10, task:'task1'});
// Ветвь для Task 2
layer_defs.push({type:'fc', num_neurons:50, activation:'relu', task:'task2'});
layer_defs.push({type:'softmax', num_classes:5, task:'task2'});
var net = new convnetjs.Net();
net.makeLayers(layer_defs);
var trainer = new convnetjs.Trainer(net, {
learning_rate: 0.01,
momentum: 0.9,
batch_size: 64,
l2_decay: 0.001
});
Для обучения модели с несколькими задачами требуется комбинировать функции потерь. Наиболее распространённый подход — взвешенная сумма потерь по каждой задаче:
[ _{total} = _1 + _2 + ]
В ConvNetJS это реализуется через передачу соответствующих меток для каждой задачи и вычисление градиентов отдельно для каждой ветви:
var loss_task1 = trainer.train(x, y_task1);
var loss_task2 = trainer.train(x, y_task2);
var total_loss = alpha * loss_task1 + beta * loss_task2;
Где alpha и beta — коэффициенты,
регулирующие значимость каждой задачи.
В ConvNetJS MTL особенно полезен при работе с:
ConvNetJS поддерживает визуализацию градиентов и активаций, что особенно важно для MTL:
var layer_activation = net.forward(x);
console.log(layer_activation);
Визуализация позволяет понять, какие признаки общие для задач, а какие уникальны для каждой ветви.
Multi-task learning в ConvNetJS обеспечивает мощный инструмент для создания гибких моделей, способных одновременно решать несколько задач, повышая эффективность обучения и качество предсказаний за счёт использования общих признаков.