首页 > 解决方案 > tf.optimizer 更新稀疏输入的所有现有权重

问题描述

我正在使用 tf 通过 FTRLOp 为稀疏数据集训练 LR 模型。代码片段如下:

feature_columns = [
       tf.feature_column.categorical_column_with_hash_bucket('query_id',15),
       tf.feature_column.categorical_column_with_hash_bucket('ad_id',15),
       tf.feature_column.categorical_column_with_hash_bucket('cat_id',15),
    ]
label_column = tf.feature_column.numeric_column('label', dtype=tf.float32, default_value=0)
columns = feature_columns + [label_column]
cols_to_vars = {}
parsed_example = tf.parse_example(serialized_example, tf.feature_column.make_parse_example_spec(columns))
logits = tf.feature_column.linear_model(
            features=parsed_example,
            feature_columns=feature_columns,
            cols_to_vars=cols_to_vars
        )
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=label, logits=logits))
optimizer = tf.train.FtrlOptimizer(learning_rate=0.5, learning_rate_power=-0.5, initial_accumulator_value=0.5,  l1_regularization_strength=2, l2_regularization_strength=0.1)

trainables = tf.trainable_variables() grads_and_vars = tf.gradients(loss, trainables)

输入是稀疏和分类的,输入有点热并记住非零索引,例如前两条记录是:6、10、13 3、9、12 梯度显示: The result of first record only input: current gradients is: IndexedSlicesValue(values=array([[0.5]], dtype=float32), indices=array([6]), dense_shape=array([15, 1], dtype=int32)) current gradients is: IndexedSlicesValue(values=array([[0.5]], dtype=float32), indices=array([10]), dense_shape=array([15, 1], dtype=int32)) current gradients is: IndexedSlicesValue(values=array([[0.5]], dtype=float32), indices=array([13]), dense_shape=array([15, 1], dtype=int32)) current gradients is: [0.5]

Result of first two input: current gradients is: IndexedSlicesValue(values=array([[0.25], [0.25]], dtype=float32), indices=array([6, 3]), dense_shape=array([15, 1], dtype=int32)) current gradients is: IndexedSlicesValue(values=array([[0.25], [0.25]], dtype=float32), indices=array([10, 9]), dense_shape=array([15, 1], dtype=int32)) current gradients is: IndexedSlicesValue(values=array([[0.25], [0.25]], dtype=float32), indices=array([13, 12]), dense_shape=array([15, 1], dtype=int32)) current gradients is: [0.5]

由于第二条记录在 6、10、13 中没有值,所以我认为在完成第二条记录后渐变不会改变。它似乎与 Ftrl 论文中的计算不同。

有没有指出错误?提前致谢

标签: pythontensorflowlogistic-regressiontfrecord

解决方案


到目前为止,我至少找到了一个原因。权重是通过每批的平均梯度更新的,这对 nn 来说很好。此处详细信息https://stats.stackexchange.com/questions/266968/how-does-minibatch-gradient-descent-update-the-weights-for-each-example-in-a-bat


推荐阅读