在tf.nn.sampled_softmax_loss中,可选输入之一是放置您自己的样本值。我想提供自己的样本值,以便可以使用float16(半精度)变量。如果sampled_values
为空,Tensorflow将使用log_uniform_candidate_sampler
来获取值,该值只能返回float32。
这里是所有输入。
tf.nn.sampled_softmax_loss(
weights,
biases,
labels,
inputs,
num_sampled,
num_classes,
num_true=1,
sampled_values=None,
remove_accidental_hits=True,
partition_strategy='mod',
name='sampled_softmax_loss',
seed=None
)
https://www.tensorflow.org/api_docs/python/tf/nn/sampled_softmax_loss
这是他们为sampled_values arg提供的信息:
sampled_values:(sampled_candidates,true_expected_count, * _candidate_sampler函数返回的sampled_expected_count)。 (如果为None,则默认为log_uniform_candidate_sampler)
我试图弄清楚如何提供该元组。 sampled_candidates
,true_expected_count
,sampled_expected_count
到底是什么?
我知道它正在对权重和相应的偏差进行采样,因此我是否将它们放到sampled_candidates
的自己的元组中?另外,我是将整数用于权重的位置放置在矩阵中,还是将整个嵌入本身放置?
我还查看了Tensorflow关于负采样的数学补充,但找不到关于我的问题https://www.tensorflow.org/extras/candidate_sampling.pdf的信息
在搜索中,我在Google论坛上发现了一个非常相似的问题
https://groups.google.com/a/tensorflow.org/forum/#!topic/discuss/6IDJ-XAIb9M
给出的答案是
sampled_values
是我们的* candidate_sampler返回的元组 类。这些类实现对对比样本进行采样的方法 根据一些标签(未观察到,但在训练中使用) 分布Q用于近似训练方法,例如 噪声对比估计(NCE)和采样的Softmax。一个例子是 log_uniform_candidate_sampler,它根据 对数均匀分布。您几乎不需要自己提供这些。你会简单地通过 在tf.nn中调用* candidate_sampler函数的结果 模块(其中*可以是“ uniform”,“ log_uniform”,“ zipfian_binned”, 等等),例如
sampled_values = tf.nn.zipfian_binned_candidate_sampler(...)
如果您只想使其正常工作,请将其保留为None,然后 将默认为log_uniform_candidate_sampler(通常是一个好 选择)。
如果您对此背后的数学感兴趣,请参阅此文档: https://www.tensorflow.org/versions/r0.8/extras/candidate_sampling.pdf。
但要回答您的问题:对于每批观察到的标签L,以及 一个候选采样分布Q,该元组包含:
- 具有实际采样的对比标签N的张量
- 具有在Q下观察到的标签L的对数期望值的张量,即log Q(L)和
- 在Q下具有对比标签的对数期望值的对数张量,即log Q(N)。
要进行数学运算,必须使用后者(请参见上文) 文献)。因此sampled_values包含(希望清楚地滥用 表示法):
sampled_values =(N,log Q(L),log Q(N))
但是,我仍然不知道如何输入值。我不确定数据类型应该是什么,以及不确定N是嵌入矩阵中的int位置还是嵌入本身。另外,我猜测N应该是值本身的列表,即我们必须采样的否定标签数量的大小。
我想知道是否可以举一些带有一些价值的例子。例如,对于3的负采样,我会做这样的事情吗?
sampled_values =([4,29,12],[1,1,1],[0,0,0])
此外,文档还说该元组应该“由* _candidate_sampler函数返回”
这是否意味着我需要提供一个返回元组而不是元组本身的函数?