I. Полный цикл работы с большими моделями
-
Создание кластера ИИ: вычислительная, коммуникационная инфраструктура и хранилища
-
Данные для больших моделей: наборы данных для больших моделей, обработка данных, векторные базы данных
-
Алгоритмы больших моделей:от традиционной обработки естественного языка NLP к предварительно обученным большим языковым моделям LLM
-
Обучение больших моделей: распространённые алгоритмические методы и анализ стабильности обучения больших моделей
-
Распределённый параллелизм: параллелизм модели, данных, оптимизатора и т. д.
-
Дообучение больших моделей:полное дообучение, дообучение малого числа параметров, алгоритмы дообучения на инструкциях
-
Инференс больших моделей:сжатие посредством квантования, инференс с расширением длины последовательности, методы кэширования
-
Оценка больших моделей: прикладные задачи NLP, прикладные задачи CV, методики оценки
-
Агенты на основе больших моделей:процесс RLHF,агенты,непрерывное обучение на протяжении всей жизни
II、Векторы
Те, кто хорошо знаком с собаками, могут быстро различать их породы. Это возможно потому, что мы рассматриваем их признаки с разных сторон, например размер тела.
Если мы используем координатную ось для отображения их размера, эти собаки окажутся в разных точках. Однако одного лишь размера недостаточно: у некоторых собак размеры очень близки.
Затем рассмотрим другие признаки, например длину шерсти, и построим ещё одну координатную ось: так мы сможем различить часть собак одинакового размера
Но часть всё ещё перекрывается, поэтому нужно продолжить рассматривать их с других сторон, например сравнить длину носа.
Можно добавить и другие измерения, например размер глаз. Мы не можем построить рисунок в четырёхмерном пространстве, но в числовых координатах это реализовать очень просто: достаточно дописывать значения в конец.
Мы можем рассматривать признаки собаки и с других точек зрения, то есть по другим измерениям: например, по толщине лап, курчавости шерсти и даже по более абстрактным характеристикам, таким как послушание, пригодность для выполнения задач и так далее. Чем больше измерений мы используем, тем лучше можем различать собак. При этом увеличивается и размерность пространства, в котором находятся координатные точки.
Так можно описать не только собаку, но и практически всё что угодно. Это могут быть конкретные предметы,
а могут быть абстрактные радость, гнев, печаль и веселье, горечь разлук и счастье встреч. У разных объектов разные проявления, иначе говоря, разные числовые значения в разных измерениях признаков, поэтому в итоге каждому соответствует точка в многомерном пространстве признаков. Просто в этих более широких пределах для хорошего различения объектов нам могут потребоваться признаки большей размерности. Возможно, сотни или тысячи, а возможно, и десятки тысяч.
Но поскольку мы не можем построить изображение более чем в трёх измерениях, объясним это на двумерных координатах.
Мы увидим, что точки, более близкие по смыслу, будут теснее группироваться в пространстве, а точки с сильно различающимся смыслом будут находиться далеко друг от друга. Если пойти дальше и взять начало координат за начальную точку, а эти точки — за конечные, получатся векторы, обладающие направлением и величиной。
Если преобразовать изображения в векторы, то поиск похожих векторов позволит реализовать поиск по изображению
Если преобразовать видео в векторы, то поиск похожих векторов позволит рекомендовать похожие видео
Если представить товары в виде векторов, то поиск похожих векторов позволит давать рекомендации, связанные с товаром, который пользователь сейчас просматривает
Если преобразовать текст в векторы, интеллектуальная система вопросов и ответов сможет находить по текущему вопросу пользователя похожие вопросы, на которые уже были даны ответы, и использовать их для справки
Третье, векторные базы данных
С приходом ИИ векторы станут важной формой данных. Традиционные базы данных плохо подходят для хранения и поиска векторных данных, поэтому для решения этих задач нужна специально разработанная база данных, которая, возможно, станет частью будущей инфраструктуры работы с данными. В отличие от традиционных баз данных, которые хранят таблицы и выполняют точный поиск с помощью запросов, векторные базы данных хранят векторы, а при запросе ищут в базе векторы, наиболее похожие на вектор запроса, поэтому такой поиск обладает некоторой нечёткостью.

1、Векторный поиск
Один из основных сценариев применения векторных данных таков:для заданного вектора запроса найти среди множества векторов несколько наиболее похожих. Это так называемая задача поиска ближайших соседей, а алгоритмы, решающие её, называются алгоритмами поиска ближайших соседей. Один из самых очевидных способов — полный перебор:последовательно сравнить сходство каждого вектора с вектором запроса и выбрать несколько наиболее похожих. При этом конкретных способов сравнения сходства двух векторов существует немало,Евклидово расстояние и косинусное сходство。
-
Евклидово расстояние — это расстояние по прямой между двумя векторами. Предположим, в двумерной системе координат есть два вектора p и q: евклидово расстояние равно длине отрезка, соединяющего p и q. В трёхмерной системе координат каждый вектор содержит три координаты x, y, z, и расстояние между любыми двумя точками вычисляется по формуле. В n-мерной системе координат имеется 100 координат, и расстояние между любыми двумя точками также вычисляется по формуле. Чем меньше расстояние, тем выше сходство этих двух векторов в некоторых измерениях

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

Если же векторных данных слишком много, такой примитивный перебор приведёт к чрезвычайно долгому поиску. Но качество этого поиска действительно идеально, поскольку он сравнивает каждый вектор. Поэтому, если объём данных в базе невелик и время полного перебора всех векторов приемлемо, это вполне хороший метод. Однако в реальных приложениях объёмы данных обычно далеко не маленькие, поэтому необходимо искать способы оптимизации.
2、Векторный индекс
Выше был описан принцип поиска в векторных базах данных, однако на практике при сопоставлении по сходству нельзя полагаться исключительно на вычисления по формуле, поскольку объём данных в векторной базе обычно велик, а размерность высока. Вычисление сходства двух 1000-мерных векторов по формуле требует большого объёма расчётов и создаёт высокую вычислительную нагрузку на CPU. Если же векторов сто миллионов и расчёт нужно выполнить для каждого, затраты времени и вычислительных ресурсов будут ещё выше. Поэтому здесь мы вводим понятие векторного индекса。
Векторные индексы похожи на индексы в реляционных базах данных, но есть одно отличие. В векторной базе данных поиск по векторному индексу даёт приближённые результаты, а не результаты с точностью 100%.Векторный индекс отражает степень сходства — высокую или низкую. Поэтому мы называем это приближённым поиском ближайших соседей(ANS). Без векторного индекса поиск по сходству векторов похож на полное сканирование таблицы в реляционной базе данных. Однако поверх полного сканирования требуется ещё один уровень вычислений, поэтому затраты значительно выше, чем при полном сканировании таблицы в реляционной базе данных.
По способу реализации векторные индексы ANNS можно разделить на четыре основные категории:
-
Индексы на основе деревьев
-
Индекс на основе графа
-
Индекс на основе хеширования
-
Индекс на основе квантования
1、Методы на основе деревьев
Основная идея методов на основе деревьев — разбивать данные на части, подобно двоичному дереву поиска, сокращая пространство поиска и обеспечивая быстрый поиск. Однако этот подход не подходит для пространств высокой размерности. Основные методы на основе деревьев — KDTree (K-Dimensional Tree, дерево k-мерного пространства) и Annoy (Approximate
Nearest Neighbors Oh Yeah, приближённый поиск ближайших соседей).
1.1
KDTree
Построение KDTree также основано на рекурсивном разбиении. Сначала выбирают измерение с наибольшей дисперсией и используют медиану всех данных по этому измерению как точку разделения, разбивая гиперпрямоугольную область на две подобласти. Значения меньше медианы относят влево, значения меньше медианы — вправо, после чего рекурсивно строят левое и правое поддеревья, пока не будут распределены все данные.
Процесс поиска на основе KDTree:
1、Для искомых данных p и измерения разбиения d текущего узла сравнить значение координаты p по измерению d со значением узла: если оно больше, перейти к левому дочернему узлу, если меньше — к правому;
2、Продолжать обход до листового узла, пометить его как посещённый и принять вычисленное расстояние до него за ближайшее расстояние;
3、Выполнять возврат от листовых узлов, при каждом возврате определяя расстояние от p до непосещённой ветви родительского узла.
a)Если расстояние от этого узла ветвления до p больше текущего минимального расстояния, продолжать подниматься назад по дереву вплоть до корневого узла;
b)Если расстояние от этого узла ветви до p меньше текущего минимального расстояния, выбираем эту ветвь и выполняем шаг 1 и шаг 2 до достижения листового узла, обновляя минимальное расстояние между листом и Q.
1.2Annoy
Annoy делит пространство гиперплоскостями: с помощью KMeans(k=2) находятся два центра кластеров, а плоскость, перпендикулярная соединяющей их линии, служит разделяющей гиперплоскостью. Процесс повторяется, пока число элементов данных в каждом подпространстве не станет меньше заданного порога.


Чтобы найти любую точку в этом пространстве, можно обходить бинарное дерево, начиная с корня. Каждый промежуточный узел(маленькие квадраты на дереве выше)задаёт гиперплоскость, по которой можно определить, следует ли дальше переходить к левому или правому дочернему узлу. Поиск точки можно выполнить за логарифмическое время, соответствующее высоте дерева.
Преимущества: достаточно высокая точность для данных низкой размерности Недостатки: не позволяет полностью учесть сложность данных, точность для многомерных данных ниже
2、Методы на основе графов
Методы на основе графов используют эту структуру данных и связность соседних узлов для построения скоростных путей, сводя задачу к обходу графа. Это позволяет быстро сужать область поиска и ускорять поиск. Однако граф — довольно сложная структура данных, и для достижения предельной скорости поиска обычно весь граф загружают в память, что приводит к очень высокому потреблению памяти. Зато поиск выполняется быстро и обеспечивает высокую полноту результатов.
Сейчас среди алгоритмов поиска по графам широко используется прежде всего HNSW (Hierarchical Navigating Small World — иерархический навигационный малый мир), а NSW (Navigating Small World — навигационный малый мир) является его предшественником, с которым тоже стоит ознакомиться.
2.1 NSW
NSW дополняет наивное построение графа следующими правилами: у каждого узла должны быть соседние узлы; соседние узлы должны соединяться рёбрами; число ближайших соседей задаётся пользователем как гиперпараметр. Это главным образом позволяет преодолеть некоторые ограничения наивного метода построения графа.
Процесс построения графа NSW:
При вставке нового узла сначала находят m ближайших к нему узлов, затем соединяют новый узел с этими m узлами。
Процесс поиска NSW:
Для запрашиваемых данных q случайным образом найти в графе входной
узел и его соседей, вычислить расстояния от входного узла и соседей до p; если какой-либо сосед ближе к p, чем входной
узел, выбрать точку с минимальным расстоянием и продолжать, пока не найдётся точка, все соседи которой расположены дальше от запроса, чем она сама.
Как показано на рисунке выше, поиск узла, ближайшего к зелёному узлу query, в построенном графе соседства начинается со случайно выбранных входных
точек: сначала красные длинные связи быстро приводят к узлам рядом с query, затем чёрные короткие связи позволяют найти подходящую точку.
NSW также использует приближённые вычисления и не гарантирует нахождения истинного ближайшего соседа. У точек, вставленных раньше, больше избыточных рёбер, поэтому они с большей вероятностью образуют скоростные магистрали; чем позже вставлена точка, тем меньше вероятность, что у неё будет такая магистраль.
2.1 HNSW
HNSW — усовершенствованный вариант NSW, реализованный главным образом на основе идеи списка с пропусками и разделения на уровни. Каждый уровень представляет собой NSW, поэтому этот метод также можно назвать иерархическим NSW. Чем выше уровень, тем реже расположены узлы и тем больше расстояния между ними;чем ниже уровень, тем больше узлов и связей и тем меньше среднее расстояние.
Преимущества:позволяет находить похожих ближайших соседей в многомерных данных, повышая производительность поиска, недостатки:сложный способ построения графа влияет на эффективность использования памяти.
3、Методы на основе хеширования
Методы на основе хеширования главным образом используют свойства хеш-функций:у данных с высокой степенью сходства схожи и хеш-значения. Хеш-функции позволяют преобразовывать многомерные данные в данные меньшей размерности, значительно повышая эффективность построения индекса. Однако у хеш-функций есть и другое ограничение:данные со схожими хеш-значениями не обязательно похожи, поэтому полнота поиска у такого метода не очень высока. Основной метод на основе хеширования — LSH(Locality-Sensitive
Hashing, локально-чувствительное хеширование). Предполагается, что если два вектора похожи, то похожи и их хеш-значения. С помощью хеш-функции похожие векторы помещают в одну корзину. При поиске сначала находят корзину, наиболее близкую к вектору запроса, затем выполняют поиск по данным внутри неё, вычисляя topk наиболее похожих результатов.
LSH (локально-чувствительное хеширование) — ещё один метод, основанный на разбиении пространства. Он реализуется следующим образом: как показано на рисунке ниже, случайным образом создаётся прямая, разделяющая пространство на положительную и отрицательную стороны. Если вектор находится с положительной стороны этой прямой, ему присваивается 1, а с отрицательной — 0. Затем случайным образом создаётся ещё одна прямая: положительной стороне снова соответствует 1, отрицательной — 0; создавая несколько таких прямых,
мы вычисляем для каждого вектора 4 значений 0 или 1, получая для каждого двоичный код длиной 4 бита. Теперь посмотрим, насколько похожи эти 4 двоичных кода.





Преимущества: очень высокая скорость обработки при масштабировании до больших данных, недостатки: посредственная точность
5、Индексы на основе квантования(Quantized)
5.1、Кластеризация
Если сначала определить приблизительную область поиска для вектора запроса, а затем искать в ней, скорость поиска можно значительно повысить. Сначала выбираем нужное число классов, например 4 класса на рисунке ниже, случайным образом создаём 4 центральные точки и относим каждый вектор к той центральной точке, к которой он ближе всего. Затем по векторам, отнесённым к одному классу, вычисляем средний вектор и переносим центр в эту точку; после этого снова определяем ближайший центр для каждого вектора и повторно распределяем их по классам. Такой повторяющийся процесс называется обучением; в конце положения центров стабилизируются, то есть сходятся. При поиске достаточно найти центр кластера, ближайший к вектору запроса, и выполнить поиск по векторам этого кластера. Тем самым область поиска сужается
5.2、Квантизация(Quantization)
Однако при огромных объёмах векторных данных серьёзной проблемой становится не только скорость поиска, но и расход памяти. В реальных сценариях применения векторы с тысячами измерений и сотни миллионов векторов вовсе не редкость, поэтому потребление памяти может быть очень большим.
Из приведённого выше описания кластеризации мы узнали о центральной точке, которая на самом деле называется центроидом. Можно ли использовать центроид как представителя точек кластера? Вероятно, да. По сути, этот метод — типичный пример Сжатие с потерями ,если показать это на примере изображений, получится следующее:

Хотя при этом теряется часть значений вектора, благодаря связи центроида кластера с векторами, входящими в этот кластер, значительная часть исходной информации сохраняется. И по сравнению с потерей некоторых деталей из-за сжатия с потерями получаемые преимущества весьма существенны. Хранение можно организовать, как показано на рисунке ниже: когда потребуется определённый вектор, по его коду в кодовой книге находят соответствующий центроид, затем восстанавливают конкретные значения этого центроида. Представление вектора кодом центроида и называется векторным квантованием(Quantization)
5.3、Произведенческое квантование PQ(Product Quantization)
После квантования векторов появляется дополнительная кодовая книга. Затраты памяти на сами векторы, несомненно, снижаются, но кодовая книга создаёт новые, причём весьма значительные затраты. При небольшой размерности это ещё не так заметно, однако в реальных сценариях с сотнями и тысячами измерений эта кодовая книга становится пугающе большой. При фиксированном количестве векторов для сохранения качества квантования чем разреженнее их распределение, тем больше требуется векторов кластеров.




При сотнях и тысячах измерений векторов, характерных для реальных приложений, данные становятся очень разреженными. Поэтому в пространстве высокой размерности для сохранения качества квантования может потребоваться огромное число кластеров. Типичный случай показан на рисунке ниже: для вектора размерности 128 может понадобиться 2 в степени 64 центров кластеров, из-за чего кодовая книга для хранения кодов центроидов становится чрезвычайно большой. При этом память, затраченная на хранение этой кодовой книги, уже значительно превышает объём памяти, сэкономленный благодаря самому квантованию
Решение этой проблемы — сначала разбить вектор высокой размерности на несколько подвекторов низкой размерности, а затем независимо квантовать каждый из них. Например, вектор размерности 128 разбивают на 8 подвекторов по 16 измерений, а затем отдельно обучают кластеризацию для каждого из 8 подвекторов размерности 16.
Таким образом, каждый вектор можно квантовать, используя результаты обучения 8 подпространств для соответствующих 8 подвекторов. Размерность каждого подвектора равна 16 и не очень велика, поэтому для каждого подпространства размерности 16 достаточно 256 кластеров, чтобы получить довольно хорошее квантование. Код каждого подвектора лежит в диапазоне 0-255. Объединив коды квантования 8 подвекторов, получаем окончательный код квантования исходного вектора. Иными словами, теперь вектор представлен 8 кодовыми значениями. Каждое подпространство также создаёт собственную подкодовую книгу. При использовании по 8 кодовым значениям из подкодовых книг извлекают 8 подвекторов размерности 16, а затем объединяют их, восстанавливая вектор размерности 128


