Модуль: Введение в нейронные сети


Векторизация вычислений


Войдите на сайт, чтобы ответы сохранялись и баллы за тетрадь засчитывались.

Сколько операций стоит один слой

На четырёх заказах цикл незаметен. Посмотрим на реальный порядок величин.

Умножение таблицы формы (300, 300) на таблицу (300, 100) требует 300 · 100 · 300 = 9 000 000 умножений. И это один слой на одном шаге. При обучении такой шаг повторяется десятки тысяч раз.

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

Векторизация — запись вычисления целиком над тензорами, без цикла по отдельным числам. Вместо перебора элементов вызывается одна операция, и работу выполняет библиотека, написанная на языке C: она считает блоками и укладывает данные в кэш процессора.

Измеренная разница

Посчитаем одно и то же произведение (300, 300) на (300, 100) тремя способами: тремя вложенными циклами, одним циклом по заказам и одной операцией @.

Результаты у всех трёх совпадают полностью — это проверяется сравнением с допуском, а не сравнением на равенство, потому что у дробных чисел последние знаки расходятся при разном порядке действий.

Таблица 13. Время трёх способов на одной и той же задаче

способвремя, секунды
три вложенных циклаоколо 2.5
один цикл по заказамоколо 0.003
одна операция @около 0.0008

Читаем сверху вниз: каждая следующая строка быстрее предыдущей. Между первой и третьей разница примерно в три тысячи раз.

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

Когда цикл убрать нельзя

Цикл по примерам почти всегда лишний. Правило такое: если внутри цикла выполняется одна и та же операция над разными элементами, в библиотеке она уже есть. Сумма, максимум с нулём, сумма произведений, среднее по столбцам — всё это отдельные операции.

Цикл остаётся нужен там, где шаги зависят друг от друга: следующий использует результат предыдущего. Обучение сети — как раз такой случай, и цикл по шагам обучения в главе 2 убрать не удастся. А вот цикл по заказам внутри одного шага убирается всегда.

Убрав цикл, результат надо сверить с прежним: векторная запись часто считает не совсем то же самое, и без сверки это остаётся незамеченным.


Какой цикл убрать не получится?