Вопрос или проблема
Я читал статью, в которой теоретически показали существование модели нейронной сети, способной выполнять алгоритм, включающий выбор шаблонов с точностью 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% точности, возможно, другие части вашей модели (например, нормализация данных, потеряная функция и др.) не идеально соответствуют этой инициализации.
Пример
Вы предоставили код, который жалуется на непоследовательные потери и точность на протяжении обучения. Это может свидетельствовать о нескольких проблемах, таких как невозрастающая сложность сети, несоответствующие функции активации или неоптимальный алгоритм оптимизации, не способный эффективно обновлять веса.
Применение
Для улучшения модели попробуйте следующие шаги:
-
Переосмысление архитектуры модели: Увеличьте количество слоев и нейронов в сети, чтобы повысить возможности выражения модели. Однако, не забывайте, что слишком сложная модель может переобучиться.
-
Использование правильных функций активации: Рекомендуется поэкспериментировать с различными функциями, такими как Leaky ReLU, ELU или даже более продвинутыми функциями, такими как SELU, в зависимости от свойств данных.
-
Оптимизация гиперпараметров: Тщательное подбирание гиперпараметров вроде скорости обучения может иметь значительное влияние на производительность сети. Методика поиска сетки или байесовская оптимизация могут в этом помочь.
-
Эффективное инициализирование весов: Правильная инициализация весов (например, Glorot или He) может помочь в быстрейшей сходимости градиентного спуска.
-
Мониторинг и вывод графиков метрик обучения: Построение графиков потерь и точности на протяжении обучения может дать ценную информацию о процессе сходимости и указать на проблемы, такие как переобучение или недообучение.
-
Усовершенствованные техники регуляризации и дропаут: Хотя L2 не сработала, возможно, стоит экспериментировать с другими формами регуляризации, такими как Dropout или Batch Normalization.
-
Более полный анализ данных: Проверьте наличие несбалансированности классов, ошибки или выбросы в данных, которые могут влиять на обучение модели.
В конечном счете, вы должны рассмотреть ваш подход к подбору гиперпараметров и исследования различных конфигураций модели, чтобы добиться лучшей производительности и доверия к вашей многоклассовой классификационной модели.