Tensorflow或Keras中的离散权重和激活

时间:2016-05-20 08:03:50

标签: tensorflow keras

您是否了解将Tensorflow或Keras约束为一组离散权重并使用离散/刚性激活函数(例如符号或硬度)的方法?

API似乎只有平滑的激活功能。

我还想到的是通过自定义正则化函数对权重进行离散化,但我不知道如何使框架考虑到这一点。

可能我必须扩展(例如)密集层类(相应框架)并定义自定义前向传播函数(及其衍生物)。你有这方面的例子吗?

2 个答案:

答案 0 :(得分:1)

在我看来,改变重量和激活从平滑到离散的可能是Keras的一个大问题。我认为这种方法至少存在两个主要困难:

  1. 优化框架必须完全不同: Keras / Theano在ANN中做得如此出色的主要原因是它们能够自动区分张量函数。这是当今大多数优化算法的主要构建块。将域从连续域更改为离散域会改变优化规则,据我所知,Keras& Theano没有为此做好准备。
  2. 数学问题:您可能想知道简单地舍入每个重量和激活可能是您的问题的一个很好的解决方案。但你必须记住,高度尺寸的离散网格具有一些违反直觉的特性,这可能会产生误导。例如。直径为28 x 28 x 3维单位立方体为50,并且具有巨大数量的顶点(2^dimension)。
  3. 这些是解决您的问题可能非常困难的原因。

答案 1 :(得分:0)

使用功能组合可以在Tensorflow中进行激活和更多激活。对于您引用的两个示例:

zero = tf.constant(0)
one = tf.constant(1)
neg_one = tf.constant(-1)

hard_tanh(x) = tf.minimum(tf.maximum(x, neg_one), one)) 

sign(x) = tf.greater(x, zero)

注意后者返回一个布尔张量,所以如果你需要1和0或1和减1,你可以使用tf.cast来改变数据类型并适当地移位。所有这些功能都实现了渐变。

对于离散权重,我认为您可以在使用之前对权重应用适当的离散激活。这种方法适用于非负矩阵分解等问题,您可以使用整流线性单位将每个更新步骤中的负权重归零。