분석하고싶은코코

RL(강화학습) 이해하기_PPO(Proximal Policy Optimization) 본문

머신러닝&딥러닝/RF(강화학습)

RL(강화학습) 이해하기_PPO(Proximal Policy Optimization)

코코로코코 2024. 1. 13. 19:49
반응형

RFHF에 대한 이해를 하기 위해서 마지막 단계에서 활용되는 PPO알고리즘에 대해서 이해를 해야만 했습니다. 그래서 이 부분에 대해서 논문과 여러 정보들을 찾아보면서 이해하다보니 시간이 좀 걸리긴 했지만 이해한 내용을 바탕으로 PPO(Proximal Policy Optimization)에 대해서 포스팅해보겠습니다. 이번 포스팅 역시 복잡한 수식을 통해서 이해하는 과정을 설명하지는 않겠습니다. (해당 알고리즘에 대해서 이해하기 위해서는 Q-learning방식의 단계부터 이해하셔야만 합니다.ㅠ.ㅠ 저는 이해를 위해 Youtbe 혁펜하임 채널에 도움을 많이 받았습니다.)

 

Importance Sampling

PPO 알고리즘 이전에 있었던 알고리즘은 Reinforce, Aactor-Critic, A2C, A3C 알고리즘들의 공통점이 있습니다. 해당 알고리즘들은 θ를 따르는 확률 분포에서 샘플들을 뽑아서 θ를 업데이트 하는 과정을 거쳤습니다. 그래서 업데이트된 θ에서 새롭게 샘플을 뽑아야만 했습니다. 이 부분이 PPO와 가장 큰 다른점이라고 할 수 있습니다. PPO는 θ를 θ와 θ_OLD로 두 가지로 구분해서 사용했습니다. 그래서 샘플을 θ_OLD를 따르는 확률 분포에서 샘플을 뽑고 여기에 업데이트된 θ값을 통해서 어느정도 가중치(Importance)를 줌으로서 지속적으로 θ가 업데이트 되어도 θ_OLD에서 샘플링을 할 수 있다는 가정이 성립하게 됩니다. 이게 핵심적인 Importance Sampling방법입니다.

 

Cliping

그런데 이런 Importance Sampling에는 큰 조건이 하나가 있습니다. θ와 θ_OLD의 값이 비슷해야만 한다는 가정이 필요합니다. 그래야 Importance Sampling을 수행할 수 있습니다. 이러한 조건에 큰 문제점은 에러값이 크면 모델에서는 해당 행동은 잘 못 됐으니 하지 말아야하고 잘 된 행동이라면 해당 행동을 더욱 유도할 것이라는 것입니다. 그렇게 되면 앞서 이야기한 θ와 θ_OLD의 값이 비슷하다는 가정이 깨져버립니다. 이를 막기 위해서 PPO에서 사용한 것이 Cliping방법입니다. Cliping은 최소, 최대의 범위를 정하고 어떤한 값이 들어왔을때 지정한 값보다 작으면 지정한 값으로 고정, 반대로 지정한 값보다 크면 지정한 값으로 고정시키는 방법입니다. 이 방법을 통해서 Importance Sampling을 만족시킬 수 있는 조건을 만들었습니다.

 

GAE

앞서 말한 것이 가장 큰 다른점이었고 추가적으로 다른점 하나가 존재합니다. TD를 GAE라는 수식을 사용해 GAE_hat으로 대체했다는 것입니다. 이에 대해서 간단하게 설명하자면 TD는 현재 시점의 값에 대한 평균을 갖고 있고 이 값을 가지고 새로운 값이 들어왔을때의 평균을 구하는 방법을 처음부터가 아니라 현재 구한 평균값만을 가지고 구하자라는 방법입니다. 이 step이 늘어날수록 1-step TD, 2-step TD .... N-step TD가 되는 것입니다. 이러한 방법에 이동평균법(Exponential Moving Average)를 적용하여 무한대-step TD의 합을 적용하여 수식으로 정리한 것이 GAE수식이 됩니다. 이렇게 하는 이유는 무엇보다 가장 가까운 TD에게 영향을 많이 받고 가정 먼 TD에게는 영향을 적게 받음으로서 단순히 1-step TD만 진행했을때보다 편향은 좀 커지겠지만 분산이 줄어드는 효과를 얻을 수 있기 때문입니다. 또한 이방법을 통해서 식도 굉장히 간단하게 표현이 가능하게 됩니다. 그런데 PPO에서는 무한대만큼 샘플을 뽑는 것이 아니기 때문에 수를 제한하여 GAE_hat이라는 수식으로 사용하게 됩니다.(그런데 간단한 GAE식을 유도할때 무한등비급수였기 때문에 정리할 수 있었던 식이었는데 이를 어기는 방법이 왜 사용됐는지는 모르겠습니다...) 이 방법이 기존의 알고리즘과 TD-target과 다른점이라고 할 수 있겠습니다.

 

 

이러한 3가지 핵심요소를 통해서 만들어진 PPO 알고리즘이 혁신적이었던 이유는 굉장히 실용적이라는 부분에 있습니다. 기존에는 θ라는 값이 업데이트 됐다면 해당 θ값을 통해서 나오는 샘플을 업데이트 될때마다 새롭게 뽑아야만 했습니다. 그런데 PPO는 Importance Sampling을 통해서 θ_OLD를 통해 나오는 샘플들을 활용해 지속적으로 θ를 업데이트 할 수 있다는 장점을 갖게 되었습니다. 물론 θ_OLD값 역시 특정 횟수를 거치면 새로운 θ값으로 대체되기는 하지만 이 부분이 PPO알고리즘이 강력하고 실용적인 가장 큰 이유라고 할 수 있었습니다.

 

 

NLP with PPO

이러한 PPO알고리즘을 자연어처리 분야에 적용할 수 있게 됩니다. PPO는 기본적으로 Reinforce -> Actor-Critic -> A2C -> A3C 알고리즘들에서 발달해온 과정이기 때문에 Actor와 Critic이라는 이름을 사용하고 실제로 PPO알고리즘을 제공해주는 모듈에서도 해당 구조를 동일하게 사용하게 됩니다. 아래 코드는 chatgpt모듈에 있는 PPOTrainer의 사용 예시입니다. Actor와 Critic에 대한 정보를 제공함으로서 훈련이 가능한 모듈임을 확인 할 수 있습니다.

PPOTrainer(strategy,
             actor,
             critic,
             reward_model,
             initial_model,
             actor_optim,
             critic_optim,
             ...)

 

앞에서 포스팅했었던 과정의 연장선으로 Actor는 실제로 다음에 나올 단어를 예측하는 확률분포를 갖고 있는 LLM(Large Language Model)혹은 SFT(Supervised Fine tuning model)이 되겠습니다. 그리고 Critic은 Actor에 대한 행동을 평가해주는 Reward Model이 되겠습니다. 이 두 모델을 활용해 PPO알고리즘을 적용하면 강화학습하는 자연어 생성 AI모델이 완성되는 것입니다. 여기서 actor와 critic을 줬음에도 initial_model(actor)와 reward_model(critic)을 따로 넘겨주는 이유는 앞서 PPO과정에서 이야기한 θ_OLD를 갖고 있는 모델이 초기화 모델과 보상 모델이 되고 θ값을 갖고 있는 모델이 actor와 critic이기 때문입니다. 이러한 자연어처리에 적용한 방법에 대한 설명을 잘 정리해둔 깃허브 가 있으니 참고해보시면 좋을 것 같습니다.

 

 

이러한 과정에서 HF(Human Feedback)즉 보상에 대한 부분이 사람이 한 직접적인 피드백이 영향을 준다면 RLHF를 처음 언급했을때 이야기한 더욱 사람과 같은 특히 하나의 인격(?)과 비슷한 느낌을 갖는 하나의 모델이 되는 것으로 볼 수 있겠죠? 다음 포스팅에서는 이전에 포스팅했던 KoGPT를 이용하여 PPO알고리즘을 통해 훈련 실습에 대한 포스팅을 진행해보겠습니다.

 

 

반응형