Моя собственная нейронная сеть сходится, но модель Keras – нет.

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

В большинстве случаев все вероятно наоборот, но…

Я реализовал базовую структуру многослойного перцептрона с обратным распространением. Мои данные представляют собой просто смещенную квадратную функцию с 100 образцами. Я создал сеть для регрессии с 1 скрытым слоем из 10 нейронов с сигмоидной функцией активации и линейной на выходе. Мой алгоритм работает прекрасно, после достаточного количества эпох я получаю MSE около 10, что неплохо. С другой стороны, когда я пытаюсь обучить ту же модель с помощью keras, она просто не может опуститься ниже 1800 MSE – независимо от того, какие оптимизаторы, какую скорость обучения и сколько эпох я использую.

Это архитектура моей модели, которая супер простая:

model = Sequential([
    Dense(10, input_dim=1, activation='sigmoid'),
    Dense(1, activation='linear')
])
model.compile(optimizer="adam", loss="mean_squared_error")
model.fit(X_test, y_test, epochs=10000)

Я построил график предсказаний:
Синий – оригинальный тестовый набор, Зеленый – предсказания из моей пользовательской сети, Оранжевый – предсказания keras.

введите описание изображения здесь

Мой вопрос: что я делаю не так? Как возможно, что реализация НС из keras не может правильно подстраиваться под такую простую функцию?

** Когда я получаю веса из моей модели и устанавливаю их в модель Keras, она дает точно тот же вывод на тестовом наборе, так что моя архитектура (и реализация перцептрона) такая же, как и в Keras.

Правка:
Решение от @brewmaster321, к сожалению, не работает. Вот график потерь MSE за 10000 эпох:
введите описание изображения здесь

В данном случае, стандартная скорость обучения для оптимизатора adam в keras составляет 0.001, поэтому потребуется очень-очень много времени, чтобы сойтись. Если вы увеличите её следующим образом:

optimizer = keras.optimizers.Adam(learning_rate=0.1)
model.compile(optimizer=optimizer, loss="mean_squared_error")
model.fit(X, y, epochs=500 )

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

import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline

import tensorflow as tf

from tensorflow import keras
from tensorflow.keras import layers

print(tf.__version__)

# генерируем некоторые квадратные функции
np.random.seed(1337)
X = np.random.rand(100,1)*20 - 10
y = X*X
plt.plot(X, y, 'o')

X_train = X[:-20]
y_train = y[:-20]
X_test  = X[-20:]
y_test  = y[-20:]

from keras import Sequential
from keras.layers import Dense

model = Sequential([
    Dense(10, input_dim=1, activation='sigmoid'),
    Dense(1, activation='linear')
])
# обратите внимание: более высокая скорость обучения будет сходиться быстрее, меньшая скорость обучения будет сходиться лучше
optimizer = keras.optimizers.Adam(learning_rate=0.1)
model.compile(optimizer=optimizer, loss="mean_squared_error")
model.fit(X_train, y_train, epochs=500 )

y_pred = model(X_test)
plt.plot(X_test, y_pred, 'o')
plt.plot(X_test, y_test, 'o')

введите описание изображения здесь

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

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

1. Архитектура сети

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

  • Необходимость достаточной выразительной мощности: Заданная архитектура древовидной структуры может не всегда быть достаточной в зависимости от сложности функции.

2. Настройки оптимизатора

Вы упомянули, что используете оптимизатор Adam с его значением по умолчанию для скорости обучения, равным 0.001. Это может быть недостаточно, особенно для задач, когда нужно добиться быстрой сходимости. Увеличение скорости обучения действительно может привести к более быстрой сходимости:

optimizer = keras.optimizers.Adam(learning_rate=0.1)

Попробуйте увеличить скорость обучения до 0.1 или 0.01, чтобы увидеть, как это повлияет на обучение модели. Это может заметно улучшить результаты, особенно за малое количество эпох.

3. Подбор данных для обучения и тестирования

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

4. Эпохи обучения

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

5. Стандартизация данных

Качество входных данных может оказать значительное влияние на производительность модели. Если ваши данные (вход X) не были нормализованы, это может привести к проблемам с обучением, так как активации могут не находиться в рабочем диапазоне. Рассмотрите возможность стандартизации или нормализации ваших данных.

6. Визуализация результатов

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

Заключение

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

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

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

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