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

В данной статье делаем по 10 запусков обучения на каждой паре (количество нейронов скрытого слоя, размера батча) и сравниваем результаты.

Исходные параметры

Количества нейронов скрытого слоя: 128-512-1024-2048
Размеры батчей 16-32-64-128-256-512-1024-2048
Запуски обучения осуществляем обычным циклическим перебором.

Применяем tensorflow
Код стандартный, все параметры стандартные или по умолчанию.
в скрытом слое activation='relu', на выходном activation='softmax'
optimizer='adam'
loss='sparse_categorical_crossentropy'
metrics=['accuracy']
validation_split=0.2

Для данного эксперимента 40 эпох вполне достаточно, так как без dropout и уменьшения шага обучения дальше практически плато.

128 нейронов

test accuracy max = 98.23%
test accuracy min = 96.74%
max - min = 1.49%

256 нейронов

test accuracy max = 98.40%
test accuracy min = 96.74%
max - min = 1.66%

512 нейронов

test accuracy max = 98.41%
test accuracy min = 97.74%
max - min = 0.67%

1024 нейрона

test accuracy max = 98.60%
test accuracy min = 97.86%
max - min = 0.74%

Вариативность

Приведем график максимальной и минимальной вариативности.

test accuracy dev (max) = 1.66%
test accuracy dev (min) = 0.67%

Даже на примере данного короткого эксперимента оказалось, что при 10 повторениях запусков обучения с одними и теми же парами (количество нейронов скрытого слоя, размер батча) максимальная вариативность достигает 1,66%, а минимальная составляет 0,67%. Это означает, что значение точности может варьироваться не просто на несколько десятых процента, а легко превышает и 1%. И вероятно, что представленные данные не окончательны, и с увеличением количества повторов "вилка" может только увеличиваться, но никак не уменьшаться.

Вывод по вариативности

Вывод состоит в том, что для понимания влияния изменения параметров недостаточно единичных запусков, так как результат может измениться на 1-2% и без изменения параметров, и будет неизвестно, насколько повлияло изменение параметров и повлияло ли вообще. Для понимания влияния изменения параметров необходимо делать именно серию запусков и отслеживать ход всего "облака", а не единичных запусков.

Примечания

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

Комментарии (8)


  1. rPman
    31.05.2023 18:54
    +1

    Это потому что стартовая инициализация весов — случайный шум.


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


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


    1. AnatolyBelov Автор
      31.05.2023 18:54
      +1

      Спасибо за комментарий )


  1. Dark_Furia
    31.05.2023 18:54
    +2

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

    Но для полной задокументированности эксперимента было бы неплохо добавить репозиторий с кодом, т.к. из описания не понятно, использовались ли LR scheduler, нормалицазии, регуляризации, аугментации и т.п.


    1. AnatolyBelov Автор
      31.05.2023 18:54

      Спасибо за комментарий )


  1. Stenmar
    31.05.2023 18:54
    +1

    В таком случае в первую очередь стоит обратить внимание на недетерминированные части кода. Например оптимизатор Adam является стохастическим, из-за него такие различия будут проявляться (а может быть есть что-то ещё, например порядок загрузки тренировочных примеров в модель, он тоже влияет на результат). Смотрите в эту сторону, поинтересуйтесь способами сделать воспроизводимые эксперименты, как минимум попробуйте зёрна генерации зафиксировать перед тем, как инициализируете модель и создаёте наборы данных, и посмотрите, что получится. Сам факт того, что от стохастичности зависит результат, не особо нов, а вот какие-нибудь выводы из экспериментов, практические рекомендации и т.п. были бы уже интересными.


    1. AnatolyBelov Автор
      31.05.2023 18:54

      Спасибо за комментарий )


  1. amurylev
    31.05.2023 18:54
    +1

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


    Для того, чтобы убрать вариативность можно воспользоваться следующей функцией:
    https://www.tensorflow.org/api_docs/python/tf/config/experimental/enable_op_determinism
    Это экспериментальная функция, которую добавили недавно. Она позволяет добиться повторяемости результатов из обучения в обучения, что позволяет более корректно сравнивать модели с разными параметрами обученные на разных данных.


    1. AnatolyBelov Автор
      31.05.2023 18:54

      Спасибо за комментарий )