【问题标题】:L1 regularization doesn't force the weight parameters to become zeroL1 正则化不会强制权重参数变为零
【发布时间】:2020-03-05 20:54:29
【问题描述】:

我的目标是通过 SGD 训练自动编码器。通过使用 tensorflow 1.x,我为我的损失函数添加了 L1 正则化,如下所示:

    ........
    ........

    beta = 10e-3

    n_inputs = X_Train.shape[1]
    n_outputs = n_inputs

    X = tf.placeholder(tf.float32, shape=[None, n_inputs])

    weights1 = tf.get_variable("weights1", shape=[n_inputs, n_hidden], dtype=tf.float32, initializer = tf.contrib.layers.variance_scaling_initializer())  
    weights2 = tf.get_variable("weights2", shape=[n_hidden, n_outputs], dtype=tf.float32, initializer = tf.contrib.layers.variance_scaling_initializer())

    biases1 = tf.get_variable("biases1", shape=[n_hidden], initializer = tf.zeros_initializer())
    biases2 = tf.get_variable("biases2", shape=[n_outputs], initializer = tf.zeros_initializer())

    hidden = activation(tf.matmul(X, weights1) + biases1)
    outputs = tf.matmul(hidden, weights2) + biases2 

    reconstruction_loss = tf.reduce_mean(tf.square(outputs - X))
    reg_loss = beta * (tf.reduce_sum(tf.abs(weights1)) + tf.reduce_sum(tf.abs(weights2))) 

    loss = reconstruction_loss + reg_loss 

    training_op = tf.train.AdamOptimizer(learning_rate).optimizer.minimize(loss)

    init = tf.global_variables_initializer()
    .......
    .......

训练后,我计算了 weights1 矩阵中零的个数。我发现所有的 weights1[i][j] ≠ 0。有什么问题?

【问题讨论】:

  • 我相信你的参数会在零附近振荡,通过添加/减去 delta = 学习率 * 正则化常数。如果一个参数为正且小于 delta,它将变为负数并再次小于 delta,然后返回。

标签: tensorflow neural-network


【解决方案1】:

L1 正则化使网络将无用的权重推向 0,但它不会通过蛮力将 0 分配给它们。它们会接近 0,但不会接近 0。

见:Is the L1 regularization in Keras/Tensorflow *really* L1-regularization?

详细解答

【讨论】:

  • 谢谢,我知道 L2 正则化会将权重参数强制为零(但绝不会完全为零)。但是 L1 正则化迫使权重参数变为零
  • 这是一个修改损失(以及梯度)的正则化;它不会“强迫”任何事情。你试过增加beta吗?这将使正则化更强,并可能产生预期的结果。
  • 这很复杂,但总体而言,权重被推到零,但很难准确地达到 0,我编辑了我的答案以添加一个问题的链接,其中包含为什么会这样的答案
  • 使用 L1 正则化 ( beta = 10e-2 ) w1: [[ 9.1070933e-06 -1.8132891e-05 2.7440405e-05 ... 9.9110139e-06 -1.9736017e-06 -6.1299079e -06] [-3.8850612e-06 -8.6495111e-06 5.6615418e-06 ... 1.3068163e-05 -1.1937200e-06 1.9667727e-05] ... 没有 L1 正则化 w1: [[ 0.04745267 0.172359 ...0.0472359 ...0.0. 0.11409388 -0.26360482] [ 0.25440112 -0.40187 -0.22634292 ... 0.16455233 0.0246956 -0.24465105] ... 我怎样才能鼓励稀疏?但是,在这种情况下,L1 不保证它
  • 如何在 tensorflow 1.x 中使用活动正则化?
猜你喜欢
  • 2015-04-20
  • 2015-12-21
  • 2021-05-05
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多