【问题标题】:How to exactly add L1 regularisation to tensorflow error function如何准确地将 L1 正则化添加到 tensorflow 误差函数中
【发布时间】:2016-04-19 00:12:43
【问题描述】:

嘿,我是 tensorflow 的新手,即使经过很多努力也无法添加 L1 正则化项到误差项

x = tf.placeholder("float", [None, n_input])
# Weights and biases to hidden layer
ae_Wh1 = tf.Variable(tf.random_uniform((n_input, n_hidden1), -1.0 / math.sqrt(n_input), 1.0 / math.sqrt(n_input)))
ae_bh1 = tf.Variable(tf.zeros([n_hidden1]))
ae_h1 = tf.nn.tanh(tf.matmul(x,ae_Wh1) + ae_bh1)

ae_Wh2 = tf.Variable(tf.random_uniform((n_hidden1, n_hidden2), -1.0 / math.sqrt(n_hidden1), 1.0 / math.sqrt(n_hidden1)))
ae_bh2 = tf.Variable(tf.zeros([n_hidden2]))
ae_h2 = tf.nn.tanh(tf.matmul(ae_h1,ae_Wh2) + ae_bh2)

ae_Wh3 = tf.transpose(ae_Wh2)
ae_bh3 = tf.Variable(tf.zeros([n_hidden1]))
ae_h1_O = tf.nn.tanh(tf.matmul(ae_h2,ae_Wh3) + ae_bh3)

ae_Wh4 = tf.transpose(ae_Wh1)
ae_bh4 = tf.Variable(tf.zeros([n_input]))
ae_y_pred = tf.nn.tanh(tf.matmul(ae_h1_O,ae_Wh4) + ae_bh4)



ae_y_actual = tf.placeholder("float", [None,n_input])
meansq = tf.reduce_mean(tf.square(ae_y_actual - ae_y_pred))
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(meansq)

在此之后,我使用

运行上面的图表
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

n_rounds = 100
batch_size = min(500, n_samp)
for i in range(100):
    sample = np.random.randint(n_samp, size=batch_size)
    batch_xs = input_data[sample][:]
    batch_ys = output_data_ae[sample][:]
    sess.run(train_step, feed_dict={x: batch_xs, ae_y_actual:batch_ys})

以上是4层自动编码器的代码, “meansq”是我的平方损失函数。如何为网络中的权重矩阵(张量)添加 L1 重保证?

【问题讨论】:

  • L1 可以用 sum 和 abs 运算符实现,这两种运算符都存在于 tensorflow 中(包括它们的梯度)
  • 0.001*tf.reduce_sum(tf.abs(parameters)) 为您提供参数向量的 L1 范数(在这种情况下,从技术上讲,可能是更高等级的张量),因此以此来惩罚您的学习
  • 非常感谢 +yaroslav。所以对于我来说,它应该像 (?) meanq = tf.reduce_mean(tf.square(ae_y_actual - ae_y_pred)) + 0.001*tf.reduce_sum(tf.abs(ae_Wh1)) + 0.001*tf.reduce_sum(tf. abs(ae_Wh1)) 我说的对吗?
  • 嗨@Abhishek 我想知道你的 l_1 正则化器的实现是否有效,以及它是否可以在 tensorFlow 中导出。这是正确的?谢谢

标签: python neural-network tensorflow deep-learning


【解决方案1】:

您可以使用 TensorFlow 的 apply_regularizationl1_regularizer 方法。 注意:这是针对 Tensorflow 1 的,并且 API 在 Tensorflow 2 中有所更改,请参阅下面的编辑。

基于您的问题的示例:

import tensorflow as tf

total_loss = meansq #or other loss calcuation
l1_regularizer = tf.contrib.layers.l1_regularizer(
   scale=0.005, scope=None
)
weights = tf.trainable_variables() # all vars of your graph
regularization_penalty = tf.contrib.layers.apply_regularization(l1_regularizer, weights)

regularized_loss = total_loss + regularization_penalty # this loss needs to be minimized
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(regularized_loss)

注意:weightslist,其中每个条目都是 tf.Variable

已编辑: 正如Paddy 正确指出的那样,在 Tensorflow 2 中,他们更改了正则化器的 API。在 Tensorflow 2 中,L1 正则化被描述为here

【讨论】:

  • tf.trainable_variables() 是否也包括偏差??
  • 应该。 tf.trainable_variables() 返回变量列表,因此您可以遍历它们以查看变量是否实际存在。 (见tensorflow.org/programmers_guide/variables
  • 我问的原因是,通常人们不会正则化,正如你在许多论文中看到的那样,只是权重是正则化的。
  • 说得很好,谢谢。偏差通常不是正则化的。此外,通常您不会对图的所有权重应用 L1 正则化 - 上面的代码 sn-p 应该只是演示如何使用正则化的原理。
  • tf.contrib.layers.l1_regularizer 不再可用
【解决方案2】:

您也可以使用slim losses 中的 tf.slim.l1_regularizer()。

【讨论】:

  • 如果您包含一个小代码示例,您的答案可能会更有帮助
猜你喜欢
  • 1970-01-01
  • 2017-08-26
  • 2017-11-22
  • 2020-01-30
  • 2020-02-11
  • 2017-07-30
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多