【问题标题】:Setting hyperparameter optimization bounds in GPflow 2.0在 GPflow 2.0 中设置超参数优化范围
【发布时间】:2019-11-17 17:56:24
【问题描述】:

在 GPflow 1.0 中,如果我想对像长度尺度这样的参数设置硬边界(即限制参数的优化范围),

transforms.Logistic(a=4., b=6.)

将参数限制在 4 和 6 之间。

GPflow 2.0 的文档说转换由 TensorFlow Probability 的 Bijector 类处理。哪个 Bijector 类处理对参数的硬性限制,实现它的正确方法是什么?

在此处 (Kernel's hyper-parameters; initialization and setting bounds) 提出了关于 GPflow 1.0 的类似问题。但由于 GPflow 1.0 不涉及使用 Bijectors,我提出了一个新问题。

【问题讨论】:

    标签: python tensorflow tensorflow2.0 tensorflow-probability gpflow


    【解决方案1】:

    使用双射器链很容易做到这一点:

    In [35]: a = 3.0
        ...: b = 5.0
        ...: affine = tfp.bijectors.AffineScalar(shift=a, scale=(b - a))
        ...: sigmoid = tfp.bijectors.Sigmoid()
        ...: logistic = tfp.bijectors.Chain([affine, sigmoid])
    
    In [36]: logistic.forward(logistic.inverse(3.1) + 0.0)
    Out[36]: <tf.Tensor: id=222, shape=(), dtype=float32, numpy=3.1>
    

    现在,您可以将logistic bijector 直接传递给 Parameter 构造函数。

    In [45]: p = gpflow.Parameter(3.1, transform=logistic, dtype=tf.float32)
    
    In [46]: p
    Out[46]: <tf.Tensor: id=307, shape=(), dtype=float32, numpy=3.1>
    
    In [47]: p.unconstrained_variable
    Out[47]: <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=-2.9444401>
    

    【讨论】:

    • 很抱歉在这里一直问问题,但我一定不明白这个自定义逻辑双射器是如何工作的。我试图实现你的建议,但发现即使我创建了一个长度尺度等于 p 的内核(在你上面的答案中),我仍然可以将内核优化到远远超出 [a,b] 的值。我希望找到一种方法来绑定像长度尺度这样的参数,这样它就不能优化超过某些值。有没有办法修改代码使其以这种方式工作?
    • @Rcameron,这听起来像是一个错误,因为您需要发布您的 MWE。
    • @[Artem Artemev],我在这里发布了一个 MWE:stackoverflow.com/questions/59504125/… 感谢您一直以来的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多