python - 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 论文中的计算不同。
有没有指出错误?提前致谢
解决方案
到目前为止,我至少找到了一个原因。权重是通过每批的平均梯度更新的,这对 nn 来说很好。此处详细信息https://stats.stackexchange.com/questions/266968/how-does-minibatch-gradient-descent-update-the-weights-for-each-example-in-a-bat
推荐阅读
- mongodb - 我有一个 MongoDB 数据库,我只希望特定用户访问他的私人数据
- ios - 将 Objective-C malloc 转换为 Swift
- tsql - SQL Server 执行计划和扩展视图
- mongodb - 在 mongodb 副本上调用 serverStatus() 返回相同的信息
- php - Laravel - 建立 HasManyThrough 关系提供了一个独特的集合
- javascript - 具有动态 ID 的 JQuery/Javascript 函数
- signals - 如何从转储文件更新中生成数字信号?
- php - 信号量在 LAMP 中未按预期工作
- codeigniter - 无法在我的远程服务器上保存生成的 pdf
- php - 使用 php 数组的名称创建新链接