RL
이 포스트에서는 강화학습에 대한 전반적인 이해 및 소소한 팁을 적어본다.
강화학습은 다른 인공지능 분야보다 좀 특별하다.
이미지 인식이나 생성형 인공지능들은 패턴을 매칭하고 학습하는 반면, 강화학습은 시행착오를 통해 학습하기 때문이다.
사람이 배우는 과정과 상당히 비슷하다. 현재 상황에서 좋은 선택을 할수록 더 큰 보상을 받고, 비슷한 상황에서 해당 행동을 선택할 확률이 커지도록 행동이 강화된다.
실제로 사람의 보상체계 중 하나인 중독 매커니즘을 모방한 것이 강화학습이다.
단순히 퍼셉트론을 이용해 패턴 매칭을 하는게 아닌, 학습 과정을 모방한 것이다.
강화학습은 수많은 경우 각각에 대해 코드를 짜주기 힘든, 다양한 상황을 고려해 최적화해야 하는 문제들을 자동화 하는데 주로 사용된다.
센서를 통해 현재 상태를 얻고 최적의 판단을 내리는 로봇 제어 문제가 대표적인 예시다.
또한, 우리가 자주 쓰는 대규모 언어모델 chat gpt를 학습시킬때도 사람의 피드백을 거치는 강화학습(RLHF)이 사용되었다.
그리고 많은 사람들이 좋아하는 게임도 강화학습이 두각을 드러낼 수 있는 분야이다.
강화학습과 유전 알고리즘을 헷갈려 하는 사람이 많다.
둘 다 시행착오를 통해 자신을 개선한다는 공통점이 있지만, 학습하는 대상(목표)가 다르다.
유전 알고리즘은 어떤 조건(criteria)에 가장 적합한 parameter값을 학습한다.
반면, 강화학습은 특정 상황(state)에서 누적 보상(cumulative reward)을 최대화 하는 선택(action)을 내리는 방법(policy), 즉 decision making process를 학습한다.
유전 알고리즘은 파라미터 값을 학습하는 반면, 강화학습은 선택하는 방법(policy) 을 학습한다.
강화학습은 행동을 결정하는 주체인 요원(agent)과 이와 상호작용하는 공간인 환경(environment)으로 이루어져 있다. 요원이 환경으로부터 정보를 얻으면(observation), 관찰에서 필요한 정보를 뽑아내어 상태(state)를 정의하고, 해당 정보로부터 행동을 결정하고 수행하며(action) 그 행동에 대해 환경으로부터 보상(reward)을 받는다. 행동을 결정하기 위해서 우리가 현재 어떤 상태에 있고(밥 그릇이 앞에 있으면 숫가락을 집어서 먹고, 김치가 앞에 있으면 젓가락으로 먹는게 효율적이다) 어떤 결정을 내렸을때 보상이 컸는지를 알아야 한다. 환경으로부터 얻는 정보로 이 상태를 알 수 있다. 한 상태에서 행동을 하면 다른 상태가 된다. 물 위에 떠있다가 수영을 해서 섬에 도착하면 내가 물 위가 아닌 섬 위에 있는 상태가 된다. 이 상태에서 어떤 행동을 했을때 보상이 가장 큰지 데이터를 쌓아서 결정을 내린다. 가장 보상이 컸던 행동을 하면 누적 보상을 최대화하는데 유리할 것이다!
그렇다면 좋은 결정이란 무엇일까? 더 구체적으로 알아보기 위해 유명한 기회비용 문제를 살펴보자. 지금 눈 앞에 쿠키가 있다. (여러분은 쿠키를 좋아해서, 보이면 바로 먹고싶은 본능이 내제 되어있다) 이 공짜 쿠키를 먹으면 도파민이 분비되고 기분이 좋아질 것이라고 생각한다. 하지만, 감독관이 지금 눈 앞의 쿠키를 먹지 않고 10분을 기다리면, 쿠키 하나를 더 공짜로 주겠다고 말한다. 그럼 당연히 10분을 기다릴 것이다. 1초마다 당신의 본능이 눈앞의 쿠키를 먹도록 유혹해도 말이다. 그렇다면, 1000년을 기다리면 쿠키를 하나 더 준다고 말하면 어떨까? 그때가 되면 우린 이미 죽고 없을 것이다. 그래서 그냥 눈앞의 쿠키를 바로 먹는게 더 나은 선택이다. 여기서 두가지 사실을 알 수 있다. 단순히 바로 1초 뒤의 보상만 생각하면 안되고, 미래에 얻을 수 있는 모든 보상의 합을 보아야 현재 가장 좋은 선택을 할 수 있다는 것이다. 또 다른 한 가지는 보상을 얻는 시간이 지연될수록 그 가치가 작아진다는 것이다. 그래서 누적 보상을 정의할때 시간이 경과할수록 (0과 1 사이의) discount factor를 곱해서 점점 먼 미래의 보상의 가중치가 작아지도록 한다. 마치 지금 바로 보상을 얻는것과 나중에 얻는것을 비교하는 기회비용처럼 말이다.
마지막으로, 강화학습의 어디에 신경망이 사용되는걸까? 바로 가치함수를 모델링할때 이다. 가치 함수는 어떤 상태에서 얻을 수 있는 누적 보상인 상태가치함수와, 한 상태에서 어떤 행동을 했을때 얻을 수 있는 누적 보상을 묘사한 상태 행동가치함수가 있다. 상태가치 함수를 전부 안다면, 현 상태보다 더 높은 상태함수값을 가진 상태로 갈 수 있는 선택을 하면 된다. 상태행동가치함수를 안다면 현 상태에서 가장 누적보상이 높은 행동을 취하면 된다.
모든 상태에 도달하여 모든 행동을 해볼 수 있다면 가치함수를 완벽히 구할 수 있을 것이다. 근데 이럴꺼면 그냥 하드코딩하여 모든 경우를 돌아보는게 시행착오를 하는것 보다 더 빠르고 정확할 것이다. 하지만 많은 문제들이 수많은 상태와 (심지어 연속적인) 수많은 행동이 있으며, 우연성이 있는 상태변화(확률적인 상태변화)가 존재한다. 따라서, 모든 시행착오를 거쳐보지 않더라도 대략적으로 보상값을 알 수 있게 일반화(generalization) 할 수 있는 능력이 있는 신경망을 사용하는 것이다.
댓글남기기