Syee's blog Machine Learning/Deep Learning Engineer

Paper Study - Policy invariance under reward transformation

이번 포스트에서는 강화학습에서 reward shaping의 기반이 되는 논문인 “Policy invariance under reward transformation: Theory and application to reward shaping” (A. Y. Ng et al., 1999) [1]을 읽고 정리한 내용을 공유합니다.

글쓴이의 의견이나 부연 설명은 이 문장과 같이 블록으로 표시합니다.

Introduction


강화학습에서 task는 Reward function을 통해 표현됩니다. 이 reward function에 변화를 주는 것으로 학습의 성능을 향상시킬 수 있습니다. 이를 Reward shaping 이라고 합니다. 하지만 reward function은 굉장히 민감하기 때문에 reward shaping의 방법에 따라 agent는 의도와 다른 행동을 하기도 합니다. 본 논문에서는 이런 의도하지 않은 학습 결과를 bug라고 표현하며 그 예시로 두 가지 경우를 설명합니다.

  1. 자전거 주행 agent를 빨리 학습시키기 위해 goal 방향으로 갈때 positive reward를 주었더니 시작 지점을 중심으로 원을 그리며 도는 agent가 되었다. 이유는 goal에서 멀어질때 penalty를 안주었기 때문에 계속 돌기만 해도 goal에 가까워질때 받은 positive reward가 무한히 쌓이기 때문이다.
  2. 축구 로봇을 학습할 때 공을 계속 점유하고 있는 것이 중요하다. 그래서 공을 건드릴 때 reward를 주었더니 공 바로 옆에서 진동하는 agent가 되었다. 공을 계속 건드려서 reward를 반복적으로 받을 수 있기 때문이다.

위의 예시에서 우리가 바라는 것은 자전거 주행 agent는 goal에 도착하는 것이고 축구 로봇은 공을 상대 골대에 넣는 것입니다. 하지만 잘못된 reward shaping으로 전혀 다른 목표를 달성하는 agent를 학습시키게 되었습니다. 이처럼 reward shaping은 강화학습의 성능 향상을 위해 효과적인 방법이지만 의도한 방향으로 shaping 하는 것은 어렵습니다. 특히 위와 같이 positive reward가 계속해서 쌓이는 것을 positive reward cycle 이라고 논문에서 표현합니다.

이런 현상이 발생하는 이유는 reward function에 따라 agent가 학습하고자 하는 optimal policy가 아닌 suboptimal로 잘못 학습했기 때문입니다. 본 논문에서 optimal policy는 우리가 해당 문제에 대해 agent에게 학습시키고자 하는 정책이고 suboptimal은 우리가 원하는 policy는 아니지만 높은 reward를 받을 수 있는 정책을 말합니다. reward function의 변화가 학습하고자 하는 policy에도 영향을 주어 reward를 최대로 받는 방향으로 학습하여도 우리가 원하지 않는 방향으로 행동하는 agent로 학습되는 것입니다. 그렇기 때문에 우리는 reward function에 변화를 주어도 optimal policy가 변하지 않는 reward function의 형태가 필요합니다. 이런 성질을 본 논문에서 Policy invariance이라고 표현합니다.

본 논문에서는 reward function이 변화에 대해 policy invariance를 보장하는, 특히 positive reward cycle을 방지하는 reward function의 형태를 제안합니다.

Preliminaries


Definitions

  • (finite-state) Markov decision process (MDP) $M$ : $(S, A, T, \gamma, R) $
    • $S$ : a finite set of states
    • $A$ : a set of actions
    • $T$ : the next state transition probabilities
    • $\gamma$ : discount factor
    • $R$ : reward function, $R: S \times A \times S \mapsto \mathbb{R}$ with $R(s, a, s’)$
  • $\pi$ : policy over set of states $S$ is any function $\pi : S \mapsto A$
  • Value function : $ V^{\pi}_{M}(s) = E[r_1 + \gamma r_2 + …; \pi, s만] $
  • Q-function : $ Q^{\pi}_{M}(s, a) = E_{s’ \sim P_{sa}(\cdot)}[R(s, a, s’) + \gamma V^{\pi}_{M}(s’) ] $
  • $\textbf s_0​$: 본 논문에서는 $s_0$를 absorbing state라 하며, undiscounted MDP($\gamma​$ = 1) 일 때 더이상 reward를 주지 않는 state를 표현합니다. 이는 episodic task를 continuing task로 일반화할 때 terminal state와 같은 역할을 합니다. $s_0​$에서는 모든 action이 $s_0​$로의 state transition (상태 전이) 만을 발생시킵니다. 아래 그림이 하나의 예시입니다. (본 논문의 figure 3)[2]

일반적으로 $s_0$는 episode의 가장 첫번째 state를 표현하지만 본 논문에서는 absorbing state를 뜻합니다.

Shaping Rewards

본 논문에서는 reward shaping function을 추가한 새로운 reward function 형태를 제안합니다.

\[R' = R + F\] \[F : S \times A \times S \mapsto \mathbb{R}\]

그리고 $R’$ 을 이용해 MDP를 새롭게 정의합니다.

\[M' = (S, A, T, \gamma, R')\]

$F$ 는 shaping reward function 라고 합니다. $F$를 이용해 원하는 shaping term을 추가할 수 있습니다. 예를들어 agent가 goal에 가까워지도록 reward shaping을 하고 싶다면 다음과 같이 $F$를 정의할 수 있습니다.

\[F(s, a , s') = \begin{cases} r, & \mbox{if } s' \ closer \ to \ the \ goal \ than \ s. \\\\\\ 0, & \mbox{otherwise} \end{cases} \text{, where } r \text{ is some positive reward.}\]

$M’$은 $M$과 같은 state, action, transition probablities, discount factor를 사용하기 때문에 강화학습 알고리즘을 동일하게 적용할 수 있습니다.

우리의 목표는 정의한 MDP 모델과 강화학습 알고리즘을 이용해 최적의 policy를 찾아내는 것입니다. 그러기 위해서는 다음의 질문들에 대답할 필요가 있습니다.

  • 어떤 형태의 $F$ 를 사용해야 $M’$ 에서의 optimal policy가 $M$에서도 동일하게 optimal policy라는 것을 보장할 수 있을지?
  • 이 때의 $M’$는 positive reward cycle을 방지할 수 있는지?

Main results


이번 절에서는 어떤 형태의 $F$가 policy invariance를 보장하는지 알아봅시다.

앞서 Introduction에서 자전거 문제를 예시로 들었습니다. 이 문제에서 단순히 goal로 가까워질때 추가적인 reward를 발생시켰고, 이로 인해 시작지점을 기준으로 원을 그리며 계속해서 회전하는 policy가 학습되었습니다. 이런 현상이 발생하는 이유는 agent가 특정 state를 순환($ s_1 \rightarrow s_2 \rightarrow … \rightarrow s_n \rightarrow s_1 \rightarrow … $)하는 경우에 $F$의 총합이 0보다 큰 값을 갖게 되기 때문입니다.

\[F(s_1, a_1, s_2) + F(s_2, a_2, s_3) + ... + F(s_n, a_n, s_1) > 0\]

Goal에 도달하는 agent를 학습시키기 위해서는 목적을 성취(goal에 도달)하는 경우에 대해서만 positive reward를 발생시켜야 합니다. 허나, 위의 경우 $F$에 의해 특정 state들을 순환하는 것으로도 reward가 증가하게 되고, 그로 인해 agent는 특정 구간을 순환하는 suboptimal policy를 학습하게 됩니다. 이러한 positive reward cycle 문제를 해결하기 위해 본 논문에서는 다음과 같은 형태의 $F$를 제안합니다.

\[F(s,a,s') = \Phi (s') - \Phi (s)\]

여기서 $\Phi$ 를 potential function 이라 하며 $F$ 를 potential-based shaping function 이라고 합니다. $F$ 가 다음 state와 현재 state에 대한 함수의 차이로 정의되었기 때문에 위의 예시처럼 cycle이 발생하더라도 reward가 계속해서 증가하지 않습니다.

\[F(s_1, a_1, s_2) + F(s_2, a_2, s_3) + ... + F(s_n, a_n, s_1) = 0\]

더 나아가 본 논문에서는 transition probablity와 reward function이 prior knowledge로 주어지지 않았을 때, potential-based shaping function $F$가 policy invariance를 보장하는 유일한 $F$임을 증명합니다.

Theorem 1

임의의 $S​$, $A​$, $\gamma​$에 대해 임의의 shaping reward function는 다음과 같습니다.

\[F:S\times A \times S \mapsto \mathbb{R}\]

이때, 모든 $s \in S - {s_0}, a \in A, s’ \in S​$에 대해 아래 식을 만족하는 real-valued function $\Phi: S \mapsto \mathbb{R}​$ 가 존재하면 $F​$를 potential-based shaping function 이라고 합니다.

\[F(s,a,s') = \gamma\Phi(s') - \Phi(s), \text{where} \ S - {s_0} = S \ \text{if} \ \gamma < 1.\]

그리고 potential-based shaping function $ F $ 는 optimal policy consistency를 보장하기 위한 필요충분 조건입니다.

  • (충분조건) $F$ 가 potential-based shaping function 이면 $M’$에서의 모든 optimal policy는 $M$에서도 optimal이다.
  • (필요조건) $F$ 가 potential-based shaping function이 아니라면 $M’$에서의 optimal policy가 $M$에서도 optimal임을 만족하는 transition과 reward function이 존재하지 않는다.

Theorem 1에 따르면 위에서 언급한 optimal policy consistency를 만족하는 shaping function $F$가 식 (2)의 형태이고, 이 형태가 optimal policy consistency를 만족하는 유일한 $F$입니다.

Proof: 충분조건

MDP $M​$에 대한 optimal Q-function $Q^{*}_{M}(s,a)​$는 다음과 같습니다.

\[Q^{*}\_{M}(s,a) = E\_{s' \sim P\_{sa}(\cdot)} \bigg[R(s,a,s') + \gamma \underset{a' \in A}{\max} Q^{*}\_{M} (s', a')\bigg]​\]

이 식에 $\Phi$을 추가해서 전개합니다.

\[\begin{align*} Q^{*}\_{M}(s,a) - \Phi(s) &= E\_{s' \sim P\_{sa}(\cdot)} \bigg[R(s,a,s') + \gamma \big(\underset{a' \in A}{\max} Q^{*}\_{M} (s', a') + \Phi(s') - \Phi(s')\big)\bigg] - \Phi(s)​ \\\\\\ &= E\_{s' \sim P\_{sa}(\cdot)} \bigg[R(s,a,s') + \gamma \Phi(s') - \Phi(s) + \gamma \big(\underset{a' \in A}{\max} Q^{*}\_{M} (s', a') - \Phi(s')\big)\bigg] \\\\\\ \end{align*}\]

여기서 $ \hat Q_{M’} (s,a) \triangleq Q^{*}_{M}(s,a) - \Phi(s)​ $ 라 정의하고 $F(s,a,s’) = \gamma \Phi(s’) - \Phi(s)​$ 로 치환합니다.

\[\begin{align*} \hat Q\_{M'} &= E\_{s' \sim P\_{sa}(\cdot)} \bigg[R(s,a,s') + F(s,a,s') + \gamma \underset{a' \in A}{\max} \hat Q\_{M'} (s', a')\bigg] \\\\\\ &= E\_{s' \sim P\_{sa}(\cdot)} \bigg[R'(s,a,s') + \gamma \underset{a' \in A}{\max} \hat Q\_{M'} (s', a')\bigg] \\\\\\ \end{align*}\]

위 식에 따르면 $ \hat Q_{M’} (s,a) $는 결국 MDP $ M’(S, A, T, R’, \gamma) $ 에서의 Q function $ Q_{M’} (s,a)$ 와 같은 형태가 됩니다. 그리고 $M’$이 undiscounted case ($ \gamma = 1 $)이고 $\Phi(s_0) = 0 $이라 가정했을 때 \(\hat Q\_{M'}(s\_0, a) = Q^{*}\_{M}(s\_0,a) - \Phi(s\_0) = 0 - 0 = 0\) 을 만족하게 됩니다. 따라서 $\hat{Q}_{M’} (s,a)​$는 Bellman equation을 만족하며 unique optimal Q-function을 반드시 갖게 됩니다.

그러므로 $M’​$에서의 optimal policy $\pi^*_{M’}(s)​$는 다음 식을 만족합니다.

\[\begin{align*} \pi^*\_{M'}(s) &\in \underset{a\in A}{\arg\max} Q^*\_{M'}(s,a) \\\\\\ &= \underset{a\in A}{\arg\max} Q^*\_{M}(s,a) - \Phi(s) \\\\\\ &= \underset{a\in A}{\arg\max} Q^*\_{M}(s,a) \end{align*}\]

즉, $M’$에서의 optimal policy $\pi^*_{M’}(s)$는 $M$에서 또한 optimal policy임을 알 수 있습니다.

필요조건의 증명은 논문의 Appendix A를 참고하시기 바랍니다.

위의 Theorem 1의 필요충분 조건에 대한 증명을 통해 potential-based shaping function이 policy invariance를 보장하는 유일한 $F$임을 증명하였습니다. 그렇다면 potential-based shaping function의 $\Phi$는 어떤 식으로 정의해야할까요? 논문에서는 Corollary 2를 통해 $\Phi​$를 구하는 한가지 방법을 서술합니다.

Corollary(따름 정리)는 Theorem으로부터 바로 증명할 수 있는 참인 명제를 말합니다.

Corollary 2

$ F(s,a,s’) = \gamma \Phi(s’) - \Phi(s) $ 이고 $ \gamma = 1 $ 일 때 $ \Phi(s_0) = 0 $를 가정하면, 모든 $ s \in S, a \in A $ 대해 다음 식을 만족합니다.

\[Q^*\_{M'}(s,a) = Q^*\_{M}(s,a) - \Phi(s), \\\\\\ V^*\_{M'}(s) = V^*\_{M}(s) - \Phi(s).\]

Proof: Corollary 2

식 (3)은 Theorem 1의 충분조건의 증명과정을 통해 증명되었습니다. $ V^(s) = \underset{a \in A}{\max}Q^(s,a) $ 이기 때문에 식 (3)을 만족하면 식 (4)도 만족합니다.

Corollary 2를 통해 $ V^_{M’}(s) = V^_{M}(s) - \Phi(s) $이 참임을 알게 되었습니다. 논문에서는 (4)를 통해 $ \Phi ​$의 가장 쉬운 형태를 제안합니다.

potential-based function

실제 환경에서 $ \Phi $를 정의하기 위해서는 domain에 대한 expert knowledge가 필요합니다. 만약 domain knowledge (MDP $M$)를 충분히 알고 있다면 $\Phi$를 다음과 같이 가정할 수 있습니다.

\[\Phi(s) = V^*\_{M}(s)\]

$\Phi$를 위와 같이 가정하면 Corollary 2의 (4)에 따라 $M’$에 대한 value function은 $V^*_{M’}(s) \equiv 0$입니다. 논문에서는 이런 형태의 value function이 학습에 용이하다고 합니다. 또한 위와 다른 형태의 $\Phi$를 이용해도 충분히 policy invariance를 보장한다고 주장합니다.

$M’$에서의 (near-) optimal policy가 $M$에서도 (near-) optimal policy임을 보장한다 라고 서술하며 Remark 1 을 통해 optimal이 아닌 near optimal 에서도 Theorem 1이 성립함을 언급합니다.

Experiments


Experiments 절에서는 두 가지 grid world 환경에서 potential-based shaping function에 변화를 주며 비교 실험한 결과를 보여줍니다. 본 논문에서는 이 실험을 통해 학습 속도 향상을 위한 합리적인 $\Phi$를 정하는 방향을 설명하는 것이 목적이라고 말합니다.

10 x 10 grid world

10 x 10 grid world 환경은 no discount setting ($ \gamma = 1 $)이며 매 step 당 -1의 reward(penalty)를 받습니다. 1 step action을 할 때 80% 확률로 exploitation 하고 20% 확률로 exploration (random action) 합니다. 저자들은 이전 절에서 좋은 shaping potential $ \Phi(s) = V^_{M}(s) $ 를 제안했습니다. 이 실험환경에서의 $ V^_{M} $ 은 현재 state에서 Goal 까지의 Manhattan distance로 볼 수 있습니다. 여기에 80%의 확률로 exploitation하는 것을 감안하여 $V^*_{M}$에 가까운 $\Phi​$ 를 다음과 같이 정의합니다.

\[\Phi_0(s) = \hat{V}_M(s) = - {MANHATTAN}(s, GOAL) / 0.8\]

참고: Manhattan distance wiki

그리고 $V^*_{M}$와 좀 더 먼 $\Phi​$ 에 대해서도 shaping potential이 잘 동작하는 것을 보이기 위해 $ \Phi(s) = 0.5 \Phi_0(s) = 0.5 \hat{V}_M(s) ​$ 에 대해서도 실험합니다. 실험 결과는 아래와 같습니다.

위 그래프를 통해 $0.5 \Phi_0(s)$와 $\Phi_0(s)$를 shaping potential로 사용했을때, shaping을 사용하지 않은 경우에 비해 학습이 빠른 속도로 수렴함을 확인 할 수 있습니다. 또한 $0.5\Phi_0(s)$를 사용하더라도 $\Phi_0(s)$를 사용했을 때와 거의 유사하게 학습 속도가 향상됨을 보여줍니다. 나아가 조금 더 큰 환경인 50 x 50 grid world 환경에서도 potential-based shaping reward를 사용한 경우에 성능이 더 빠르게 향상됨을 확인 할 수 있습니다.

5 x 5 grid world with subgoals

이번 실험에서는 subgoal이 있는 환경에서도 potential-based shaping reward이 잘 작동하는지 확인합니다.

Action과 reward function의 설정은 이전 10 x 10 grid world 환경과 동일합니다. 위 그림의 grid 내부에 표시된 숫자는 각각 flag를 의미하고, agent는 모든 flag를 순서대로 (오름차순) 획득한 뒤 goal에 도착해야합니다. 이 환경에 대한 potential-function을 정의해봅시다. 만약 subgoal의 위치를 모두 알고 있고 이전 환경과 동일하게 80%의 exploitation을 한다면 우리는 goal에 도착하기까지의 timestep t를 예측할 수 있습니다. 이 환경에서는 이전 subgoal에서 다음 subgoal로 가기까지 필요한 step의 갯수가 모두 유사하기 때문에 n번째 subgoal에 도달하기 위한 step은 $((5-n_s)/5)t$ step이라고 할 수 있습니다. 이때 $n_s$는 $s$ 일때 통과한 subgoal의 수가 됩니다.

위에서 도출한 식을 이용하여 potential-function을 다음과 같이 정의합니다. \(\Phi_0(s) = -((5 - n_s - 0.5)/5 )t\)

0.5는 일반적으로 agent가 n번째 subgoal과 n+1번째 subgoal 중간에 있기 때문에 이를 보정해주기 위한 값입니다.

또 다른 potential-function으로 10 x 10 grid world 환경에서 사용했던 $\hat{V}_M(s)​$를 사용합니다. \(\Phi_1(s) = \hat{V}_M(s) = - {MANHATTAN}(s, GOAL) / 0.8\) 이렇게 정의한 potential function을 통해 실험한 결과는 다음과 같습니다.

위 그래프는 위에서 부터 no shaping, $\Phi = \Phi_0(s)$, $\Phi = \Phi_1(s)$에 해당합니다. 이전 실험에서 정의한 $\Phi_1$ 뿐만 아니라 새로 정의한 $\Phi_0$을 사용하였을때에도 마찬가지로 shaping을 사용하지 않은 경우보다 학습속도가 향상되었음을 확인 할 수 있습니다.

Discussion and Conclusions


이번 논문에서는 reward shaping을 위한 function $F$를 제안하였습니다. $F$는 potential-based shaping reward $\gamma \Phi(s’) - \Phi$로 정의하며 이것이 (near-) optimal을 유지하는 shaping reward임을 증명하였습니다. 또한 실험을 통해 distance-based 환경과 subgoal-based 환경에서 potential function을 정의해보고 성능이 향상됨을 확인하였습니다. 이번 논문에서 알아본 potential-based shaping function의 형태는 추후 IRL과 이후의 reward shaping 논문에서 계속해서 사용되고 인용됩니다.

Reference


[1] A. Y. Ng et al., “Policy invariance under reward transformation: Therory and application to reward shaping.” Proceedings of the Sixteenth International Conference on Machine Learning(pp.278-287), 1999.

[2] Sutton, R. and Barto, A., “3.4 Unified Notation for Episodic and Continuing,” in Reinforcement Learning: An Introduction, 2nd ed., MIT Press, 2018.

Prioritized Experience Replay(PER)의 Sum tree 구현

Sum tree로 구현하는 PER

강화학습에서 많이 쓰이는 Replay buffer 중 PER는 Sum tree로 구현하는 것이 효율적이라고 논문에서 언급한다. Sum tree는 무엇이고 어떤 식으로 구현하는지 정리한다.

Segment Tree

Sum tree는 Segment tree의 부분집합이다. 먼저 Segment Tree에 대해 알아본다.

image

image

Image Ref : https://www.acmicpc.net/blog/view/9

  • 완전 이진 트리

  • Segment 뜻 : 구획, 구간

  • 부모 노드는 각 자식노드들의 범위(구간)에 대한 정보를 갖고 있다. (e.g. 그 범위에 대한 합, 그 범위에서의 최소값)

  • 실제 데이터는 맨 아래의 leaf 노드들이 가지게 됨.

  • Sum Tree는 Segment tree의 부분집합

  • ex.

    • [4, 5, 1, 3] 의 값을 Sum tree로 구성한다면

    • image

    • [None, 13, 9, 4, 4, 5, 1, 3]

When to use Segment Tree

특정 범위의 element들에 대한 연산값들(e.g. sum, max, min)을 미리 구해 저장해 두기 때문에 빠르게 접근(Find)하거나 수정(Update)할 수 있다.

  • Sum all elements in a range.
  • Find the min or max value of elements in a range.
  • Update all elements in a range.

PER은 버퍼에 보관하고 있는 td error의 총합에 대한 비율로 prior를 결정하기 때문에 합을 계속해서 계산해주어야 한다. Sum tree를 사용하면 update를 하는데 O(log N)의 시간복잡도를 가진다. (일반 List로 구현할 경우 O(N))

Sampling

image

sampling의 경우도 O(log N)의 시간복잡도를 가진다. 논문에서는 각 transition에 대한 prior $p_i $ 에 대한 확률분포 ${p^{\alpha}_{i}} \over {\sum_{k}p^{\alpha}_{k}}$ 를 따라 transition을 sampling 한다. 하지만 실제 Sum tree로 구현했을때 분포를 따로 계산하는 것이 아니라 tree를 순회하는 로직으로 확률분포에서 sampling 했을 때와 똑같은 똑같은 확률로 sampling 한다 (TD error가 높은 transition을 더 많이 sampling). Sum tree가 위 그림과 같다고 가정 했을 때 sampling 하는 로직을 소개한다. [OpenAI 코드 참조함.]

  • hyperparmeter 예시
    • batch size : 4
  1. 총 합(Tree의 root)인 24 만큼의 구간을 설정하고 batch size 크기로 나눈다.
    • [0, 24] : [0, 6], [6, 12], [12, 18], [18, 24]
  2. 각 구간에서 랜덤한 값을 샘플링 : S
    • 4, 9, 16, 20
  3. 샘플링한 값을 이용해 다음의 로직으로 leaf node까지 retrieve
    1. root node 에서 시작 (index: 1)
    2. left node가 S 보다 크면 index = left node index
    3. 작거나 같으면 index = right node, s = s - val(left node)
    4. leaf node에 도착할 때까지 반복
  4. 이 작업을 거치면 전체 구간이 leaf node 값의 비율로 나눠진다.
    • 위의 예시를 보면 아래 그림과 같은 비율로 나눠진다.
    • image
    • 각 leaf node는 prior를 가지고 있으므로 prior에 따라 해당 prior의 node가 선택된다.
    • ex. 10 prior를 갖는 node는 10/24 확률로 선택됨.
  5. 위 로직을 따르면 해당 prior가 뽑힐 확률이 ${p^{\alpha}_{i}} \over {\sum_{k}p^{\alpha}_{k}}​$ 된다.

PER 코드 검증

PER 코드 : Link

  • Sampling Test
    • 0 ~ 100 용량의 PER에 100에 가까울수록 prior를 크게 넣었을 때 각 인덱스 별 sampling 된 횟수

image

  • Update Test
      • 위와 같은 상태에서 0 ~ 30 구간만 prior를 더 큰 값으로 update 했을 시 sampling 결과

image

Reference

  • https://www.acmicpc.net/blog/view/9

  • http://snowdeer.github.io/algorithm/2016/03/28/segment-tree/

  • https://hackernoon.com/practical-data-structures-for-frontend-applications-when-to-use-segment-trees-9c7cdb7c2819

  • https://github.com/openai/baselines/blob/master/baselines/common/segment_tree.py

CNN의 성능, 효율을 높이기 위한 기법들

Introduction

CNN(Convolution Neural Network)은 주로 이미지 처리에 쓰이는 인공신경망 입니다. CNN이 처음 제안된 후부터 대부분의 연구들은 CNN의 성능에 주목하는 연구들이 많았습니다. 그러나 최근에는 Mobile 환경 또는 임베디드 시스템과 같은 작은 환경에서 CNN을 적용하기 위해 모델을 경량화하는 연구가 많이 진행되고 있습니다. 이러한 CNN의 성능 향상 또는 경량화하는 기법들을 간단하게 정리해서 소개해보려합니다.

Notation

  • M : 입력 채널 수
  • X, Y : 입력 사이즈 (width, height)
  • N : 필터 수
  • K : 필터 커널 사이즈
  • P : 패딩 사이즈

Convolution layer에 의한 Size 계산

  • conv layer를 통과했을 때 size
    \({X(or Y) - K + 2P \over stride} + 1\)

CNN techniques

3 x 3 Convolutional filters

  • 3x3 conv 필터 를 여러개 쌓는 것이 그 이상의 크기를 갖는 conv 필터를 한 층 사용하는 것과 비교했을 때 성능은 유지되면서 파라미터 수는 적어진다.
  • 파라미터 수 : N(MKK +1)
    • if M=3, N =32
    • 5x5 layer 1개 : N(25M + 1) = 25MN + N = 2432
    • 3x3 layer 2개 : N(9M + 1) + N(9M +1) = 18MN + 2N = 1792
    • 큰 size의 필터를 사용했을 때보다 출력되는 feature size는 같으면서 필요한 파라미터 수가 줄어든다.
  • ref : VGGNet

Residual Learning (Skip Connection)

image

이미지 출처 : Deep Residual Learning for Image Recognition 논문

  • 기존의 네트워크에 일종의 지름길(Skip Connection)을 추가한 구조
  • weight layer를 거친 output과 input을 더해주는 형태로 구성. 이를 Residual learning block 이라 함.
  • weight layer는 input과의 차이 만 학습하면 되기 때문에 학습이 더 좋아짐.
  • Skip Connection을 추가하면 성능이 올라가기 때문에 기존보다 layer수를 줄여도 성능이 유지된다.
  • ref : ResNet

Point-wise Convolutional

image image

이미지 출처 : Dongyi Kim님 발표자료

  • 1 x 1 Conv filter로 channel 단위의 convoution 연산을 한다. (1 x 1 x N)
  • channel간의 불필요한 뉴런을 없애는 pruning 효과.
  • channel reduction.
  • 파라미터 수 : N(M + 1)

Depth-wise Convolution

image

이미지 출처 : Dongyi Kim님 발표자료

  • 필터 수가 채널 수가 같은 conv filter.
  • 각 채널에 대한 feature를 추출할 수 있다.
  • 파라미터 수 : M(KK + 1)

Depth-wise Separable Convolution

image

이미지 출처 : Dongyi Kim님 발표자료

  • Depth-wise conv + Point-wise conv 순서로 구성.
  • 채널 간의 conv 연산과 각 채널에 대한 conv연산을 분리해서 처리할 수 있는 구조.
  • 파라미터 수 : M(KK + 1) + N(M + 1)
  • 3x3 필터 기준으로 기존 모델과 약 9배 의 모델 사이즈(파라미터 수) 차이를 보여줌.
  • ref : Xception, Mobilenet v1

Reference

  • Dongyi Kim님 발표자료
  • Deep Residual Learning for Image Recognition 논문
  • MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 논문

Show and Tell - A Neural Caption Generator 논문 리뷰

Introduction

Show and Tell: A Neural Caption Generator 논문을 리뷰한 포스트입니다. 이미지를 보고 설명하는 글을 만들어내는 Image Captioning 문제를 CNN과 LSTM을 조합한 end-to-end 구조의 신경망으로 풀었고 그 당시 SOTA(State-of-the-art)를 갱신했다는 내용입니다.

이 자료는 모두의연구소 의 풀잎스쿨반인 NLP Boot Camp 에서 발표한 내용입니다.

Contents

  • Introduction
  • Model
  • Experiments
  • Results

Introduction

  • 이미지를 설명하는 문장을 자동으로 만들어 내는것(Image description)은 굉장히 어려운 문제다. (challenging task)
  • image classification과 object dection보다 훨씬 어렵다.

$\rightarrow$ 이미지 인식 + 자연어 표현까지 학습해야 되기 때문


Contribution

  1. Image description 문제를 푸는 end-to-end 시스템을 제안함.
  2. 논문에서 제안하는 모델은 vision과 language 모델 중에 SOTA인 모델들의 구조의 일부를 조합해서 만듬.
  3. 기존 SOTA 보다 더 좋은 성능을 보여줌.

Idea

  • encoder RNN - decoder RNN
  • Source language $S$ - Target language $T$

maximizing $p(T|S)$ 하도록 학습


Idea

  • encoder RNN $\rightarrow$ encoder CNN
  • image $I$
  • target sequence of words $S = { S_1, S_2, … }$
  • Neural Image Caption model (NIC)

maximizing $p(S|I)$ 하도록 학습

이 논문에서 새롭게 제안하는 모델의 이름은 Neural Image Caption(NIC)입니다. 이전에 나온 논문인 Seq2Seq(또는 RNN Autoencoder)의 구조와 거의 유사합니다. 대신 encoder RNN이 아닌 encoder CNN을 사용해 이미지의 feature를 decoder의 입력으로 합니다. 또 다른 점은 둘 다 RNN 구조를 사용했을 때는 encoder의 hidden state를 decoder의 hidden state로 초기화 해주었는데 NIC에서는 encoder CNN의 출력을 decoder RNN의 첫 번째 입력으로 넣어줍니다.


Model

  • Machine translation 모델과 같이
  • input Image가 주어졌을 때 정답 output Sequence의 확률을 maximizing
  • correct transcription $S$, input image $I$, parameter $\theta$


이 그림은 논문의 그림이고 더 좋은 구조 그림은 아래에 있습니다.


Training

  • Encoder로 Deep CNN 사용.
  • Decoder로 LSTM 사용.

\(x_{t-1} = CNN(I)\) \(x_t = W_eS_t, t \in \{0, ...., N-1\}\) \(p_{t+1} = LSTM(x_t), t \in \{0, ...., N-1\}\)


Training Details

  • Over fiiting을 막기 위한 techniques
    1. Pre-Train 된 Deep CNN 사용. (e.g. ImageNet)
    2. Pre-Train 된 Word embedding vetor 사용. (효과 적음)
    3. Dropout & Ensembling

Pre-Train 된 word embedding vector를 사용하는 것은 효과가 적었기 때문에 실제 실험에서는 random initialize해서 사용했고 NIC 모델의 학습을 통해 embedding vector도 잘 학습됨을 아래 결과에서 보입니다.


Model

구현 입장에서 더 명확하다고 생각되는 구조 그림.


Inference

  • Sampling : 가장 확률이 높은 값(단어)을 고른다.
  • BeamSearch : k 개의 후보(단어)를 뽑아서 다음 t+1 에서의 단어와의 조합의 확률을 보고 높은 값을 고른다.

BeamSearch는 단순히 가장 높은 확률을 가지는 단어를 선택하는 것이 아닌 상위 k개를 뽑아 그 단어들로 다음 단어를 예측한 후 각 단어들의 확률을 더해 문장 단위로 높은 확률을 가지는 문장을 결과로 사용합니다.


Experiments

Evaluation Metrics

  • Amazon Mechanical Turk experiment
  • BLEU
  • METHOR
  • CIDER

각 지표는 wiki나 google을 통해 검색해보면 잘 나와 있습니다.


Datasets

  • 이미지마다 5개의 문장 (SBU 제외)
  • Pascal VOC 2008은 test로만 사용 (실험에서는 학습은 MSCOCO로 함)
  • Flickr는 사진과 사진에 대한 글을 올리는 사이트
  • SBU는 Flicker에 올라온 사진과 글을 그대로 데이터로 사용

SBU는 정확히 이미지를 설명하는 글이 아닌 사용자들이 올린 글이기 때문에 일종의 noise 역할을 하기를 기대함. (weakly labeled examples)


Results

결과를 통해 세 가지 질문에 답하려 함.

  • How dataset size affects generalization
  • What kinds of transfer learning it would be able to achieve
  • How it would deal with weakly labeled examples

Generalization

  • 좋은 데이터가 10만개 정도
  • 데이터가 많아지면 더 좋은 결과가 나올 것이라 예상
  • 데이터가 부족하기 때문에 generalization(overfitting 방지)을 하기 위해 노력함.

논문에서 overfitting 방지를 위해 위의 Training Details에서 설명한 3가지 방법을 실험했다고 설명합니다.


Generation Results

  • 여러 metric으로 평가해봄.
  • 사람보다 점수가 높은 경우가 있지만 실제 결과는 그렇지 않음.
  • metric에 대한 연구도 더 필요할 것으로 보임.

Generation Results


Transfer Learning

  • 다른 dataset 간의 transfer가 가능한지 실험.
  • Flickr30k -> Flickr8k (유사 데이터, 데이터 차이 4배)
    • BLEU 4 증가
  • MSCOCO -> Flickr8k (다른 데이터, 데이터 차이 20배)
    • BLEU 10 감소, but 만든 문장은 괜찮음.
  • MSCOCO -> SBU
    • BLEU 16 감소

Generation Diversity Discussion

  • generating model 모델이 새롭고 다양하고 높은 퀄리티의 문장을 만들어내는지 확인.

굵게 표시된 문장이 dataset에 없는 문장이다.


Ranking Results

  • 다른 연구에서 사용되는 지표인 Ranking Scores에서도 높은 점수를 받음.


Human Evaluation

  • 사람이 직접 평가한 지표를 보여줌.
  • BLEU Score는 human보다 높았는데, 여기서는 낮다.
  • BLEU 지표가 완벽한 지표는 아님을 보여줌.


Human Evaluation


Analysis of Embedding

  • Word embedding vector도 유사한 단어들끼리 뭉쳐있도록 잘 학습됨을 확인.

Reference

  • https://arxiv.org/abs/1411.4555
  • https://github.com/YBIGTA/DeepNLP-Study/wiki/Show-and-Tell:-A-Neural-Image-Caption-Generator-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0
  • https://github.com/yunjey/pytorch-tutorial/tree/master/tutorials/03-advanced/image_captioning

Unity ML Agent - 실습 준비와 Push Block 예제 학습해보기

Introduction

강화학습 공부, 더 나아가 강화학습을 실제 문제에 적용을 해야할 때 가장 걸림돌이 되는 것이 바로 강화학습 Agent를 학습(시뮬레이션) 시킬 환경(envirionment) 입니다. 로봇을 학습시키려면 직접 로봇을 만들어야 하고 자율주행 자동차를 학습시키려면 자동차를 직접 도로에 주행시켜야 합니다. 하지만 실제 환경을 이용해 시뮬레이션 하는 것은 많은 비용과 위험부담이 따릅니다. 이러한 문제 때문에 실제 환경에 학습하기 보다 현실과 유사한 가상의 시뮬레이션 환경 을 만들고 그 환경에서 학습시킨 모델을 실제 환경에 적용합니다. 그러나 이러한 현실과 유사한 가상 공간을 만드는 것도 전문가 수준이 아니면 쉽지 않습니다.

게임 엔진으로 잘 알려진 Unity 는 이런 가상 환경을 쉽게 만들 수 있게 해주는 툴입니다. 물론 정교하게 만들려면 많은 기술이 필요하겠지만 간단한 물리법칙들은 쉽게 적용할 수 있기 때문에 비교적 어렵지 않게 시뮬레이션 환경을 구축 할 수 있습니다. 최근 Unity에서 이러한 장점을 살려 Unity로 만든 가상 환경에 쉽게 인공지능 알고리즘을 적용할 수 있게 해주는 Unity ML-Agents Toolkit 을 배포하고 업데이트하고 있습니다.

저는 위 Github에 올라온 Unity ML-Agents Toolkit의 매뉴얼을 보고 실습해본 내용을 공유해보려 합니다. Unity ML-Agents의 스터디는 모두의연구소 의 강화학습 랩인 CTRL Lab 에서 함께 하고 있습니다.

목표

  1. 매뉴얼에 올라온 예제들을 학습해보고 test 해본다.
  2. 예제 환경의 일부를 고쳐서 새로운 환경을 만들어보고 학습해본다.
  3. 강화학습 알고리즘도 예제 코드가 아닌 새로운 코드를 적용해본다.
  4. 원하는 환경을 만들어서 강화학습을 적용해본다.

Settings

Unity ML-Agents Toolkit에 있는 매뉴얼을 통해 기본적인 Unity의 설치와 ML-Agent를 clone 합니다.

git clone https://github.com/Unity-Technologies/ml-agents.git

저는 아래와 같은 환경에서 세팅했습니다.

  • Window 10
  • Unity 2018.2.16f1
  • conda 4.3.30
  • python 3.6.0
  • tensorflow-gpu 1.7.1
  • Cuda 9.0.176 & cudnn 7.0.5

파이썬 세팅

저는 Windows에서 세팅했기 때문에 Anaconda를 사용했습니다. Anaconda에 대한 설명은 이 포스트에서 자세히 다루지는 않겠습니다. 간단하게 얘기하면 파이썬 패키지를 가상환경 단위로 관리할 수 있게 해주는 도구입니다. Anaconda 설치 후에 가상환경을 만듭니다. 저는 unity_ml 이라는 이름으로 만들었습니다. 그리고 가상환경을 활성화합니다.

conda create -n unity_ml python=3.6
activate unity_ml

이제부터 설치하는 파이썬 패키지들은 unity_ml 이라는 가상환경에 설치됩니다. 이전에 clone 한 디렉토리로 가서 Unity ML-Agents도 설치해봅시다.

cd ml-agents
pip install .

설치가 완료되면 mlagents-learn 명령어를 사용할 수 있습니다.

unity_mlagents1

Unity 세팅

Unity 쪽의 세팅과 예제 실행은 다음 문서를 참고합니다.

먼저, Unity 프로젝트를 하나 생성합니다. 그 후 생성한 프로젝트 폴더의 Assets 폴더에 이전에 cloneml-agents 폴더의 UnitySDK/Assets 폴더 안에 있는 ML-Agents 폴더와 ML-Agents.meta 파일을 복사합니다. 이 폴더안에 Unity ML-Agent의 주요 코드들과 예제가 담겨 있습니다.
여기까지가 위 가이드의 3번까지 입니다. 그 후 위 가이드의 4번 부터 차례로 세팅합니다.

추가로 Tensorflow sharp 플러그인을 설치해야합니다. 링크의 플러그인을 Unity 프로젝트를 실행시킨 채로 플러그인을 실행시키면 Assets/ML-Agents/Plugins 경로에 설치됩니다.

여기까지 완료하시면 예제 실행을 위한 준비는 끝납니다. 이제 Push Block 예제를 실행해봅시다.

Push Block 예제

pushblock

Push Block 예제는 파란색 블럭인 Agent가 주황색 블럭을 목표 지점까지 밀어서 옮기는 것을 목표로 합니다.

Push Block 환경이 구현된 Scene 파일은 Assets/ML-Agents/Examples/PushBlock/Scenes에 있습니다.

pushblock_scene

Scene을 열면 위 그림과 같은 환경이 나옵니다. 똑같은 환경이 32개가 있는데 이는 32개의 시뮬레이션 경험을 모아 학습속도를 빠르게 하기 위함입니다. Unity 환경에 강화학습 알고리즘을 적용하려면 Brain object를 설정해야 합니다. Unity 창에서 Hierarchy 탭의 Academy/PushBlockBrain를 클릭한 후 Brain component에서 Brain TypeExternal 로 변경합니다.

  • Internal : 학습된 파라미터 파일을 이용해 Agent를 조종합니다.
  • External : 외부 Python 파일을 이용해 Agent를 조종합니다. 학습 시 사용합니다.
  • Player : 직접 조종합니다.
  • Heuristic : 행동을 결정하는 알고리즘을 구현해 Agent를 조종합니다. (직접 해보지 않아 확실하지 않습니다.)

brain_

이제 강화학습 알고리즘을 이용해 Agent를 학습해봅시다. 저는 Unity ML-Agent Toolkit에서 기본적으로 제공하는 강화학습 알고리즘인 PPO 알고리즘의 코드를 사용하려 합니다.
먼저 이전에 Anaconda 가상환경을 실행시킨 cmd 창(또는 Anaconda Prompt 창)에서 cloneml-agents 폴더의 경로로 이동합니다. 그리고 다음 명령어를 입력합니다.

mlagents-learn config/trainer_config.yaml --run-id=firstRun --train

이 명령어를 사용하면 Unity ML-Agent Toolkit에서 제공해주는 config/trainer_config.yaml 파일에 미리 정해준 파라미터와 각종 설정들을 불러와 학습을 실행시킵니다. 이 명령어를 통해 제공되는 PPO 알고리즘 코드로 현재 Unity 환경의 Agent를 학습할 수 있게 됩니다. run-id 는 학습 결과를 구분하기 위한 구분자로 원하는 string을 입력하면 됩니다. 실행시키면 다음과 같은 창이 나옵니다.

train

이 상태에서 Unity 화면으로 가서 Play(▶) 버튼을 누르면 현재 환경에서 Agent 학습을 시작합니다. 저는 20000 step 정도 학습시켰고 10000 step 정도부터 점점 Agent가 주황색 블럭을 목표 지점으로 잘 미는 것을 확인할 수 있었습니다.

pushblock_train

학습이 어느 정도 완료되면 학습을 멈추고(ctrl+c) ml-agents 폴더에서 models 폴더에 위에서 설정한 run-id 이름의 폴더가 생성된 것을 확인할 수 있습니다. 저는 firstRun이라고 지정했기 때문에 그 이름의 폴더가 생겼습니다. 이 폴더 안의 파일들이 학습된 Agent와 신경망의 파라미터를 가지고 있습니다. 이 폴더를 Unity 프로젝트 폴더의 Assets 폴더에 Model 폴더를 만든 후 그 폴더로 옮깁니다. 그 후 Unity 화면에서 Academy/PushBlockBrain를 클릭한 후 Brain component에서 Brain TypeInternal 로 변경하고 Graph Model을 이전에 옮긴 Model/firstRun' 경로의 'editor_Academy_firstRun-0.bytes 파일로 지정합니다. 이 작업은 Unity 화면에서 마우스로 Drag & Drop을 통해 쉽게 지정할 수 있습니다.

interal

그 후 Play(▶) 버튼을 누르면 학습한 Agent가 실행됩니다. 아래는 학습한 Agent를 실행한 화면입니다.

push_block_train

다음에 해볼 것

Push Block 예제를 기본적으로 제공하는 PPO 알고리즘으로 학습해보았습니다. 다음으로는 위 Push Block 환경을 조금씩 변화시켜 새로운 환경을 만들고 Agent를 학습시켜 보려합니다.