【Tensorflow】使用get_variable和safe_embedding_lookup_sparse进行embedding并添加L2正则时的注意事项

本文详述在TensorFlow中使用safe_embedding_lookup_sparse与get_variable进行embedding时,如何正确添加L2正则化,避免将所有变量而非仅使用的embedding权值计入正则损失。
部署运行你感兴趣的模型镜像

使用get_variable和safe_embedding_lookup_sparse进行embedding并添加L2正则时的注意事项

safe_embedding_lookup_sparse能够实现“Lookup embedding results, accounting for invalid IDs and empty features”,配合get_variable进行初始化embedding权值,
使用方法为:

from tensorflow.contrib.layers import safe_embedding_lookup_sparse
weight = tf.get_variable(name="linear_weight".format(name),shape=[vocabulary_size, 1],
initializer=tf.glorot_normal_initializer())

当使用这个方法进行LookUp求embedding之后,如果想要添加变量的L2正则损失,有些同学可能会这样做:

l2_loss = tf.contrib.layers.l2_regularizer(0.001)(tf.trainable_variables())

其实这样的做法时错误的。因为,这样会把所有trainable_variables的变量都添加到了l2正则损失里面,但是实际上我们需要的是“用到的那些trainable_variables”。拿embedding来说,embedding我们初始化了一个很大的权值矩阵,但是实际上我们只使用了我们LookUpTable查到的那部分权值,因此只需要把这部分权值添加进去就行了。
至于为什么上面的做法会把全部的权值都添加进l2,我们看一下tf.get_variabletrainable参数描述:

'''
trainable: If `True` also add the variable to the graph collection
        `GraphKeys.TRAINABLE_VARIABLES` (see `tf.Variable`). `trainable`
        defaults to `True` unless `synchronization` is set to `ON_READ`.
'''

那该怎么解决呢?

embedding = safe_embedding_lookup_sparse(weight, ids, combiner="mean")
tf.add_to_collection(tf.GraphKeys.WEIGHTS,embedding)

首先使用safe_embedding_lookup_sparse得到embedding向量,然后,将该向量添加进tf.GraphKeys.WEIGHTS这个collection里,然后:

l2_regular = tf.contrib.layers.l2_regularizer(0.001)
regularization_loss = tf.contrib.layers.apply_regularization(l2_regular)

即,定义一个l2_regularizer,然后调用tf.contrib.layers.apply_regularization就可以得到实际使用embedding权值的l2正则损失了。注意tf.contrib.layers.apply_regularization(regularizer, weights_list=None)函数其实有两个参数,第一个是正则化方法,第二个是想要执行正则化方法的变量列表,如果为None,则默认取tf.GraphKeys.WEIGHTS中的weight,这就是我们将需要正则化的变量加入该集合的原因,也可以加入别的集合,只要在函数中指明要正则化的变量集合名字即可。

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值