Alterna · учебный материал

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

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

Что в этом материале

Содержание и основные понятия

На предыдущей странице: как измерить длину.
Умножим соответствующие координаты двух векторов и сложим. Получим одно число, связанное с длинами и направлением стрелок.
Два вектора: [3,4] и [2,0].
Координаты и расчёт геометрического примера приведены в тексте. Для изменения пространственного рисунка включитеJavaScript.
Из компонент получается один скаляр
Скалярное произведение двух векторов одинаковой размерности определено как
x
T
y
=
∑
i
=
1
n
x
i
y
i
.
x^Ty=\sum_{i=1}^{n}x_i y_i.
x
T
y
=
i
=
1
∑
n
​
x
i
​
y
i
​
.
Операция выполняет два действия: перемножает соответствующие компоненты, затем суммирует все результаты. Для
x
=
[
1
,
2
]
T
x=[1,2]^T
x
=
[
1
,
2
]
T
,
y
=
[
3
,
4
]
T
y=[3,4]^T
y
=
[
3
,
4
]
T
промежуточный вектор произведений равен
[
3
,
8
]
T
[3,8]^T
[
3
,
8
]
T
, а dot равен 11. Покомпонентный результат называется произведением Адамара и не должен подменять скалярный итог.
Shape помогает обнаружить ошибку:
[n] · [n]
даёт скаляр, тогда как
[n] * [n]
во многих библиотеках даёт
[n]
. В NumPy это различие видно как
x @ y
против
x * y
.
Арифметика кодирует евклидов угол
Для ненулевых векторов евклидово скалярное произведение связано с углом
θ
\theta
θ
:
x
T
y
=
∥
x
∥
2
∥
y
∥
2
cos
⁡
θ
.
x^Ty=\|x\|_2\|y\|_2\cos\theta.
x
T
y
=
∥
x
∥
2
​
∥
y
∥
2
​
cos
θ
.
При
x
=
[
3
,
4
]
T
x=[3,4]^T
x
=
[
3
,
4
]
T
,
y
=
[
1
,
0
]
T
y=[1,0]^T
y
=
[
1
,
0
]
T
dot равен
3
3
3
, а
∥
x
∥
2
∥
y
∥
2
=
5
\|x\|_2\|y\|_2=5
∥
x
∥
2
​
∥
y
∥
2
​
=
5
, поэтому
cos
⁡
θ
=
3
/
5
\cos\theta=3/5
cos
θ
=
3/5
. Если заменить
y
y
y
на
[
0
,
1
]
T
[0,1]^T
[
0
,
1
]
T
, dot станет 4: вертикальная ось согласована с
x
x
x
сильнее горизонтальной.
Знак даёт качественную информацию:
x
T
y
>
0
x^Ty>0
x
T
y
>
0
: угол острый;
x
T
y
=
0
x^Ty=0
x
T
y
=
0
: векторы ортогональны или один из них нулевой;
x
T
y
<
0
x^Ty<0
x
T
y
<
0
: угол тупой.
Условие dot = 0 само по себе не разрешает говорить об угле, если присутствует нулевой вектор: арифметическая сумма определена, но направление нулевого вектора отсутствует.
Компенсация вкладов создаёт ортогональность
Возьмём
y
=
[
−
4
,
3
]
T
y=[-4,3]^T
y
=
[
−
4
,
3
]
T
. Тогда
x
T
y
=
3
(
−
4
)
+
4
(
3
)
=
−
12
+
12
=
0.
x^Ty=3(-4)+4(3)=-12+12=0.
x
T
y
=
3
(
−
4
)
+
4
(
3
)
=
−
12
+
12
=
0.
Ортогональность возникла не потому, что каждое произведение равно нулю, а потому, что отрицательный и положительный вклады точно компенсировались. Вектор
[
−
4
,
3
]
T
[-4,3]^T
[
−
4
,
3
]
T
является поворотом
[
3
,
4
]
T
[3,4]^T
[
3
,
4
]
T
на 90 градусов и имеет ту же длину 5.
Dot измеряет и направление, и масштаб
Если
y
=
x
y=x
y
=
x
, то
x
T
y
=
∥
x
∥
2
2
=
25
x^Ty=\|x\|_2^2=25
x
T
y
=
∥
x
∥
2
2
​
=
25
. Если
y
=
2
x
y=2x
y
=
2
x
, угол остаётся нулевым, но dot удваивается до 50. Если
y
=
−
x
y=-x
y
=
−
x
, длины прежние, а dot равен
−
25
-25
−
25
. Поэтому большой положительный score может быть следствием большой длины, сильного совпадения направления или обоих факторов.
Это существенно для attention: score query-key до нормировки зависит от масштаба представлений. Деление на
d
\sqrt d
d
​
в scaled dot-product attention управляет масштабом типичных logits, но не превращает каждый dot в cosine.
Неравенство Коши–Буняковского
∣
x
T
y
∣
≤
∥
x
∥
2
∥
y
∥
2
|x^Ty|\le\|x\|_2\|y\|_2
∣
x
T
y
∣
≤
∥
x
∥
2
​
∥
y
∥
2
​
гарантирует, что нормированное отношение лежит в
[
−
1
,
1
]
[-1,1]
[
−
1
,
1
]
. Равенство достигается для линейно зависимых векторов: знак плюс для одного направления и минус для противоположных. В floating-point вычислениях отношение может стать
1
+
ε
1+\varepsilon
1
+
ε
из-за округления; перед
arccos
его допустимо ограничить диапазоном
[
−
1
,
1
]
[-1,1]
[
−
1
,
1
]
. Такое ограничение исправляет только численный шум, но не несовместимые shapes и не неверную формулу.
Вычисление dot длины
n
n
n
требует
n
n
n
умножений и
n
−
1
n-1
n
−
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
Академическая база →

Структурная карта учебников