Тренировка 3 моделей в разном порядке дала разные результаты.

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

У меня есть следующий цикл для обучения некоторых моделей на временном ряде.

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, что само по себе является шагом для обеспечения чистоты среды обучения перед началом нового цикла тренировки.

Применение: Вот некоторые рекомендации для выявления и устранения проблемы:

  1. Изоляция среды: Убедитесь, что код действительно создает новую и чистую сессию перед началом обучения каждой новой модели. Использование tf.compat.v1.reset_default_graph() и tf.keras.backend.clear_session() является хорошей практикой, но также следует рассмотреть возможность использования виртуальных сред или контейнеров (например, Docker) для дополнительной изоляции среды.

  2. Установка случайных начальных условий: Необходимо пересматривать установку всех случайных семян в коде, как на уровне Python и NumPy, так и на уровне TensorFlow, чтобы гарантировать согласованность. Вы уже применяете это в вашем коде, но обратите внимание на то, какие именно настройки эти функции фактически контролируют.

  3. Аппаратные особенности: При использовании графического процессора (GPU) возможно возникновение недетерминированных артефактов, связанных с параллельной обработкой данных. Убедитесь, что ваш код работает в контролируемой среде и с включенной функцией tf.config.experimental.enable_op_determinism(), чтобы ограничить такие артефакты.

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

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

  6. Проверка начальной загрузки данных: Проверьте, что данные загружаются в модели одинаково в обеих тренировочных стратегиях. Даже минимальные различия в разметке данных могут дать разные результаты.

Заключение: Воспроизводимость результатов в машинном обучении — это важное и нередко сложное для достижения свойство. Многообразие вовлеченных факторов требует комплексного подхода и тщательного контроля всех переменных и внешних элементов. Используйте приведенные рекомендации и внимательно изучите технические детали работы с TensorFlow и Keras для минимизации недетерминированных аспектов моделирования.

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

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