Сравнительное тестирование моделей с использованием механизмов внимания

Мы с вами проделали большую работу в процессе изучения и реализации алгоритма Multi-Head Self-Attention. Мы даже успели его реализовать в нескольких платформах. И если ранее мы создавали новые классы только для нашей библиотеки на языке MQL5, то сейчас мы познакомились с возможностью создания пользовательских нейронных слоев и на языке Python с использованием библиотеки TensorFlow. Теперь пришло время посмотреть на плод трудов наших и оценить возможности, предлагаемые нам новой технологией.

Как обычно, тестирование мы начинаем с моделей, созданных стандартными средствами MQL5. Мы уже начали эту работу при тестировании работы алгоритма Self-Attention. Для проведения нового теста мы возьмем скрипт attention_test.mq5 из предыдущего теста и создадим его копию с именем attention_test2.mq5.

Напомню, в процессе создания нового класса многоголового внимания мы во многом наследовали процессы из алгоритма Self-Attention. Где-то полностью наследовали методы, а где-то брали за основу методы Self-Attention и создавали новый функционал благодаря небольшим правкам. Так и здесь, скрипт для тестирования не потребует внесения больших изменений — все изменения коснутся лишь блока объявления нового слоя.

Первое наше изменение — это, конечно, тип создаваемого нейронного слоя. В параметре type мы укажем константу defNeuronMHAttention, соответствующую классу многоголового внимания.

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

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

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

//--- Слой внимания
   if(!(descr = new CLayerDescription()))
     {
      PrintFormat("Error creating CLayerDescription: %d"GetLastError());
      return false;
     }
   descr.type = defNeuronMHAttention;
   descr.count = BarsToLine;
   descr.window = NeuronsToBar;
   descr.window_out = 8;
   descr.step = 8;                // Количество голов внимания
   descr.optimization = Adam;
   descr.activation_params[0] = 1;
   if(!layers.Add(descr))
     {
      PrintFormat("Error adding layer: %d"GetLastError());
      delete descr;
      return false;
     }

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

Мы уже говорили, что даже использование технологии Self-Attention дает превосходство нам над рассмотренными ранее архитектурными решениями сверточных и рекуррентных моделей. Увеличение голов внимания также дает положительный результат.

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

Сравнительное тестирование моделей внимания

Сравнительное тестирование моделей внимания

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

Сравнительное тестирование моделей внимания

Сравнительное тестирование моделей внимания

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

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

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

При увеличении масштаба графика можно заметить, что у моделей с использованием механизмов внимая линии более прямолинейные и менее рваные. Этот свидетельствует о более четком выявлении зависимостей и поступательном движении к минимизации ошибки. Отчасти это можно объяснить нормализацией результатов внутри блока Self-Attention, что позволяет иметь на выходе результат с одинаковыми статистическими показателями.

График результатов тестирования по показателю Accuracy также подтверждает наши выводы.

Результаты тестового обучения моделей внимания Python

Результаты тестового обучения моделей внимания Python

Результаты тестового обучения моделей внимания Python

Результаты тестового обучения моделей внимания Python

Результаты тестового обучения моделей внимания Python

Результаты тестового обучения моделей внимания Python

Результаты тестового обучения моделей внимания Python

Результаты тестового обучения моделей внимания Python