提交 665fc714 编写于 作者: X xingzhaolong

fix sampled softmax entropy loss api doc

test=develop
上级 15064bb7
......@@ -5,46 +5,41 @@ sampled_softmax_with_cross_entropy
.. py:function:: paddle.fluid.layers.sampled_softmax_with_cross_entropy(logits, label, num_samples, num_true=1, remove_accidental_hits=True, use_customized_samples=False, customized_samples=None, customized_probabilities=None, seed=0)
**Sampled Softmax With Cross Entropy Operator**
假设该OP输入logits的shape为[N, K],N表示batch size大小。该OP首先对logits进行softmax计算,得到每个样例下分类的概率值,假设为logits_s,shape为[N,K],其中样例个数为N,类别个数为K。
对于较大的输出类,采样的交叉熵损失Softmax被广泛地用作输出层。该运算符为所有示例采样若干个样本,并计算每行采样张量的SoftMax标准化值,然后计算交叉熵损失
该OP的输入label的shape为[N,1]。对于某一个样例i的概率值logits_s[i],其中有1个为正样例的概率,其他的K-1个为负样本的概率
由于此运算符在内部对逻辑执行SoftMax,因此它需要未分级的逻辑。此运算符不应与SoftMax运算符的输出一起使用,因为这样会产生不正确的结果
对于样例logits_s[i],该OP并不会对该样例的所有输出为负样例的K-1个概率值计算交叉熵,而是从K-1个概率值中随机选择出num_samples
对于T真标签(T>=1)的示例,我们假设每个真标签的概率为1/T。对于每个样本,使用对数均匀分布生成S个样本。真正的标签与这些样本连接起来,形成每个示例的T+S样本。因此,假设逻辑的形状是[N x K],样本的形状是[N x(T+S)]。对于每个取样标签,计算出一个概率,对应于[Jean et al., 2014]( `http://arxiv.org/abs/1412.2007 <https://arxiv.org/abs/1412.2007>`_ )中的Q(y|x)。
根据采样标签对逻辑进行采样。如果remove_accidental_hits为“真”,如果sample[i, j] 意外匹配“真”标签,则相应的sampled_logits[i, j]减去1e20,使其SoftMax结果接近零。然后用logQ(y|x)减去采样的逻辑,这些采样的逻辑和重新索引的标签被用来计算具有交叉熵的SoftMax。
将label真实标签的对应的概率值, 以及根据随机选择出的非真实标签对应的概率值拼接成[N,1 + num_samples] 大小的矩阵。
对此矩阵进行计算交叉熵损失即为该OP的输出。
参数:
- **logits** (Variable)- 非比例对数概率,是一个二维张量,形状为[N x K]。N是批大小,K是类别号。
- **label** (Variable)- 基本事实,是一个二维张量。label是一个张量<int64>,其形状为[N x T],其中T是每个示例的真实标签数。
- **num_samples** (int)- 每个示例的数目num_samples应该小于类的数目。
- **num_true** (int)- 每个训练实例的目标类别总数。
- **remove_accidental_hits** (bool)- 指示采样时是否删除意外命中的标签。如果为真,如果一个sample[i,j]意外地碰到了真标签,那么相应的sampled_logits[i,j]将被减去1e20,使其SoftMax结果接近零。默认值为True。
- **use_customized_samples** (bool)- 是否使用自定义样本和可能性对logits进行抽样。
- **customized_samples** (Variable)- 用户定义的示例,它是一个具有形状[N, T + S]的二维张量。S是num_samples,T是每个示例的真标签数。
- **customized_probabilities** (Variable)- 用户定义的样本概率,与customized_samples形状相同的二维张量。
- **seed** (int)- 用于生成随机数的随机种子,在采样过程中使用。默认值为0。
- **logits** (Variable)- logits是一个shape为[N x K]的2-D Tensor。N是batch size,K是类别数目。数据类型支持float32。
- **label** (Variable)- 表示样例的真实标签。label是一个shape为[N,1]的真实标签。数据类型支持int64。
- **num_samples** (int)- OP计算过程中,会随机从非真实标签的概率输出中选择出num_samples个概率进行计算交叉熵损失。
- **num_true** (int)- 训练实例的目标类别总数,默认值为1。
- **remove_accidental_hits** (bool,可选)- 随机选出num_samples个概率期间,可能会选出同一个非真实标签的概率值,如果此值为True,表示允许选择出多个同样的非真实标签的概率值出来。默认值为True。
- **use_customized_samples** (bool,可选)- 此开关为开发人员测试使用,默认值为False。
- **customized_samples** (Variable, 可选)- 此开关为开发人员测试使用,默认值为None。
- **customized_probabilities** (Variable,可选)- 此开关为开发人员测试使用,默认值为None。
- **seed** (int,可选)- 用于生成随机数的随机种子,在采样过程中使用。默认值为0。
返回:返回类型为Variable(Tensor|LoDTensor),是一个2-D Tensor/LoDTensor,shape为[N x 1]。
返回:交叉熵损失,是一个二维张量,形状为[N x 1]。
返回类型:Variable
<font color="#FF0000">**注意:此OP内部会进行Softmax运算。**</font>
**代码示例:**
.. code-block:: python
import paddle.fluid as fluid
input = fluid.layers.data(name='data', shape=[256], dtype='float32')
label = fluid.layers.data(name='label', shape=[5], dtype='int64')
fc = fluid.layers.fc(input=input, size=100)
out = fluid.layers.sampled_softmax_with_cross_entropy(
logits=fc, label=label, num_samples=25)
import numpy as np
import paddle.fluid as fluid
input = fluid.layers.data(name='data', shape=[25], dtype='float32')
label = fluid.layers.data(name='label', shape=[1], dtype='int64')
out = fluid.layers.sampled_softmax_with_cross_entropy(
logits=input, label=label, num_samples=2)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册