Комментарии 13
Это потому что стартовая инициализация весов — случайный шум.
Хотите больше стабильности, подготовьте хотя бы часть стартовых слоев каким-либо другим способом, более простым, например обучив нейронную сеть 'бутылочное горлышко', у которой на входы и выходы подается одни и те же входные данные из исходного датасета (без выходных) а размерность центрального слоя значительно ниже входного.
Такая сеть ищет закономерности, пытаясь ужать исходные данные до маленького вектора. Такая сеть может быть значительно меньше целевой, ведь ее задача фактически только поиск классификатора. Так же в такую сеть можно подавать не размеченные данные, это дешевле и данных больше — больше информации о целевой области.
Вывод в целом на практике известный, описание неплохое. Можно бы было добавить статистическое сравнение разных групп запусков, чтобы понимать, что наблюдаемое снижение точности при увеличении кол-ва нейронов в данном случае это не случайность, а результат оверфита.
Но для полной задокументированности эксперимента было бы неплохо добавить репозиторий с кодом, т.к. из описания не понятно, использовались ли LR scheduler, нормалицазии, регуляризации, аугментации и т.п.
Спасибо за комментарий )
"использовались ли LR scheduler, нормалицазии, регуляризации, аугментации и т.п."
Нет, не использовались.
Специально все применялось самое распространенное или по умолчанию для понимания изначальной ситуации
def main_function(batchsize, epochs):
input_shape = x_train[0].shape
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=input_shape))
model.add(tf.keras.layers.Dense(NEURONS, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
history = model.fit(x_train, y_train, batch_size=batchsize, epochs=epochs, validation_split=0.2, verbose = 0)
res = model.evaluate(x_test, y_test, verbose=0)
return res
И вот эта функция вызывалась из нескольких вложенных циклов по количеству повторов, размеру батча, количеству нейронов.
В таком случае в первую очередь стоит обратить внимание на недетерминированные части кода. Например оптимизатор Adam является стохастическим, из-за него такие различия будут проявляться (а может быть есть что-то ещё, например порядок загрузки тренировочных примеров в модель, он тоже влияет на результат). Смотрите в эту сторону, поинтересуйтесь способами сделать воспроизводимые эксперименты, как минимум попробуйте зёрна генерации зафиксировать перед тем, как инициализируете модель и создаёте наборы данных, и посмотрите, что получится. Сам факт того, что от стохастичности зависит результат, не особо нов, а вот какие-нибудь выводы из экспериментов, практические рекомендации и т.п. были бы уже интересными.
Вариативность идёт из-за того, что у вас происходит рандомизация обучающей выборки и каждый раз, когда вы обучаете новую модель, примеры для обучения поступают на вход в другом порядке из-за чего и меняется результат обучения.
Для того, чтобы убрать вариативность можно воспользоваться следующей функцией:
https://www.tensorflow.org/api_docs/python/tf/config/experimental/enable_op_determinism
Это экспериментальная функция, которую добавили недавно. Она позволяет добиться повторяемости результатов из обучения в обучения, что позволяет более корректно сравнивать модели с разными параметрами обученные на разных данных.
Спасибо за комментарий )
Зачем вводите людей в заблуждение?
"When op determinism is enabled, TensorFlow ops will be deterministic. This means that if an op is run multiple times with the same inputs on the same hardware, it will have the exact same outputs each time." Речь идет о повторяемости только(!) на одних и тех же данных (включая параметры модели, обучение). Дополнительно они говорят о том, что и железо должно быть таким же (т.к. речь идет о дробных числах это замечание важное). Это ввели для отладки. Правда не совсем понятно с какой целью, т.к. даже банальное изменение порядка операций почти наверняка изменит финальный результат.
Насколько я понял из дальнейшей документации вместе с enable_op_determinism
обязательно использование set_random_seed.
Эта пара вместе должна заставлять TensorFlow производить все операции в том же порядке с теми же данными (переменными для генерации псевдослучайных чисел, которые используются при обучении).
Все почему-то сконцентрировались на вопросе откуда берется вариативность. А нам на практике важнее к чему может привести эта вариативность? Ну узнал я, что вариативность по метрике аккуратность 1%, как это мне поможет сделать более лучшую модель?
Cosine Annealing https://paperswithcode.com/method/cosine-annealing - изменение learning rate, который (в теории) может сильно снизить вариативность. В процессе обучения (разумеется) запоминаем наилучшую модель, которая и идет в зачет. Прогоните заново ваши эксперименты (только оптимально подгоните параметры обучения под свою задачу) и, почти уверен, что вариативность результатов сильно снизится.
Комментарий от себя: Cosine Annealing хорош, когда у нас есть дополнительное время на обучения. Хотя, такое тоже может быть, есть некоторая надежда на то, что времени не сильно больше нужно.
Спасибо за комментарий )
Данная статья не концентрируется на вопросе – откуда берется вариативность. В общем случае это и так понятно. Из-за рандомности инициации весов, рандомности подбора состава батча и прочее.
Также статья не направлена на решение задачи снижения вариативности, в большинстве случаев процесс будет совпадать со штатной оптимизацией – комбинирование шага обучения, dropout и прочее. В статье речь не об этом.
Цель статьи – обратить внимание на размеры этой вариативности.
«Ну узнал я, что вариативность по метрике аккуратность 1%, как это мне поможет сделать более лучшую модель?»
Практическое применение как раз и заключается в понимании размера вариативности. Если известно, что вариативность достигает 1%, а при коррекции параметров точность улучшилась на 0,3% - это означает, что коррекция параметров практически не повлияла на результат. Он попадает в те же рамки, как если повторно запустить обучение без коррекции параметров. Нельзя сказать, что мы сделали вот так, и модель улучшилась на 0,3%. Нет, ничего не произошло, никакого улучшения. А вот если точность улучшилась на 2%, то в эту сторону уже стоит смотреть внимательно и оптимизировать в этом направлении.
О вариативности результатов обучения нейронных сетей