Уличный алгоритм
В линейной алгебре алгоритм Штрассена , названный в честь Фолькера Штрассена , представляет собой алгоритм умножения матриц . Он быстрее, чем стандартный алгоритм умножения матриц для больших матриц, с лучшей асимптотической сложностью , хотя наивный алгоритм часто лучше подходит для меньших матриц. Алгоритм Штрассена медленнее самых быстрых известных алгоритмов для чрезвычайно больших матриц, но такие галактические алгоритмы бесполезны на практике, поскольку они намного медленнее для матриц практического размера. Для небольших матриц существуют еще более быстрые алгоритмы.
Алгоритм Штрассена работает для любого кольца , например плюс/умножение, но не для всех полуколец , например мин-плюс или булевой алгебры , где все еще работает наивный алгоритм, и так называемого комбинаторного умножения матриц .
История
[ редактировать ]Фолькер Штрассен впервые опубликовал этот алгоритм в 1969 году и тем самым доказал, что общий алгоритм умножения матриц не был оптимальным. [1] Публикация алгоритма Штрассена привела к увеличению количества исследований по умножению матриц, которые привели как к асимптотически нижним оценкам, так и к улучшению вычислительных верхних границ.
Алгоритм
[ редактировать ]
Позволять , быть двумя квадратными матрицами над кольцом , например матрицы, элементы которых являются целыми или действительными числами. Целью умножения матриц является вычисление произведения матрицы. . Следующее описание алгоритма предполагает, что все эти матрицы имеют размеры, являющиеся степенями двойки (т. е. ), но это лишь концептуально необходимо — если матрицы , не относятся к типу , «недостающие» строки и столбцы можно заполнить нулями, чтобы получить матрицы с размерами степеней двойки, хотя реальные реализации алгоритма на практике этого не делают.
Разделения алгоритма Штрассена , и одинакового размера на блочные матрицы
с . Наивный алгоритм будет таким:
Данная конструкция не уменьшает количество умножений: для вычисления матриц, то же количество умножений, необходимое при использовании стандартного умножения матриц.
Вместо этого алгоритм Штрассена определяет новые значения:
используя всего 7 умножений (по одному на каждое ) вместо 8. Теперь мы можем выразить с точки зрения :
Мы рекурсивно повторяем этот процесс деления до тех пор, пока подматрицы не вырождаются в числа (элементы кольца ). Если, как упоминалось выше, исходная матрица имела размер, не являющийся степенью 2, то результирующее произведение будет иметь нулевые строки и столбцы, как и и , и затем на этом этапе они будут удалены, чтобы получить (меньшую) матрицу мы очень хотели.
Практическая реализация алгоритма Штрассена переключается на стандартные методы умножения матриц для достаточно маленьких подматриц, для которых эти алгоритмы более эффективны. Конкретная точка пересечения, для которой алгоритм Штрассена более эффективен, зависит от конкретной реализации и аппаратного обеспечения. Ранее авторы подсчитали, что алгоритм Штрассена работает быстрее для матриц шириной от 32 до 128 для оптимизированных реализаций. [2] Однако было замечено, что эта точка пересечения в последние годы увеличивается, и исследование 2010 года показало, что даже один шаг алгоритма Штрассена часто не приносит пользы для современных архитектур по сравнению с высокооптимизированным традиционным умножением, пока размеры матрицы не превысят 1000 или более, и даже для размеров матриц в несколько тысяч выигрыш обычно в лучшем случае незначителен (около 10% или меньше). [3] Более недавнее исследование (2016 г.) выявило преимущества для матриц размером всего 512 и около 20%. [4]
Форма Винограда
[ редактировать ]Можно уменьшить количество сложений матриц, используя вместо этого следующую форму, открытую Виноградом:
где .
Это уменьшает количество сложений и вычитаний матриц с 18 до 15. Количество умножений матриц по-прежнему равно 7, а асимптотическая сложность та же. [5]
Асимптотическая сложность
[ редактировать ]Схема приведенного выше алгоритма показала, что можно обойтись всего 7 вместо традиционных 8 матричных умножений для подблоков матрицы. С другой стороны, приходится делать сложение и вычитание блоков, хотя по общей сложности это не имеет значения: Сложение матриц размера требуется только операции, тогда как умножение существенно дороже (традиционно операции сложения или умножения).
Тогда вопрос заключается в том, сколько именно операций нужно для алгоритмов Штрассена и как это соотносится со стандартным умножением матриц, которое занимает примерно (где ) арифметические операции, т.е. асимптотическая сложность .
Количество сложений и умножений, необходимых в алгоритме Штрассена, можно рассчитать следующим образом: пусть быть числом операций за матрица. Затем, рекурсивно применив алгоритм Штрассена, мы видим, что , для некоторой константы это зависит от количества сложений, выполняемых при каждом применении алгоритма. Следовательно , т. е. асимптотическая сложность умножения матриц размера использование алгоритма Штрассена . Однако за уменьшение количества арифметических операций приходится несколько снижать числовую стабильность . [6] и алгоритм также требует значительно больше памяти по сравнению с наивным алгоритмом. Обе исходные матрицы должны иметь размеры, расширенные до следующей степени 2, что приводит к хранению в четыре раза большего количества элементов, а каждая из семи вспомогательных матриц содержит четверть элементов расширенных.
Алгоритм Штрассена следует сравнить с «наивным» способом умножения матриц, который потребует 8 вместо 7 умножений подблоков. Тогда это привело бы к сложности, которую можно ожидать от стандартного подхода: . Сравнение этих двух алгоритмов показывает, что асимптотически алгоритм Штрассена быстрее: существует размер так что матрицы большего размера более эффективно умножаются с помощью алгоритма Штрассена, чем «традиционным» способом. Однако из асимптотического утверждения не следует, что алгоритм Штрассена всегда быстрее даже для маленьких матриц, и на практике это на самом деле не так: для маленьких матриц стоимость дополнительных добавлений матричных блоков перевешивает экономию на количестве умножения. Существуют и другие факторы, не учтенные в приведенном выше анализе, например, разница в стоимости современного оборудования между загрузкой данных из памяти в процессоры и стоимостью фактического выполнения операций с этими данными. Вследствие такого рода соображений алгоритм Штрассена обычно используется только с «большими» матрицами. Этот вид эффекта еще более выражен при использовании альтернативных алгоритмов, таких как алгоритм Копперсмита и Винограда : хотя асимптотически даже быстрее, точка пересечения настолько велик, что этот алгоритм обычно не используется для матриц, встречающихся на практике.
Ранг или билинейная сложность
[ редактировать ]Билинейная сложность или ранг билинейного отображения является важным понятием асимптотической сложности умножения матриц. Ранг билинейного отображения над полем F определяется как (что-то вроде злоупотребления обозначениями )
Другими словами, ранг билинейного отображения — это длина его кратчайшего билинейного вычисления. [7] Существование алгоритма Штрассена показывает, что ранг умножение матрицы не более семи. Чтобы убедиться в этом, давайте представим этот алгоритм (наряду со стандартным алгоритмом) как такое билинейное вычисление. В случае матриц двойственные пространства A * и B * состоят из отображений в поле F , индуцированных скалярным двойным скалярным произведением (т.е. в данном случае суммой всех элементов произведения Адамара ).
Стандартный алгоритм | Уличный алгоритм | ||||||
1 | |||||||
2 | |||||||
3 | |||||||
4 | |||||||
5 | |||||||
6 | |||||||
7 | |||||||
8 | |||||||
Можно показать, что общее количество элементарных умножений необходимое для умножения матриц тесно асимптотически связано с рангом , то есть или, более конкретно, поскольку константы известны, . Одним из полезных свойств ранга является то, что он субмультипликативен для тензорных произведений , и это позволяет показать, что умножение матриц может быть выполнено не более чем за элементарное умножение любого . (Этот -кратное тензорное произведение карта умножения матрицы сама на себя — -я тензорная степень — реализуется на рекурсивном этапе показанного алгоритма.)
Поведение кэша
[ редактировать ]Алгоритм Штрассена не учитывает кэш . Анализ алгоритма поведения кэша показал, что он несет
кеш промахивается во время своего выполнения, предполагая, что кеш идеализированного размера (т.е. с линии длины ). [8] : 13
Рекомендации по реализации
[ редактировать ]Этот раздел нуждается в дополнительных цитатах для проверки . ( январь 2015 г. ) |
В приведенном выше описании указано, что матрицы имеют квадратную форму, а размер равен степени двойки, и что при необходимости следует использовать заполнение. Это ограничение позволяет рекурсивно разбивать матрицы пополам, пока не будет достигнут предел скалярного умножения. Ограничение упрощает объяснение и анализ сложности, но на самом деле не является необходимым; [9] и на самом деле, заполнение матрицы, как описано, увеличит время вычислений и может легко устранить довольно небольшую экономию времени, полученную в первую очередь при использовании этого метода.
Хорошая реализация будет наблюдать следующее:
- Нет необходимости и нежелательно использовать алгоритм Штрассена вплоть до предела скаляров. По сравнению с обычным умножением матриц этот алгоритм добавляет значительные нагрузка на сложение/вычитание; поэтому ниже определенного размера лучше использовать обычное умножение. Так, например, не нужно дополнять , поскольку его можно разделить на Затем на этом уровне можно использовать матрицы и обычное умножение.
- Этот метод действительно можно применить к квадратным матрицам любой размерности. [3] Если размер четный, они делятся пополам, как описано. Если размерность нечетная, сначала применяется заполнение нулями одной строки и одного столбца. Такое дополнение можно применять «на лету» и лениво, а лишние строки и столбцы отбрасываются по мере формирования результата. Например, предположим, что матрицы . Их можно разделить так, чтобы верхняя левая часть была и правый нижний угол . Везде, где этого требуют операции, размеры дополняются нулями до первый. Обратите внимание, например, что произведение используется только в нижней строке вывода, поэтому требуется только ряды высокие; и, следовательно, левый фактор использовать для его создания нужно только ряды высокие; соответственно, нет необходимости дополнять эту сумму до ряды; нужно только проложить к столбцы для соответствия .
Более того, нет необходимости, чтобы матрицы были квадратными. Неквадратные матрицы можно разделить пополам, используя те же методы, в результате чего неквадратные матрицы будут меньшего размера. Если матрицы достаточно неквадратны, имеет смысл свести первоначальную операцию к более квадратным произведениям, используя простые методы, которые по сути являются , например:
- Продукт размером можно сделать как 20 отдельных операции, организованные для формирования результата;
- Продукт размером можно сделать как 10 отдельных операции, суммированные для формирования результата.
Эти методы усложнят реализацию по сравнению с простым заполнением квадрата степени двойки; однако разумно предположить, что любой, кто приступит к реализации Штрассена, а не к обычному умножению, будет отдавать более высокий приоритет вычислительной эффективности, чем простоте реализации.
На практике алгоритм Штрассена может быть реализован для достижения большей производительности, чем обычное умножение, даже для матриц такого маленького размера, как , для матриц, которые совсем не являются квадратными и не требуют рабочего пространства за пределами буферов, которые уже необходимы для высокопроизводительного обычного умножения. [4]
См. также
[ редактировать ]- Вычислительная сложность математических операций
- Элиминация Гаусса – Джордана
- Вычислительная сложность умножения матриц
- Кривая Z-порядка
- Алгоритм Карацубы для умножения n -значных целых чисел в вместо того, чтобы в время
- Похожий алгоритм комплексного умножения умножает два комплексных числа, используя 3 действительных умножения вместо 4.
- Алгоритм Тума-Кука , более быстрое обобщение алгоритма Карацубы, которое позволяет рекурсивное разложение по принципу «разделяй и властвуй» на более чем два блока одновременно.
Ссылки
[ редактировать ]- ^ Штрассен, Волкер (1969). «Исключение по Гауссу не оптимально». Число. Математика . 13 (4): 354–356. дои : 10.1007/BF02165411 . S2CID 121656251 .
- ^ Скиена, Стивен С. (1998), «§8.2.3 Умножение матриц», Руководство по разработке алгоритмов , Берлин, Нью-Йорк: Springer-Verlag , ISBN 978-0-387-94860-7 .
- ^ Jump up to: а б Д'Альберто, Паоло; Николау, Александру (2005). Использование рекурсии для повышения производительности ATLAS (PDF) . Шестой международный симпозиум. по высокопроизводительным вычислениям.
- ^ Jump up to: а б Хуан, Цзяньюй; Смит, Тайлер М.; Генри, Грег М.; ван де Гейн, Роберт А. (13 ноября 2016 г.). Перезагрузка алгоритма Штрассена . SC16: Международная конференция по высокопроизводительным вычислениям, сетям, хранению и анализу . IEEE Пресс. стр. 690–701. дои : 10.1109/SC.2016.58 . ISBN 9781467388153 . Проверено 1 ноября 2022 г.
- ^ Кнут (1997) , с. 500.
- ^ Уэбб, Миллер (1975). «Вычислительная сложность и численная устойчивость». СИАМ Дж. Компьютер . 4 (2): 97–107. дои : 10.1137/0204009 .
- ^ Бургиссер; Клаузен; Шокроллахи (1997). Алгебраическая теория сложности . Издательство Спрингер. ISBN 3-540-60582-7 .
- ^ Фриго, М.; Лейзерсон, CE ; Прокоп, Х. ; Рамачандран, С. (1999). Алгоритмы, не обращающие внимания на кэш (PDF) . Учеб. IEEE симп. по основам информатики (FOCS). стр. 285–297.
- ^ Хайэм, Николас Дж. (1990). «Использование быстрого матричного умножения в BLAS уровня 3» (PDF) . Транзакции ACM в математическом программном обеспечении . 16 (4): 352–368. дои : 10.1145/98267.98290 . hdl : 1813/6900 . S2CID 5715053 .
- Томас Х. Кормен , Чарльз Э. Лейзерсон , Рональд Л. Ривест и Клиффорд Стейн . Введение в алгоритмы , второе издание. MIT Press и McGraw-Hill, 2001. ISBN 0-262-03293-7 . Глава 28: Раздел 28.2: Алгоритм Штрассена для умножения матриц, стр. 735–741.
- Кнут, Дональд (1997). Искусство компьютерного программирования, получисловые алгоритмы . Том. II (3-е изд.). Аддисон-Уэсли. ISBN 0-201-89684-2 .
Внешние ссылки
[ редактировать ]- Вайсштейн, Эрик В. «Формулы Штрассена» . Математический мир . (также включает формулы для быстрого обращения матрицы )
- Тайлер Дж. Эрнест, Алгоритм Штрассена для механизма сотовой широкополосной связи