alterna ai
ALTERNA AI / ГЛАВА 01 · 04

01.4 Что даёт сумма произведений

На предыдущей странице: как измерить длину.

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

Два вектора: [3,4] и [2,0].

Из компонент получается один скаляр

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

xTy=∑i=1nxiyi.x^Ty=\sum_{i=1}^{n}x_i y_i.

Операция выполняет два действия: перемножает соответствующие компоненты, затем суммирует все результаты. Для x=[1,2]Tx=[1,2]^T, y=[3,4]Ty=[3,4]^T промежуточный вектор произведений равен [3,8]T[3,8]^T, а dot равен 11. Покомпонентный результат называется произведением Адамара и не должен подменять скалярный итог.

Shape помогает обнаружить ошибку: [n] · [n] даёт скаляр, тогда как [n] * [n] во многих библиотеках даёт [n]. В NumPy это различие видно как x @ y против x * y.

Арифметика кодирует евклидов угол

Для ненулевых векторов евклидово скалярное произведение связано с углом θ\theta:

xTy=∥x∥2∥y∥2cos⁡θ.x^Ty=\|x\|_2\|y\|_2\cos\theta.

При x=[3,4]Tx=[3,4]^T, y=[1,0]Ty=[1,0]^T dot равен 33, а ∥x∥2∥y∥2=5\|x\|_2\|y\|_2=5, поэтому cos⁡θ=3/5\cos\theta=3/5. Если заменить yy на [0,1]T[0,1]^T, dot станет 4: вертикальная ось согласована с xx сильнее горизонтальной.

Знак даёт качественную информацию:

Условие dot = 0 само по себе не разрешает говорить об угле, если присутствует нулевой вектор: арифметическая сумма определена, но направление нулевого вектора отсутствует.

Компенсация вкладов создаёт ортогональность

Возьмём y=[−4,3]Ty=[-4,3]^T. Тогда

xTy=3(−4)+4(3)=−12+12=0.x^Ty=3(-4)+4(3)=-12+12=0.

Ортогональность возникла не потому, что каждое произведение равно нулю, а потому, что отрицательный и положительный вклады точно компенсировались. Вектор [−4,3]T[-4,3]^T является поворотом [3,4]T[3,4]^T на 90 градусов и имеет ту же длину 5.

Dot измеряет и направление, и масштаб

Если y=xy=x, то xTy=∥x∥22=25x^Ty=\|x\|_2^2=25. Если y=2xy=2x, угол остаётся нулевым, но dot удваивается до 50. Если y=−xy=-x, длины прежние, а dot равен −25-25. Поэтому большой положительный score может быть следствием большой длины, сильного совпадения направления или обоих факторов.

Это существенно для attention: score query-key до нормировки зависит от масштаба представлений. Деление на d\sqrt d в scaled dot-product attention управляет масштабом типичных logits, но не превращает каждый dot в cosine.

Неравенство Коши–Буняковского

∣xTy∣≤∥x∥2∥y∥2|x^Ty|\le\|x\|_2\|y\|_2

гарантирует, что нормированное отношение лежит в [−1,1][-1,1]. Равенство достигается для линейно зависимых векторов: знак плюс для одного направления и минус для противоположных. В floating-point вычислениях отношение может стать 1+ε1+\varepsilon из-за округления; перед arccos его допустимо ограничить диапазоном [−1,1][-1,1]. Такое ограничение исправляет только численный шум, но не несовместимые shapes и не неверную формулу.

Вычисление dot длины nn требует nn умножений и n−1n-1 сложений при последовательном суммировании. В attention такие суммы вычисляются для множества пар query-key. Нижняя лаборатория показывает и промежуточные произведения, и итог: следите, какие вклады усиливают друг друга, а какие компенсируются.

x, y = [1, 2], [3, 4]
products = [a*b for a, b in zip(x, y)]
dot = sum(products)
assert products == [3, 8] and dot == 11

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

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

Ближайшая точка на направлении. Как этот вопрос продолжает полученный результат?

Python-примеры главы 01 Академическая база →