np.log와 np.log1p는 둘 다 자연 로그(자연 상수 e를 밑으로 하는 로그)를 계산하는 함수이다.
하지만 이 두 함수는 방식과 주로 사용되는 상황이 다르다.
각각에 대해 알아보도록 하자.
1. np.log와 np.log1p의 차이
- np.log(x): 이 함수는 주어진 값 x에 대해 자연 로그를 계산한다. 즉, ln(x)를 구한다. 여기서 x는 양의 실수여야 한다. (x>0)
- np.log1p(x): 이 함수는 1+x에 대한 자연 로그를 계산한다. 즉, ln(1+x)을 구한다. 이 함수는 x가 매우 작은 값일 때 더 정확한 결과를 제공합니다. x가 작을수록 ln(1+x)와 ln(x)의 값은 거의 같지만, 작은 값에 대해 계산 시 np.log1p가 언더플로우나 부동소수점 오류를 방지할 수 있습니다.
import numpy as np
np.log(2) # 2의 자연 로그 계산
import numpy as np
np.log1p(0.0000001) # 1 + 0.0000001의 자연 로그 계산
2. 언더플로우 (Underflow)란?
언더플로우(Underflow)는 계산에서 매우 작은 수가 컴퓨터의 숫자 표현 범위보다 작을 때 발생하는 문제이다.
컴퓨터에서 숫자는 제한된 비트 수로 표현되기 때문에, 너무 작은 값은 표현할 수 없거나 0으로 처리된다.
예를 들어, 매우 작은 실수 (예: 10^{-308})를 처리할 때 이 값은 컴퓨터에서 0으로 인식될 수 있다.
이로 인해 계산에 오차가 발생하거나 예상치 못한 결과를 초래할 수 있다.
또한 자연 로그 함수는 ln(x)를 계산할 때 x가 매우 작은 값일 경우 ln(x) 값이 매우 큰 음수로 도출된다.
그러나 컴퓨터에서는 이 값이 너무 작아 0으로 표현되면 계산이 잘못될 수 있다.
np.log1p는 작은 값에 대해 더 정확한 계산을 제공하므로 언더플로우로 인한 오류를 줄이는 데 효과적이다.
또한 로그를 그냥 사용할 경우 NaN 문제가 발생할 수 있다.
그 이유는 로그 함수의 정의와 관련이 있다. 특히 자연 로그 함수 (np.log)는 입력값이 특정 조건을 만족하지 않으면 유효한 결과를 반환하지 않거나 계산이 불가능한 경우가 생긴다.
3. 로그 함수에서 발생할 수 있는 문제
로그 함수는 정의에 의해 양수인 값에 대해서만 계산이 가능합니다.
- 로그 계산에서의 제한:
- ln(x)에서 x ≤ 0 이면 계산할 수 없다. 즉, x = 0이거나 음수인 경우 로그값을 계산할 수 없다.
- 예를 들어, np.log(0)은 -inf (음의 무한대)를 반환하고, np.log(-1)은 NaN을 반환한다.
이 문제를 피하려면 입력값이 1보다 작은 수일 때 주의해야 한다. 예를 들어, ln(1+x)에서 x가 매우 작은 값일 때, 계산 결과가 잘못될 가능성이 있다. 또한 0에 가까운 값에 대한 계산에서 부동소수점 오차가 발생할 수 있다.
4. np.log1p(x)의 사용 이유
다시 한 번 언급하자면, np.log1p(x)는 ln(1 + x)를 계산하는 함수이다.
이는 로그 값이 0에 가까운 작은 값에 대해 정확하게 계산을 할 수 있도록 돕는 함수로, np.log와 비교할 때 다음과 같은 장점을 가진다:
- 입력값이 작은 경우 안정성: ln(1+x)는 가 매우 작을 때에도 부동소수점 오차 없이 정확하게 계산이 가능하므로, 작은 값을 처리할 때 안전하다. 예를 들어, ln(1+0.0000001) 와 같은 계산에서 np.log1p는 매우 정확한 값을 제공한다.
- 로그 계산에서 NaN이나 무한대 문제 방지: 만약 입력값이 0이나 그보다 작은 값을 포함할 경우, np.log1p는 x가 매우 작거나 0에 가까운 값이어도 NaN이나 무한대 문제가 발생하지 않도록 처리한다.
# 이 경우 np.log(0)은 -inf를 반환한다.
# 만약 이 값이 계산의 일부로 사용되면 의도한 결과를 얻을 수 없다.
import numpy as np
x = 0
log_value = np.log(x) # 0에 대한 로그는 -inf
print(log_value)
# np.log1p(0)은 0을 반환한다.
# x가 0이거나 매우 작은 값일 때 부동소수점 오차를 최소화한다.
x = 0
log1p_value = np.log1p(x) # ln(1 + 0) = 0
print(log1p_value)
# 이 경우 np.log(-1)은 NaN을 반환한다.
# np.log1p(x)는 음수에 대해서 안전하지 않을 수 있지만, 주로 x가 -1보다 큰 작은 값일 경우 더 정확한 결과를 반환한다.
x = -1
log_value = np.log(x) # 음수에 대한 로그는 NaN
print(log_value)
따라서, NaN 문제나 무한대와 같은 문제를 방지하고 정확한 로그 계산을 하려면 np.log1p를 사용하는 것이 더 안전하고 신뢰할 수 있다.
'데이터 사이언스 공부' 카테고리의 다른 글
| 00. [논문 번역] Attention is All You Need (2) (0) | 2025.04.07 |
|---|---|
| 00. [논문 번역] Attention is All You Need (1) (0) | 2025.04.07 |
| 00. numpy로 구현한 경사하강법 코드 흐름 (0) | 2024.11.13 |
| 00. GBM 결정트리의 분할 (0) | 2024.11.12 |
| 00. LightGBM, XGBoost에서의 eval_set 파라미터 (0) | 2024.11.11 |