依据给定的词表概率以及top-k、top-p,从词表概率中选取前k个作为候选,然后选取概率高于top-p的词表按照TopkToppSamplingType的值采取不同的后处理策略,最后选择最合适的词序号以及对应的概率作为输出。
Top-k取样:从tokens里选取k个作为候选,然后根据它们的"likelihood scores"来采样模型从最有可能的k个选项中随机选择一个。
Top-p取样:从tokens里选取累计概率大于或等于概率p的最小集合作为候选,然后随机选择一个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
struct TopkToppSamplingParam { enum TopkToppSamplingType { SAMPLING_UNDEFINED = -1, SINGLE_TOPK_SAMPLING, BATCH_TOPK_MULTINOMIAL_SAMPLING, BATCH_TOPK_EXPONENTIAL_SAMPLING, SAMPLING_MAX, }; TopkToppSamplingType topkToppSamplingType = SINGLE_TOPK_SAMPLING; uint32_t randSeed = 0; uint32_t topk = 100; std::vector<uint32_t> randSeeds; uint8_t rsv[16] = {0}; }; |
成员名称 |
类型 |
默认值 |
描述 |
---|---|---|---|
topkToppSamplingType |
TopkToppSamplingType |
SINGLE_TOPK_SAMPLING |
取样处理类型。
|
randSeed |
uint32_t |
0 |
top-p阶段随机抽样使用的随机数种子,默认值为0。当topktoppSamplingtype = SINGLE_TOPK_SAMPLING时使用。 |
topk |
uint32_t |
100 |
top-k阶段保留的词的个数,需要小于词表的词数,默认值为100。top-k必须大于0且小于或等于输入probs最后一维的大小。当topktoppSamplingtype = SINGLE_TOPK_SAMPLING时使用。 |
randSeeds |
std::vector<uint32_t> |
- |
每个batch下top-p阶段随机抽样使用的随机数种子。维度与batch大小一致。当topktoppSamplingtype = BATCH_TOPK_MULTINOMIAL_SAMPLING时使用。 |
rsv[16] |
uint8_t |
{0} |
预留参数。 |
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
probs |
[batch, voc_size] |
float16 |
ND |
输入,词表概率。 |
topp |
[batch, 1] |
float16 |
ND |
输入topp,topp截取的概率,batch的值需与probs的一致。 |
sampled_indices |
[batch, 1] |
int32 |
ND |
输出,取样的idx。 |
sampled_probs |
[batch, 1] |
float16 |
ND |
输出,取样的值。 |
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
probs |
[batch, voc_size] |
float16 |
ND |
输入,词表概率。 |
topk |
[batch, 1] |
int32 |
ND |
输入,topk截取的位置,batch的值需与probs的一致。 |
topp |
[batch, 1] |
float16 |
ND |
输入,topp截取的概率,batch的值需与probs的一致。 |
sampled_indices |
[batch, 1] |
int32 |
ND |
输出,取样的idx。 |
sampled_probs |
[batch, 1] |
float16 |
ND |
输出,取样的值。 |
参数 |
维度 |
数据类型 |
格式 |
描述 |
---|---|---|---|---|
probs |
[batch, voc_size] |
float16 |
ND |
输入,词表概率。 |
topk |
[batch, 1] |
float16 |
ND |
输入,topk截取的位置,batch的值需与probs的一致。 |
topp |
[batch, 1] |
float16 |
ND |
输入,topp截取的概率,batch的值需与probs的一致。 |
exp |
[batch, voc_size] |
float16 |
ND |
输入,所除的指数分布,维度需与probs的一致。 |
sampled_indices |
[batch, 1] |
int32 |
ND |
输出,取样的idx。 |
sampled_probs |
[batch, 1] |
float16 |
ND |
输出,取样的值。 |
probs必须是是两维张量。
使用单一的randSeed和topk,对输入的词表概率的所有batch使用统一的topk值进行截取,再对截取后的词表概率的所有batch使用统一的randSeed进行topp取样。
topkToppSamplingType = SINGLE_TOPK_SAMPLING、topk、randSeed
topkToppSamplingType = BATCH_TOPK_MULTINOMIAL_SAMPLING、randSeeds
对于词表概率的每一个batch使用不同的topk进行截取,再对截取后的词表概率的每个batch使用不同的随机种子进行topp的exponential取样。
topkToppSamplingType = BATCH_TOPK_EXPONENTIAL_SAMPLING