Введение
Этот пост в блоге проведет вас через шаги по реализации однослойного персептрона для многоклассовой классификации и объяснит его происхождение. Однослойный персептрон — одна из самых простых архитектур нейронной сети, состоящая из входного и выходного слоев. Поэтому его можно использовать для различных задач классификации, в том числе мультиклассовой классификации.
Постановка проблемы
Для задачи мультиклассовой классификации у нас есть набор данных с n
входными образцами, каждый из которых имеет d
признаков и всего c
классов. Мы стремимся изучить отображение входных функций на метки классов с использованием однослойного персептрона.
Однослойная архитектура персептрона
Однослойный персептрон состоит из входного слоя, соединенного с выходным слоем. Для задачи мультиклассовой классификации выходной слой содержит c
нейрона, по одному на каждый класс. Входные признаки умножаются на веса и добавляются к смещению для получения логитов. Затем к логитам применяется функция softmax для получения вероятностей классов.
Математическая формулировка
Обозначим матрицу входных признаков как X
(форма: nxd), матрицу весов как W
(форма: d x c) и матрицу смещения как b
(форма: 1 x c), где n
— количество выборок, d
— количество признаков. , а c
— количество классов. Логиты задаются Z=X*W+b
, а функция softmax применяется к логитам для получения вероятностей класса.
Функция потерь
Чтобы обучить однослойный персептрон, нам нужно минимизировать функцию потерь, которая измеряет разницу между предсказанными вероятностями класса и истинными метками класса. Для мультиклассовой классификации мы обычно используем функцию кросс-энтропийных потерь, определяемую как:
где Y_k,j — бинарный показатель (0 или 1), если k-я выборка принадлежит j-му классу, S_k,j — вероятность принадлежности k-й выборки j-му классу, а n равно количество образцов.
Вычисление градиента
Чтобы минимизировать функцию потерь, мы вычисляем градиенты функции потерь по отношению к весам и смещениям, используя цепное правило. Градиенты относительно весов и смещений задаются следующим образом:
Обновить правило
Мы обновляем веса и смещения, используя вычисленные градиенты и скорость обучения (альфа) следующим образом:
Алгоритм обучения
Однослойный персептрон обучается с использованием итеративного процесса, в котором веса и смещения обновляются на каждой итерации с использованием градиентов, вычисленных из функции потерь. Процесс обучения можно представить в виде следующих этапов:
- Инициализируйте веса и смещения.
- Перебрать набор данных для предопределенного количества эпох:
- Вычислите логиты (
Z=X*W+b
). - Примените функцию softmax к логитам.
- Вычислите кросс-энтропийную потерю.
- Вычислите градиенты относительно весов и смещений.
- Обновите веса и смещения, используя вычисленные градиенты и скорость обучения.
Оценка модели
После обучения однослойного персептрона мы можем оценить его производительность на тестовом наборе данных, вычислив различные показатели, такие как точность, воспроизводимость и показатель F1. Чтобы делать прогнозы, мы применяем обученную модель к тестовому набору данных, вычисляем логиты, применяем функцию softmax для получения вероятностей классов и выбираем класс с наибольшей вероятностью в качестве прогнозируемого класса.
Реализация Matlab
Вот реализация MATLAB для полиномиальной классификации с однослойными персептронами на наборе данных Iris.
- Загрузите и предварительно обработайте набор данных Iris:
load fisheriris.mat X = meas; y = grp2idx(species); % Normalize the features X = (X - mean(X)) ./ std(X); % One-hot encoding of the labels Y = ind2vec(y')';
2. Инициализируйте веса и смещения:
n_features = size(X, 2); n_classes = length(unique(y)); W = randn(n_features, n_classes); b = randn(1, n_classes);
3. Установите параметры обучения:
learning_rate = 0.01; num_epochs = 5000;
4. Определите функции softmax и cross-entropy:
softmax = @(z) exp(z) ./ sum(exp(z), 2); cross_entropy_loss = @(y_true, y_pred) -mean(sum(y_true .* log(y_pred), 2));
5. Обучите однослойный персептрон с помощью градиентного спуска:
for epoch = 1:num_epochs % Forward pass Z = X * W + b; S = softmax(Z); % Compute the loss loss = cross_entropy_loss(Y, S); if mod(epoch, 500) == 0 fprintf('Epoch %d, Loss: %.4f\n', epoch, full(loss)); end % Compute the gradients dL_dZ = S - Y; dL_dW = (X' * dL_dZ) / size(X, 1); dL_db = mean(dL_dZ, 1); % Update the weights and biases W = W - learning_rate * dL_dW; b = b - learning_rate * dL_db; end
6. Оцените обученную модель:
[~, y_pred] = max(S, [], 2); accuracy = sum(y_pred == y) / numel(y); fprintf('Training set accuracy: %.2f%%\n', accuracy * 100);
Когда вы установите количество эпох равным 5000 и запустите предоставленный код, программа будет отображать потери для каждой 500-й эпохи, а также точность прогнозов. Полученный результат показан на изображениях ниже.
Вам может потребоваться разделить набор данных на обучающий и тестовый наборы и соответствующим образом предварительно обработать данные, если вы хотите оценить производительность на тестовом наборе.
Заключение
В этом сообщении блога мы обсудили шаги по реализации однослойного персептрона для многоклассовой классификации и объяснили его происхождение. Однослойный персептрон — это простая, но мощная архитектура нейронной сети, которую можно использовать для различных задач классификации. Понимая математическую формулировку, функцию потерь, вычисление градиента и правило обновления, мы можем эффективно обучить однослойный перцептрон классифицировать несколько классов в наборе данных. Хотя для сложных задач существуют более сложные архитектуры нейронных сетей, однослойный персептрон служит фундаментальным строительным блоком для понимания принципов нейронных сетей и их приложений в машинном обучении.