[CS285] 2. Supervised Learning of Behaviors

Date:     Updated:

카테고리:

태그:


💡 이 글은 『2024 PseudoLab 전반기 강화학습팀』으로 진행되었으며, CS285 Fall 2023를 따라 정리했습니다.

1. Imitation Learning

이번 시간에는 본격적인 강화학습 공부에 앞서 imitation learning에 대해 공부한다. Imitation learning은 behavior cloning이라고도 불리며, expert가 수행한 행동을 imitate하는 것을 의미한다. 즉, supervised learning을 통해 강화학습을 수행할 수 있다.

1.1. Terminology & notation

시작에 앞서 간단한 강화학습 용어를 알아보자.

  • Observation $o_t$: Agent가 관측한 정보
  • Action $a_t$: Agent가 취한 행동
  • Policy $\pi(a_t \vert o_t)$: Agent가 관측한 정보를 바탕으로 행동을 선택하는 확률분포

그리고 state $s_t$와 observation $o_t$의 차이를 강조한다. State는 observation의 상위 개념으로, observation을 만드는 complete physical description을 의미한다. 즉, observation은 state의 일부를 관측한 것이다. 예를 들어 치타가 쫓는 상황 자체가 state라면 우리가 실제로 관측하는 것은 치타가 쫒는 “사진”, 즉 observation이다. 그러나 실제로는 state와 observation을 혼용하여 사용하기도 하는데, 대개 둘 중 무엇을 써도 상관없는 경우에 혼용한다.

설명한 과정을 위와 같은 Bayes network로 표현할 수 있다. 위 그래프를 직관적으로 이해할 수 있을 것이다. 중요한 것은 state는 Markov property를 가지고 있다고 가정하는 것이다. 즉, present $s_t$에만 의존하고 past $s_{t-1}, s_{t-2}, \cdots$에는 의존하지 않는다. 따라서 다음과 같이 나타낸다.

\[p(s_{t+1} \vert s_t, a_t)\]

따라서 state $s_t$는 과거의 정보 없이 미래 $s_{t+1}$을 예측하기 위해 알아야 할 모든 것이라고 이해할 수 있다. 그러나 $s_t$를 안다고 미래를 완벽히 예측할 수 있는 것은 아닌데, 이는 stochasticity 때문이다. 즉, 미래는 확률적이다.

Imitation learning의 목표는 policy $\pi(a_t \vert o_t)$를 학습하는 것이다. 이때 사람의 행동(human demonstrator)으로 dataset을 만들어서 일종의 supervised learning을 하게 된다. 위 그림에서 observation은 image, action은 steering wheel angle이라고 하면 이 데이터 쌍 $(o_t, a_t)$을 통해 policy를 학습한다. 이를 다른 말로 behavior cloning이라고도 한다.

1.2. Distribution shift problem

그러나 behavior cloning은 잘 작동하지 않는다. 이는 human demonstrator와 조금만 행동 $a_t$가 달라져도, 나중에는 state $s_t$가 원래의 루트에서 크게 벗어나버리기 때문이다. 이를 distribution shift problem이라고 한다. 이는 supervised learning에서는 없는 문제이다. 왜냐하면 supervised learning에서는 input과 output이 i.i.d.이기 때문이다. 그러나 강화학습에서는 input과 output이 i.i.d.가 아니기 때문에 이러한 문제가 발생한다. 즉, 앞의 상태가 뒤의 상태에 영향을 미치고 있다.

이를 수학적으로 표현하면 다음과 같다. 우리는 사람의 행동을 통해 데이터를 수집했다. 이를 $p_{data}(o_t)$라고 한다. 이때 우리는 다음 목표를 훈련하게 된다.

\[\max_ \theta \mathbb{E}_ {o_t \sim p_{data}(o_t)} \left[ \log \pi_ {\theta}(a_t \vert o_t) \right]\]

그러나 실제로는 정책 $\pi_ {\theta}$에 의해 만들어진 데이터를 수집하여 $p_{\pi_{\theta}}(o_t)$를 얻게 된다. 이때 $p_{\pi_{\theta}}(o_t)$는 $p_{data}(o_t)$와 다르다. 이를 distribution shift라고 한다. 이러한 문제를 조금 더 분석해보자.

다음과 같이 cost function $c(s_t, a_t)$를 정의하자. 이때 $\pi^ \ast$는 expert의 policy라고 하자.

\[c(s_t, a_t) = \begin{cases} 0 & \text{if } a_t = \pi^ \ast(s_t) \\ 1 & \text{otherwise} \end{cases}\]

즉 expert의 policy와 동일한 행동을 하면 cost가 0이고, 그렇지 않으면 cost가 1이다. 따라서 우리는 cost를 최소화시키는 방향으로 학습해야 한다. 그리고 더 이상 $p_{data}$가 아닌 $p_{\pi_{\theta}}$를 통해 학습해야 한다. 이를 수학적으로 표현하면 다음과 같다. (여기서 $o_t$와 $s_t$는 동일한 의미로 혼용되고 있다.)

\[\min_ \theta \mathbb{E}_ {s_t \sim p_{\pi_\theta (s_t)}} \left[ c(s_t, a_t) \right]\]

그럼 평균적으로 얼마나 실수를 하는지 확인하기 위해, 데이터셋에 있는 데이터에 대해서는 평균적으로 실수를 할 확률이 $\epsilon$보다 작다고 가정하자. 즉, 다음과 같다.

\[\mathbb{E}_ {s \sim p_{\text{train}}(s)} \left[ \pi_ {\theta}(a \neq \pi^ \ast(s) \vert s) \right] \leq \epsilon\]

그렇다면 계속 $\pi^ \ast$와 같은 행동을 할 확률은, 시간 $t$가 지났을 때 $(1-\epsilon)^t$로 나타낼 수 있다. 따라서 다음과 같이 나타낼 수 있다.

\[p_\theta (s_t) = (1-\epsilon)^t p_{\text{train}}(s_t) + (1 - (1-\epsilon)^t) p_{\text{mistake}}(s_t)\]

이때 $p_\theta$와 $p_{\text{train}}$의 차이를 구하면 다음과 같다.

\[\begin{aligned} \vert p_\theta (s_t) - p_{\text{train}} (s_t) \vert &= (1 - (1-\epsilon)^t) \vert p_{\text{mistake}} (s_t) - p_{\text{train}} (s_t) \vert \\ &\leq 2 (1 - (1-\epsilon)^t) \\ &\leq 2 \epsilon t \quad \because (1-\epsilon)^t \geq 1 - \epsilon t \text{ for } \epsilon \in [0, 1] \end{aligned}\]

(참고) 많은 분들이 여기서 이해가 안 된다고 하시는 부분이 두 확률분포의 차이의 최댓값이 2가 되는 부분이다. 예를 들어 $p$가 왼쪽으로 갈 확률, 직진할 확률, 오른쪽으로 갈 확률 총 3가지의 확률로 나누어져 있다면 다음과 같은 때에 최대 2가 될 수 있다.

\[\begin{aligned} p_{\text{mistake}} &= [0.5, 0, 0.5] \\ p_{\text{train}} &= [0, 1, 0] \\ \end{aligned}\]

이어서 평균적으로 얼마나 실수를 하는지 upper bound를 추산해보면 다음과 같다.

\[\begin{aligned} \sum_ t \mathbb{E}_ {p_\theta (s_t)} \left[ c_t \right] &= \sum_ t \sum_ {s_t} p_\theta (s_t) c_t (s_t) \\ &\leq \sum_ t \sum_ {s_t} \left[ p_{\text{train}} (s_t) c_t (s_t) + \vert p_\theta (s_t) - p_{\text{train}} (s_t) \vert c_{\text{max}} \right] \\ &\leq \sum_ t \left[ \epsilon + 2 \epsilon t \right] \sim O(\epsilon T^2) \\ \end{aligned}\]

따라서 시간이 지날수록 quadratic하게 실수의 수가 늘게 된다. 이는 distribution shift problem의 심각성을 보여주는 것이다. 물론 운 좋게 실수로부터 다시 회복하여 $p_{\text{train}}$로 돌아갈 수도 있지만, 그렇다고 imitation learning이 잘 작동한다고 할 수는 없다.


2. Addressing the problem in practice

이러한 문제를 해결하기 위하여 4가지 방법을 제시한다. 하나씩 알아보자.

  • Be smart about how we collect (and augment) our data
  • Use very powerful models that make very few mistakes
  • Use multi-task learning
  • Change the algorithm (DAgger)

2.1. Be smart about how we collect (and augment) our data

첫 번째 방법은 단순하다. $p_{data}$에 실수를 하고, 그것을 해결하는 과정을 포함시키는 것이다. 혹은 data augmentation을 통해 실수를 교정하는 방법을 포함시키는 것이다. 이렇게 되면 $p_{data}$가 커버하는 trajectory가 넓어지게 되어 정말 이상적인 루트로 가지 않더라도 다시 교정할 수 있는 기회가 남아 있으므로 distribution shift problem을 해결할 수 있다.

예를 들어 위와 같은 자율주행 프로그램을 학습시킬 때, 전방 카메라만 보고 학습하는 것이 아니라 전방 카메라, 왼쪽 카메라, 오른쪽 카메라를 보고 학습시키는 것이다. 예를 들어 일반적으로 왼쪽 카메라가 보는 화면이 전방 카메라에 비춘다면 이는 잘못된 것이다. 오른쪽으로 핸들을 틀어야 하는 상황인 것이다. 따라서 왼쪽 카메라로 수집한 데이터에는 이러한 데이터가 전방 카메라에 비춘다면 오른쪽으로 핸들을 틀어야 한다는 라벨링이 붙는다. 즉, 왼쪽과 오른쪽 카메라를 통해 mistakes and corrections를 만들어내는 것이다.

2.2. Use very powerful models that make very few mistakes

두 번째 방법은 강력한 모델을 학습시켜서 실수를 덜 하게 하자는 것이다. 사람의 행동을 따라하지 못하는 데에는 크게 두 가지 이유가 있다. 각각에 대해서 알아보자.

  • Non-Markovian behavior
  • Multimodal behavior

2.2.1. Non-Markovian behavior

Non-Markovian behavior과거의 정보가 미래에 영향을 미치는 행동을 의미한다. 즉, 실제로는 state가 Markov property를 가지고 있지 않다는 것이다. 사람은 똑같은 것을 보아도 과거의 상태에 따라 다르게 행동한다. 즉, $\pi_\theta(a_t \vert o_t)$가 아니라 다음과 같이 표현하는 게 옳다.

\[\pi_\theta(a_t \vert o_1, o_2, \cdots, o_t)\]

따라서 과거를 기억하여 유추하기 위해 frame 여러 개를 겹쳐 넣기도 하고, sequence model을 사용하기도 한다. 하지만 이러한 방법은 원래 방법보다 느릴 수밖에 없다.

그러나 이러한 해결법이 항상 옳은 것이 아니다. 오히려 이것으로 인해 결과가 더 나빠지기도 하는데, 이를 causal confusion이라고 한다. 예를 들어 원래 간단한 모델이었으면 보행자를 보고 바로 브레이크를 밟을 수 있었던 것을(Scenario B), 오히려 브레이크 보조등에 의해 브레이크가 밟힌다고 잘못 유추하여 사고가 나는 경우(Scenario A)가 생길 수 있다.

2.2.2. Multimodal behavior

두 번째는 multimodal behavior로, 2개 이상의 행동이 가능한 상황을 의미한다. 예를 들어 아래 나무를 지나가는 방법은 왼쪽으로 가는 것도, 오른쪽으로 가는 것도 유효하다.

문제는 단일 Gaussian으로 이를 학습시킨다면, Gaussian은 평균을 학습하므로 오히려 두 가지 행동의 중간, 즉 직진하는 것을 학습하게 될 수 있다는 것이다. 따라서 두 가지 방법을 선택할 수 있다.

  1. Continuous distribution을 사용하되, 실제 분포를 더 잘 표현할 수 있는 모델을 사용한다. 그 예시로는 다음과 같은 것들이 있다.
    1. Mixture of Gaussians
    2. Latent variable models
    3. Diffusion models
  2. 고차원에서 discrete distribution을 사용한다. 이를 위해 autoregressive discretization을 사용하기도 한다.

아래는 각각 latent variable model과 diffusion model을 그림으로 나타낸 것이다. Latent variable에 따라 distribution이 달라지는 것을 볼 수 있다.

고차원에서의 discretization을 위해 한 번에 한 차원씩 예측하는 autoregressive discretization을 사용할 수도 있다.

2.3. Use multi-task learning

세 번째는 multi-task learning으로, 더 다양한 goal을 가지고 학습하여 유연성을 학습시키는 것이다. 이를 goal-conditioned behavior cloning이라고 한다. 즉, goal state에 따라 policy가 달라질 수 있다.

예를 들어 아래 로봇은 인간이 자유롭게 조작하여 다양한 데이터를 모으고, 각각에 대해 다른 goal을 라벨링해준다. 그리고 goal conditioned policy를 학습시켜 더 유연하게 움직이도록 했다.

2.4. Change the algorithm (DAgger)

네 번째는 알고리즘을 바꾸자는 것이다. 교수님께서는 DAgger를 수업 내내 강조하시는데, 이는 Dataset Aggregation의 약자이다. 아이디어는 학습 데이터를 지금까지는 $p_{data}$에서 모았다면, 이제는 로봇이 실제로 수행하는 $p_{\pi_\theta}$에서 모으자는 것이다. 즉, 실제로 수행한 행동을 다시 라벨링하여 학습 데이터로 사용하는 것이다.

DAgger의 알고리즘은 다음과 같다.

  1. Human data $\mathcal{D} = \lbrace o_1, a_1, \cdots, o_N, a_N \rbrace$를 수집하여 $\pi_\theta(a_t \vert o_t)$를 학습시킨다.
  2. $\pi_\theta$를 사용하여 로봇이 수행한 행동을 라벨링하여 $\mathcal{D}_ \pi = \lbrace o_1, \cdots, o_M \rbrace$를 수집한다.
  3. 사람이 $\mathcal{D}_ \pi$에 적절한 action $a_t$를 라벨링한다.
  4. $\mathcal{D} \leftarrow \mathcal{D} \cup \mathcal{D}_ \pi$로 업데이트하고, $\pi_\theta$를 반복 학습시킨다.

문제는 3번, 사람이 직접 라벨링을 해야 한다는 것이다. 이상적이지만 현실적으로는 어렵다.


3. What comes next?

3.1. Problem of imitation learning

Imitation learning의 태생적인 문제인 distribution shift를 해결했다고 해도, 남은 여러 문제가 있다.

  • 사람이 데이터를 만드는 것은 한정적(finite)일 수밖에 없다.
  • 물리적으로 복잡한 상황 (네 발로 걷는 로봇 등) 을 사람이 라벨링하기 어렵다.
  • 사람은 자율적(autonomously)으로 학습한다. 로봇도 마찬가지로 자율적으로 학습하게 하고 싶다.

따라서 다음 장부터 본격적인 강화학습에 대해 설명할 것이다.

3.2. cost functions and reward functions

마지막으로 cost functionreward function에 대해 알아보자. Reward functionagent가 얼마나 좋은 행동을 했는지를 나타내는 함수이다. 반면 cost functionagent가 얼마나 나쁜 행동을 했는지를 나타내는 함수이다. 이 둘은 서로 반대되는 개념이다. 예를 들어 지금까지 알아보았던 imitation learning에서 이들이 어떻게 정의될 수 있는지 보자. 먼저 cost function을 다음과 같이 정의했다.

\[c(s, a) = \begin{cases} 0 & \text{if } a = \pi^ \ast(s) \\ 1 & \text{otherwise} \end{cases}\]

이상적인 행동을 하지 않으면 cost가 증가한다. 반대로 reward function은 다음과 같이 정의할 수 있다.

\[r(s, a) = \log p(a = \pi^ \ast(s) \vert s)\]

이상적인 행동을 할 확률이 증가하면 reward가 증가한다. 따라서 다음 두 가지 방법으로 모델을 학습시킬 수 있다.

\[\begin{aligned} \min_ \theta \mathbb{E}_ {s_t \sim p_{\pi_\theta (s_t)}} \left[ c(s_t, a_t) \right] &\quad \text{(cost function)} \\ \max_ \theta \mathbb{E}_ {s_t \sim p_{\pi_\theta (s_t)}} \left[ r(s_t, a_t) \right] &\quad \text{(reward function)} \end{aligned}\]

다음 시간에는 RL의 개요에 대해 알아보겠다.


CS285 카테고리 내 다른 글 보러가기

댓글 남기기