epsilon

2024. 6. 12. 21:13DATA/BIGDATA

반응형

 

 

 

 

 

 

 

 

  ■  부동 소수점 연산에서, 두 숫자가 "거의 같은지" 확인할 때 엡실론(ε)을 사용하는데 두 수의 차이가 매우 작은 값보다 작은지 비교하는 방식이다.  두 수 \(a\)와 \(b\)가 주어졌을 때, \(|a - b| < \epsilon\)이면 두 수가 같다고 여길 수 있다. 
   
 

 import math

   def are_floats_equal(a, b, epsilon=1e-10):
       return math.isclose(a, b, abs_tol=epsilon)

   # 예시 사용
   a = 0.0000001
   b = 0.0000002
   print(are_floats_equal(a, b))  # True or False depending on epsilon

 

1e-10  \(1 \times 10^{-10}\)로 매우 작은 값을 나타내며, 두 부동 소수점 숫자를 비교할 때 허용하는 오차 범위를 지정한다. 

math.isclose 함수는 두 부동 소수점 숫자가 주어진 절대 오차 abs_tol 이내에서 가까운지를 확인한다. 즉, \(|a - b| \leq \epsilon\)이면 True를 반환하고, 그렇지 않으면 False를 반환한다.

 

 

이 예시에서는 a와 b의 차이는 \(1 \times 10^{-7}\)로, 기본 엡실론 값인 \(1 \times 10^{-10}\)보다 크기 때문에 False 를 반환한다.

 



 
   ■ 강화 학습에서 사용되는 엡실론 그리디(epsilon-greedy) 알고리즘은 주어진 상태에서 최적의 행동을 선택하거나, 무작위로 행동을 선택하는 전략이 \(\epsilon\) 값은 탐험(exploration)과 활용(exploitation) 사이의 균형을 조절한다. \(\epsilon\)이 클수록 탐험의 비율이 높아지고, \(\epsilon\)이 작을수록 활용의 비율이 높아진다.

 

탐험(exploration)과 활용(exploitation)은 에이전트가 환경과 상호작용하면서 최적의 행동을 학습하는 과정에서 발생하는 딜레마를 설명한다. 탐험은 새로운 행동을 시도하여 환경에 대한 지식을 얻는 과정으로 에이전트가 아직 충분한 정보를 가지고 있지 않아서 어떤 행동이 최적인지 확신할 수 없는 경우, 환경이 동적이어서 시간이 지남에 따라 변화할 수 있는 경우에서 다양한 행동을 시도함으로써 환경에 대한 더 많은 정보를 수집하고, 장기적으로 더 나은 결정을 내리기 위한 것이다.   탐험을 통해 에이전트는 새로운 상태나 보상을 발견할 수 있다.

 

 활용은 현재 가지고 있는 정보로 최적이라고 생각되는 행동을 선택하는 과정으로 에이전트가 충분한 정보를 가지고 있어서 어떤 행동이 최적인지 알고 있는 경우, 단기적으로 최대 보상을 얻기 원하는 경우에서 현재 상태에서 가능한 최고의 보상을 얻는고 학습한 정보를 바탕으로 최적의 행동을 선택하는 것이 목표이다.

 

 탐험과 활용의 균형을 맞추는 것이 강화 학습의 핵심 과제이다. 많이 탐험하면 이미 최적인 행동을 충분히 활용하지 못하게 되고, 너무 많이 활용하면 새로운 최적의 행동을 발견할 기회를 놓치게 된다.

 

이를 해결하기 위한 방법 중 하나가 엡실론-그리디(epsilon-greedy) 알고리즘이다:

   import random

   def epsilon_greedy(Q, state, epsilon=0.1):
       if random.random() < epsilon:
           # Explore: choose a random action
           action = random.choice(list(Q[state].keys()))
       else:
           # Exploit: choose the action with the highest Q-value
           action = max(Q[state], key=Q[state].get)
       return action

   # 예시 사용
   Q = {
       'state1': {'action1': 1, 'action2': 2},
       'state2': {'action1': 3, 'action2': 4}
   }
   state = 'state1'
   print(epsilon_greedy(Q, state))  # 'action1' or 'action2'



 
- Q: 상태와 행동에 대한 Q-값을 저장하는 딕셔너리이다.
- epsilon: 탐험 확률을 나타내는 값이다. 기본값은 0.1이다.

random.random()은 0과 1 사이의 무작위 부동 소수점 숫자를 반환한다. 이 숫자가 epsilon보다 작으면 탐험을 수행하고, 그렇지 않으면 활용을 수행한다.

action = random.choice(list(Q[state].keys()))
탐험을 수행하는 경우, 현재 상태에서 가능한 행동들 중 하나를 무작위로 선택한다.

action = max(Q[state], key=Q[state].get)
활용을 수행하는 경우, 현재 상태에서 가능한 행동들 중 Q-값이 가장 높은 행동을 선택한다. 

- epsilon 값이 0.1이므로, 10% 확률로 무작위 행동을 선택하고, 90% 확률로 가장 높은 Q-값을 가지는 행동을 선택한다.
- 'state1'에서는 action2가 Q-값이 2로, action1의 Q-값 1보다 높기 때문에, 활용을 선택할 경우 대부분 action2를 반환하게 된다.
- 10%의 확률로 action1을 선택할 수도 있다.

 

 

 
 

 

 

 

 

 
 
 
 
 

 

반응형

'DATA > BIGDATA' 카테고리의 다른 글

파이썬 데이터 라이브러리 관련  (0) 2024.06.27
SSR SSE  (0) 2024.06.14
시그모이드 함수 수식  (0) 2024.05.21
hive 환경설정  (0) 2024.05.20
hadoop 환경 설정  (0) 2024.05.20