Снижение потерь в задаче многоклассовой классификации

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

Я читал статью, в которой теоретически показали существование модели нейронной сети, способной выполнять алгоритм, включающий выбор шаблонов с точностью 100%. Они предоставили точные матрицы, и я мог увидеть 100-процентную точность для тех же обучающих данных. Сейчас я пытаюсь обучить модель с рандомизированными начальными значениями, надеясь, что модель в итоге научится той же 100%-точной модели. У меня получается модель с точностью около 82%, когда я запускаю следующий набор кодов

model = Sequential([
    tf.keras.Input(shape=(4,)),

    Dense(4, activation='relu'),  
    Dense(2, activation='relu'),  
    Dense(2, activation='softmax')  
])

И вывод был следующим:

Epoch 91/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.4209 - sparse_categorical_accuracy: 0.8065 
Epoch 92/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3894 - sparse_categorical_accuracy: 0.8482 
Epoch 93/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 7ms/step - loss: 0.3852 - sparse_categorical_accuracy: 0.8515 
Epoch 94/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.4263 - sparse_categorical_accuracy: 0.8229 
Epoch 95/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - loss: 0.4020 - sparse_categorical_accuracy: 0.8354 
Epoch 96/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3967 - sparse_categorical_accuracy: 0.8351 
Epoch 97/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3993 - sparse_categorical_accuracy: 0.8252 
Epoch 98/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3597 - sparse_categorical_accuracy: 0.8517 
Epoch 99/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - loss: 0.3958 - sparse_categorical_accuracy: 0.8345 
Epoch 100/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 10ms/step - loss: 0.4269 - sparse_categorical_accuracy: 0.7941

Я заметил, что потеря не уменьшается постоянно, поэтому я применил L2-регуляризацию к каждому слою.

model = Sequential([
    tf.keras.Input(shape=(4,)),

    Dense(4, activation='relu', kernel_regularizer=l2(0.001)),  
    Dense(2, activation='relu', kernel_regularizer=l2(0.001)),  
    Dense(2, activation='softmax', kernel_regularizer=l2(0.001)) 
])

На этот раз вывод был следующим:

Epoch 91/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3859 - sparse_categorical_accuracy: 0.8427 
Epoch 92/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3554 - sparse_categorical_accuracy: 0.8550 
Epoch 93/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3770 - sparse_categorical_accuracy: 0.8610 
Epoch 94/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 7ms/step - loss: 0.3557 - sparse_categorical_accuracy: 0.8645 
Epoch 95/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - loss: 0.3908 - sparse_categorical_accuracy: 0.8495 
Epoch 96/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3769 - sparse_categorical_accuracy: 0.8543 
Epoch 97/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3862 - sparse_categorical_accuracy: 0.8434 
Epoch 98/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - loss: 0.3992 - sparse_categorical_accuracy: 0.8403 
Epoch 99/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - loss: 0.3781 - sparse_categorical_accuracy: 0.8513 
Epoch 100/100
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.4179 - sparse_categorical_accuracy: 0.8194 

Q1) Я не понимаю, почему регуляризация не сработала должным образом и потеря не уменьшается постоянно.

Q2) Также, я запутался в том, как улучшить точность, я пытался уменьшить скорость обучения с 0.01 до 0.001, 0.005, но не заметил никакого улучшения. После изменения скорости регуляризации я также не заметил никакого улучшения. Я увеличил количество эпох, и точность просто колеблется между 80-85%.

Еще одна вещь, которую я заметил: когда я инициализирую W, b с точными матрицами, которые давали 100% точности, модель после нескольких эпох все еще показывает около 85% точности. Код был следующим:

model = Sequential([
    tf.keras.Input(shape=(4,)),

    Dense(4, activation='relu',
          kernel_initializer=tf.keras.initializers.Constant(W1),
          bias_initializer=tf.keras.initializers.Zeros()),


    Dense(2, activation='relu',
          kernel_initializer=tf.keras.initializers.Constant(W2),
          bias_initializer=tf.keras.initializers.Zeros()
          ),

    Dense(2, activation='softmax',
          kernel_initializer=tf.keras.initializers.Constant(W3),
          bias_initializer=tf.keras.initializers.Zeros(),name="dense_2"),

])

Вывод первых нескольких эпох:

Epoch 1/50
16/16 ━━━━━━━━━━━━━━━━━━━━ 2s 7ms/step - loss: 0.6134 - sparse_categorical_accuracy: 0.8085
Epoch 2/50
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.5139 - sparse_categorical_accuracy: 0.7769 
Epoch 3/50
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.5149 - sparse_categorical_accuracy: 0.7807 
Epoch 4/50
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.4979 - sparse_categorical_accuracy: 0.7880 
Epoch 5/50
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - loss: 0.4758 - sparse_categorical_accuracy: 0.7929 
Epoch 6/50
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.4982 - sparse_categorical_accuracy: 0.7781 
Epoch 7/50
16/16 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.4932 - sparse_categorical_accuracy: 0.7806

Q3) Первая эпоха сама показывает 80.85% точности, когда trainable=”false”, эти же матрицы показали 100% точности. Почему я получаю такой вывод?

.

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

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

Теория

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

Q2: Как можно улучшить точность модели?
Множество факторов может влиять на точность модели, включая структуру сети, функцию активации, скорость обучения, начальную инициализацию, масштабы данных и многое другое. Однако основными моментами, которые стоит рассмотреть, могут быть:

  • Увеличение сложности модели через добавление дополнительных скрытых слоев или нейронов.
  • Изменение функции активации.
  • Использование заранее обученных весов для улучшения результата, если они известны.
  • Эксперименты с другими алгоритмами оптимизации, такими как Adam, RMSProp или другие.

Q3: Почему изменение trainable=false не приводит к ожидаемому результату?
Когда вы инициализируете веса известными матрицами и ставите trainable=false, вы говорите сети не обновлять веса в этих слоях. Это должно сохранить известное хорошее решение. Однако если такая конфигурация не дает 100% точности, возможно, другие части вашей модели (например, нормализация данных, потеряная функция и др.) не идеально соответствуют этой инициализации.

Пример

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

Применение

Для улучшения модели попробуйте следующие шаги:

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

  2. Использование правильных функций активации: Рекомендуется поэкспериментировать с различными функциями, такими как Leaky ReLU, ELU или даже более продвинутыми функциями, такими как SELU, в зависимости от свойств данных.

  3. Оптимизация гиперпараметров: Тщательное подбирание гиперпараметров вроде скорости обучения может иметь значительное влияние на производительность сети. Методика поиска сетки или байесовская оптимизация могут в этом помочь.

  4. Эффективное инициализирование весов: Правильная инициализация весов (например, Glorot или He) может помочь в быстрейшей сходимости градиентного спуска.

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

  6. Усовершенствованные техники регуляризации и дропаут: Хотя L2 не сработала, возможно, стоит экспериментировать с другими формами регуляризации, такими как Dropout или Batch Normalization.

  7. Более полный анализ данных: Проверьте наличие несбалансированности классов, ошибки или выбросы в данных, которые могут влиять на обучение модели.

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

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

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