【发布时间】:2019-03-27 17:19:39
【问题描述】:
由于 StackOverflow 不支持 LaTeX,我已在 Data Science StackExchange 网站上发布了这个问题。在这里链接它是因为这个网站可能更合适。
正确渲染 LaTeX 的问题在这里:https://datascience.stackexchange.com/questions/48062/pytorch-does-not-seem-to-be-optimizing-correctly
这个想法是我正在考虑具有不同相位的正弦波的总和。在区间 [0, 2pi] 中以某个采样率 s 对波进行采样。我需要以这样一种方式选择相位,以使任何采样点的波之和最小化。
以下是 Python 代码。优化似乎没有正确计算。
import numpy as np
import torch
def phaseOptimize(n, s = 48000, nsteps = 1000):
learning_rate = 1e-3
theta = torch.zeros([n, 1], requires_grad=True)
l = torch.linspace(0, 2 * np.pi, s)
t = torch.stack([l] * n)
T = t + theta
for jj in range(nsteps):
loss = T.sin().sum(0).pow(2).sum() / s
loss.backward()
theta.data -= learning_rate * theta.grad.data
print('Optimal theta: \n\n', theta.data)
print('\n\nMaximum value:', T.sin().sum(0).abs().max().item())
下面是一个示例输出。
phaseOptimize(5, nsteps=100)
Optimal theta:
tensor([[1.2812e-07],
[1.2812e-07],
[1.2812e-07],
[1.2812e-07],
[1.2812e-07]], requires_grad=True)
Maximum value: 5.0
我假设这与广播有关
T = t + theta
和/或我计算损失函数的方式。
验证优化是否不正确的一种方法是简单地评估数组 $\theta_1、\dots、\theta_n$ 的随机值的损失函数,比如均匀分布在 $[0, 2\pi]$ 中。这种情况下的最大值几乎总是远低于phaseOptimize() 报告的最大值。实际上更容易考虑 $n = 2$ 的情况,并简单地计算 $\theta_1 = 0$ 和 $\theta_2 = \pi$。在这种情况下,我们得到:
phaseOptimize(2, nsteps=100)
Optimal theta:
tensor([[2.8599e-08],
[2.8599e-08]])
Maximum value: 2.0
另一方面,
theta = torch.FloatTensor([[0], [np.pi]])
l = torch.linspace(0, 2 * np.pi, 48000)
t = torch.stack([l] * 2)
T = t + theta
T.sin().sum(0).abs().max().item()
生产
3.2782554626464844e-07
【问题讨论】:
标签: pytorch