【问题标题】:Discrete Weights and Activations in Tensorflow or KerasTensorflow 或 Keras 中的离散权重和激活
【发布时间】:2016-09-17 09:31:16
【问题描述】:

您知道将tensorflowkeras 限制为一组离散权重并使用离散/刚性激活函数(例如signhard-tanh)的方法吗?

API 似乎只有平滑的激活函数。

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

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

【问题讨论】:

    标签: tensorflow machine-learning keras neural-network deep-learning


    【解决方案1】:

    在 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 和减号,您可以使用 tf.cast 更改数据类型并进行适当的移位。所有这些功能都实现了渐变。

    对于离散权重,我想您可以在使用权重之前对权重应用适当的离散激活。这种方法适用于诸如非负矩阵分解之类的事情,在这种分解中,您在每个更新步骤中使用校正线性单元将负权重归零。

    【讨论】:

      【解决方案2】:

      在我看来,将权重和激活从平滑变为离散可能是 Keras 中的一个大问题。我发现这种方法至少有两个主要困难:

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

      这些是解决您的问题可能非常困难的原因。

      【讨论】:

      • 你是对的。这似乎是不可能的。我发现一篇博文展示了如何在使用连续值进行训练后量化模型:petewarden.com/2016/05/03/…
      • 但是,直接使用离散权重进行训练似乎需要完全不同的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      相关资源
      最近更新 更多