로그 섬에서 치명적인 취소


18

상대적 오류 가 낮은 배정 밀도 부동 소수점에서 다음 함수를 구현하려고합니다 .

logsum(x,y)=log(exp(x)+exp(y))

이는 통계적 응용 프로그램에서 광범위하게 사용되어 로그 공간에 표시되는 확률 또는 확률 밀도를 추가합니다. 물론 또는 는 쉽게 오버플로 또는 언더 플로가 될 수 있습니다. 로그 공간은 처음에 언더 플로를 피하기 위해 사용되므로 좋지 않습니다. 이것이 일반적인 해결책입니다.특급 ( y )exp(x)exp(y)

logsum(x,y)=x+log1p(exp(yx))

에서 취소 가 발생하지만 의해 완화됩니다 . 더 나쁜 것은 와 가 가까이있을 때입니다. 상대 오차도는 다음과 같습니다.exp x l o g 1 p ( exp ( y x ) )yxexpxlog1p(exp(yx))

여기에 이미지 설명을 입력하십시오

플롯은 에서 곡선의 모양을 강조 하여 취소가 발생합니다. 최대 까지의 오류를보고 훨씬 더 나빠질 것으로 의심됩니다. FWIW의 "지상 진실"기능은 128 비트 정밀도의 MPFR 임의 정밀도 부동 소수점을 사용하여 구현됩니다. l o g s u m ( x , y ) = 0 10 111014logsum(x,y)=01011

나는 다른 결과를 시도했지만 모두 같은 결과를 얻었습니다. 함께 외측 식과 같은 에러 1. 가까운 것을 로그를 취함으로써 발생 외측 식과 취소는 내부 식 일어난다.l o g 1 ploglog1p

이제 절대 오류는 매우 작으므로 는 엡실론 내에서 상대적 오류가 매우 작습니다. 의 사용자 가 실제로 로그 확률이 ​​아닌 확률에 관심이 있기 때문에이 끔찍한 상대 오류는 문제가되지 않습니다. 일반적으로 그렇지 않을 수도 있지만 라이브러리 함수를 작성 중이며 클라이언트가 반올림 오류보다 훨씬 나쁘지 않은 상대 오류를 계산할 수 있기를 바랍니다.l o g s u mexp(logsum(x,y))logsum

새로운 접근법이 필요한 것 같습니다. 무엇일까요?


나는 당신의 마지막 단락을 이해하지 못합니다. "엡실론 내"라는 말은 아무 의미가 없습니다. 마지막 장소유닛 을 의미 합니까? 확률에 관심이있는 사용자의 경우 작은 로그 확률 오류로 인해 큰 확률 오류가 발생하므로 그렇지 않습니다.
Aron Ahmadia

호기심에서 두 가지 방법 중 "최고"를 취하여 그 오류를 플로팅하려고 했습니까? 그런 다음 필요한 사례를 감지하고 (어쨌든 비용이 적게 들거나 필요한 알고리즘 비용의 일부가 됨) 적절한 방법으로 전환하는 올바른 논리 만 있으면됩니다.
Aron Ahmadia

@AronAhmadia : "엡실론 내"는 배정 밀도 부동 소수점 엡실론 (약 2.22e-16)보다 작은 상대 오차를 의미합니다. 정상 (즉, 비정규가 아닌) 수레의 경우 약 ulp에 해당합니다. 또한 가 의 절대 오차 인 경우 의 상대 오차 는 이며 이는 거의 0에 가까운 항등 함수입니다. IOW에서 대한 작은 절대 오차 는 대한 작은 상대 오차를 의미 합니다. axexp(x)exp(a)1xexp(x)
Neil Toronto

부록 : 절대 오차 가 0에 가까울 때 . 때 , 예를 들어, 당신이 옳아 요 : 상대적 폭발. aa>1
Neil Toronto

답변:


12

수식 는 수치 적으로 안정적이어야합니다. 안정 계산

logsum(x,y)=max(x,y)+log1p(exp(abs(xy))
logiexi=ξ+logiexiξ,   ξ=maxixi

로그 섬이 0에 매우 근접하고 높은 상대 정확도를 원하는 경우 정확한 값을 사용하여 사용할 수 있습니다. 작은 대해 거의 선형 인 구현 (즉, 배정도 이상 .L E (X) P ( Z ) : = 로그 ( 1 명 + E - | Z | ) Z를

logsum(x,y)=max(x,y)+lexp(xy)
lexp(z):=log(1+e|z|)
z

절대 오차의 관점에서 그렇습니다. 상대 오차 측면에서, 출력이 0에 가까워지면 끔찍합니다.
Neil Toronto

@NeilToronto : 두 개의 명시적인 입력 와 된 예제를 제시해주세요 . yxy
Arnold Neumaier

x = -0.775 및 y = -0.6175의 경우 62271 ulps 오류와 1.007e-11 상대 오류가 발생합니다.
Neil Toronto

1
관심있는 범위에서 매우 정확한 데이터 포인트를 계산하십시오-점근 적 행동으로 인해 적어도 두 개의 다른 범위가 필요합니다. z에 대한 정의 표현식을 0에 가깝지 않게 사용할 수 있습니다. 예외적 인 범위의 경우 원하는 정확도를 얻을 수있을만큼 충분히 높은 합리적인 기능을 수행하십시오. 수치 안정성을 위해 관심 구간에 맞게 분자 및 분모에 bernstein 다항식 또는 Tchebychev 다항식을 사용하십시오. 결국, 연속 분수로 확장하고 정확도를 손상시키지 않고 계수를자를 수있는 양을 찾으십시오.
Arnold Neumaier

1
이것은 를줍니다. 이 똑같이하지만 lexp (z) -l (z) 함수에 적용되도록합니다. ml=l(z)m
Arnold Neumaier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.