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

Постановка задачи

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

Начало

Начнем с однослойной сети прямого распространения (FNN), потом будем расширяться, переходя на многослойные сети прямого распространения, на многослойные сверточные сети (CNN) и на "тюнинг" предобученных сетей.

Некоторые исследования уже были проведены, представлены в предыдущей статье "Анализ подбора гиперпараметров при обучении нейронной сети прямого распространения — FNN (на примере MNIST)", и в ряде случаев будем к ним обращаться.

Что уже знаем и умеем:

  1. увеличение количества признаков приводит к увеличение точности, но нужно следить за переобучением.

  2. переобучение возможно регулировать подбором размера батча и dropout.

  3. с определенного момента целесообразно добавлять уменьшение шага обучения и "шлифовать" точность.

Изначально сразу сталкиваемся со следующими неопределенностями:

  1. Конечная функция не то чтобы дифференцируема, а пока вообще не известна, то есть не сможем применять в лоб "производные" и соответствующие алгоритмы.

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

Начинаем хоть с чего-то

Посмотрим, с какими поверхностями имеем дело.

Конечно, идеальный случай - сделать полный перебор по количествам признаков и размерам батчей. Однако понимаем, что каждая такая итерация - это полное обучение сети, то есть такой подход слишком затратный. Более того, изменение, например, количества признаков на 1 не дает явного изменения, поэтому лучше перемещаться какими-либо шагами.

Примечания:

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

2. Альтернатива №2. Как-бы градиентный спуск.
При обучении нейронных сетей мы часто применяемый градиентный спуск. С некоторыми допущениями и ограничениями возможно применить градиентный спуск и в данном случае. Основное отличие лишь в том, что мы не знаем функцию, поэтому будем просто замерять точность до итерации и точность после итерации. При этом на каждой итерации, кроме первой, точность до итерации будет уже измерена, так как это будет точностью после предыдущей итерации. Также если мы будем учитывать, что обычно направление движения сохраняется с гораздо большей вероятностью, чем изменение на обратное, то на каждой итерации будем сначала делать измерение в том же направлении, и только если показатели ухудшились, то будем измерять показатели движения в обратном направлении. Так, поочередно меняя количество признаков и размер батча, будем продвигаться в сторону экстремума. При этом понимаем, что если начали колебаться "вперед-назад", то подозреваем локальный экстремум. В данном случае шаг не уменьшаем, запоминаем соотношение, выходим из локального экстремума и идем дальше. Когда пройдем заданный интервал или до некоторого заданного ограничения, то возьмем каждый сохраненный локальный экстремум и проработаем со схемами уменьшения шага. Хотя этот алгоритм также представляется "затратным", так как на каждой итерации сеть обучается заново.

Необходимо отметить, что мы ничего не утверждаем и ничего не опровергаем - все подлежит тестированию. Поэтому все альтернативные решения имеют право быть, и даже интересно довести их до реализации и сравнить получившиеся алгоритмы, но это тема уже отдельной статьи.

Возвращаемся к рассматриваемому алгоритму.

В IT любят умножить на 2, поэтому возьмем увеличивающийся в 2 раза ряд количества признаков [ 128, 256, 512, 1024, 4056, 8192 ]. Больше 8192 уже как-то "затратно", хотя возможная целесообразность захождения правее будет быстро понятна в ходе исследования. Меньше 128 тоже вроде бы не имеет смысла, хотя также будет быстро понятно в ходе исследования. И чтобы скачки не были таким уж резкими, вставим дополнительные значения посередине между имеющимися значениями.

Размер батча 64, размер валидационной выборки 20%, оптимизатор 'adam'.
Dropout пока не трогаем, так как при однослойной сети он как-то не очень влияет на экстремум, а шаги обучения будем уменьшать уже непосредственно в зонах экстремума, окончательно шлифуя точность.

Запускаем на 20 эпох, чтобы присмотреться.

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

На 40 эпохах до 2048 стали уже доходить до 1.0, но ясности это не добавило, а наоборот - картину видим совершенно иную, чем на 20 эпохах.
Хотя уже некоторая зона экстремума прослеживается.

Добавив графики на 60 эпох снова видим примерную зону экстремума.

Продолжим на 80 эпох, чтобы дообучились модели с большим количеством признаков.
Скачки немного другие, но зона экстремума примерно там же, где и на 60.

Таким образом видно, что единый экстремум даже по одному размеру батча может и отсутствовать, поэтому следует выделять возможные "зоны экстремума".

Определяем алгоритм в общем виде

Прослеживается деление алгоритма на 3 этапа:

  1. определить примерные зоны экстремума (их может быть несколько);

  2. в зонах экстремума поработать более пристально и определить "потенциально оптимальные" соотношения количества признаков и размеров батча (их также может быть несколько);

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

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

Также важно, что все последующие вычисления также "независимы" , то есть возможно брать любые части выбранных последовательностей, отправлять их на разные машины, обрабатывать параллельно, а потом объединять результаты. По сути, в итоге получится набор [(параметр 1, параметр 2, ... , точность)]. Это легко объединяется и сравнивается.

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

1 этап. Определяем зоны экстремума

Идем от простого к сложному. Берем ряд количеств признаков и ряд размеров батчей и делаем полный перебор комбинаций.

Для экономии времени и упрощения визуализации на этапе формирования алгоритма разделяем количества признаков на "малые" (до 1024) и "большие" (более 1024) и запускаем "малые" на 40 эпох.

В 3-мерном виде поверхность выглядит так:

Понимаем, что с "большими" все будет аналогично.

2 этап. Определяем "потенциально оптимальные" соотношения

Видим, что близкие значения точности могут достигаться при разных соотношениях количества признаков и размеров батча. Например показатели точности четырех точек (при количестве признаков 1024 с батчем 512 и 256 и при количестве признаков 512 с батчем 128 и 512) достаточно достаточно близки, предположительно на уровне случайности инициации исходных весов. Это усиливает тезис о необходимости выделения несколько "зон экстремума".

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

Берем любую зона экстремума и попытаемся разобраться, как работать с этой информацией.

Точка: количество признаков 512, размер батча 128.

Рассмотрим "точку" (512, 128).
Более корректно будет рассматривать не точку, а интервалы (512, [64-256]) и ([256-1024], 128). При фиксации количества признаков или размера батча мы получаем стандартную задачу определения оптимума неизвестной функции на заданном интервале в двухмерном пространстве. Для такой задачи есть уже стандартные известные способы, даже не связанные с нейронными сетями. Понимаем, что мы можем взять "какой-то" способ, и потом его менять, корректировать и прочее, и это будет отдельным фрагментом. На выход будет подаваться только координата оптимума - число признаков и размер батча.

Итак, начнем с самого простого способа - разделим интервал на 8 частей и посчитаем значение в соответствующих точках. Где значение больше - там и оптимум.

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

3 этап. Шлифуем точность

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

Некоторые из распространенных схем уменьшения шага обучения:

  1. Не уменьшать шаг обучения.

  2. Уменьшать шаг обучение в 2 раза через заданное количество эпох (часто 7).

  3. Уменьшать шаг обучения в 2 раза, если через заданное количество эпох точность не увеличивается (часто 3).

  4. Уменьшать шаг обучения в 2 раза, если через "сильно большее" количество эпох точность не увеличивается (например, 10).

Теперь запускается цикл перебора по набору "потенциально оптимальных" соотношений, и по каждому соотношению из набора запускается вложенный цикл перебора по выбранным схемам уменьшения шага обучения. В итоге выбирается несколько лучших значений (3,5,7), запоминаются, и запускаются несколько раз для усреднения случайностей.

Предварительные результаты

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

Отдельное наблюдение

В предыдущей статье мы довольно внимательно экспериментировали с параметрами, в том числе и с уменьшением шага обучения, и достигли точности на тестовой выборке на соответствующем датасете (MNIST) 0.9869. Не утверждаем, что это самый лучший показатель, но даже его достижение было весьма трудоемко. В этой статье мы просто брали последовательность количеств признаков с увеличением в 2 раза [128, 256, 512, 1024] и таким же образом сформированную последовательность размеров батчей [16, 32, 64,128], и просто перебирали соотношения, и таким образом достигли показателя 0.9860. Разница между 0.9860, полученными "легко и случайно", и 0.9869, полученными достаточно трудоемко, составляет сотые доли процента. С этой точки зрения вызывает отдельный интерес, насколько поднимается точность в ходе работы с зонами экстремума и схемами уменьшения шага обучения по сравнению с простым "автоматическим" перебором распространенных параметров.

Что дальше

А дальше мы рассчитываем на комментарии и рекомендации сообщества касательно рассматриваемого алгоритма и приступаем непосредственно к кодированию.

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


  1. Proydemte
    00.00.0000 00:00

    Интересно, шестерёнки на КДПВ как могут крутиться?


    1. AnatolyBelov Автор
      00.00.0000 00:00

      Поменяли шестеренки )


  1. berng
    00.00.0000 00:00
    +1

    А что выбрано в качестве исходной архитектуры и сколько свободных параметров?

    Просто у меня на тестовом датасете MNIST при 50тыс свободных параметров сети безо всяких оптимизаций, стандартным ADAMом, дефолтным батчем и LR точность 99.18% . Правда, архитектура проприетарная, да.


    1. AnatolyBelov Автор
      00.00.0000 00:00

      Спасибо за комментарий )
      Идем от простого к сложному.
      В данной статье архитектура тестовая - FNN с одним скрытым слоем.


      1. berng
        00.00.0000 00:00

        А сколько свободных параметров?

        Если у вас 8000 нейронов в скрытом слое - это порядка 6.5млн свободных параметров в сети. Для такой сетки 98.6% - очень плохой показатель, такие нейронки все дают результаты выше 99%, посмотрите обзор https://doi.org/10.1016/j.neunet.2021.01.026 , там в последней таблице есть бенчмарки по различным сеткам. И вообще, 8000 нейронов - это сильно много, по теории 1600 должно быть достаточно.


        1. AnatolyBelov Автор
          00.00.0000 00:00

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

          На всякий случай для ясности.
          В данном примере не оптимизируем структуру и тип сети. Это FNN с одним скрытым слоем. Не сверточная, не многослойная, не предобученная. Изображения не крутим, никаких новых не генерируем - только исходный датасет.

          Перебирается несколько вариантов количеств признаков - от 128 до 8192 с несколькими вариантами размеров батчей - от 16 до 1024.

          Запустили дефолтные установки на 50000 признаков, как в комментарии.
          Действительно, уже на 9 эпохе 0.9895, и возможно, что дальше будет еще чуть лучше.
          Это интересно ...

          До Вашего комментария не думали в таком примере на такое количество признаков выходить )


          1. berng
            00.00.0000 00:00

            У вас в коде число признаков=числу нейронов в скрытом слое. Боюсь, вы вводите в заблуждение. В полносвязной сети уже для 128 нейронов у вас больше 100тыс свободных параметров. А при 50тыс нейронов соответственно 40млн свободных парампетров. 40млн по мощности - это сетка класса ResNet, если что.

            Что вы называете числом признаков? Если число нейронов - то это одно, если число неизвестных коэффициентов сети - это другое. Эти величины различаются на порядки

            По моему, у вас всего два признака - размер батча и число нейронов в скрытом слое.


            1. AnatolyBelov Автор
              00.00.0000 00:00

              Да, действительно, под "числом признаков" имелось ввиду "число нейронов скрытого слоя", и это может вводить в заблуждение.

              Спасибо за подстветку, скорректируем формулировки )


            1. AnatolyBelov Автор
              00.00.0000 00:00

               "размер батча" и "число нейронов в скрытом слое" - понимаем как "гиперпараметры"


  1. deadmoroz14
    00.00.0000 00:00
    +3

    Может я не понимаю вашего гения, но оптимизатор то у вас Adam. Оптимизатор стохастический.

    Какой смысл тогда в построении поверхности при различных значениях параметров, и её дальнейшем анализе? Ведь если вы ещё раз попробуете построить эту поверхность, у вас будут совершенно другие результаты


    1. HollowPoint
      00.00.0000 00:00
      +2

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


      1. berng
        00.00.0000 00:00
        +2

        Это как раз можно попробовать посчитать. Интервал Уилсона для тестового датасета (на MNIST его длина 10000), средней точности 98.6% и стандартного статистического уровня значимости alpha=0.05 составляет

        (98.35%, 98.81%)

        Т.е. 95% всех рандомных запусков по идее будут попадать в интервал (98.58+/-0.23)%, и любые достигнутые точности внутри этого интервала - просто случайность.

        Т.е. разницы между 98.6% и 98.69% никакой - это обычный случайный разброс, и допустимый разброс составляет действительно порядка полпроцента.

        Для обучающего датасета (длина 60000) этот интервал чуть меньше, и равен

        (0.9850, 0.9869).

        Т.е. и учет случайности обучения (рандомные коэффициенты при инициализации и все такое) тоже говорит о случайности 98.69% по сравнению 98.60%.

        Обычно в таких случаях говорят, что улучшения нет.


        1. AnatolyBelov Автор
          00.00.0000 00:00

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

          Действительно, 98.6% и 98.69% - это не улучшение, а "вариативность", вызванная применяемыми рандомностями.

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

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


      1. AnatolyBelov Автор
        00.00.0000 00:00

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

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

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


    1. AnatolyBelov Автор
      00.00.0000 00:00
      +1

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

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

      Смысл построения поверхности с точки зрения данной статьи и разрабатываемого алгоритма такой:

      1. Посмотреть "форму" поверхности.
      Имеется в виду, что изначально мы ее не знаем. То есть мы не знаем - это набор гипербол с единым оптимумом, или постоянно колеблющиеся экстремумы, или единая наклонная гиперплоскость - на данном этапе представление о форме поверхности отсутствует. Это как бы первый "прицел" для понимания, с чем предстоит работать.

      2. Мы предполагаем (не утверждаем, а именно предполагаем, и это вопрос тестирования), что даже с учетом вариативности результата обучения сравнительный результат различных соотношений может сохраняться. То есть несколько обучений при соотношении (1024,64) дадут отличающийся результат, и несколько обучений при соотношении (128, 32) дадут отличающийся результат, но совокупность результатов соотношения (1024, 64) может быть в целом лучше, и тогда именно это соотношение запоминается как "потенциально оптимальное". Таким образом по завершении соответствующего этапа формируется набор "потенциально оптимальных" соотношений, которые в целом лучше, чем остальные, и именно они прорабатываются на следующем этапе.


    1. AnatolyBelov Автор
      00.00.0000 00:00
      +1

      Базовая идея видится так:

      1. Обычно обучение начинается с инициации весов и затем шарик катится градиентным спуском к ближайшей лунке. Если лунка неглубокая, то в ряде случаев шарик может выскочить и катиться дальше к следующей лунке. Но если лунка глубокая, он будет вращаться уже внутри нее, постепенно углубляясь приближаясь к ее дну. При этом о потенциальной глубине этой лунки ничего не известно. Более того, ничего не известно о потенциальных глубинах других лунок - и соседних, и на другом краю, а они могут быть глубже, но об этом уже не будет известно, так как шарик будет искать оптимум уже там, где провалился (в том числе и при уменьшении шага обучения) и оттуда не выскочит.

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

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