В численном анализе и научных вычислениях разреженная матрица или разреженный массив — это матрица , в которой большинство элементов равны нулю. [1] Не существует строгого определения относительно доли элементов с нулевым значением для того, чтобы матрица считалась разреженной, но общим критерием является то, что количество ненулевых элементов примерно равно количеству строк или столбцов. Напротив, если большинство элементов не равны нулю, матрица считается плотной . [1] Количество элементов с нулевым значением, деленное на общее количество элементов (например, m × n для матрицы m × n ), иногда называют разреженностью матрицы .
Концептуально разреженность соответствует системам с небольшим количеством парных взаимодействий. Например, рассмотрим линию шаров, соединенных пружинами от одного к другому: это разреженная система, поскольку соединены только соседние шары. Напротив, если бы та же линия шаров имела пружины, соединяющие каждый шар со всеми другими шарами, система соответствовала бы плотной матрице. Концепция разреженности полезна в комбинаторике и прикладных областях, таких как теория сетей и численный анализ , которые обычно имеют низкую плотность значимых данных или связей. Большие разреженные матрицы часто появляются в научных или инженерных приложениях при решении уравнений в частных производных .
При хранении и обработке разреженных матриц на компьютере полезно и часто необходимо использовать специализированные алгоритмы и структуры данных , которые используют преимущества разреженной структуры матрицы. Для разреженных матриц были созданы специализированные компьютеры, [2] поскольку они распространены в области машинного обучения. [3] Операции с использованием стандартных структур и алгоритмов плотной матрицы медленны и неэффективны при применении к большим разреженным матрицам, поскольку обработка и память тратятся на нули. Разреженные данные по своей природе легче сжимаются и, таким образом, требуют значительно меньшего объема хранения . Некоторые очень большие разреженные матрицы невозможно обрабатывать с помощью стандартных алгоритмов плотной матрицы.
Важным специальным типом разреженных матриц является ленточная матрица , определяемая следующим образом. Нижняя полоса пропускания матрицы A — это наименьшее число p, такое что элемент a i , j обращается в нуль, когда i > j + p . Аналогично, верхняя полоса пропускания — это наименьшее число p, такое что a i , j = 0, когда i < j − p (Golub & Van Loan 1996, §1.2.1). Например, трехдиагональная матрица имеет нижнюю полосу пропускания 1 и верхнюю полосу пропускания 1 . В качестве другого примера, следующая разреженная матрица имеет нижнюю и верхнюю полосы пропускания, обе равные 3. Обратите внимание, что нули представлены точками для ясности.
Матрицы с достаточно малой верхней и нижней полосой пропускания называются ленточными матрицами и часто поддаются более простым алгоритмам, чем общие разреженные матрицы; или иногда можно применить плотные матричные алгоритмы и повысить эффективность, просто перебрав меньшее количество индексов.
Переставляя строки и столбцы матрицы A, можно получить матрицу A ′ с меньшей пропускной способностью. Для минимизации пропускной способности разработан ряд алгоритмов .
Очень эффективная структура для предельного случая ленточных матриц, диагональной матрицы , заключается в хранении только записей в главной диагонали в виде одномерного массива , поэтому диагональная матрица n × n требует только n записей.
Симметричная разреженная матрица возникает как матрица смежности неориентированного графа ; ее можно эффективно хранить как список смежности .
Блочно -диагональная матрица состоит из подматриц вдоль ее диагональных блоков. Блочно-диагональная матрица A имеет вид
где A k — квадратная матрица для всех k = 1, ..., n .
Заполнение матрицы — это те записи, которые изменяются с начального нуля на ненулевое значение во время выполнения алгоритма. Чтобы уменьшить требования к памяти и количество арифметических операций, используемых во время алгоритма, полезно минимизировать заполнение, переставляя строки и столбцы в матрице. Символическое разложение Холецкого может использоваться для вычисления наихудшего возможного заполнения перед выполнением фактического разложения Холецкого .
Существуют и другие методы, помимо разложения Холецкого . Методы ортогонализации (такие как QR-факторизация) распространены, например, при решении задач методами наименьших квадратов. Хотя теоретическое заполнение остается тем же, на практике «ложные ненули» могут быть разными для разных методов. И символические версии этих алгоритмов могут использоваться таким же образом, как и символический Холецкий, для вычисления наихудшего заполнения.
Для решения разреженных матриц существуют как итерационные , так и прямые методы.
Итерационные методы, такие как метод сопряженных градиентов и GMRES, используют быстрые вычисления произведений матрицы и вектора , где матрица разрежена. Использование предобуславливателей может значительно ускорить сходимость таких итерационных методов.
Матрица обычно хранится в виде двумерного массива. Каждая запись в массиве представляет элемент a i , j матрицы и доступна по двум индексам i и j . Обычно i — это индекс строки, пронумерованный сверху вниз, а j — индекс столбца, пронумерованный слева направо. Для матрицы размером m × n объем памяти, необходимый для хранения матрицы в этом формате, пропорционален m × n (без учета того, что размеры матрицы также необходимо хранить).
В случае разреженной матрицы можно добиться существенного сокращения требований к памяти, сохраняя только ненулевые записи. В зависимости от количества и распределения ненулевых записей можно использовать различные структуры данных, что дает огромную экономию памяти по сравнению с базовым подходом. Компромисс заключается в том, что доступ к отдельным элементам становится более сложным, и для однозначного восстановления исходной матрицы требуются дополнительные структуры.
Форматы можно разделить на две группы:
DOK состоит из словаря , который сопоставляет пары ( строка, столбец) со значением элементов. Элементы, отсутствующие в словаре, считаются равными нулю. Формат хорош для постепенного построения разреженной матрицы в случайном порядке, но плох для итерации по ненулевым значениям в лексикографическом порядке. Обычно матрицу строят в этом формате, а затем преобразуют в другой, более эффективный формат для обработки. [4]
LIL хранит один список на строку, где каждая запись содержит индекс столбца и значение. Обычно эти записи хранятся отсортированными по индексу столбца для более быстрого поиска. Это еще один формат, подходящий для построения инкрементной матрицы. [5]
COO хранит список кортежей (строка, столбец, значение) . В идеале записи сортируются сначала по индексу строки, а затем по индексу столбца, чтобы улучшить время случайного доступа. Это еще один формат, который хорош для построения инкрементной матрицы. [6]
Формат сжатой разреженной строки (CSR) или сжатого хранения строк (CRS) или Йельского формата представляет собой матрицу M на три (одномерных) массива, которые соответственно содержат ненулевые значения, экстенты строк и индексы столбцов. Он похож на COO, но сжимает индексы строк, отсюда и название. Этот формат обеспечивает быстрый доступ к строкам и умножение матрицы на вектор ( M x ). Формат CSR используется по крайней мере с середины 1960-х годов, а первое полное описание появилось в 1967 году. [7]
Формат CSR хранит разреженную матрицу M размером m × n в строковой форме с использованием трех (одномерных) массивов (V, COL_INDEX, ROW_INDEX) . Пусть NNZ обозначает количество ненулевых записей в M. (Обратите внимание, что здесь должны использоваться индексы, отсчитываемые от нуля .)
Например, матрица представляет собой матрицу 4 × 4 с 4 ненулевыми элементами, следовательно
В = [ 5 8 3 6 ]COL_INDEX = [ 0 1 2 1 ]СТРОКА_ИНДЕКС = [ 0 1 2 3 4 ]
предполагая, что язык имеет нулевой индекс.
Чтобы извлечь строку, мы сначала определяем:
row_start = ROW_INDEX[строка]row_end = ROW_INDEX[строка + 1]
Затем мы берем срезы из V и COL_INDEX, начиная с row_start и заканчивая row_end.
Для извлечения строки 1 (второй строки) этой матрицы мы устанавливаем row_start=1
и row_end=2
. Затем мы делаем срезы V[1:2] = [8]
и COL_INDEX[1:2] = [1]
. Теперь мы знаем, что в строке 1 у нас есть один элемент в столбце 1 со значением 8.
В этом случае представление CSR содержит 13 записей по сравнению с 16 в исходной матрице. Формат CSR экономит память только тогда, когда NNZ < ( m ( n − 1) − 1) / 2 .
Другой пример: матрица имеет размер 4 × 6 (24 элемента) с 8 ненулевыми элементами, поэтому
В = [ 10 20 30 40 50 60 70 80 ]COL_INDEX = [ 0 1 1 3 2 3 4 5 ] СТРОКА_ИНДЕКС = [ 0 2 4 7 8 ]
Все хранится в виде 21 записи: 8 в V , 8 в COL_INDEX и 5 в ROW_INDEX .
(10, 20) (30, 40) (50, 60, 70) (80)
, указывая индекс V (и COL_INDEX ), где начинается и заканчивается каждая строка;(10, 20, ...) (0, 30, 0, 40, ...)(0, 0, 50, 60, 70, 0) (0, 0, 0, 0, 0, 80)
.Обратите внимание, что в этом формате первое значение ROW_INDEX всегда равно нулю, а последнее — всегда NNZ , поэтому они в некотором смысле избыточны (хотя в языках программирования, где длина массива должна храниться явно, NNZ не будет избыточным). Тем не менее, это позволяет избежать необходимости обрабатывать исключительный случай при вычислении длины каждой строки, поскольку гарантирует, что формула ROW_INDEX[ i + 1] − ROW_INDEX[ i ] будет работать для любой строки i . Более того, стоимость памяти этого избыточного хранения, вероятно, незначительна для достаточно большой матрицы.
(Старые и новые) форматы разреженных матриц Йельского университета являются примерами схемы CSR. Старый формат Йельского университета работает точно так же, как описано выше, с тремя массивами; новый формат объединяет ROW_INDEX и COL_INDEX в один массив и обрабатывает диагональ матрицы отдельно. [9]
Для матриц логической смежности массив данных можно опустить, поскольку наличие записи в массиве строк достаточно для моделирования бинарного отношения смежности.
Вероятно, он известен как Йельский формат, поскольку был предложен в докладе Йельского разреженного матричного пакета 1977 года на кафедре компьютерных наук Йельского университета. [10]
CSC похож на CSR, за исключением того, что значения сначала считываются по столбцам, для каждого значения сохраняется индекс строки и сохраняются указатели столбцов. Например, CSC — это (val, row_ind, col_ptr) , где val — это массив (сверху вниз, затем слева направо) ненулевых значений матрицы; row_ind — это индексы строк, соответствующие значениям; а col_ptr — это список индексов val , с которых начинается каждый столбец. Название основано на том факте, что информация об индексе столбца сжимается относительно формата COO. Обычно для построения используется другой формат (LIL, DOK, COO). Этот формат эффективен для арифметических операций, разрезания столбцов и произведений матрицы и вектора. Это традиционный формат для указания разреженной матрицы в MATLAB (через sparse
функцию).
Многие библиотеки программного обеспечения поддерживают разреженные матрицы и предоставляют решатели для разреженных матричных уравнений. Следующие библиотеки имеют открытый исходный код:
Термин «разреженная матрица», возможно, был придуман Гарри Марковицем , который инициировал некоторые пионерские работы, но затем оставил эту область. [11]
Вычислительным ядром DNN является умножение больших разреженных и плотных матриц. В области численного анализа разреженная матрица — это матрица, заполненная в основном нулями в качестве элементов таблицы. Напротив, если количество ненулевых элементов в матрице относительно велико, то ее обычно считают плотной матрицей. Доля нулевых элементов (ненулевых элементов) в матрице называется разреженностью (плотностью). Операции с использованием стандартных структур и алгоритмов плотных матриц относительно медленные и потребляют большие объемы памяти при применении к большим разреженным матрицам.
WSE содержит 400 000 вычислительных ядер, оптимизированных для ИИ. Вычислительные ядра, называемые SLAC™ (Sparse Linear Algebra Cores), являются гибкими, программируемыми и оптимизированными для разреженной линейной алгебры, которая лежит в основе всех вычислений нейронных сетей.
WSE — самый большой чип из когда-либо созданных, его площадь составляет 46 225 квадратных миллиметров, он в 56,7 раза больше самого большого графического процессора. Он содержит в 78 раз больше вычислительных ядер, оптимизированных для ИИ, в 3000 раз больше высокоскоростной памяти на кристалле, в 10 000 раз больше пропускной способности памяти и в 33 000 раз больше пропускной способности связи.