Вопрос или проблема
У меня есть следующий цикл для обучения некоторых моделей на временном ряде.
my_seed = 7
time_frames = [4,5]
layers = [3,4,5]
----- базовое форматирование данных, всегда выдает один и тот же результат -------
x1 = numpy.concatenate((x1,x2), axis=0)
y1 = numpy.concatenate((y1,y2), axis=0)
for l in layers:
if (w, l) in trained_models_list:
print("Модель " + str(w) + "." + str(l) + " уже обучена!")
else:
print("Обучение -------> окно: ",w, l)
----- сбрасываем всё? -----
tf.compat.v1.reset_default_graph()
tf.keras.backend.clear_session()
tf.config.experimental.enable_op_determinism()
----- сбрасываем сиды -----
os.environ['PYTHONHASHSEED'] = str(my_seed)
numpy.random.seed(my_seed)
tf.random.set_seed(my_seed)
tf.experimental.numpy.random.seed(my_seed)
model = keras.Sequential()
model.add(keras.layers.GRU(units=int(x1.shape[2] * w * (l / (l+1))), activation='tanh', input_shape=(x1.shape[1], x1.shape[2]), return_sequences=True, kernel_initializer=my_kernel_initializer(seed=my_seed), kernel_constraint=MaxNorm(3)))
added_dropout = False
for i in reversed(range(2, l)):
model.add(keras.layers.GRU(units=int(x1.shape[2] * w * (i / l)), activation='tanh', return_sequences=True, kernel_initializer=my_kernel_initializer(seed=my_seed), kernel_constraint=MaxNorm(3)))
if added_dropout == True:
model.add(keras.layers.Dropout(0.1))
added_dropout = False
model.add(keras.layers.GRU(units=int(x1.shape[2] * w * (1 / l)), activation='tanh', return_sequences=False, kernel_initializer=my_kernel_initializer(seed=my_seed)))
model.add(keras.layers.Dense(units=1, activation='linear', kernel_initializer=my_kernel_initializer(seed=my_seed)))
optimizerr = tf.keras.optimizers.Adam(learning_rate=0.001)
model.compile(loss=["mae"], metrics=[tf.keras.metrics.RootMeanSquaredError()], optimizer=optimizerr)
model.summary()
train_dataset = tf.data.Dataset.from_tensor_slices((x1, y1))
val_dataset = tf.data.Dataset.from_tensor_slices((X_val, Y_val))
test_dataset = tf.data.Dataset.from_tensor_slices((X_test, X_test))
train_dataset = train_dataset.batch(my_batch_size)
val_dataset = val_dataset.batch(my_batch_size)
test_dataset = test_dataset.batch(my_batch_size)
history = model.fit(
train_dataset,
epochs=my_epch,
validation_data=val_dataset,
verbose=2
)
path = "xxxx"
model.save(path)
print("СОХРАНЕНО!\n")
Обучение моделей в порядке (окно, слои): (4,3)->(4,4)->(4,5)
Дает разные результаты при обучении по сравнению с (4,5)->(4,4)->(4,3)
Но обучение в одном и том же порядке всегда даст одинаковые результаты. Может ли это быть связано с тем, что слои GRU используют какую-то общую непрерывную зону памяти? поскольку обучение в разных сессиях дает разные результаты?
Данные форматируются на основе размера окна, и проблема возникает в пределах одного и того же размера окна, например, 4
Если вы могли бы мне помочь, я был бы очень благодарен!
Ответ или решение
Теория: В машинном обучении, особенно при работе с глубокими нейронными сетями, такими как рекуррентные слои GRU, существует множество факторов, влияющих на воспроизводимость модели и итоговые результаты. На практике, даже при установленных одинаковых начальных настройках, таких как фиксированные случайные семена (seeds) и определенные гиперпараметры, возможны отклонения в результатах, связанные с поведением сепарабельных компонентов системы. Эти компоненты включают в себя начальные условия и переменные, связанные с аппаратным обеспечением, такими как графический процессор, аллокация памяти и внутрипроцессные оптимизации.
Пример: Вы сталкиваетесь с проблемой, при которой обучение моделей в порядке (окно, уровень): (4,3)→(4,4)→(4,5) дает другие результаты в сравнении с (4,5)→(4,4)→(4,3), несмотря на идентичные условия и гиперпараметры. Одна из возможных причин заключается в том, что процессы, задействованные в обучении моделей, используют части памяти, которые могут оставлять остаточные эффекты, влияющие на производительность последующей модели в очереди. В описанном коде вы заметили, что включены функции для сброса графа TensorFlow и очистки сессии Keras, что само по себе является шагом для обеспечения чистоты среды обучения перед началом нового цикла тренировки.
Применение: Вот некоторые рекомендации для выявления и устранения проблемы:
-
Изоляция среды: Убедитесь, что код действительно создает новую и чистую сессию перед началом обучения каждой новой модели. Использование tf.compat.v1.reset_default_graph() и tf.keras.backend.clear_session() является хорошей практикой, но также следует рассмотреть возможность использования виртуальных сред или контейнеров (например, Docker) для дополнительной изоляции среды.
-
Установка случайных начальных условий: Необходимо пересматривать установку всех случайных семян в коде, как на уровне Python и NumPy, так и на уровне TensorFlow, чтобы гарантировать согласованность. Вы уже применяете это в вашем коде, но обратите внимание на то, какие именно настройки эти функции фактически контролируют.
-
Аппаратные особенности: При использовании графического процессора (GPU) возможно возникновение недетерминированных артефактов, связанных с параллельной обработкой данных. Убедитесь, что ваш код работает в контролируемой среде и с включенной функцией tf.config.experimental.enable_op_determinism(), чтобы ограничить такие артефакты.
-
Идентификация дополнительных зависимостей: Изучите тщательно все внешние библиотеки и их версии, которые задействованы в проекте. Даже незначительные обновления или изменения могут привести к различиям в результатах.
-
Отзывы и журналирование: Введите расширенное журналирование для сбора разнообразных метрик и характеристик при каждом выполнении обучения. Использование специализированных инструментов для мониторинга, таких как TensorBoard, может помочь понимать более детально, какие конкретно изменения происходят в процессе тренировки.
-
Проверка начальной загрузки данных: Проверьте, что данные загружаются в модели одинаково в обеих тренировочных стратегиях. Даже минимальные различия в разметке данных могут дать разные результаты.
Заключение: Воспроизводимость результатов в машинном обучении — это важное и нередко сложное для достижения свойство. Многообразие вовлеченных факторов требует комплексного подхода и тщательного контроля всех переменных и внешних элементов. Используйте приведенные рекомендации и внимательно изучите технические детали работы с TensorFlow и Keras для минимизации недетерминированных аспектов моделирования.