UniqueRandomizer:无替换的增量采样
unique-randomizer的Python项目详细描述
UniqueRandomizer
概述
UniqueRandomizer是一种用于随机抽样输出的数据结构 程序,例如神经序列模型,递增和没有 更换。在
- Incremental采样:而不是在 与beam search一样,UniqueRandomizer一次提供一个样本。 这使停止条件(如停止采样)具有灵活性 一旦发现满意的输出,立即进行处理。在
- 采样而不替换:在许多应用中,使用神经模型 为某些搜索或优化问题产生候选解决方案。在 这类应用通常需要考虑unique候选 解决方案,因为重复通常没有用处。在
更多细节请参考我们的文章, Incremental Sampling Without Replacement for Sequence Models, 发表于ICML 2020。在
BibTeX入口:
@article{shi2020uniquerandomizer,
title = {Incremental Sampling Without Replacement for Sequence Models},
author = {Kensen Shi and David Bieber and Charles Sutton},
booktitle = {Proceedings of the 37th International Conference on Machine Learning},
year = {2020}
}
安装
^{pr2}$这个包需要python3。上面的命令会自动安装 同时遵循以下依赖项:
- 绝对值py>;=0.6.1
- 数量=1.15.4
- scipy>;=1.1.0
使用
要使用UniqueRandomizer,请首先标识要使用的程序或函数
从中提取唯一的示例,例如下面的draw_sample
函数
示例:
def draw_sample(sequence_model, state):
"""Draws a sample (a sequence of token indices) from the sequence model."""
tokens = []
token = BOS
for i in range(MAX_LEN):
probs, state = sequence_model(token, state)
token = np.random.choice(np.arange(len(probs)), p=probs)
if token == EOS:
break
tokens.append(token)
return tokens
注意,draw_sample
可以接受输入并可以使用控制流,例如循环,
条件句和递归。对draw_sample
只有两个约束
功能:
- 除了随机选择,它必须是确定性的
由
np.random.choice
提供(或其他一些随机选择的方法 给定离散概率分布的指数)。在 - 两个不同的随机选择序列必须导致
draw_sample
返回不同的输出。在
接下来,添加一个UniqueRandomizer
对象作为draw_sample
的输入,并使用其
sample_distribution
替换np.random.choice
的函数:
- def draw_sample(sequence_model, state):+ def draw_sample(sequence_model, state, randomizer): """Draws a sample (a sequence of token indices) from the sequence model.""" tokens = [] token = BOS for i in range(MAX_LEN): probs, state = sequence_model(token, state) - token = np.random.choice(np.arange(len(probs)), p=probs)+ token = randomizer.sample_distribution(probs) if token == EOS: break tokens.append(token) return tokens
最后,围绕draw_sample
的一个简单循环可以收集唯一的样本,如
以下内容:
def draw_unique_samples(model, state, num_samples):
"""Draws multiple unique samples from the sequence model."""
samples = []
randomizer = unique_randomizer.UniqueRandomizer()
for _ in range(num_samples):
samples.append(draw_sample(model, state, randomizer))
randomizer.mark_sequence_complete()
return samples
代码示例
我们提供了一些代码示例来演示如何使用UniqueRandomizer:
- 在
在examples/weighted_coin_flips.py
:这提供了一个非常简单的示例 使用UniqueRandomizer。函数flip_two_weighted_coins
模拟 翻一对重硬币。sample_flips_without_replacement
函数然后使用UniqueRandomizer有效地采样flip_two_weighted_coins
没有替换。在 - 在
在examples/expand_grammar.py
:这定义了一个概率上下文无关 语法(PCFG),以及在没有 使用UniqueRandomizer、拒绝抽样和随机替换 波束搜索(SBS)。脚本examples/expand_grammar_main.py
使 不同情景下不同抽样方法的比较。在 - 在
在examples/sequence_example.py
:这将实现采样而不进行替换 从序列模型中,使用UniqueRandomizer,批处理UniqueRandomizer, 拒收取样和SBS。脚本examples/sequence_example_main.py
允许在下的不同采样方法之间进行轻松比较 不同的场景。在
免责声明
这不是一个官方支持的Google产品。在
- 项目
标签: