Введение

Этот пост в блоге проведет вас через шаги по реализации однослойного персептрона для многоклассовой классификации и объяснит его происхождение. Однослойный персептрон — одна из самых простых архитектур нейронной сети, состоящая из входного и выходного слоев. Поэтому его можно использовать для различных задач классификации, в том числе мультиклассовой классификации.

Постановка проблемы

Для задачи мультиклассовой классификации у нас есть набор данных с 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 равно количество образцов.

Вычисление градиента

Чтобы минимизировать функцию потерь, мы вычисляем градиенты функции потерь по отношению к весам и смещениям, используя цепное правило. Градиенты относительно весов и смещений задаются следующим образом:

Обновить правило

Мы обновляем веса и смещения, используя вычисленные градиенты и скорость обучения (альфа) следующим образом:

Алгоритм обучения

Однослойный персептрон обучается с использованием итеративного процесса, в котором веса и смещения обновляются на каждой итерации с использованием градиентов, вычисленных из функции потерь. Процесс обучения можно представить в виде следующих этапов:

  1. Инициализируйте веса и смещения.
  2. Перебрать набор данных для предопределенного количества эпох:
  • Вычислите логиты (Z=X*W+b).
  • Примените функцию softmax к логитам.
  • Вычислите кросс-энтропийную потерю.
  • Вычислите градиенты относительно весов и смещений.
  • Обновите веса и смещения, используя вычисленные градиенты и скорость обучения.

Оценка модели

После обучения однослойного персептрона мы можем оценить его производительность на тестовом наборе данных, вычислив различные показатели, такие как точность, воспроизводимость и показатель F1. Чтобы делать прогнозы, мы применяем обученную модель к тестовому набору данных, вычисляем логиты, применяем функцию softmax для получения вероятностей классов и выбираем класс с наибольшей вероятностью в качестве прогнозируемого класса.

Реализация Matlab

Вот реализация MATLAB для полиномиальной классификации с однослойными персептронами на наборе данных Iris.

  1. Загрузите и предварительно обработайте набор данных 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-й эпохи, а также точность прогнозов. Полученный результат показан на изображениях ниже.

Вам может потребоваться разделить набор данных на обучающий и тестовый наборы и соответствующим образом предварительно обработать данные, если вы хотите оценить производительность на тестовом наборе.

Заключение

В этом сообщении блога мы обсудили шаги по реализации однослойного персептрона для многоклассовой классификации и объяснили его происхождение. Однослойный персептрон — это простая, но мощная архитектура нейронной сети, которую можно использовать для различных задач классификации. Понимая математическую формулировку, функцию потерь, вычисление градиента и правило обновления, мы можем эффективно обучить однослойный перцептрон классифицировать несколько классов в наборе данных. Хотя для сложных задач существуют более сложные архитектуры нейронных сетей, однослойный персептрон служит фундаментальным строительным блоком для понимания принципов нейронных сетей и их приложений в машинном обучении.