Изучение производной функции для полиномов с помощью PyTorch

Недавно я прошел серию 3Blue1Brown по линейной алгебре в третийраз и, наконец, что-то щелкнуло для меня. Блин, почему так долго!

Меня особенно поразили идеи из последнего эпизода сериала под названием Абстрактные векторные пространства, поэтому я пишу эту заметку, чтобы подытожить то, что я узнал, и призвать всех ознакомиться с сериалом. Я также проведу эксперимент с PyTorch, чтобы подтвердить то, что было сказано в эпизоде. Итак, давайте погрузимся!

Производные с матрицей

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

где три условия следующие:

f(x): полиномиальная функция

Например:

Поскольку наше пространство ограничено многочленами, мы можем просто отслеживать коэффициенты и представлять f(x) как:

Тогда наш пример можно представить как:

y:производная от f(x)

В нашем примере y равно

M: матричный оператор

Итак, формула для нахождения производной полиномиальной функции довольно тривиальна, но как ее представить в виде матричного оператора? Как оказалось, производная функция линейна, поэтому мы можем описать ее с помощью линейного оператора с матрицей. Назовем его M:

Собираем все вместе

Таким образом, линейное преобразование для производной многочлена имеет следующий вид:

В приведенном выше примере f(x) = 3x³ + 2x + 4:

что дает нам правильные коэффициенты для результата: 9x² + 2.

Грубо говоря, когда мы умножаем f(x) на M, мы применяем линейное преобразование, определяемое M, к базисным функциям исходного пространства. Полученное пространство является нашим производным пространством. Базисные функции полиномиального пространства можно определить как:

Я был поражен этой прекрасной идеей. Итак, позвольте мне повторить это:

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

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

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

Производные с нейронной сетью

В любом случае, чтобы углубить эту идею, я решил подтвердить производный оператор M. И есть ли лучший способ сделать это, чем заставить машину заучить сам матричный оператор, а затем сравнить его с M? В частности, давайте создадим простую нейронную сеть, которая учится находить производные полиномов. Затем мы посмотрим на его весовую матрицу W и посмотрим, совпадает ли W с M! Вот блокнот Colab на случай, если вы захотите запустить код: http://goo.gl/FGB5F1.

Во-первых, давайте определим нашу весовую матрицу W. Здесь D — количество членов в наших многочленах: если D равно 5, наши многочлены увеличиваются до x⁴.

Во-вторых, нам нужно сгенерировать некоторые обучающие данные для нашей сети. Это довольно просто, так как мы уже знаем формулу производной для многочленов. Ниже представлен класс набора данных PyTorch, который генерирует пары (f(x), df/dx). Datasetclass — этоспособ передачи настраиваемых данных в PyTorch.Нам нужно определить методы __init__, __len__ и __getitem__, а затем использовать DataLoader для загрузки этого набора данных в пакетах. или даже параллельно.

Благодаря простоте PyTorch это почти все, что нам нужно настроить для эксперимента. Теперь давайте обучим сеть!

Наконец, обученная весовая матрица W выглядит так:

Так что да, матрица выученных весов W по сути является M, производным линейным оператором.

Спасибо за чтение! Было весело писать это. Дайте мне знать, если у вас есть какие-либо вопросы в разделе комментариев ниже.