В этой статье я использовал метод «сверху вниз», чтобы объяснить линейную алгебру для глубокого обучения: сначала предоставил приложения и способы их использования, а затем углубился, чтобы предоставить концепции.

Определение линейной алгебры в Википедии:

Линейная алгебра - это раздел математики, посвященный линейным уравнениям и линейным функциям и их представлениям через матрицы и векторные пространства.

Оглавление:

  • Вступление.
  • Математическая перспектива векторов и матриц.
  • Типы матриц.
  • Разложение матриц.
  • Нормы.
  • Векторизация.
  • Вещание.
  • Внешние ресурсы.

Введение:

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

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

На изображении выше показана простая нейронная сеть с прямой связью, которая передает информацию вперед.

Изображение является прекрасным представлением нейронной сети, но как компьютер может это понять. В компьютере слои нейронной сети представлены в виде векторов. Рассмотрим входной слой как X, а скрытый слой как H. Выходной уровень сейчас не касается (процесс вычисления нейронных сетей с прямой связью здесь не рассматривается).

Таким образом, его можно представить в виде векторов и матриц как,

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

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

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

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

Вывод скрытого слоя H рассчитывается путем выполнения H = f (W .x + b).

Здесь W называется матрицей весов, b называется смещением, а f - функцией активации. (В этой статье не объясняется, что такое нейронные сети с прямой связью, если вам нужен учебник по концепции FFNN, посмотрите здесь.)

Давайте разберем уравнение,

первый компонент - W. x; это произведение матрица-вектор, потому что W - это матрица, а x - вектор. Прежде чем переходить к их умножению, давайте разберемся, Об обозначениях: обычно векторы обозначаются маленькими жирными курсивными буквами (например, x), а матрицы обозначаются заглавными жирными курсивными буквами (например, X). буква заглавная и жирная, но не курсивная, тогда это тензор (например, X ).

С точки зрения информатики:

Скаляр: одно число.

Вектор: список значений (тензор ранга 1).

Матрица: двумерный список значений (тензор 2-го ранга).

Тензор: многомерная матрица с рангом n.

Детализация:

С математической точки зрения:

Вектор:

Вектор - это величина, которая имеет как величину, так и направление. Это сущность, существующая в пространстве, ее существование обозначается x∈ ℝ², если это Двухмерный вектор, существующий в реальном пространстве. (Каждый элемент обозначает координату по другой оси.)

Все векторы в 2D-пространстве могут быть получены путем линейной комбинации двух векторов, называемых базисными векторами. (Обозначаются i и j) (В общем, вектор в N измерениях может быть представлен N базисными векторами. ) Они являются единичными нормальными векторами, потому что их величина равна единице и они перпендикулярны друг другу. Один из этих двух векторов не может быть представлен другим вектором. Поэтому они называются линейно независимыми векторами. (Если какой-либо вектор не может быть получен линейной комбинацией набора векторов, тогда вектор линейно не зависит от этого набора). Весь набор точек в 2D-пространстве, который может быть получен линейной комбинацией этих двух векторов, называется промежутком этих векторов. Если вектор представлен линейной комбинацией (сложение, умножение ) набора других векторов, то он линейно зависит от этого набора векторов (нет смысла добавлять этот новый вектор к существующему набору).

Любые два вектора можно сложить вместе. Их можно перемножить. Их умножение бывает двух типов: скалярное произведение и перекрестное произведение. Обратитесь сюда.

Матрица:

Матрица - это двумерный массив чисел. Они представляют собой преобразования. Каждый столбец матрицы 2 * 2 обозначает каждый из 2 базисных векторов после применения этого преобразования к двумерному пространству. Их пространственное представление - W ∈ ℝ³ * ², имеющее 3 строки и 2 столбца.

Матричное векторное произведение называется преобразованием этого вектора, а матричное матричное произведение называется композицией преобразований.

Есть только одна матрица, которая не преобразует вектор - это единичная матрица (I). Столбцы представляют собой базисные векторы.

Определитель матрицы A,, обозначаемый det (A) масштабирования коэффициент линейного преобразования, описываемого матрицей.

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

Одна из таких библиотек - numpy для языка программирования Python.

Есть много ресурсов для изучения numpy. (Что очень важно для изучения глубокого обучения, если вы используете python.) Посмотрите здесь.

Здесь np.array создает массив numpy.

np.random - это пакет, содержащий методы генерации случайных чисел.

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

Мы можем изменить форму массива numpy, а также проверить его.

здесь вы можете видеть, что произведение W.x является вектором, и к нему добавляется b, который является скаляром. Это автоматически расширяет b как транспонирование ([1,1]). Это неявное копирование b в несколько местоположений называется трансляцией. (мы рассмотрим подробнее через мгновение.)

Вы обратили внимание на слово "транспонирование": Транспонирование матрицы - это зеркальное отображение матрицы по диагональной линии (от верхнего левого угла до нижнего правого угла матрицы).

## numpy code for transpose
import numpy as np
A = np.array([[1,2],
              [3,4],
              [5,6]])
B = np.transpose(A) 
##or
B = A.T

Типы матриц:

Диагональная матрица: все элементы равны нулю, кроме основных диагональных элементов.

Матрица идентичности: диагональная матрица с диагональными значениями, равными 1.

## numpy code to create identity matrix
import numpy as np
a = np.eye(4)

Симметричная матрица: матрица, равная транспонированной. A = транспонировать (A)

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

Разложение матриц:

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

Собственный вектор квадратной матрицы A - это ненулевой вектор v, такой что умножение на A изменяет только масштаб v.

А. v = лямбда. v

здесь v - собственный вектор, а лямбда - собственное значение.

## numpy program to find eigen vectors.

from numpy import array
from numpy.linalg import eig
# define matrix
A = array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(A)
# calculate eigendecomposition
values, vectors = eig(A)
print(values)
print(vectors)

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

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

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

Нормы:

Переоснащение и недостаточное оснащение:

Когда вы посещаете лекцию по глубокому обучению, вы часто слышите термины «переоснащение» и «недообучение». Эти термины описывают степень точности модели глубокого обучения.

Под переобучением понимается модель, которая слишком хорошо усваивает обучающие данные. Она буквально захватила обучающие данные. В моделях с переобучением точность обучения очень высока, а точность проверки очень низка.

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

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

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

Это самая важная обязанность инженера по глубокому обучению - создать модель, которая в целом соответствует входным данным. Существует несколько методов регуляризации, в первую очередь L1-регуляризация (лассо) и L2-регуляризация (Ridge).

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

Норма:

Норма - это размер вектора. Общая формула нормы вектора x имеет вид

L² norm с p = 2 называется евклидовой нормой, потому что это евклидово расстояние между исходной точкой и x.

Норма L¹ - это просто сумма всех элементов вектора. Она используется в машинном обучении, когда системе требуется гораздо большая точность. Чтобы четко различать нулевой и ненулевой элемент. Норма L¹ также известна как норма Манхэттена.

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

Эквивалентом нормы L² для матрицы является норма Фробениуса.

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

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

Векторизация:

Это уловка, позволяющая сократить количество циклов и заставить процесс выполняться параллельно, предоставляя данные в виде векторов.

Многие процессоры имеют наборы инструкций «вектор» или «SIMD» (одна инструкция и несколько данных), которые применяют одну и ту же операцию одновременно к двум, четырем или более частям данных. SIMD стал популярным в процессорах общего назначения в начале 1990-х годов.

Для получения более подробной информации ищите Классификацию Флинна.

Векторизация - это процесс переписывания цикла таким образом, что вместо обработки одного элемента массива N раз он обрабатывает (скажем) 4 элемента массива одновременно N / 4 раза.

Numpy сильно внедрила векторизацию в свои алгоритмы. Вот официальная заметка от numpy.

Векторизация описывает отсутствие каких-либо явных циклов, индексации и т. Д. В коде - эти вещи, конечно же, происходят «за кулисами» в оптимизированном, предварительно скомпилированном коде C. Векторизованный код имеет множество преимуществ, среди которых:

векторизованный код более лаконичен и легче читается

меньше строк кода обычно означает меньше ошибок

код более похож на стандартную математическую нотацию (что, как правило, упрощает правильное кодирование математических конструкций)

векторизация приводит к более «питоническому» коду. Без векторизации наш код был бы завален неэффективными и трудными для чтения циклами for.

Пример кода:

## to add two arrays together.
## consider two basic python lists.
a = [1,2,3,4,5]
b = [2,3,4,5,6]
c = []
## without vectorization.
for i in range(len(a)): 
    c.append(a[i]+b[i])
## using vectorization.
a = np.array([1,2,3,4,5])
b = np.array([2,3,4,5,6])
c = a+b

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

Подробнее о векторизации смотрите здесь.

Вещание:

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

Из Документации Numpy:

The term broadcasting describes how numpy treats arrays with 
different shapes during arithmetic operations. Subject to certain 
constraints, the smaller array is “broadcast” across the larger 
array so that they have compatible shapes. Broadcasting provides a 
means of vectorizing array operations so that looping occurs in C
instead of Python. It does this without making needless copies of 
data and usually leads to efficient algorithm implementations.

пример кода:

 a = np.array([1.0, 2.0, 3.0])
 b = 2.0
 a * b
 array([ 2.,  4.,  6.])
this is similar to
a = np.array([1.0, 2.0, 3.0])
b = np.array([2.0, 2.0, 2.0])
a * b
array([ 2.,  4.,  6.])

Массив b расширяется, чтобы можно было применять арифметические операции.

Вещание - не новая концепция. Это относительно старый инструмент, созданный в 50-х годах. В своей статье Обозначение как инструмент мышления Кеннет Айверсон описывает несколько инструментов математического использования, которые позволяют нам мыслить с новых точек зрения. Он впервые упомянул вещание не как компьютерный алгоритм, а как математическую процедуру. Многие из этих инструментов он реализовал в программном обеспечении под названием APL.

Позже его сын расширил его идеи и создал еще одну программу под названием J software. Этот жест означает, что с программным обеспечением мы получаем более 50 лет глубоких исследований, и с их помощью мы можем реализовать очень сложные математические функции в небольшом фрагменте кода.

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

Имейте в виду, что это не очень простые идеи, которые пришли в одночасье. Это как фундаментальные способы думать о математике и ее воплощении в программном обеспечении. (Приведенный выше контент взят из курса машинного обучения fast.ai)

подробнее о нескольких версиях трансляции смотрите здесь.

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

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

Ниже приведены некоторые из полезных ресурсов:

Подробные видео с интуитивно понятной линейной алгеброй: 3blue1brown

электронная книга: https://www.math.ucdavis.edu/~linear/linear-guest.pdf

Лучший сайт для изучения глубокого обучения: fast.ai

Полная обучающая книга: Книга по глубокому обучению Яна Гудфеллоу.