TensorFlow或Keras中的离散权重和激活函数

5
你知道有没有一种方法可以将tensorflowkeras约束为一组离散的权重,并使用离散/刚性激活函数(例如像signhard-tanh)?
API似乎只提供了平滑的激活函数。
我还想到通过自定义正则化函数对权重进行离散化,但我不知道如何让框架考虑这一点。
也许我需要扩展(例如)相应框架的密集层类,并定义自定义的前向传播函数(及其导数)。你有任何示例吗?
2个回答

1
在我看来,将平滑的权重和激活函数从连续变为离散可能是Keras中的一个巨大问题。我认为这种方法至少存在两个主要困难:
  1. 优化框架必须完全不同:Keras/Theano之所以在人工神经网络方面表现得如此出色,主要原因是它们能够自动区分张量函数。这是大多数现代优化算法的主要构建块。将域从连续变为离散会改变优化规则,据我所知,Keras和Theano还没有为此做好准备。
  2. 数学问题:你可能会想,简单地四舍五入每个权重和激活函数可能是解决问题的好办法。但你必须记住,高度离散化的网格具有一些反直觉的特性,这可能会非常误导人。例如,28 x 28 x 3维单位立方体的直径为50,拥有巨大数量的顶点(2^dimension)。

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


你是对的。这似乎是不可能的。我找到了一篇博客文章,展示了如何在使用连续值进行训练后量化模型: https://petewarden.com/2016/05/03/how-to-quantize-neural-networks-with-tensorflow/ - ndrizza
然而,直接使用离散权重进行训练似乎需要完全不同的方法。 - ndrizza

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更改数据类型并适当移位。所有这些函数都已实现梯度。
对于离散权重,我想在使用它们之前可以将适当的离散激活应用于权重。这种方法适用于像非负矩阵分解这样的东西,在每个更新步骤中使用修正线性单元将负权重归零。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接