[Перевод] Ускоряем работу нейросетей с помощью хеширования
Индустрия сконцентрировалась на ускорении перемножений матриц, однако улучшение алгоритма поиска может привести к более серьёзному повышению быстродействия
В частности, довольно много усилий было положено на разработку специального железа, на котором можно выполнять эти вычисления. В последние годы компьютерная индустрия была занята, пытаясь ускорить вычисления, требуемые для искусственных нейросетей – как для обучения, так и для получения выводов её работы. Позже Nvidia представила V100 Graphics Processing Unit, описывая его, как чип, специально разработанный для обучения и использования ИИ, а также для других высокопроизводительных вычислительных нужд. В Google разработали Tensor Processing Unit, или TPU, впервые представленный публике в 2016-м. Полно и иных стартапов, концентрирующихся на других типах аппаратных ускорителей.
Возможно, все они совершают грандиозную ошибку.
В ней её авторы, Бейди Чен, Тарун Медини и Аншумали Шривастава из университета Райса, доказывают, что, возможно, специальное оборудование, разрабатываемое для работы нейросетей, оптимизируется не под тот алгоритм. Такая мысль озвучена в работе, появившейся в середине марта на сайте arXiv.
Матрицы используются потому, что каждое входное значение для нейрона умножается на соответствующий весовой параметр, а затем все они суммируются – и это умножение со сложением и есть базовая операция перемножения матриц. Всё дело в том, что работа нейросетей обычно зависит от того, насколько быстро оборудование может выполнять умножение матриц, используемых для определения выходных параметров каждого искусственного нейтрона – его «активации» – для заданного набора входных значений.
Поэтому, если знать, что это за нейроны, их можно просто игнорировать. Исследователи из университета Райса, как и некоторые другие учёные, поняли, что активация многих нейронов в определённом слое нейросети оказывается слишком малой, и не влияет на выходное значение, подсчитываемое последующими слоями.
Но исследователи поняли, что на самом деле можно определиться с этим более эффективным способом, если посмотреть на проблему под другим углом. Может показаться, что единственным способом узнать, какие нейроны в слое не активируются, будет сначала произвести все операции матричного перемножения для этого слоя. «Мы подходим к этому вопросу, как к решению задачи поиска», — говорит Шривастава.
Преимущество такого подхода в задаче состоит в том, что можно использовать обобщённую стратегию, давно уже усовершенствованную специалистами по информатике с целью ускорения поиска данных в базе: хеширование. То есть, вместо того, чтобы вычислять умножения матриц и смотреть, какие нейроны активировались для заданных входных данных, можно просто посмотреть, какие это нейроны в базе данных.
Вы используете хеш, легко рассчитываемый через применение хеш-функции к нужной величине, указывающий, где это значение должно храниться в базе. Хеширование позволяет вам быстро проверить, есть ли нужное значение в таблице базы данных, без необходимости последовательно проходить каждую её строчку. Потом можно проверить только одно это место, чтобы узнать, хранится ли там это значение.
Проиллюстрировать их подход поможет следующий пример: Исследователи сделали нечто подобное для подсчётов, связанных с нейросетями.
Допустим, что входные данные – это серые пиксели в массиве 16х16, то есть, всего это 256 чисел. Допустим, мы создали нейросеть, распознающую рукописный ввод цифр. Скормим эти данные одному скрытому слою из 512 нейронов, результаты активации которых скармливаются выходному слою из 10 нейронов, по одному на каждую из возможных цифр.
Здесь хеш входных значений H1 используется для поиска соответствующих нейронов в первом скрытом слое – в данном случае это будут нейроны 2 и 4. Таблицы из сетей: до расчёта активации нейронов в скрытых слоях мы используем хеши, помогающие нам определить, какие нейроны окажутся активированными. Такая стратегия уменьшает количество активаций, которые необходимо рассчитать. Второй хеш H2 показывает, какие нейроны из второго скрытого слоя внесут свой вклад.
Когда ей на вход поступает разборчиво написанная цифра, активация одного из выходных нейронов (соответствующнго этой цифре) будет близка к 1. Такую сеть довольно сложно тренировать, но пока что опустим этот момент, и представим, что мы уже подстроили все веса каждого из нейронов так, что нейросеть прекрасно распознаёт рукописные цифры. Классически, работа такой неросети требует провести по одному перемножению матриц для каждого из 512 скрытых нейронов, и ещё по одной для каждого выходного – что даёт нам очень много перемножений. Активации остальных девяти будут близки к 0.
Первый шаг – хеширование весов каждого из 512 нейронов в скрытом слое при помощи «хеширования, чувствительного к расположению» [locality sensitive hashing], одно из свойств которого состоит в том, что сходные входные данные дают сходные значения хешей. Исследователи применяют иной подход. Каждую группу можно хранить в базе данных, и определять по хешу входных значений, которые приведут к активации данной группы нейронов. Затем можно сгруппировать нейроны с похожими хешами, что будет означать, что у этих нейронов сходные наборы весов.
Нужно прогнать 256 входных величин через легко вычисляемые хеш-функции, и использовать результат для поиска в базе данных тех нейронов, которые будут активированы. После всего этого хеширования оказывается легко определять, какие из скрытых нейронов будут активированы некими новыми входными данными. Не нужно подсчитывать активации всех остальных нейронов в слое только для того, чтобы выяснить, что они не вносят своего вклада в результат. Таким способом придётся подсчитать значения активации только для нескольких нейронов, имеющих значение.
Ответ вы получаете быстро потому, что используете для поиска хеши. Подачу на вход такой нейросети данных можно представить, как выполнение поискового запроса к базе данных, который просит найти все нейроны, активировавшиеся бы при прямом подсчёте. А потом можно просто подсчитать активацию небольшого количества нейронов, реально имеющих значение.
Затем они сравнили быстродействие алгоритма обучения с более традиционным подходом, использующим мощный GPU – конкретно, Nvidia V100 GPU. Исследователи применили эту технику, названную ими SLIDE (Sub-LInear Deep learning Engine [сублинейная ситема глубокого обучения]), для обучения нейросети – для процесса, вычислительные запросы которого больше, чем у использования нейросети по назначению. В итоге у них получилось нечто потрясающее: «Наши результаты показывают, что на среднем CPU технология SLIDE может работать на порядки быстрее наилучшей возможной альтернативы, реализуемой на наилучшем оборудовании и с любой точностью».
Но работа определённо подчёркивает опасность увлечения определённого типа железом в случаях, когда существует возможность появления нового и лучшего алгоритма для работы нейросетей. Пока рановато делать выводы о том, выдержат ли эти результаты (которые ещё не оценивали эксперты) проверки и заставят ли они производителей чипов по-другому взглянуть на разработку специального оборудования для глубокого обучения.