可以说,分布函数定义如下:
dist = tf.contrib.distributions.Normal(mu, sigma)
Run Code Online (Sandbox Code Playgroud)
从分布中抽取一个样本
val = dist.pdf(x)
Run Code Online (Sandbox Code Playgroud)
该值在模型中用于预测变量
X_hat = f(val)
loss = tf.norm(X_pred-X_hat, ord=2)
Run Code Online (Sandbox Code Playgroud)
如果我想优化变量mu和sigma以减少预测误差,可以执行以下操作吗?
train = tf.train.AdamOptimizer(1e-03).minimize(loss, var_list=[mu, sigma])
Run Code Online (Sandbox Code Playgroud)
我想知道梯度例程是否通过正态分布传播,或者我应该期待一些问题,因为我正在对定义分布的参数进行梯度处理
tl; dr:是的,梯度反向传播将与一起正常工作tf.distributions.Normal。
dist.pdf(x)不会从分布中抽取样本,而是返回处的概率密度函数x。这可能不是您想要的。
要获得随机样本,您真正想要的是致电dist.sample()。对于许多随机分布,随机样本对参数的依赖性是不平凡的,并且不一定是可逆的。
但是,正如@Richard_wth所指出的,特别是对于正态分布,可以通过重新参数化来简单地依赖于位置和比例参数(mu和sigma)。
实际上,在(最近迁移到)的实现中,这正是实现方式:tf.contrib.distributions.Normaltf.distributions.Normalsample
def _sample_n(self, n, seed=None):
...
sampled = random_ops.random_normal(shape=shape, mean=0., stddev=1., ...)
return sampled * self.scale + self.loc
Run Code Online (Sandbox Code Playgroud)
因此,如果您将比例和位置参数作为张量提供,则反向传播将在这些张量上正常工作。
请注意,这种反向传播本质上是随机的:它将根据正常高斯变量的随机抽取而变化。但是,从长远来看(通过许多培训示例),这可能会按您期望的那样工作。
| 归档时间: |
|
| 查看次数: |
606 次 |
| 最近记录: |