tf.fake_quant_with_min_max_vars - это дифференцируемая функция?
Схемы квантования обычно недифференцируемы, потому что они проходят через порог, такой как функция округления или знака. Это означает, что мы не можем получить градиент обучаемых переменных из-за природы правила цепочки.
Вместо этого мы можем использовать трюк, называемый "сквозной оценщик", который позволяет нам распространять градиент отдельных обучаемых переменных.
Одним из таких методов является 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...
Я скучаю по тому, что происходит?