Кривая потерь теста глубокого обучения не снижается.

Вопрос или проблема

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

Текущая модель, которую я имею, использует только CNN, но я планирую расширить её с помощью LSTM или других моделей в будущем. Вот код для моей модели.

model = Sequential([
    Input(batch_input_shape = (None, 1036, 1)),

    Conv1D(
        filters=32,
        kernel_size=3,
        padding='same',
        activation='relu',
        activity_regularizer=l2(5e-4),
    ),
    Conv1D(
        filters=16,
        kernel_size=3,
        padding='same',
        activation='relu',
        activity_regularizer=l2(5e-4),
    ),
    MaxPooling1D(),
    
    Conv1D(
        filters=8,
        kernel_size=3,
        padding='same',
        activation='relu',
        activity_regularizer=l2(5e-4),
    ),
    Conv1D(
        filters=8,
        kernel_size=3,
        padding='same',
        activation='relu',
        activity_regularizer=l2(5e-4),
    ),
    MaxPooling1D(),
    Flatten(),

    Dense(10, activation='relu'),
    Dropout(0.25),
    Dense(1, activation='sigmoid'),
])

model.compile(
    # optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),
    loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
    metrics=[f1_m,precision_m, recall_m, matthews_correlation, 'accuracy', fpr_m]
)

После обучения модели в течение 100 эпох кривая потерь выглядит так
введите описание изображения здесь

Я пробовал несколько вещей, а именно:

  • Уменьшение размера сети. Это все равно приводит к той же проблеме, но в другой точке в сети.
  • Уменьшение скорости обучения оптимизатора. То же самое, что и в предыдущем пункте. Это, похоже, работает, но на самом деле изменяет, когда это происходит.

Я открыт для любых предложений или рекомендаций, которые я мог бы получить о том, как сделать кривую тестирования более похожей на кривую обучения. Я должен отметить, что мой набор данных несбалансирован, и я ТОЛЬКО балансирую x_train и y_train с помощью SMOTE и не проводя балансировку для тестовых и валидационных наборов данных, чтобы сохранить данные как можно более чистыми.

Ваши кривые обучения предполагают переобучение.

В этом отношении вам стоит попробовать

  • увеличить уровень dropout
  • отрегулировать регуляризацию l1/l2 до более высоких уровней
  • проверить соотношение классов в обучающих и валидационных тестах (“обучение на простом, предсказание на трудном” несбалансированности)

Кроме того, вам может понадобиться

  • добавить слой batchnorm
  • попробовать разные активации
  • проверить, в какой степени веса/смещения каждого слоя обновляются во время итераций обучения, в случае исчезающих/взрывных градиентов

Ответ или решение

Почему кривая потерь в глубоких обучениях не уменьшается?

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

1. Признаки переобучения

Анализ ваших кривых потерь указывает на возможность переобучения модели. Это часто происходит, когда модель слишком сложна для данных, что приводит к хорошей работе на обучающем наборе и плохой — на проверочном. Чтобы смягчить проблему переобучения, вы можете рассмотреть следующие стратегии:

  • Увеличьте уровень дропаута: На данный момент у вас установлен дроп-аут на уровне 0.25. Попробуйте увеличить это значение, например, до 0.5. Это может помочь модели избежать переобучения, не запоминая шум в данных.

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

  • Баланс классов: Выясните, действительно ли сбалансированы ваши классы в обучающем наборе данных. Неправильная пропорция классов может затруднить обучение модели. Возможно, вам следует попробовать метод SMOTE для проверки валидности классов, чтобы убедиться, что трудные примеры не игнорируются.

2. Изменения в архитектуре модели

Ваши текущие слои свертки и последний Dense-слой могут быть недостаточно универсальными для капитального изменения сложных паттернов временных рядов. Постарайтесь включить:

  • Слои нормализации по пакетам (Batch Normalization): Это может помочь стабилизировать обучение и ускорить его.

  • Пробуйте различные функции активации: Вы используете функцию ReLU, попробуйте другие функции, такие как Leaky ReLU или ELU, чтобы улучшить выступление модели.

  • Сложные архитектуры: Попробуйте объединить CNN с LSTM или GRU. Эти модели хорошо подходят для обработки временных рядов и могут добавить временные зависимости, которые важны для вашей задачи.

3. Тонкая настройка параметров обучения

Так как вы уже изменили скорость обучения, убедитесь, что вы используете оптимизатор, который может адаптивно менять скорость обучения, например, Adam или RMSprop. Эти оптимизаторы могут дать лучшее поведение на тренировочных данных и плавнее регулировать параметры.

  • Снижение скорости обучения: Используйте "EarlyStopping" и "ReduceLROnPlateau" для отслеживания кривых потерь и динамической коррекции скорости обучения.

4. Проверка градиентов

Не забывайте проверять насколько сильно обновляются веса и смещения на каждом этапе обучения. Если вы имеете проблему взрыва или убывания градиентов, возможно, это причина, из-за которой кривая потерь не уменьшается.

Заключение

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

Обратите внимание на предложенные стратегии и адаптируйте их под свои нужды, чтобы улучшить производительность модели и успешность ее обучения.

Оцените материал
Добавить комментарий

Капча загружается...