본문 바로가기
TechStudy/LLM

[펌] 강화학습(Reinforcement Training)

대중에게 최초로 AI의 공포를 각인시켰던 사건들 중 하나를 꼽자면, 단연 알파고를 빼놓을 수 없을 것입니다. 또한 chatGPT 가 처음 등장할 때에도 기본적인 GPT 언어 생성모델에, 파라메터를 잔뜩 불리고 (180B) RLHF 라는 기법을 통해 사람과 대화하는 것 같은 instruction following 이라는 task 에 추가 학습시킴으로써 이제껏 보지못한 새로운 형태의 지능이 등장하는 것을 보게 되었습니다.

 

이러한 충격적인 기술혁명의 공통점에는 바로 강화학습이 있습니다. 오늘은 강화학습에 대해 알아볼까 합니다. 

 

강화학습이라는 기술 자체는 꽤 오래전부터 연구되어오던 주제입니다. 하지만 2010년 대 들어서 발전한 딥러닝의 기법들+GPU 연산능력의 증가에 의해 그 실용적인 적용범위가 대폭 확장되었는데요, 그럼에도 불구하고 강화학습을 좀 들여다보려고 하면 시작부터 난해한 수식들과 개념들의 향연에 좌절하게 되곤 합니다.

 

먼저, 강화학습이 무엇이고 왜 중요한가에 대해 결론부터 말씀드리겠습니다. 

 

강화학습은 기본적인 딥러닝으로는 학습할 수 없는 목표 - 미분불가능한 파라메터들 - 을 학습하는 방법 중 하나입니다.

 

이것이 현대 생성ai 의 학습에서 강화학습이 지니는 가장 큰 의의라고 할 수 있겠습니다. 위키피디아에서 전통적인 강화학습에 대한 정의를 찾아보면 다음과 같은 설명이 나옵니다

 

 

전통적인 강화학습을 구성하는 주요 개념은 환경, 에이전트, 상태, 행동, 보상 등이 있습니다. 위의 설명을 보면 '강화학습은 입출력 쌍으로 이루어진 훈련 집합이 제시되지 않는다' 라고 써 있습니다.

 

하지만 요즘에 생성AI 에 사용되는 다양한 강화학습 알고리즘, DPO, KPO, ORPO, RSO, cDPO, DOVE, SPIN, RAFT, SimPO, RLOO 등을 살펴보면.. 대부분 데이타셋 (훈련 집합) 이 별도로 존재합니다. 데이타셋이 없이 스스로 데이타셋을 만들어내는 프레임워크들도 있긴 하지만, 어쨌든 중간과정에 데이타셋이 생겨나긴 합니다. 여기서부터 첫번째 혼란이 생겨납니다.

 

 

또한 기존의 강화학습은 온라인 수행에 중심을 두고 있다라고 설명하고 있지만, 현대의 복잡한 생성 모델들은 온라인 학습에 적합하지 않고 (temporal correlation 문제), 병렬화를 통한 고속화를 위해서도 asynchronous, offline, off-policy 학습을 하게 됩니다. 이런 부분들에서 두번째 혼란이 생겨납니다.

 

강화학습을 통해 더 강력한 생성모델을 만들고 싶어서 강화학습을 공부하게 되면 자꾸 딴 얘기가 나오게 되니까 기운이 빠질 수 밖에 없습니다.

 

이 부분에 대한 가장 명쾌한 해답은 Andrej Karpathy 가 2016년에 올린 블로그 글 'Deep Reinforcement Learning: Pong from Pixels' 에서 다루고 있습니다. https://karpathy.github.io/2016/05/31/rl/

 

블로그 글 초중반까지는 일반적인 RL의 개념 소개와, RL 의 학습법중 딥러닝과 가장 잘 맞는 Policy Gradient 최적화법을 소개하는 부분들이 있는데, 이쪽은 각자 읽어보시기 바라며, 가장 흥미롭고 통찰력이 느껴지는 결론은 맨 마지막에 제시하고 있습니다

 

 

Policy Gradient 방식에서 흥미로운 점은, 이걸 통해서 미분 불가능한 연산이 포함된 모델을 학습시킬 수 있다는 점이다라고 밝히고 있습니다. 전체 추론의 흐름을 정의할 때 위쪽의 표에서 빨간 부분은 미분이 안되는 항이 포함되어 있기때문에 전통적인 딥러닝 학습법 (역전파) 로는 학습이 불가능합니다.

 

하지만 위의 빨간 부분을 policy gradient 로 대체 하면, 미분 불가능한 부분까지도 역전파로 학습이 가능해집니다.

 

미분 불가능 가능에 대해서 조금 더 자세하게 설명해보겠습니다.

 

예를 들어 여러분이 리그오브레전드나 철권 같은 대전게임의 밸런싱 책임자가 되었다고 가정해봅시다. 신규캐릭터를 출시했는데 성능이 너무 개사기 or 개 쓰레기로 평가받고 있어서 다음 패치에 조정이 필요한 상황입니다.

 

숫자로 표현되는 파라메터를 조절하는 것 (예: 공격력, 딜레이시간, 피격 범위 히트박스 등등) 은 미분 가능한 수치들을 조절하는 것입니다. 이론상, 밸런싱의 기반이 되는 수치를 조절하게 되면 최종적으로 맞추고자 하는 수치 (평균승률) 에 맞춰나갈 수 있습니다.

하지만 현실적으로는 그렇게 안되는 경우들이 생겨납니다. 게이머들이 불평을 할 수도 있고 (몇주간 기다려서 고작 숫자 몇개 딸깍한거냐? 기본적으로 스킬 메커니즘을 바꾸지 않으면 이 캐릭은 재미가 없다), 실질적으로 미분 가능한 파라메터만으로는 최적화가 불가능할 수도 있습니다 (밸런스 A 를 바꿨더니 간접적으로 연관된 밸런스B 가 망가지고, B 를 바꿨더니 C 가 망가지고, C를 바꿨더니 다시 A가 망가지는 식으로 부분최적화의 무한루프 늪에 빠지는 경우)

 

 

 

결국, 전체적으로 어느 이상 복잡한 시스템에서는 미분 가능한 파라메터 조절 같은 쉬운 방법으로는 최적화에 한계가 있습니다. 또한 구조적으로 학습이 불가능한 다른 종류의 파라메터들도 있습니다. 바로 하이퍼파라메터들입니다. 임베딩 벡터의 차원 수라던가, 배치사이즈, 레이어 정규화층의 위치 같은 것들은 역시 미분 가능한 대상이 아니기 때문에 역전파를 통한 학습이 불가능합니다.

 

그렇다면 대안은 무엇일까요? 역전파를 사용하지 않는 다른 학습법을 사용하는 것입니다. 그러한 학습법중 직관적이면서도 간단한 사례로 '유전자학습' 이라는 방식이 있습니다

 

 

 

https://www.youtube.com/watch?v=w1MF0Iz0p40

 

 

위에서 보는 것처럼 그네를 탈 때 몸을 뻗을 것인가, 움츠릴 것인가를 0 또는 1 로 나타내고, 그네의 진자운동 주기를 여러단계로 쪼개서, 각 단계별로 몸 동작을 어떻게 할 것인지를 선택하게 하고 학습을 시킵니다. 보다시피 각 파라메터는 0 과 1 의 상태만 가지기 때문에 연속이 아니고, 미분도 되지 않습니다. 하지만 여러가지의 바리에이션을 만들고 그중에서 가장 성능이 좋은 것을 선택한 다음 다시 바리에이션 하는 진화의 원리를 차용하여 제법 그럴듯한 그네타기를 구현하고 있습니다.

 

유전자 알고리즘은 너무 간단하기 때문에 복잡한 상황에 적응하려면 좀 더 체계를 갖출 필요가 있습니다. 여기에 상태와 행동의 개념을 더 구체화하고 환경과 에이전트의 상호작용을 일반화하는 식으로 해서 강화학습의 프레임워크로 확장할 수 있습니다.

 

다시 말하지만 가장 중요한 것은, 미분 안되는 에이전트의 행동을 최적화할 수 있다는 것이고, 그게 자동으로 되는 것은 아닙니다. 아까 게임의 스킬 디자인과 밸런싱을 예로 설명하고 있었습니다만, 스킬 하나를 숫자만으로 바리에이션하는 것이 아니라 로직 자체를 바리에이션할 방법을 만들어주고 강화학습의 프레임워크에 끼워넣을 수 있다면, RL 알고리즘은 파라메터 미분의 영역을 넘어 다른 가능성들을 탐색하고, 그 방식들을 적용해서 획득한 보상들을 취합해서 조금 더 나은 선택지를 찾아나가는 것이 가능합니다.

 

언어모델의 경우를 생각해보겠습니다. 미분 안되는 학습의 영역이 어디일까요? 토큰화된 결과물입니다. 임베딩끼리는 연속적인 숫자를 가지지만, 일단 역임베딩, 역토큰화가 되어서 사람의 눈에 보이는 문장이 되고 난 다음에는 그것의 연속적인 형태를 찾을 수가 없습니다. 예를 들어서 '그녀는 예쁘다' 에서 약간 더 의미를 강조하고 싶다고 해서 간단히 어떤 미분가능한 작은 값을 더해서 '그녀는 매우 예쁘다' 라고 변환하기 어려운 것이지요.

 

그래서 결국 강화학습의 방법을 사용해서, 미분 안되는 구간 (토큰화, 역토큰화) 을 회피하면서 원하는 방향으로 언어모델의 동작 (policy) 을 유도하는 것이 언어모델 강화학습의 실태라고 할 수 있습니다.

 

다만, 요즘에는 이런 부분을 좀 다른 각도로 접근하는 연구들이 나오고 있습니다. 대표적인 것이 최근에 meta 에서 발표된 coconut 이라는 방법론인데요, 요즘의 언어모델은 추론 능력을 강화하기 위해 어떤 문제에 대해 바로 답을 내지 않고 중간에 scratchpad 에 해당하는 chain of thought 토큰들을 생성시킨 다음에 그걸 참고삼아서 단계를 밟아가서 최종적인 답을 내는 접근법을 사용하고 있습니다. 그런데 cot 의 단계에서는 중간에 언어모델이 낸 결론들에 대해 다양한 바리에이션 혹은 다음 단계 추론을 할 수 있어야 하는데, 이 과정에서 내부적인 표현 (문장 임베딩 = residual stream activation)  을 조금씩 움직여야합니다만, 토큰화와 역토큰화라는 중간의 장애물때문에 미세한 조절이 어렵다는 단점이 있습니다. 그럼에도 불구하고 내부 생각을 표현해서 GPT 모델에 다시 입력시킨다는 접근법은 확실한 효과가 있는건데 그걸 더 효율화하기 위해서, meta 연구진들은 중간의 토큰화와 역토큰화를 건너뛰고 내부적인 표현을 다시 다음 단계의 입력으로 넣어버리면 어떨까 하는 식의 접근을 생각해냅니다.

 

이렇게 하면 미분 불가능했던 중간 사고과정을 미분가능하게 (Continous) 만들어서 학습할 수 있습니다. 이것을 연구진들이 Chain of Continous Thought, 줄여서 COCONUT 이라고 부른 것입니다.

 

그 외에도 sakana.ai 같은 일본 팀은 미분 불가능한 목표 (트랜스포머의 아키텍처의 주요 컴포넌트) 들에 대해 유전자 학습 알고리즘을 도입해서 흥미로운 결과들을 내고 있습니다

예를 들면 모델을 병합(merge) 할 때 여러가지 파라메터들의 옵션이 생겨나게 되는데, 이것을 유전자 학습으로 자동으로 최적해를 골라낸다던가, 트랜스포머의 컨텍스트를 늘리면서도 효율성을 유지하기 위해서 어텐션 매트릭스를 변형한다던가 하는 것들을 대상으로 합니다. 

 

 

이상으로 강화학습과 현대 생성AI 의 관계에 대해 살펴보았습니다. 여러분들도 강화학습의 흥미로운 세계에 매력을 느끼는 계기가 되었으면 합니다. 시중에 나와있는 난해한 강화학습 책들에 등장하는 복잡한 수식들의 장벽을 극복하고 나면 그때부터 새로운 가능성의 세계가 열릴 것입니다.

 

 

 

 

 

https://arca.live/b/alpaca/124559424?p=1

728x90
반응형