ReLU (Rectified Linear Unit) — это одна из наиболее популярных активационных функций в современных сверточных нейронных сетях. В ConvNetJS она реализована с высокой оптимизацией и предназначена для ускорения обучения глубоких сетей за счет устранения проблемы затухающего градиента, характерной для сигмоидных и тангенсоидных функций.
Функция ReLU задается формулой:
[ f(x) = (0, x)]
То есть на отрицательных значениях она возвращает 0, а на положительных — само значение. Этот простой нелинейный переход обеспечивает несколько важных эффектов:
ConvNetJS предоставляет класс ReLU для использования в
качестве слоя активации. Основной конструктор слоя:
var layer = new convnetjs.ReLULayer({
num_neurons: 100, // количество нейронов в слое
bias_pref: 0.0 // начальное значение смещения
});
num_neurons определяет размер выходного тензора.bias_pref задает начальное смещение для каждого
нейрона. В ConvNetJS оно используется для ускорения обучения путем
небольшого положительного смещения, предотвращающего нулевые
градиенты.Прямое распространение (forward pass) через ReLU вычисляется просто:
layer.forward = function(V) {
var A = new convnetjs.Vol(V.sx, V.sy, V.depth, 0.0);
for(var i=0;i<V.w.length;i++) {
A.w[i] = Math.max(0,V.w[i] + this.bias);
}
this.out_act = A;
this.in_act = V;
return this.out_act;
}
Ключевые моменты:
A того же размера, что и
вход V.max(0, x + bias).Обратное распространение (backpropagation) для ReLU очень простое, поскольку градиент равен 1 для положительных значений и 0 для отрицательных:
layer.backward = function() {
var V = this.in_act;
V.dw = new Float32Array(V.w.length);
for(var i=0;i<V.w.length;i++) {
V.dw[i] = V.w[i] > 0 ? this.out_act.dw[i] : 0.0;
}
}
Особенности:
ReLU может использоваться как после полносвязных слоев
(FullyConnLayer), так и после сверточных слоев
(ConvLayer). Пример конфигурации сети:
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:'softmax', num_classes:10});
conv с активацией relu обеспечивают
нелинейность и ускоряют обучение.pool) уменьшает размерность
признаков, сохраняя ключевую информацию.bias_pref),
чтобы избежать “мертвых” нейронов.Важный аспект изучения ReLU — визуализировать активации. В ConvNetJS
активации можно получить через layer.out_act.w после
прямого распространения. Типичный паттерн:
ReLU является стандартным инструментом при построении глубоких нейронных сетей в ConvNetJS. Простая реализация, легкая обратная связь и ускорение сходимости делают её основным выбором для большинства задач распознавания изображений и классификации. Комбинация с другими слоями, правильная инициализация и внимательное наблюдение за активными нейронами позволяют добиться стабильного и эффективного обучения.