Cходимость (конвергенция) — это точка обучения модели, после которой изменения в Скорости обучения (Learning Rate) становятся ниже, а Ошибки (Error) – разность между предсказанным и реальным значениями, сводятся к минимуму:
Скорость обучения — это гиперпараметр, который определяет, насколько сильно следует изменять модель в ответ на предполагаемую ошибку при каждом обновлении модели.
Противоположным сходимости явлением называют Несходимость (Divergence) – ситуация, при которой ошибка не стремится к минимуму при уменьшении скорости обучения.
Конвергенция может быть двух типов: глобальная или локальная, и она должна происходить с нисходящей тенденцией. Однако в различных процедурах моделирования очень редко можно увидеть, что модель сходится очень строго.
Если мы говорим, что потеря равна нулю, то ряд, который мы называем сходящимся, является бесконечным:
Потеря, равная нулю, — это идеальное условие, которого нельзя достичь, однако после сходимости скорость обучения может продолжать уменьшаться.
Изображение выше – пример сходимости: обучение модели после двадцатой итерации становится сходящимся, а ошибки после этой итерации уменьшаются и держатся в меньшем диапазоне.
Сходимость важна, поскольку характеризует успешность обучения
Проще говоря, мы можем думать о сбое конвергенции как о состоянии, при котором мы не можем найти точку конвергенции на кривой обучения нейронной сети. Это прямо означает, что на кривой нет такой точки, которую можно было бы представить как начальную точку снижения и уменьшения ошибки. Мы можем понять сбой в конвергенции, взглянув на изображение ниже.
На приведенном выше изображении мы видим, что ошибки уменьшаются по мере увеличения количества итераций, но мы не можем сказать, с какой точки ошибка изменяется в меньшем диапазоне. В такой ситуации можно сказать, что нейронная сеть не сошлась. Давайте посмотрим, почему это происходит.
Давайте посмотрим сходимость на примере Линейной регрессии (Linear Regression) библиотеки scikit-learn. Для начала импортируем необходимые библиотеки:
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
Сгенерируем игрушечный набор данных, состоящий из 75 Наблюдений (Observation) – строк в Тренировочных данных (Train Data), 150 строк в Тестовых (Test Data) и 500 Признаках (Feature) – столбцах. Среди прочих настроек заметим, что перемешивания shuffle
нет, шум есть (noise=1.0
). Переменная coef
означает Параметр регуляризации С (C Regularization Parameter), это своеобразная мера наказания модели за неверное предсказание. coef
напрямую влияет на сходимость модели.
n_samples_train, n_samples_test, n_features = 75, 150, 500
X, y, coef = make_regression(
n_samples=n_samples_train + n_samples_test,
n_features=n_features,
n_informative=50,
shuffle=False,
noise=1.0,
coef=True,
)
Разделим датасет на тренировочную и тестовую части в соотношениие 75:150:
X_train, X_test, y_train, y_test = train_test_split(
X, y, train_size=n_samples_train, test_size=n_samples_test, shuffle=False
)
Инициируем модель линейной регрессии linear_model.ElasticNet
и позволим ей до 10 тысяч итераций. Scikit-learn также позволяет рассчитать оптимальный параметр регуляризации:
alphas = np.logspace(-5, 1, 60)
enet = linear_model.ElasticNet(l1_ratio=0.7, max_iter=10000)
train_errors = list()
test_errors = list()
for alpha in alphas:
enet.set_params(alpha=alpha)
enet.fit(X_train, y_train)
train_errors.append(enet.score(X_train, y_train))
test_errors.append(enet.score(X_test, y_test))
i_alpha_optim = np.argmax(test_errors)
alpha_optim = alphas[i_alpha_optim]
print("Оптимальный параметр регуляризации: %s" % alpha_optim)
enet.set_params(alpha=alpha_optim)
coef_ = enet.fit(X, y).coef_
В данном случае, C-параметр равен:
Оптимальный параметр регуляризации: 0.000335292414924956
Построим график, чтобы оценить, достигла ли модель состояния сходимости:
plt.figure(figsize=(20,6))
plt.subplot(2, 1, 1)
plt.semilogx(alphas, train_errors, label="Тренировочные данные")
plt.semilogx(alphas, test_errors, label="Тестовые данные")
plt.vlines(
alpha_optim,
plt.ylim()[0],
np.max(test_errors),
color="k",
linewidth=3,
label="Точка оптимума (тест)",
)
plt.legend(loc="upper right")
plt.ylim([0, 1.2])
plt.xlabel("Параметр регуляризации")
plt.ylabel("Производительность")
plt.show()
На графике мы видим, то по достижении точки Оптимума (Optimum) – локального максимума модель резко начинает сокращать свои ошибки, ибо была "наказана" более всего. На значении коэффициента регуляризации 10-3, то есть 0.000335292414924956
наступила ранняя сходимость, которая повторится на значении coef
более 101.
Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.
Автор оригинальной статьи: Yugesh Verma, scikit-learn.org
Подари чашку кофе дата-сайентисту ↑
© Лена Капаца. Все права защищены.