Lecture 10 | Recurrent Neural Networks(75~)

Hoon82의 velog·2022년 8월 30일
0

이미지 캡셔닝 : 결과 예시
이미지 캡셔닝은 Supervised learning으로 natural language caption이 있는 이미지를 이용해서 학습합니다. 대표적인게 Microsoft coco 데이터셋입니다. 이미지를 묘사하는 비교적 복잡한 캡션들도 생성할 수 있습니다.

이미지 캡셔닝 : 실패 사례
첫 번째 사진을 보면, 여성을 고양이라고 설명하고 있습니다. 이렇게 학습이 잘 안되는 경우도 물론 있습니다. 훈련 데이터와 비슷한 이미지에 대해 캡션을 해야 잘 동작합니다. 그러나 그 이상을 훨씬 넘어서 일반화하려고 하면 분명 어려워합니다.

이번에는 상위 버전인 Image captioning with Attention 알고리즘을 보겠습니다. 이 모델은 caption을 생성할 때 이미지의 다양한 부분에 집중(attention)해서 해석해줍니다.

먼저 CNN에서 LxD의 필터(벡터 집합)를 만들어냅니다. 공간 정보를 가지고 있는 grid of sector입니다. 진행하는 과정에서 각 step(hidden state, h0)의 이미지 위치에 대한 다양한 분포를 계산합니다. 즉 훈련하는 동안 모델이 집중(attention)하고 싶은 위치를 계산하는 겁니다. 이 값이 a1이고 이게 grid of sector와 연산하여 attention(z1)을 만들어냅니다.

이제 그 요약 벡터(z1)가 word(y1)와 함께 신경망(neural network)의 다음 시점에서 입력값으로 들어가고 2개의 출력을 만들어 냅니다. d1은 어휘 단어들에 대한 분포이고, a2는 이미지 위치에 대한 분포입니다. 이 과정은 반복됩니다.

모델을 훈련시킨 다음에, 그것이 캡션에서 만들어낸 모든 단어들에 대해 이미지 여기저기에 attention을 이동시키면서 봅니다. 여기서는 그것이 캡션을 만들어 낸다는 것을 알 수 있습니다. hard attention과 soft attention이라는 개념이 있는데, 소프트 어텐션 아이디어로는, 모든 이미지의 위치로부터 모든 피쳐들의 조합을 얻는 겁니다. 반면 하드 어텐션의 경우는, 모델이 매 시점마다 이미지에서 정확히 하나의 위치만 선택하도록 강요합니다. 그래서 하드 어텐션의 경우는 하나의 이미지 위치를 고르는 것인데 까다롭습니다. 왜냐면 미분할 수 있는 함수가 아니어서 그 시나리오에서 모델을 훈련시키려면 바닐라(vanilla) 역전파보다 좀 더 어려운 무언가를 해야 합니다. 자세한 내용은 강화 학습에 관한 강의에서 자세히 다루겠습니다.

이런 attention 모델 하나를 훈련시킨 다음 캡션을 생성하기 위해 실행시키면, 캡션을 생성할 때 이미지의 핵심적인 부분에 집중하는 경향이 있다는 것을 알게 됩니다. 첫 번째 캡션을 보면 어떤 여자가 프리스비(frisbee)를 공원에서 던진다고 되어 있습니다. attention 모델이 프리스비라는 단어를 생성했을 때, 동시에, 프리스비를 진짜로 포함하고 있는 이 이미지 영역에 attention이 집중되어 있다는 것을 알 수 있습니다. 우리는 모델에게 매 시점마다 어디를 봐야 한다고 얘기하지 않았습니다. 훈련하는 동안 이미지에 대해 해야 할 일을 스스로 알아냈습니다. 그리고 이 모델은 미분이 가능하기 때문에, 이 소프트 어텐션을 통해 역전파할 수 있습니다. 이 소프트 어텐션은 훈련 과정을 통해 나오는 것입니다.

시각 질의 응답
이 순환 신경망과 attention 아이디어는 사실 이미지 캡셔닝(image captioning)을 넘어서 다른 작업에서도 사용되고 있습니다. 하나의 예는 시각 질의 응답 (visual question answer)의 아이디어입니다. 여기서 모델은 2개를 입력으로 받습니다. 이미지를 입력으로 받고 이미지에 대해 묻는 어떤 자연어 질문을 받습니다. 여기서 왼쪽의 이미지를 보고 트럭에 그려진 멸종위기 동물이 무엇이냐고 물을 수 있습니다. 그럼 모델은 어떤 것이 이미지의 문맥에서 그 질문에 제대로 답했는지에 대해 4가지 자연어 답 중에서 하나를 골라야 합니다.

시각 질의 응답 : Attention이 있는 RNN들
이 알고리즘도 CNN(합성곱 신경망)과 RNN(순환 신경망)을 합친 모델입니다. many to one(다대일)식으로 모델은 자연어 순열을 입력으로 받습니다. 순환 신경망을 입력 질문의 각 원소에 대해 실행시켜서 입력 질문을 단일 벡터로 요약합니다. 그리고 CNN(합성곱 신경망)이 이미지를 요약하게 하고 CNN(합성곱 신경망)으로부터의 벡터와 질문과 코딩 RNN(순환 신경망)으로부터의 벡터를 합쳐서 답에 대한 분포를 예측할 수 있습니다. 또한 소프트 공간 어텐션 아이디어가 가끔 시각 질의 응답에 포함되는 것을 볼 수 있습니다. 그래서 이 모델이 질문에 대한 답을 결정하려고 할 때, 이미지에 대한 공간 어텐션을 가지는 것을 볼 수 있습니다.

지금까지 우리는 단일 순환망에 대해서 얘기했는데, 하나의 숨겨진 상태(hidden state)만 있는 것입니다. 앞으로 자주 보게 될 하나는 다층 순환망(multi-layer recurrent network) 아이디어입니다. 여기서는 3층 순환 신경망인데, 입력이 들어가고 일련의 숨겨진 상태가 첫번째 신경망 계층으로부터 만들어 집니다. 그리고 하나의 순환 신경망 계층을 실행시키고 나면, 숨겨진 상태의 전체 순열을 가지게 됩니다. 그리고 그 숨겨진 상태의 순열을 다른 순환 신경망 계층의 입력 순열로 사용합니다. 그럼 두번째 RNN 계층으로부터 또다른 숨겨진 상태의 순열을 만들어 냅니다. 그리고 이런 것들을 서로서로 쌓아올립니다. 많은 문제에 대해서, 둘 혹은 셋 계층의 순환신경망 모델이 꽤 흔하게 사용됩니다. RNN에서는 보통, 2, 3, 4 계층들이 일반적으로 사용됩니다. 하지만 RNN은 multi layer(다층)로 하면 문제가 생기기 때문에 보통은 RNN은 사용하지 않고 LSTM을 많이 사용합니다.

바닐라 RNN 경사 흐름
RNN의 기본 수식입니다. 현재 입력 x_t와 이전 hidden state h_t-1이 들어옵니다. 그리고 두 입력을 stack합니다. 가중치 행렬과 이 행렬 곱셉을 하고 출력을 tanh를 통과시키면 다음 숨겨진 상태(h_t)를 줍니다. 그것이 바닐라(vanilla) 순환 신경망의 함수 형태입니다.
이럴 때 bakkward pass(역방향 전달)에 gradient를 계산하는 과정에서 어떤 일이 발생될까요? 우선 h_t에 대한 loss 미분값을 얻습니다. 그 다음 loss에 대한 h_t-1의 미분값을 계산하게 됩니다. 이 빨간색 경로처럼 진행됩니다. 근데 여기서 보아야 할 것이 gradient는 tanh gate를 타고 mul gate(행렬 곱셈 게이트)를 통과하게 됩니다. 앞에서 보았듯이 mul gate(행렬 곱셈 게이트)를 통과해서 역전파할 때, 결국 가중치 행렬의 전치 행렬 (transposed matrix)로 곱하게 됩니다. 그 얘기는 우리가 이 바닐라 RNN 셀들 중 하나를 통과해서 역전파를 할 때마다, 결국 가중치 행렬의 어떤 부분을 곱하게 된다는 의미입니다.

가중치가 1보다 크면 값이 계속 커져서 h_0에 대한 기울기가 explode(폭발)하게 됩니다. 그나마 explode(폭발)는 clipping(잘라내기)으로 제한해줄 수 있지만, 1보다 작아서 vanishing(소멸)한다면, 답이 없습니다. RNN 아키텍쳐를 바꾸는 것을 권유합니다. 이것이 일어나지 않는 유일한 방법은 그 숫자가 정확히 1이 되는 것입니다. 사실상 아주 드문 일입니다.

그래서 RNN 대신 LSTM(Long Short Term Memory)을 씁니다. RNN에서 기울기의 문제를 완화하기 위해 나온 알고리즘입니다. 하나의 셀에 2개의 hidden state가 존재합니다. c_t(cell state), h_t 값은 LSTM(Long Short Term Memory) 내부에만 있고, 노출되지 않습니다. 그리고 이 방정식을 통해서, 2개의 입력을 받고, 그것으로 이 4개의 gate를 계산하는데, i, f, o, g라고 부릅니다. 그 gate들을 사용해서 셀 상태를 업데이트합니다. 그 다음 셀 상태의 일부를 숨겨진 상태로 노출합니다.

hidden state를 stack하고 4개의 gate(ifog)로 가중치 행렬을 곱해줍니다. i는 input gate인데 cell에서의 입력 x_t에 대한 가중치입니다. f는 forget gate입니다. 이전 스텝의 cell을 얼마나 잊을지 정합니다. o는 output gate입니다. cell state를 얼마나 밖으로 출력할 것이냐를 정합니다. g는 따로 부르는게 없어서 gate gate라 부릅니다. input cell 을 얼마나 포함시킬지를 정합니다.

i, f 그리고 o gate는 모두 시그모이드 (sigmoid)를 사용합니다. 값이 0과 1사이라는 걸 의미합니다. 반면에 g gate는 tanh를 사용합니다. 출력이 -1부터 1사이라는 것을 의미합니다. 이 gate들을 계산한 다음 방정식을 보면, 이전 시점으로부터의 셀 상태가 원소마다 f gate로 곱해진다는 것을 알 수 있습니다. f gate를 0과 1의 벡터라고 생각해보면, 셀 상태의 각각의 항목에 대해서, f gate가 0이라면, 그 셀의 원소를 잊고 싶다고 얘기하고 있는 겁니다. f gate가 1이라면, 그 셀의 원소를 기억하고 싶다고 얘기하는 겁니다. 일단 f gate를 사용해서 셀 상태의 일부를 막으면, 두번째 항을 가지게 되는데, 그건 i와 g를 원소 단위로 곱한 겁니다. 시그모이드로부터 나오는 i는 0과 1의 벡터입니다. i가 1인 경우는 그 셀 상태의 각 원소에 대해서 쓰고 싶다는 것을 얘기합니다. 혹은 i가 0인 경우는 그 셀 상태의 각 원소에 대해서 쓰고 싶지 않다는 걸 얘기하는 겁니다. g gate는, tanh로부터 나옵니다. 0이거나 -1일겁니다. 각 시점에서 셀 상태의 각 원소에 쓰고 싶은 후보 값입니다. 만약 셀 상태 방정식을 보면, 매 시점마다, 셀 상태는 이런 종류의 다른, 독립적인 배수 값을 가지고 있고, 그것들은 모두 1씩 증가하거나 줄어듭니다. 그래서 셀 상태 안에서, 이전 상태를 기억하거나 잊을 수 있고, 그 다음 매 시점마다 셀 상태의 원소들을 1까지 증가시키거나 감소시킬 수 있습니다. 이 셀 상태의 원소들을 매 시점마다 증가하거나 감소할 수 있는 작은 배율 정수 카운터로 생각할 수 있습니다. 이제, 셀 상태를 계산하고 난 다음, 우리는 업데이트 된 셀 상태를 사용해서 숨겨진 상태를 계산할 거고, 그것을 바깥 세상에 노출 시킬 겁니다. 그래서 셀 상태가 카운터로 해석되기 때문에, 매 시점마다 1혹은 -1만큼 센다고 할 수 있습니다. 그래서 저 카운터 값을 tanh를 사용하여 적당한 0에서 1까지의 범위로 집어 넣습니다. 이제, 원소단위로 o gate로 곱합니다. 그리고 o gate는 또 시그모이드로부터 나오니까, 그건 대부분 0과 1이라고 생각할 수 있습니다. 그리고 o gate는 셀 상태의 각 원소에 대해서 얘기해줍니다. 그 시점에 대해서 외부의 숨겨진 상태를 계산할 때 셀 상태의 그 원소를 드러내고 싶은지 드러내고 싶지 않은지를.

셀로부터 오는 업스트림(upstream) 경사를 가질 때, 더하기 연산을 통과하는 역전파를 하면, 더하기는 업스트림 경사를 2개의 가지로 복사합니다. 그래서 업스트림 경사가 복사되어서 원소 단위 곱하기를 통해 역전파 됩니다. 그 다음 업스트림 경사는 결국 원소 단위로 f gate로 곱해집니다. 이 셀 상태를 통해서 역전파를 하면, 업스트림 셀 상태 경사는 결국 f gate 원소단위로 곱해지게 됩니다. 이건 실제로 두가지 이유로 바닐라 RNN보다 훨씬 좋습니다. 하나는 이 f gate가 원소 단위 곱하기라는 겁니다. 전체 행렬 곱하기가 아닙니다. 원소마다의 곱하기가 전체 행렬 곱하기보다 더 낫습니다. 두 번째는 원소마다의 곱셈은 잠재적으로 매 시점마다 다른 f gate로 곱한다는 겁니다. 바닐라 RNN에서는, 계속해서 같은 가중치 행렬로 반복해서 곱하고 있었습니다. 그건 폭발하는 경사나 사라지는 경사로 귀결됩니다. 그러나 LSTM의 경우는, 이 f gate가 매 시점마다 달라질 수 있는 겁니다. 이제, 모델이 폭발하고 사라지는 경사의 문제를 피하기 훨씬 쉬워졌습니다. 마지막으로, f gate가 시그모이드로부터 나오기때문에, 이 원소 단위 곱셉이 0과 1사이에 있는 것이 확실합니다. 또 주목할 점은 바닐라 순환 신경망에서는, 역방향 전달 동안, 경사는 매 시점마다 tanh를 통과하며 흐르고 있었습니다. 그러나 LSTM에서는, 숨겨진 상태가 출력 y_t를 계산하는데 사용됩니다. 최종 숨겨진 상태에서 첫 번째 셀 상태로 역전파하는 것을 생각해보면, 그 역방향 경로를 통과하면서, 단일 tanh 비선형성을 통과하며 역전파할 뿐입니다. 매 시점마다 별도의 tanh를 통과하는 게 아닙니다.

셀 상태를 통과하여 역전파하는 이 역방향 전달이 경사가 비교적 방해받지 않고 모델의 제일 끝의 손실로부터 모델의 시작점의 초기 셀 상태까지 쭉 지나가게 해주는 것입니다.
LSTM은 사실 레즈넷(ResNet)과 꽤 비슷해 보인다는 것을 알 수 있습니다. 중복 망에서, 망을 통과하며 거꾸로 가는 항등 연결(identity connection)의 경로가 있었고, 그것이 레즈넷에서 경사가 거꾸로 흐를 수 있는 경사 슈퍼 고속도로를 주었습니다. 그것이 일종의 LSTM에서의 같은 직관입니다. 여기서도 이런 더하기와 셀 상태의 원소 단위 곱하기 상호작용이 LSTM에서 셀 상태를 통해 경사가 거꾸로 흐르게 하는 비슷한 경사 슈퍼 고속도로를 제공합니다.
그런데 고속도로 망 (highway networks)이라고 불리는 좋은 논문이 있습니다. 그건 이 LSTM 셀과 이런 중복 망의 중간쯤에 있는 것입니다. 고속도로 망들은 사실 중복 망 이전에 나왔고, 고속도로 망의 각 계층에서, 우리는 일종의 후보 활성들 (candidate activations)을 계산하고, 뿐만 아니라 게이팅 함수(gating function)도 계산할 겁니다. 게이팅 함수는 그 계층에서의 이전 입력과 합성곱 같은 것을 통과해 나온 후보 활성 사이에 끼워들어간 것입니다. 사실상 이것들 사이에는 많은 아키텍처상의 유사점들이 있고 사람들은 매우 깊은 CNN들과 매우 깊은 RNN들을 훈련시키는 것으로부터 많은 영감을 얻고 여기서 많은 크로스오버(crossover)가 있습니다.

요약하면, RNN은 좋습니다. 그것으로 수 많은 새로운 종류의 문제들을 해결할 수 있습니다. 그러나 경사가 사라지는 문제나 폭발하는 문제가 있습니다. LSTM은 가중치 잘라내기나 더 멋진 아키텍처들로 그 문제들을 해결할 수 있습니다. 그리고 CNN 아키텍처와 RNN 아키텍처에 겹치는 유용한 부분들이 있습니다. 좋은 연구 주제입니다.

profile
나는 킹고수다!!

0개의 댓글