Глубокое обучение зависит от скорости. Более быстрое обучение позволяет создавать более крупные и сложные сети. Нам всегда нужны более быстрые сети, чтобы быстрее обнаруживать пешеходов в автономных автомобилях, а также для включения сетей на встроенных устройствах с ограниченными ресурсами и по бесконечному множеству других причин. В архитектурах CNN большую часть времени используют слои свертки. Сегодня мы поговорим о алгоритме Винограда, который может уменьшить количество операций умножения с плавающей запятой в 2,25 раза. Ссылка- http://arxiv.org/abs/1509.09308

Прежде чем мы начнем говорить о Winograd, я надеюсь, вы понимаете, как свертки обычно реализуются в библиотеках глубокого обучения. Они не просто реализованы так, как мы визуализируем извилины в нашем уме. Обычные свертки слишком медленны для реализации, потому что они не могут правильно использовать кэш ЦП и Местность ссылки. Для этого мы преобразуем операции свертки в умножение матриц. Посмотрим, как это делается.

Предположим, у нас есть входное изображение f размера (4) и filter g размера (3).

Затем, используя технику im2col, мы конвертируем входное изображение в

Не волнуйтесь прямо сейчас. Я понимаю, может показаться, что мы увеличили ненужное потребление памяти здесь, но теперь мы можем выполнять матричное умножение с использованием библиотек BLAS, таких как CuBLAS (GPU) или Intel MKL (CPU), которые чрезвычайно оптимизированы для матричного умножения.

Если вы хотите глубже понять это, посетите https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/content/making_faster.html

Но мы люди, всегда стремимся к лучшему. Итак, как мы можем еще больше увеличить скорость? Итак, на сцену выходит Виноград. Итак, вместо скалярного произведения мы вычисляем результирующую матрицу по этой формуле.

Или давайте немного обобщим.

куда:

Таким образом мы можем найти значения m1, m2, m3, m4. Затем используйте их для вычисления свертки вместо скалярного произведения матриц. Здесь мы можем сделать одно наблюдение: значения (g0 + g1 + g2) / 2 и (g0-g1 + g2) / 2 не нужно вычислять на каждом операция свертки, поскольку фильтр остается прежним. Мы можем вычислить их один раз перед сверткой во время обучения и можем сохранить предварительно вычисленными во время логического вывода. Теперь нам понадобится-

4 операции ADD и 4 операции MUL для вычисления значений m1, m2, m3, m4 и 4 операции ADD при вычислении результата с использованием вычисленных значений m1, m2, m3, m4. При выполнении обычных скалярных произведений мы бы выполняли 6 операций MUL вместо 4. Это сокращает затратные в вычислительном отношении операции MUL в 1,5 раза, что очень важно.

В приведенном выше примере я использовал F (4,3), т.е. f (4) и g (3), что дало нам 2 свертки. Минимальный одномерный алгоритм F (m, r) вложен сам с собой, чтобы получить минимальный двумерный алгоритм, F (m x m, r x r). Если мы попробуем это с, f (4,4) и g (3,3), что даст нам 4 свертки, мы увидим, что Winograd метод принимает 4 * 4 = 16 MUL по сравнению с 2 * 2 * 9 = 36 MUL в нормальном ко nvolution, что может уменьшить MUL в 2,25 раза, что немного безумно !!

Заключение

Я надеюсь, что эта статья помогла вам понять, насколько оптимизированы библиотеки, которые вы используете. Я думаю, это дает хорошее объяснение того, как работает Виноград. В следующем посте мы обсудим минимальные алгоритмы фильтрации вложенности, где мы обсудим, как Winograd реализован для различных размеров ядра .

📝 Прочтите этот рассказ позже в Журнале.

👩‍💻 Просыпайтесь каждое воскресное утро и слушайте самые интересные истории из области технологий, ожидающие вас в вашем почтовом ящике. Прочтите информационный бюллетень« Примечательно в технологиях .