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