2020. 6. 27. 12:38ㆍ관심있는 주제/RL
강화 학습에서는 에이전트의 행동에서 탐색이 수행하는 역할에 대해서 알아보고자 한다.
이 미디엠 글에서는 행동 선택에 초점을 맞추고 비교 강점과 약점을 보여줄 뿐만 아니라 Tensorflow를 사용하여 각각을 구현하는 방법을 보여주는 탐색에 일반적으로 사용되는 몇 가지 접근법을 살펴볼 것이라고 한다.
이 글에 대한 결과물은 아래를 들어가면 된다.
http://awjuliani.github.io/exploration/index.html
그렇다면 왜 강화학습에서는 탐험(Explore)을 해야 할까?
개인적으로 이 질문은 항상 드는 생각이다. 뉴럴 네트워크로 학습하면 자기의 믿음을 확률로 표현해서 보여줄 텐데, 왜 이 확률을 무시하고, 탐험을 해야 하는 걸까? 그 이유는 바로 training data의 모든 상태를 최적으로 처리하는 방법을 배우려면 가능한 많은 상태(state)에 노출되어야 한다는 것이다. 이것이 바로 기존에 우리가 자주 하는 지도 학습과는 다른 모습이다. 즉 많은 상태에 대해서 경험을 해야 하기 때문에, 학습 때는 때로는 탐험 기법을 적용하여, 많은 상태에 노출시키고 보상을 얻고, 다음 행동 때 이러한 경험들을 반영하여 좋은 정책을 만들 수 있다.
이 문제로부터 강화 학습 내에서 서브 필드 전체가 등장하여 탐사(exploration)와 착취(exploitation) 트레이드오프를 의미 있게 균형 잡기 위한 기술을 개발하려고 시도했다.
이상적으로는 이러한 접근 방식은 최적의 조치에 대한 정보에 근거한 결정을 내릴 수 있을 만큼 충분히 학습 한 시점까지 환경을 탐색하도록 권장해야 한다.
탐험을 장려하기 위해 자주 사용되는 여러 가지 방법이 있다. 이 글에서는 작업 선택과 관련된 몇 가지 기본 접근 방식을 살펴본다. 후반부에서는 본질적 동기 부여를 통해 탐구를 장려하는 고급 방법을 다룰 것입니다.
Greedy Approach
모든 강화학습 알고리즘들은 시간이 갈수록 보상을 최대화하고자 한다. 주어진 시간에 최적의 행동을 확보하기 위한 가장 순진한 접근 방식은 가장 큰 리워드를 제공할 것으로 기대되는 조치를 선택하는 것이다.
이러한 방법을 greedy method라고 한다. 현재 시점에서 에이전트가 최고라고 추정하는 조치를 취하는 것이 착취(exploitation)의 예이다. (에이전트는 행동할 환경의 보상 구조에 대한 현재 지식을 활용하고 있다. 이 접근법은 탐색 가능성이 거의 없거나 전혀 없는 것으로 생각할 수 있습니다.)
단점
greedy action의 문제는 거의 보편적으로 차선책에 도달한다는 것이다. 간단한 two armed bandit에서 생각해보자.
만약 우리가 한 arm에게 보상을 1을 주고 다른 arm에게는 2의 보상을 준다고 가정하자. 그리고 에이전트의 파라미터들은 이전 arm을 먼저 선택하는 것과 같으면 신경망이 얼마나 복잡한지에 상관없이, greedy 접근 방식으로 후자의 행동이 더 최적이라는 것을 결코 배우지 못한다.
코드
#Use this for action selection.
#Q_out referrs to activation from final layer of Q-Network.
Q_values = sess.run(Q_out, feed_dict={inputs:[state]})
action = np.argmax(Q_values)
Random Approach
greedy selection과는 반대적인 접근 방식으로 항상 random action을 취하는 것이다.
단점
임의의 정책이 최적인 상황에서만이 이 방법이 이상적임.
그러나 DQN을 사용할 때 explerience buffer를 채우기 위해 상태 공간에서 샘플링하는 초기 수단으로 유용할 수 있다.
#Assuming we are using OpenAI gym environment.
action = env.action_space.sample()
#Otherwise:
#total_actions = ??
action = np.random.randint(0,total_actions)
ϵ-Greedy Approach
greedy와 random 접근의 간단한 조합은 가장 많이 사용하는 탐사 전략 중 하나를 만들어냄
($\epsilon -greedy$)
이 방법은 에이전트가 대부분의 경우 최적의 행동이라고 생각하는 것을 선택하지만 때때로 무작위 행동을 취하게 한다. 이런 방식으로 에이전트는 이상적인 것으로 추정되지 않을 수도 있지만 에이전트에 새로운 정보를 제공할 수 있는 조치를 취한다. 여기서 $\epislon$같은 경우 hyper parameter이며, 행동을 할 때 랜덤을 취하게 될 확률을 의미한다.
간단하지만 놀라운 효과 때문에, 이 방법은 DQN 및 변형을 포함하여 가장 최근의 강화 학습 알고리즘에 대한 사실상의 기술이 되었다.
Adjusting during training
$\epislon$은 환경에 대해서 탐험을 독려하기 위해 학습 과정에서 처음에는 크게 설정하였다가. 점점 작은 값으로 바꿔줍니다.
단점
널리 사용함에도 불구하고, 이 방법은 최적과는 거리가 멉니다. 왜냐하면, 행동이 보상을 받든 안 받든 상관없이 취해지기 때문입니다. 즉 보상과 탐험해서 얻게 되는 행동이 직접적으로 연관성은 없다.
e = 0.1
if np.random.rand(1) < e:
action = env.action_space.sample()
else:
Q_dist = sess.run(Q_out,feed_dict={inputs:[state]})
action = np.argmax(Q_dist)
Boltzmann Approach
탐색 과정에서 우리는 네트워크에서 생성된 예상 Q- values에 있는 모든 정보를 활용하는 것이 이상적입니다.
Boltzmann 탐험은 이것을 할 수 있습니다. 최적의 행동을 항상 취하는 거나 랜덤하게 취하는 것 대신에, 이 방법은 가중화된 확률 행동을 선택하게 합니다. 이를 달성하기 위해 각 행동에 대한 네트워크 추정치에 대해 softmax를 사용합니다.
이런 경우 에이전트가 최적이라고 추정된 행동을 대게 선택하게 된다.(보장은 못하지만)
$\epsilon$-greedy보다 큰 장점은 다른 행동의 값에 대한 정보를 고려할 수 있다는 것이다.
만약 에이전트가 4개의 행동이 가능하다면, $\epsilon$-greedy에서는 최적이 아닌 것에 대해서는 똑같이 고려하지만, Boltzmann 탐험은 상대 가치에 의해 가중치가 측정된다.
이러한 방식으로 에이전트는 대체로 차선책으로 추정되는 행동을 무시하고 잠재적으로 유망하지만 반드시 이상적인 행동에 더 주의를 기울일 수 있다.
Adjusting during training
실제로, 시간이 흐를수록 작아지는 temperature parameter $\tau$를 사용할 수 있다.
이 파라미터는 softmax 분포의 퍼짐을 조절할 수 있다. 모든 행동들은 시작 시기에서는 공평하게 고려되고, 학습이 끝나는 시점으로써, 분포들은 분리될 것이다.
단점
Boltzmann 탐험 안에 내재된 가정은 네트워크에서 나오는 결과물이 softmax는 각 행동에서 에이전트의 확신의 측정을 제공한다는 것이다. 만약 행동 2가 70% 행동 1이 20%라고 할 때, 생각이 나게 되는 해석은 에이전트는 action2에서 70% 확률이 나올 것이라고 믿는 것이다. 반면 행동 1은 20 % 일 가능성이 높다고 생각한다.
실제로는 그렇지 않습니다. 대신 에이전트가 추정하는 것은 행동이 최적이라고 생각하는 것이 아니라 행동이 얼마나 적절한가를 생각하는지 측정하는 것이다. 이 방법은 유용한 proxy가 될 수 있지만, 탐사에 가장 도움이 되는 것은 아니다.
실제로 이해하고자 하는 것은 다른 행동 값에 대한 에이전트의 불확실성이다.
#Add this to network to compute Boltzmann probabilities.
Temp = tf.placeholder(shape=None,dtype=tf.float32)
Q_dist = slim.softmax(Q_out/Temp)
#Use this for action selection.
t = 0.5
Q_probs = sess.run(Q_dist,feed_dict={inputs:[state],Temp:t})
action_value = np.random.choice(Q_probs[0],p=Q_probs[0])
action = np.argmax(Q_probs[0] == action_value)
역시 모든 끝은 Bayesian...
Bayesian Approaches (w/ Dropout)
만약 에이전트가 그 행동들에 대해서 불확실성을 착취(exploitation)하면 어떻게 될까?
이것이 정확히 베이지안 신경망 (BNN)이라고 하는 신경망 모델 클래스가 제공하는 능력이다.
전통적인 NN이 deterministically(결정론적)인 것과는 달리, BNN은 확률론적으로 행동한다.
즉, BNN은 단일 고정 가중치 집합 대신 가능한 가중치에 대한 확률 분포를 유지합니다.
강화학습 설정에서 weight 값에 대한 분포를 통해 행동에 대한 분포를 얻을 수 있게 한다.
이 행동에 대한 분포의 분산은 각 행동에 대한 에이전트의 불확실성을 추정하는 데 사용할 수 있다.
그러나 실제로, 모든 가중치에 대해서 분포를 중요시하는 것은 비실용적이다.
대신에 확률적은 네트워크를 생성하기 위해서 dropout을 활용할 수 있다.
Dropout은 네트워크의 활성화가 학습하는 동안 랜덤하게 제로로 만드는 기술이다. 이것은 레귤러라이저로써 많이 사용한다. dropout과 함께 네트워크를 반복적으로 샘플링함으로써, 우리는 각 행동에 대한 불확실성을 측정할 수 있다.
Dropout과 함께 네트워크로부터 하나의 샘플을 얻을 때 우리는 BNN로부터 샘플링을 근사하는 어떤 것을 할 수 있게 된다.
For more on the implications of using Dropout for BNNs, I highly recommend Yarin Gal’s Phd thesis on the topic.
개인적으로 Bayesian을 좋아하려고 노력하고 적용하려고 노력하는데, 역시 가장 단순한 방법은 Dropout을 사용하는 것인 것 같다. 아마 계산량도 너무 많아지고 가중치에 대한 사전 분포 가정에도 애매한 게 있어서 이 방법을 주로 쓰는 것 같다.
단점
불확실성 측정을 얻기 위해서는 여러 개의 샘플들이 필요로 한다. 그래서 계산 복잡성이 증가하게 된다.
그러나 이 글을 쓴 사람은 실험에서 한 번의 샘플로도 충분하다는 것을 발견했다고 한다(?!)
그리고 네트워크로부터 제공된 노이즈 추정치를 사용한다.
추정치의 노이즈를 줄이기 위해서 dropout은 0.1에서 1.0으로 하여 줄여나가게 했다고 함.
#Add to network
keep_per = tf.placeholder(shape=None,dtype=tf.float32)
hidden = slim.dropout(hidden,keep_per)
keep = 0.5
Q_values = sess.run(Q_out,feed_dict={inputs:[state],keep_per:keep})
action = #Insert your favorite action-selection strategy with the sampled Q-values.
실험 결과
bayeisan이 누구보다 빠르게 다른 알고리즘과는 다른 좋은 성을 내는 것을 확인!
현재 E-Greedy를 쓰고 있는데, 확대해서 진행해보는 것이 좋을 것 같다.
진보된 방법들
위에서 설명한 방법론들은 모두 action을 어떻게 할지를 다루고 있고,
이것 말고도 보상 신호 자체의 특성을 다루는 또 다른 탐사 방법이 있다고 한다.
이러한 접근법은 본질적 동기에 속하며, 많은 사람들이 노력해주고 있음.
아래와 같은 방법론들이 있고, 더 많다고 함.
- Variational Information Maximizing Exploration
- Incentivizing Exploration In Reinforcement Learning With Deep Predictive Models
- Unifying Count-Based Exploration and Intrinsic Motivation
- Hierarchical Deep Reinforcement Learning: Integrating Temporal Abstraction and Intrinsic Motivation
'관심있는 주제 > RL' 카테고리의 다른 글
Sarsa, Q-Learning , Expected Sarsa, Double Q-Learning 코드 비교하기 (2) | 2020.07.18 |
---|---|
On-Policy와 Off-Policy Learning의 차이 (0) | 2020.07.11 |
Chapter 5 Monte-Carlo Learning 공부 (0) | 2020.05.16 |
chapter 4 Dynamic Programming Example 도박사 문제 (0) | 2020.05.05 |
chapter 4 Dynamic Programming Example Car Rental (in-place) (0) | 2020.05.05 |