Схемы квантования обычно недифференцируемы, потому что они проходят через порог, такой как функция округления или знака.Это означает, что мы не можем получить градиент обучаемых переменных из-за природы правила цепочки.
Вместо этого мы можем использовать трюк с именем 'прямой анализ *' 1004 *, который позволяет нам распространять градиент отдельных обучаемых переменных в обратном направлении.
Одна такаяМетод tf.fake_quant_with_min_max_vars . Преимущества этого формата в том, что он может представлять произвольные величины диапазонов, они не должны быть симметричными, он может представлять значения со знаком и без знака, а линейный разброс делает выполнениеумножения просто. Блог , Бумага .
Итак, мой вопрос, можем ли мы дифференцировать функцию fake_quant?И если да, применяется ли эта функция «сквозной оценщик»?
Я сделал это немного с помощью некоторого фрагмента кода
x = tf.cast (np.random.normal (0,1, (10,10), tf.float32)
x_q = tf.fake_quant_with_min_max_vars (x, min = tf.reduce_min (x), max = tf.reduce_max (x), num_bits = 3)
grad = tf.gradients (x_q, x)
В этом случае почти каждый град имеет значение 1 (т. е. градиент 1), что означает, что он проходит через сам градиент.
Однако иногда несколькосэмплы имеют градиент 0 или другую постоянную, например, 2, 3, 4 ...
Я пропустил, что происходит?