Неизъяснимое мастерство глубокого обучения искусство приближения нелинейностей с помощью кусочных оценок Часть-1.

Магия глубокого обучения искусство приближения нелинейностей с помощью кусочных оценок Часть-1.

В прошлом году мы стали свидетелями взрывного роста популярности Глубокого Обучения. Модели на основе Больших Языковых Моделей, таких как GPT-4, и Генеративные модели, как DALL·E, стали доминировать во всех разговорах в интернете. Энтузиазм, окружающий Глубокое Обучение, спровоцировал разработку суперкомпьютеров, таких как Nvidia DGX GH200. Он является вычислительной мощью с потрясающей производительностью в 1 экзафлопс, специально разработанным для вычислений нейронных сетей. Когда разговоры идут о Глубоком Обучении, они неотъемлемо связаны с Глубокими Нейронными Сетями, и наоборот. Глубокие Нейронные Сети – это уравнения, которые могут представлять крайне широкий класс отношений между входом и выходом. Часто эти отношения очень сложны, нелинейны и трудно визуализировать, но как именно Глубокие Нейронные Сети комфортно представляют их?

Чтобы понять, как глубокая нейронная сеть приближает такие сложные функции, мы начнем с исследования простой поверхностной нейронной сети и рассмотрим, как она моделирует эти связи. Нейронные сети, в общем, являются функциями f(x,ϕ), которые отображают многомерные входы x в многомерные выходы y, где ϕ является набором параметров функции f. Например, если f(x,ϕ) = ax + b, то ϕ – это набор {a, b}. Поверхностные нейронные сети в общем состоят из основных вычислительных блоков, называемых нейронами. Эти нейроны действуют как линейные оценщики, каждый оценивая разные линейные функции.

Простая поверхностная нейронная сеть с 3 скрытыми блоками

В общем случае, простая поверхностная нейронная сеть, изображенная на приведенной выше схеме, с одним входом x и одним выходом y с D нейронами может быть представлена следующим образом:

где ϕ₀ и ϕᵢ – это смещение и вес выхода, соответствующий скрытому блоку i соответственно. Каждый hᵢ соответствует линейной функции, оцениваемой скрытым блоком i. Каждый скрытый блок вычисляет hᵢ следующим образом:

как мы уже утверждали ранее, θ₀ – это смещение, а θᵢ – это входной вес, соответствующий скрытому блоку i. Здесь a[.] – функция активации. До сих пор мы только оценивали линейную функцию с помощью нейронной сети, которая, по предположению, должна оценивать нелинейную функцию. Функция активации именно вносит эту нелинейность. Более точно, она генерирует то, что известно как кусочно-линейная функция, которая служит приближением для обработки нелинейных функций.

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

Теперь давайте объединим y₁, y₂ и y₃ найдем y с использованием приведенного выше уравнения и визуализируем результат.

Мы видим, что результат представляет собой линейную функцию, теперь давайте пропустим y₁, y₂ и y₃ через функцию активации и визуализируем результат.

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

Несмотря на то, что мы можем оценить нелинейную функцию с помощью сигмоидной активационной функции ReLu или одной из ее вариаций – выбор делается в пользу ReLu, когда речь идет о большинстве современных нейронных сетей. Различные факторы делают ReLu наиболее влияющим фактором, когда речь идет об активационных функциях, наиболее влияющим фактором является то, что ReLu и ее производная функция Хевисайда чрезвычайно просты для вычисления по сравнению с сигмоидой или тангенсом. Использование ReLu может снизить время вычисления значительно, не в ущерб производительности.

Теперь давайте обучим неглубокую нейронную сеть с активацией ReLu для оценки sin(x), увеличивая количество скрытых узлов каждый раз и визуализируя оцененную функцию до тех пор, пока оценка не будет удовлетворительной. Затем мы сравниваем эту оцененную функцию с функциями, оцененными с помощью сигмоиды и тангенса и видим, есть ли что-то в компромиссе в производительности.

Неглубокая нейронная сеть с 5 скрытыми узлами и активацией ReLu
Неглубокая нейронная сеть с 50 скрытыми узлами и активацией ReLu
Неглубокая нейронная сеть с 500 скрытыми узлами и активацией ReLu
Неглубокая нейронная сеть с 1500 скрытыми узлами и активацией ReLu

Из графиков выше мы видим, что фрагментарные оценки, выполненные с помощью ReLu, хорошо приближают нелинейную функцию, такую как sin(x). Заметно, что с увеличением количества скрытых узлов, фрагментарные линейные сегменты близко напоминают нелинейные области. Фактически, с D скрытыми узлами возможно создать столько же линейных областей, сколько и D+1. В процессе обучения модель учится наклонам, обозначенным как θ₁, и сдвигам, обозначенным как θ₀, для этих D+1 линейных сегментов, повышая общую эффективность данного подхода.

Теперь сравним это с оценками, сделанными с использованием функций сигмоиды и тангенса.

Неглубокая нейронная сеть с 1500 скрытыми узлами и активацией сигмоиды
Неглубокая нейронная сеть с 1500 скрытыми узлами и активацией тангенса

Из графиков выше мы можем заметить, что даже если эти оценки являются нелинейными, они не настолько хороши, как оценки, сделанные с помощью функции ReLu. Одним из способов объяснить это является то, что при обучении неглубокой нейронной сети с D скрытыми узлами с активацией ReLu мы фактически получаем отдельные линейные области D+1, которые обладают гибкостью быть ориентированными и располагаться по необходимости, адаптируясь под лежащее распределение данных. Давайте поймем это с помощью чрезвычайно простой реальной аналогии, посмотрите на рисунок ниже

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

Этот блог получил значительное вдохновение из книги «Понимание глубокого обучения» Саймона Дж. Д. Принса (udlbook.github.io/udlbook/). Я планирую расширить этот блог еще двумя частями, чтобы более детально изучить тему. Код, который я использовал для создания графиков, можно найти ниже. Если вам понравился этот блог и он оказался полезным, я буду очень благодарен за вашу поддержку в виде лайка.

Понимание глубокого обучения/Овладение глубоким обучением: искусство приближения нелинейностей с помощью числа π…

Присоединитесь к Raagulbharatwaj/пониманию-глубокого-обучения, создав аккаунт на GitHub.

github.com