Часть IV • Резюме и заключительное слово
3.
sub
с
x
и
means
в качестве входных значений.
4.
div
с результатами шагов 2 и 3 в качестве входных значений.
5.
mul
с
gamma
и результатом шага 4 в качестве входных значений.
6.
add
с
beta
и результатом шага 5 в качестве входных значений.
На основе очевидных арифметических правил можно существенно упростить
уравнение (12.3), если значения
mean
,
var
,
epsilon
,
gamma
и
beta
постоянны (не
меняются в зависимости от входных данных или количества вызовов слоя). По
сле обучения включающей слой BatchNormalization модели все эти переменные
действительно становятся константами. Именно так и работает преобразование
GraphModel
— схлопывает константы и упрощает арифметику, в результате чего полу
чается следующее математически эквивалентное уравнение:
output =
x
*
k
+
b.
(12.4)
Значения
k
и
b
вычисляются во время преобразования
GraphModel
, а не во время
выполнения вывода:
k
= gamma / (sqrt(var) + epsilon);
(12.5)
b
= –mean / (sqrt(var) + epsilon)
×
gamma + beta.
(12.6)
Следовательно, на объем вычислений во время выполнения вывода
не
влияют
уравнения (12.5) и (12.6), а только уравнение (12.4). При сравнении уравнений
(12.3) и (12.4) видно, что схлопывание констант и упрощение арифметики сокра
щает количество операций с шести до двух (операции
mul
между
x
и
k
и операции
add
между
b
и результатом операции
mul
), что значительно ускоряет выполнение
данного слоя. Но почему
tf.LayersModel
не производит подобной оптимизации? Из
за необходимости поддержки обучения слоя BatchNormalization, во время которого
значения
mean
,
var
,
gamma
и
beta
обновляются на каждом шаге обучения. Преобра
зование
GraphModel
извлекает выгоду из того факта, что эти обновленные значения
более не нужны по завершении обучения модели.
Оптимизация, подобная показанной в примере BatchNormalization, возможна
лишь при соблюдении двух требований. Вопервых, вычисления должны произ
водиться на уровне достаточно мелких структурных единиц, то есть на уровне
элементарных математических операций наподобие
mul
и
add
, а не более крупных
послойных операций, на которых основан API слоев TensorFlow.js. Вовторых, все
необходимые операции должны быть известны заранее, до вызовов метода
predict()
модели. Преобразование
GraphModel
производится через библиотеку TensorFlow
(Python), у которой есть доступ к графовому представлению модели, удовлетворя
ющему обоим критериям.
Помимо обсуждавшихся выше схлопывания констант и арифметической оптими
зации, преобразование
GraphModel
способно еще на один вид оптимизации —
слияние
операций
(op fusion). Для примера возьмем часто используемый тип плотного слоя
(
tf.layers.dense()
). Плотный слой включает три операции: матричное умножение
(
matMul
) входного сигнала
x
и ядра W, сложение с транслированием результата
Do'stlaringiz bilan baham: |