StackOverflow가 LaTeX를 지원하지 않기 때문에이 질문을 Data Science StackExchange 사이트에 게시했습니다. 이 사이트가 더 적절할 수 있으므로 여기에 링크하십시오.
올바르게 렌더링 된 LaTeX에 대한 질문은 여기에 있습니다 : https://datascience.stackexchange.com/questions/48062/pytorch-does-not-seem-to-be-optimizing-correctly
아이디어는 위상이 다른 사인파의 합을 고려하고 있다는 것입니다. 웨이브는 s
[0, 2pi] 간격의 일부 샘플 속도 로 샘플링됩니다 . 모든 샘플 지점에서 파동의 합이 최소화되도록 위상을 선택해야합니다.
아래는 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
및 / 또는 손실 함수를 계산하는 방식.
최적화가 잘못되었는지 확인하는 한 가지 방법은 $ [0, 2 \ pi] $에 균일하게 분포 된 배열 $ \ theta_1, \ dots, \ theta_n $의 임의 값에서 손실 함수를 평가하는 것입니다. 이 경우 최대 값은 거의 항상에서보고 한 최대 값보다 훨씬 낮습니다 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
T
루프 내에서 컴퓨팅을 이동해야합니다 . 그렇지 않으면 항상 동일한 상수 값을 가지므로 지속적인 손실이 발생합니다.
또 다른 한 가지는 theta
인덱스에서 다른 값 으로 초기화 하는 것입니다 . 그렇지 않으면 문제의 대칭 적 특성으로 인해 기울기가 모든 인덱스에 대해 동일합니다.
또 다른 점은 그래디언트를 0으로 backward
누적 해야한다는 것입니다.
이것은 작동하는 것 같습니다.
def phaseOptimize(n, s = 48000, nsteps = 1000):
learning_rate = 1e-1
theta = torch.zeros([n, 1], requires_grad=True)
theta.data[0][0] = 1
l = torch.linspace(0, 2 * np.pi, s)
t = torch.stack([l] * n)
for jj in range(nsteps):
T = t + theta
loss = T.sin().sum(0).pow(2).sum() / s
loss.backward()
theta.data -= learning_rate * theta.grad.data
theta.grad.zero_()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다