초심자가 이해하는 LSTM
딥러닝 전문가가 아닌 입장에서 항상 좋은 공부를 하기 위해 노력 중입니다. 이해가 안되면 새로 배우고 이해가 된 것은 더 확장하는 일의 반복입니다. 평생 공부가 적성에 맞으니까 그렇게 힘들지는 않습니다.
그런데, 제가 배운 것을 가르치다보면 학생들이 특히 LSTM이 어렵다는 이야기를 많이 합니다. 내부 작동 원리에 대한 이해가 부족하다보니 실제 LSTM을 응용하기 쉽지 않은 것 같습니다. Keras라는 멋진 도구가 제 힘을 발휘하지 못하는 경우가 많습니다.
위 그림은 Chis Olah의 LSTM 개념도입니다. 어렵죠? 게이트에 익숙한 공학자가 아니면 참으로 난감한 그림입니다.
딥러닝이든 뭐든 계산은 결국 함수니까 함수의 기본으로 돌아가 생각해봅니다. 함수는 입력과 출력을 연결하는 그 무엇(?)입니다. 수학은 모르는 것은 모른채로 놔두고 생각하기 위해 존재하는 도구라고 느낍니다. 그 무엇이 무엇인지는 모르지만 하여튼 입력 -?-> 출력을 만듭니다. 딥러닝의 계산도 입력 -> 출력으로 연결되고 그 함수 내용은 전혀 모르는 것입니다.
그런데, 입력->출력으로 한 번에 이어지지 않고 점진적으로 출력까지 '다가가는' 경우가 있습니다. 예를 들어 여러분 앞에 계단이 있다고 상상합니다. 이 계단은 모두 10개의 단계로 되어 있습니다. 2층에서 1층으로 내려간다고 합시다. 여러분은 선택할 수 있습니다. 한 번에 10개 단계를 뛰어 넘어 1층까지 내려갈 것인지 아니면 한 계단씩 밟아가며 내려갈 것인지. 입력->출력처럼 한 번에 결과를 얻으려면 뛰세요! 다리는 아주 아프겠지만. 현실에서는 한 계단 씩 내려가는 것이 안전합니다. 그런데, 이 경우 몇 번 정도 내려가면 우리가 1층에 도달했다고 말할까요? 가령 2칸 내려간 다음 1층에 도달했다고 말할 수 있을까요? 그렇지는 않습니다. 그러나 앞서 했던 일(2칸 내려가기)을 지속한다면 언젠가는 1층에 도달합니다. 같은 행동을 지속한다는 가정만 있으면 2칸 내려가기는 1층에 도달하는 적절한 방법이 될 수 있습니다. 이것을 표현으로 보면, 입력 -(지속)-> 출력 정도가 적당하겠습니다.
함수 계산을 한 번에 끝내지 않고 잘게 나눈다음, 이전 결과를 다시 받아 출력을 만들고 이 출력을 다시 받아 입력으로 삼은 다음 또 다시 출력을 만들고 다시 ....
이렇게 반복하는 것이 순환(recurrent)입니다. 다이내믹(dynamic) 알고리즘과도 가깝고, 수학의 점화식과도 언뜻 비슷한 면이 있습니다. 핵심은 점진적 업데이트입니다.
계단을 내려가기 위해 필요한 과거 정보는 얼마나 되어야 할까요? 이전에 계단을 내려갔다는 것과 다음에 내려갈 계단이 있다는 것만 알고 있으면 됩니다. 물론, 그 이전에 계단을 내려갔다는 사실, 그 이전에 내려갔다는 사실도 의미는 있을 것입니다. 그러나 언제까지? 63빌딩의 꼭대기 층에서 1층으로 내려온다고 할 때, 그 이전 계단을 다 기억한다는 것이 무슨 의미가 있을까요?
한 가지 더 큰 문제가 있습니다. 이전 정보를 다 기억하면 아예 계단을 내려가는 알고리즘을 만들 수가 없다는 점입니다. 이해가 안되면 다음 그림을 볼까요?
우리가 기억할 수 있는 용량이 정해져 있어서 특정 크기의 이미지만 본다고 합시다. 정보가 적으면 계단의 형태가 잘 보입니다. 그런데 정보를 더 많이 보려면(오른쪽 화살표로 이동) 나중에는 계단 모양은 사라지고 선만 보입니다.
계단을 내려갈 수 있는 이유는 수평과 수직 구조가 반복되기 때문입니다. 계단을 내려가는 기계적인 알고리즘은 수직 구조를 건너뛰고 수평구조를 밟는 것입니다. 그런데 선으로 표현되어 있으면 수평 혹은 수직 구조를 찾기가 극히 어렵습니다. 알고리즘이 작동하지 않게 되는 결과가 벌어지는 것입니다. 정보를 많이 가지고 있으면 오히려 알고리즘이 제대로 작동하지 않게 됩니다.
순환 학습의 상황에서도 너무 많은 정보를 가지고 있으면 안됩니다. 우리는 기계가 계단을 내려가는 방법을 학습케 하려는데 너무 많은 정보로 학습을 방해하는 꼴이 벌어집니다. 이에 대한 대응 방법이 바로 LSTM(Long Short Term Memory) 모델입니다. 너무 많은 정보가 반영되지 않게 적당한 방법을 고민하자는 접근법입니다.
고등학교 저학년 수준의 수학을 도입해서 LSTM의 구동 원리는 이해해 봅시다.
우선 활동 A를 정의하겠습니다. A는 = {"잊는다","기억한다"}입니다. 현재 받아들인 정보를 어느 정도 기억하고 이전 정보를 어느 정도 잊어 버려야 합니다. 잊는다를 f라고 하고 기억한다를 i라고 하겠습니다.
f=S(x|h)
과거 상태(h)가 있고, 새롭게 배워야 할 어떤 것(x)이 주어지면 어떤 함수(S)에 따라 잊는다(f)라는 일이 벌어집니다. h와 x가 주어지면 저절로 잊는다라는 일이 생겨난다고 봅니다. 이제 기억한다는,
i=S(x|h)
마찬가지로 h,x가 주어졌을 때 일어나는 일입니다.
이제,
새롭게 벌어지는 결과(o)를 생각하면,
o=S(x|h)
가 됩니다. 어떤 활동이 일어나는 것과는 별도로 이전 상태와 새로운 정보로 결과가 벌어지는 일이 "관찰"됩니다.
이와 같은 상황들을 종합적으로 고려하면, 노드 안에서 벌어지는 모습을 (c)라고 하고
c=f~c`+i~c`
로 표현할 수 있습니다. 즉, 일전의 모습(c`)과 f를 함께 생각하고, 또한 c`과 i를 함께 생각해서 새로운 모습을 그려봅니다. 계단을 내려가는 사람을 상상하면 아마 c`은 이전의 왼발로 계단을 내려오던 모습이고 이제 c는 오른발로 계단을 밟아 내려가는 모습일 것입니다.
이제 새로운 상태(계단을 내려온 것) h*는
h*=o~c
가 됩니다. 즉, 새롭게 벌어진 결과(계단 내려온 결과)에 이전의 벌어진 모습에 관한 정보(c)가 반영됩니다. 즉, h*는 어떤 과정을 거쳐 어떤 결과에 이르게 되었다는 정보가 모두 반영된 것입니다. 이때, c는 f와 i의 작용을 통해 만들어졌다는 점이 중요하고 이렇게 어떤 결과를 위한 작동 기재를 게이트(gate)라고 부릅니다.
정리하면,
LSTM은 f, i를 두고 c를 업데이트 하며, 이 c로 새로 발생한 o를 해석하도록 함으로써 새로운 h를 만들고 이것이 또한 입력되는 새로운 x와 결합함으로써 다음 차례의 f, i 게이트로 연결되도록 하는 방법입니다. 계단을 내려가되, 다음과 같이 경험하도록 구성한다고 보면 됩니다.
한 가지 더.
LSTM에서 이제 계산해야 할 값들은 몇 개가 될까요? 먼저 계산해야 할 대상은 몇 개가 될까요? 정답은 4입니다. 일단 f, i, c의 게이트가 3개가 있고, 이것들이 지나가는 h가 있으니까요. 입력(x)와 출력(o)를 제외하고 이들 4개의 것들 안의 가중치는 계속 업데이트가 되어야 합니다. 가중치는 몇 개나 계산되어야 할까요? 출력(o)의 개수가 5개라고 하면 이것 5개와 5개에 대한 5개의 출력값들이 계속 나와야 합니다. 왜냐하면 이전의 값들을 이어받아 새롭게 값들을 계산해야 하니까요. 또한 새롭게 입력되는 x의 차원(m)에 따라 출력값이 조정되어야 하니 5곱하기 m만큼이 새롭게 계산되어야 합니다. 이제 5라고 하지말고 n이라고 하고 m과 n의 곱을 mn, n곱하기 n을 n^2라고 하면, LSTM이 계산하는 파라미터의 총 개수는
4*(mn+n+n^2)입니다.
가능한 쉽게 설명하려고 노력했습니다. 어떤가요?
그런데, 제가 배운 것을 가르치다보면 학생들이 특히 LSTM이 어렵다는 이야기를 많이 합니다. 내부 작동 원리에 대한 이해가 부족하다보니 실제 LSTM을 응용하기 쉽지 않은 것 같습니다. Keras라는 멋진 도구가 제 힘을 발휘하지 못하는 경우가 많습니다.
위 그림은 Chis Olah의 LSTM 개념도입니다. 어렵죠? 게이트에 익숙한 공학자가 아니면 참으로 난감한 그림입니다.
딥러닝이든 뭐든 계산은 결국 함수니까 함수의 기본으로 돌아가 생각해봅니다. 함수는 입력과 출력을 연결하는 그 무엇(?)입니다. 수학은 모르는 것은 모른채로 놔두고 생각하기 위해 존재하는 도구라고 느낍니다. 그 무엇이 무엇인지는 모르지만 하여튼 입력 -?-> 출력을 만듭니다. 딥러닝의 계산도 입력 -> 출력으로 연결되고 그 함수 내용은 전혀 모르는 것입니다.
그런데, 입력->출력으로 한 번에 이어지지 않고 점진적으로 출력까지 '다가가는' 경우가 있습니다. 예를 들어 여러분 앞에 계단이 있다고 상상합니다. 이 계단은 모두 10개의 단계로 되어 있습니다. 2층에서 1층으로 내려간다고 합시다. 여러분은 선택할 수 있습니다. 한 번에 10개 단계를 뛰어 넘어 1층까지 내려갈 것인지 아니면 한 계단씩 밟아가며 내려갈 것인지. 입력->출력처럼 한 번에 결과를 얻으려면 뛰세요! 다리는 아주 아프겠지만. 현실에서는 한 계단 씩 내려가는 것이 안전합니다. 그런데, 이 경우 몇 번 정도 내려가면 우리가 1층에 도달했다고 말할까요? 가령 2칸 내려간 다음 1층에 도달했다고 말할 수 있을까요? 그렇지는 않습니다. 그러나 앞서 했던 일(2칸 내려가기)을 지속한다면 언젠가는 1층에 도달합니다. 같은 행동을 지속한다는 가정만 있으면 2칸 내려가기는 1층에 도달하는 적절한 방법이 될 수 있습니다. 이것을 표현으로 보면, 입력 -(지속)-> 출력 정도가 적당하겠습니다.
함수 계산을 한 번에 끝내지 않고 잘게 나눈다음, 이전 결과를 다시 받아 출력을 만들고 이 출력을 다시 받아 입력으로 삼은 다음 또 다시 출력을 만들고 다시 ....
이렇게 반복하는 것이 순환(recurrent)입니다. 다이내믹(dynamic) 알고리즘과도 가깝고, 수학의 점화식과도 언뜻 비슷한 면이 있습니다. 핵심은 점진적 업데이트입니다.
계단을 내려가기 위해 필요한 과거 정보는 얼마나 되어야 할까요? 이전에 계단을 내려갔다는 것과 다음에 내려갈 계단이 있다는 것만 알고 있으면 됩니다. 물론, 그 이전에 계단을 내려갔다는 사실, 그 이전에 내려갔다는 사실도 의미는 있을 것입니다. 그러나 언제까지? 63빌딩의 꼭대기 층에서 1층으로 내려온다고 할 때, 그 이전 계단을 다 기억한다는 것이 무슨 의미가 있을까요?
한 가지 더 큰 문제가 있습니다. 이전 정보를 다 기억하면 아예 계단을 내려가는 알고리즘을 만들 수가 없다는 점입니다. 이해가 안되면 다음 그림을 볼까요?
우리가 기억할 수 있는 용량이 정해져 있어서 특정 크기의 이미지만 본다고 합시다. 정보가 적으면 계단의 형태가 잘 보입니다. 그런데 정보를 더 많이 보려면(오른쪽 화살표로 이동) 나중에는 계단 모양은 사라지고 선만 보입니다.
계단을 내려갈 수 있는 이유는 수평과 수직 구조가 반복되기 때문입니다. 계단을 내려가는 기계적인 알고리즘은 수직 구조를 건너뛰고 수평구조를 밟는 것입니다. 그런데 선으로 표현되어 있으면 수평 혹은 수직 구조를 찾기가 극히 어렵습니다. 알고리즘이 작동하지 않게 되는 결과가 벌어지는 것입니다. 정보를 많이 가지고 있으면 오히려 알고리즘이 제대로 작동하지 않게 됩니다.
순환 학습의 상황에서도 너무 많은 정보를 가지고 있으면 안됩니다. 우리는 기계가 계단을 내려가는 방법을 학습케 하려는데 너무 많은 정보로 학습을 방해하는 꼴이 벌어집니다. 이에 대한 대응 방법이 바로 LSTM(Long Short Term Memory) 모델입니다. 너무 많은 정보가 반영되지 않게 적당한 방법을 고민하자는 접근법입니다.
고등학교 저학년 수준의 수학을 도입해서 LSTM의 구동 원리는 이해해 봅시다.
우선 활동 A를 정의하겠습니다. A는 = {"잊는다","기억한다"}입니다. 현재 받아들인 정보를 어느 정도 기억하고 이전 정보를 어느 정도 잊어 버려야 합니다. 잊는다를 f라고 하고 기억한다를 i라고 하겠습니다.
f=S(x|h)
과거 상태(h)가 있고, 새롭게 배워야 할 어떤 것(x)이 주어지면 어떤 함수(S)에 따라 잊는다(f)라는 일이 벌어집니다. h와 x가 주어지면 저절로 잊는다라는 일이 생겨난다고 봅니다. 이제 기억한다는,
i=S(x|h)
마찬가지로 h,x가 주어졌을 때 일어나는 일입니다.
이제,
새롭게 벌어지는 결과(o)를 생각하면,
o=S(x|h)
가 됩니다. 어떤 활동이 일어나는 것과는 별도로 이전 상태와 새로운 정보로 결과가 벌어지는 일이 "관찰"됩니다.
이와 같은 상황들을 종합적으로 고려하면, 노드 안에서 벌어지는 모습을 (c)라고 하고
c=f~c`+i~c`
로 표현할 수 있습니다. 즉, 일전의 모습(c`)과 f를 함께 생각하고, 또한 c`과 i를 함께 생각해서 새로운 모습을 그려봅니다. 계단을 내려가는 사람을 상상하면 아마 c`은 이전의 왼발로 계단을 내려오던 모습이고 이제 c는 오른발로 계단을 밟아 내려가는 모습일 것입니다.
이제 새로운 상태(계단을 내려온 것) h*는
h*=o~c
가 됩니다. 즉, 새롭게 벌어진 결과(계단 내려온 결과)에 이전의 벌어진 모습에 관한 정보(c)가 반영됩니다. 즉, h*는 어떤 과정을 거쳐 어떤 결과에 이르게 되었다는 정보가 모두 반영된 것입니다. 이때, c는 f와 i의 작용을 통해 만들어졌다는 점이 중요하고 이렇게 어떤 결과를 위한 작동 기재를 게이트(gate)라고 부릅니다.
정리하면,
LSTM은 f, i를 두고 c를 업데이트 하며, 이 c로 새로 발생한 o를 해석하도록 함으로써 새로운 h를 만들고 이것이 또한 입력되는 새로운 x와 결합함으로써 다음 차례의 f, i 게이트로 연결되도록 하는 방법입니다. 계단을 내려가되, 다음과 같이 경험하도록 구성한다고 보면 됩니다.
한 가지 더.
LSTM에서 이제 계산해야 할 값들은 몇 개가 될까요? 먼저 계산해야 할 대상은 몇 개가 될까요? 정답은 4입니다. 일단 f, i, c의 게이트가 3개가 있고, 이것들이 지나가는 h가 있으니까요. 입력(x)와 출력(o)를 제외하고 이들 4개의 것들 안의 가중치는 계속 업데이트가 되어야 합니다. 가중치는 몇 개나 계산되어야 할까요? 출력(o)의 개수가 5개라고 하면 이것 5개와 5개에 대한 5개의 출력값들이 계속 나와야 합니다. 왜냐하면 이전의 값들을 이어받아 새롭게 값들을 계산해야 하니까요. 또한 새롭게 입력되는 x의 차원(m)에 따라 출력값이 조정되어야 하니 5곱하기 m만큼이 새롭게 계산되어야 합니다. 이제 5라고 하지말고 n이라고 하고 m과 n의 곱을 mn, n곱하기 n을 n^2라고 하면, LSTM이 계산하는 파라미터의 총 개수는
4*(mn+n+n^2)입니다.
가능한 쉽게 설명하려고 노력했습니다. 어떤가요?
댓글
댓글 쓰기