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只有两个约束 功能:

  1. 除了随机选择,它必须是确定性的 由np.random.choice提供(或其他一些随机选择的方法 给定离散概率分布的指数)。在
  2. 两个不同的随机选择序列必须导致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产品。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在Eclipse中使用ctrlshiftt而不是ctrlshiftr有什么好处?   java自动装箱概念SCJP   java如何使用JAXR和Resteasy、Angular和Wildfly10处理COR   java如何在整数数组中动态添加元素?   JAVA从继承生成器模式返回父对象继承   java问题调试生产者消费者问题   java MQ:已达到通道的最大实例数   JavaPowerMockMockito:我试图stubb的方法最终被调用   java Hibernate将多个列映射到一个表   在java中,将字符串中的单词大写,但跳过字符串中的数字和多余空格或符号   使用Eclipse将Java项目导出到JAR时出现“重复条目”错误   java使用eclipselink在实体表上指定NullConstraint   <Java>我可以在TCPIP中使用多个服务器socket吗?   带有自定义视图的java AlertDialog:调整大小以包装视图的内容   如何从用C#编写的web服务生成用于java的SOAP API?