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如何将cassandra中的行数据转换为与列相关的嵌套json   java如何使用jcr XPath在jcr:content/@jcr:data中搜索?   java在使用openCV进行安卓开发时如何利用手机的广角镜头   java解析扩展了接口,结束了一个潜在的无限循环   位置服务的@Override方法中存在java Android应用程序错误   java本地线程的用途和需求是什么   具有左右子访问的java节点树遍历   java验证JsonWebToken签名   JUL日志处理程序中的java日志记录   嵌入式Java读取给定时间段的串行数据。   java有没有办法从多个URL获取多个图像?   java线程通过等待intent阻止自己发送intent   java Spring MVC解析多部分内容请求   java JPA/Hibernate静态元模型属性未填充NullPointerException   java格式错误的字符(需要引号,得到I)~正在处理   java为什么PrintWriter对象抛出FileNotFoundException?   java Neo4j未正确保存标签   java IE不加载图像