Линейная алгебра, или зачем Excel в МО
Урок 5

Линейная регрессия алгебра, или зачем Excel в МО

· 11 мин чтения

Вступление

В этом уроке мы приступим к самой страшной вещи в машинном обучении: мы начнём изучать МАТЕМАТИКУ. Запасайтесь ледяными компрессами, потому что голова может закипеть.

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

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

Магистр кринжа вернулся

Снова дома, но в Москве

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

Рассмотрим небольшую таблицу с вымышленными данными:

Кв S (м²) K (м²) F (этаж) T (этажей) D (км) y (млн руб.)
A 40 10.4 18 24 18.35 6.6
B 60 12 3 17 17.63 9.0
C 60 13 3 17 20.45 8.2

Здесь:

  • S -общая площадь квартиры;
  • K - площадь кухни;
  • F - этаж, на котором находится квартира;
  • T - количество этажей в доме;
  • D - расстояние до центра Москвы;
  • y - цена квартиры.

Выглядит как обычная таблица в Excel, не правда ли? Но давайте посмотрим на неё немного иначе.

Вспомним, что каждая квартира - это отдельный объект, а её характеристики - признаки.

Тогда квартиру A можно представить следующим образом:

xA=(4010.4182418.35)x_A = \begin{pmatrix} 40 & 10.4 & 18 & 24 & 18.35 \end{pmatrix}

А все три квартиры:

X=(4010.4182418.35601231717.63601331720.45)X = \begin{pmatrix} 40 & 10.4 & 18 & 24 & 18.35 \\ 60 & 12 & 3 & 17 & 17.63 \\ 60 & 13 & 3 & 17 & 20.45 \end{pmatrix}

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

Но что это вообще за математические конструкции?

Поздравляю! Мы только что познакомились с ВЕКТОРАМИ и МАТРИЦАМИ.

Верьте в себя, даже если хочется плакать

Вектор - это не только стрелочка

ВЕКТОР - это упорядоченный набор элементов (в нашем случае чисел).

Например:

a=(23)a = \begin{pmatrix} 2 & 3 \end{pmatrix}

Это вектор из двух элементов. Но почему именно вектор, а не просто список из Python?

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

Для начала рассмотрим геометрическую интерпретацию.

Представим обычную систему координат с двумя осями: X и Y.

Тогда наш вектор

a=(23)a = \begin{pmatrix} 2 & 3 \end{pmatrix}

можно представить в виде стрелки, которая начинается в точке (0;0)(0;0) и заканчивается в точке (2;3)(2;3).

Первое число отвечает за перемещение по оси X, второе - по оси Y.

А что, если чисел будет три?

a=(234)a = \begin{pmatrix} 2 & 3 & 4 \end{pmatrix}

Ничего страшного! Просто добавим третью ось Z (ZZZZZZZZ) и получим трёхмерное пространство.

А если чисел будет пять? Десять? Тысяча?

Вот тут уже интереснее.

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

Хотя, если у вас получилось, пожалуйста, поделитесь способом, Я ЗНАЮ ХОРОШЕГО ПСИХИАТРА!

Количество координат вектора называют его РАЗМЕРНОСТЬЮ.

Наш вектор квартиры A имеет пять координат, следовательно, он принадлежит пятимерному пространству:

xA∈R5x_A \in \mathbb{R}^5

Не пугайтесь этой записи. Она означает всего лишь то, что наш вектор состоит из пяти действительных чисел.

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

Именно поэтому в предыдущих уроках я говорил о многомерных пространствах и проклятии размерности.

Теперь эти слова должны выглядеть немного менее страшно.

Что можно делать с векторами?

С векторами можно выполнять множество операций, но пока рассмотрим самые простые.

1. Сложение векторов

Допустим, у нас есть два вектора:

a=(23),b=(41)a = \begin{pmatrix} 2 & 3 \end{pmatrix}, \qquad b = \begin{pmatrix} 4 & 1 \end{pmatrix}

Чтобы сложить их, достаточно сложить соответствующие координаты:

a+b=(64)a+b = \begin{pmatrix} 6 & 4 \end{pmatrix}

Геометрически это можно представить так: мы сначала перемещаемся на вектор aa, а затем из полученной точки — на вектор bb.

Результатом будет вектор, который ведёт нас из начальной точки в конечную.

Обратите внимание: складывать таким образом можно только векторы одинаковой размерности.

2. Умножение вектора на число

Здесь всё ещё проще.

2a=2(23)=(46)2a = 2\begin{pmatrix}2 & 3\end{pmatrix} =\begin{pmatrix}4 & 6\end{pmatrix}

Мы просто умножаем каждую координату на одно и то же число.

Геометрически это означает растяжение или сжатие вектора. При умножении на отрицательное число его направление также меняется на противоположное.

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

Например:

c=2a+3bc = 2a+3b

Такая конструкция называется ЛИНЕЙНОЙ КОМБИНАЦИЕЙ векторов.

Запомните это название. Оно ещё неоднократно встретится нам в курсе.

Связь

Матрицы, или Excel для математиков

Вернёмся к нашей таблице квартир.

Мы уже выяснили, что одна квартира может быть представлена вектором. А что, если нам необходимо хранить сразу несколько квартир?

Правильно, можно объединить их в одну таблицу!

X=(4010.4182418.35601231717.63601331720.45)X = \begin{pmatrix} 40 & 10.4 & 18 & 24 & 18.35 \\ 60 & 12 & 3 & 17 & 17.63 \\ 60 & 13 & 3 & 17 & 20.45 \end{pmatrix}

МАТРИЦА — это прямоугольная таблица элементов, расположенных в строках и столбцах.

В отличие от вектора, матрица имеет сразу два размера: количество строк и количество столбцов.

Наша матрица содержит три строки и пять столбцов, поэтому её размерность:

X∈R3×5X \in \mathbb{R}^{3\times5}

Читается это как «матрица размером три на пять».

В машинном обучении часто используют обозначение:

X∈Rn×dX \in \mathbb{R}^{n\times d}

Где:

  • nn - количество объектов;
  • dd - количество признаков.

Таким образом, если у нас будет миллион квартир, каждая из которых описывается пятью признаками, мы получим матрицу размером 1000000×51000000\times5.

Excel уже начинает подозревать неладное.

А куда делись цены?

Обратите внимание: в нашу матрицу XX мы не включили последний столбец с ценами квартир.

Почему?

Потому что цены — это целевая переменная, которую наша модель должна научиться предсказывать.

Поэтому мы будем хранить их отдельно:

y=(6.69.08.2)y = \begin{pmatrix} 6.6\\ 9.0\\ 8.2 \end{pmatrix}

Это тоже вектор, только записанный вертикально.

Здесь мы сталкиваемся с двумя разновидностями записи векторов: вектор-строка и вектор-столбец.

Наш первый вектор квартиры был строкой:

xA=(4010.4182418.35)x_A = \begin{pmatrix} 40 & 10.4 & 18 & 24 & 18.35 \end{pmatrix}

Но мы можем записать те же элементы вертикально:

xAT=(4010.4182418.35)x_A^T = \begin{pmatrix} 40\\ 10.4\\ 18\\ 24\\ 18.35 \end{pmatrix}

Операция, которая превращает строки в столбцы, а столбцы в строки, называется ТРАНСПОНИРОВАНИЕМ.

Обозначается она буквой TT сверху.

Транспонировать можно и целую матрицу. Например:

A=(123456)A = \begin{pmatrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{pmatrix}

Тогда:

AT=(142536)A^T = \begin{pmatrix} 1 & 4\\ 2 & 5\\ 3 & 6 \end{pmatrix}

Матрица размером 2×32\times3 превратилась в матрицу размером 3×23\times2.

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

А где щитпост?...

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

Мы уже научились складывать векторы и умножать их на числа. Но можно ли умножить один вектор на другой?

Можно! Причём существует несколько способов, но сейчас нам понадобится только один - СКАЛЯРНОЕ ПРОИЗВЕДЕНИЕ.

Пусть у нас есть два вектора:

a=(23),b=(45)a = \begin{pmatrix}2 & 3\end{pmatrix}, \qquad b = \begin{pmatrix}4 & 5\end{pmatrix}

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

a⋅b=2⋅4+3⋅5=23a\cdot b=2\cdot4+3\cdot5=23

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

В общем виде:

a⋅b=∑i=1daibia\cdot b=\sum_{i=1}^{d}a_i b_i

Где dd - размерность наших векторов.

Заметьте, что результатом является ЧИСЛО, а не новый вектор. Именно поэтому произведение называется скалярным.

Но зачем нам вообще такая странная операция?

Немного геометрии

У скалярного произведения есть ещё одна, гораздо более интересная интерпретация:

a⋅b=∣a∣∣b∣cos⁡αa\cdot b = |a||b|\cos\alpha

Где:

  • ∣a∣|a| и ∣b∣|b| — длины наших векторов;
  • α\alpha — угол между ними.

А длина вектора в двумерном пространстве вычисляется по знакомой нам теореме Пифагора:

∣a∣=a12+a22|a|=\sqrt{a_1^2+a_2^2}

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

Например, если два ненулевых вектора перпендикулярны, угол между ними равен 90∘90^\circ, а значит:

cos⁡90∘=0\cos90^\circ=0

Следовательно:

a⋅b=0a\cdot b=0

И это довольно интересное свойство!

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

Матрицы тоже умеют умножаться

И вот мы подошли к одной из самых полезных операций в линейной алгебре - МАТРИЧНОМУ УМНОЖЕНИЮ.

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

Но нет. Математики решили, что наша жизнь слишком проста.

Для матричного умножения существует отдельное правило.

Допустим, мы имеем матрицу:

A=(1234)A = \begin{pmatrix} 1 & 2\\ 3 & 4 \end{pmatrix}

И вектор-столбец:

b=(56)b = \begin{pmatrix} 5\\ 6 \end{pmatrix}

Тогда:

(1739)\begin{pmatrix} 17\\ 39 \end{pmatrix}

Заметили закономерность?

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

Именно так работает умножение матрицы на вектор-столбец.

Но есть одно важное ограничение: количество столбцов первой матрицы должно совпадать с количеством строк второй.

В общем случае:

Am×nBn×p=Cm×pA_{m\times n}B_{n\times p}=C_{m\times p}

То есть при умножении матрицы размером m×nm\times n на матрицу размером n×pn\times p мы получим матрицу размером m×pm\times p.

Например:

(3×5)⋅(5×1)=(3×1)(3\times5)\cdot(5\times1)=(3\times1)

Именно эта операция позволит нам получать предсказания сразу для множества объектов!

А теперь самое время вернуться к нашим квартирам.

Моя жизнь

Как всё это связано с линейной регрессией?

В предыдущем уроке мы выяснили, что простейшая линейная регрессия имеет вид:

y^=kx+b\hat y=kx+b

Но тогда у нас был всего один признак — площадь квартиры.

А сейчас их пять!

Что делать?

Всё довольно просто: вместо одного коэффициента kk нам потребуется по одному коэффициенту для каждого признака.

Наша модель примет следующий вид:

y^=w1x1+w2x2+w3x3+w4x4+w5x5+b\hat y=w_1x_1+w_2x_2+w_3x_3+w_4x_4+w_5x_5+b

Здесь:

  • x1,…,x5x_1,\ldots,x_5 - признаки квартиры;
  • w1,…,w5w_1,\ldots,w_5 - коэффициенты модели, или веса;
  • bb - свободный член, или смещение (bias);
  • y^\hat y - предсказанная цена квартиры.

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

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

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

Но погодите...

Мы же только что изучили скалярное произведение!

Посмотрите на нашу формулу ещё раз:

y^=w1x1+w2x2+…+w5x5+b\hat y=w_1x_1+w_2x_2+\ldots+w_5x_5+b

Это буквально СКАЛЯРНОЕ ПРОИЗВЕДЕНИЕ векторов признаков и весов, к которому мы прибавили смещение.

Обозначим веса вектором-столбцом:

w=(w1 w2 w3 w4 w5)w= \begin{pmatrix} w_1\ w_2\ w_3\ w_4\ w_5 \end{pmatrix}

Тогда формулу можно сократить до:

y^=xw+b\boxed{\hat y=xw+b}

Где xx — вектор-строка признаков одной квартиры.

И всё! Мы только что записали линейную регрессию с несколькими признаками с помощью линейной алгебры.

А можно сразу для всех квартир?

Разумеется!

У нас ведь уже есть матрица XX, содержащая признаки всех квартир.

Тогда:

y^=Xw+b1\boxed{\hat y=Xw+b\mathbf{1}}

Здесь 1\mathbf{1} — вектор-столбец из единиц, позволяющий прибавить одно и то же смещение к каждому предсказанию.

В нашем случае:

1=(1 1 1)\mathbf{1}= \begin{pmatrix} 1\ 1\ 1 \end{pmatrix}

Проверим размерности:

Xw⏟3×1\underbrace{Xw}_{3\times1}

Получается вектор из трёх предсказаний — по одному для каждой квартиры.

То есть одна операция матричного умножения позволяет нам получить предсказания сразу для всех объектов!

Вот почему в машинном обучении так любят матрицы.

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

И именно поэтому библиотеки вроде NumPy играют такую важную роль в ML.

Я вспомнил, почему я перестал писать

Давайте всё-таки что-нибудь предскажем

Хорошо, с формулами разобрались. Но давайте наконец заставим нашу модель выдать хоть какие-нибудь числа.

Возьмём вектор весов:

w=(0.150.050.020.01−0.10)w= \begin{pmatrix} 0.15\\ 0.05\\ 0.02\\ 0.01\\ -0.10 \end{pmatrix}

А смещение пусть будет равно:

b=1b=1

ВНИМАНИЕ! Эти параметры я сейчас просто придумал. Мы ещё не обучали модель и не искали оптимальные коэффициенты.

Подставим признаки квартиры A:

y^A=40⋅0.15+10.4⋅0.05+18⋅0.02+24⋅0.01−18.35⋅0.10+1\hat y_A= 40\cdot0.15+ 10.4\cdot0.05+ 18\cdot0.02+ 24\cdot0.01- 18.35\cdot0.10+1

Получаем:

y^A=6.285\boxed{\hat y_A=6.285}

То есть наша модель предсказывает цену около 6.29 млн рублей.

А реальная цена квартиры A из таблицы — 6.6 млн рублей.

Неплохо для коэффициентов, взятых буквально с потолка!

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

y^=Xw+b1\hat y=Xw+b\mathbf{1}

Получим:

y^=(6.285 9.067 8.835)\hat y= \begin{pmatrix} 6.285\ 9.067\ 8.835 \end{pmatrix}

А настоящие цены:

y=(6.6 9.0 8.2)y= \begin{pmatrix} 6.6\ 9.0\ 8.2 \end{pmatrix}

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

Но очевидно, что можно попробовать найти веса получше.

И здесь возникает главный вопрос:

КАК НАЙТИ ТАКИЕ ВЕСА, ЧТОБЫ МОДЕЛЬ ОШИБАЛАСЬ КАК МОЖНО МЕНЬШЕ?

Именно это и будет нашей следующей большой задачей.

Так это просто, Наклз: все что надо...

А где же геометрия?

Помните, в начале урока мы представляли векторы в виде стрелочек, а объекты — в виде точек в пространстве?

Теперь посмотрим на линейную регрессию с этой стороны.

Когда у нас был один признак, модель выглядела как обычная прямая на плоскости:

y^=w1x1+b\hat y=w_1x_1+b

Если добавить второй признак:

y^=w1x1+w2x2+b\hat y=w_1x_1+w_2x_2+b

то график нашей модели уже будет ПЛОСКОСТЬЮ в трёхмерном пространстве.

А что произойдёт, если признаков станет пять?

Вместо обычной плоскости мы получим её многомерное обобщение - ГИПЕРПЛОСКОСТЬ.

Звучит страшно, но идея осталась прежней.

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

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

Кстати, если вам показалось, что всё это напоминает нашу прямую из предыдущего урока, то вам не показалось.

Мы просто обобщили ту же самую идею на большее количество признаков.

Капец :(

Заключение

Поздравляю! Мы пережили первый урок, посвящённый математике.

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

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

Но у нас осталась одна маленькая проблема...

МЫ ДО СИХ ПОР НЕ УМЕЕМ ОБУЧАТЬ НАШУ МОДЕЛЬ.

Коэффициенты в последнем примере я просто придумал, а хотелось бы находить их автоматически.

Для этого нам понадобится ещё один инструмент линейной алгебры - СИСТЕМЫ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ (СЛАУ).

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

Спасибо за внимание!

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

Но я не сдамся!
Оцените урок