量化方案通常是不可微的,因为它们会通过阈值,例如舍入或正负号函数。这意味着由于链式规则的性质,我们无法获得可训练变量的梯度。
相反,我们可以使用称为'straight-through-estimator'的技巧,使我们可以反向传播各个可训练变量的梯度。
一种这样的方法是 tf.fake_quant_with_min_max_vars ,这种格式的优点是可以表示任意大小的范围,它们不必对称,可以表示有符号和无符号值, Blog,Paper。
所以,我的问题是,我们可以区分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)
在那种情况下,几乎每个grad的值都为1(即渐变1),这意味着它会通过渐变本身。
但是,有时一些样本的梯度为0或其他常数,例如2、3、4 ...
我想念发生了什么事吗?