순환 신경망을 컴퓨터 비전 분야에 활용한 예시로 이미지 캡셔닝이 있겠다. 이 이미지 캡셔닝은 이미지 하나를 입력으로해서 문장을 출력시키는 일대다문제라고 할수 있는데,
이미지를 합성곱 신경망에다가 입력으로주어 특징들을 추출시키겠다. 그렇게 추출한 특징들을 순환 신경망 언어 모델에 대입하여 문장을 만들수 있도록, 이미지 데이터셋과 이미지에 대한 캡션들을 사용해서 이 언어 모델을 경사 하강법으로 학습 시키겠다.
이 그림은 이게 어떻게 생겻는지 보기위한 전이 학습의 구체적인 예시라고 할수 있는데, 우선 이미지넷으로 선학습시킨 CNN모델을 다운받아서 가져오고, 그 신경망 모델의 마지막 2계층을 제거시키겠다.
이제 유한한 임의 길이의 시퀀스를 절단 시간 역전파를 사용해서 처리한다고 해보자. 이미지 캡셔닝에서는 <start>와 <end>로 이뤄진 시퀀스를 가지고 처리하는데 항상 시퀀스의 첫번째 요소, 시작 요소는 <START>로 새로운 문장의 시작점을 의미한다.
이제 합성곱 신경망으로부터 얻은 데이터를 순환 신경망에서 사용해보자. 지난번에 이전 상태의 은닉 상태를 이용해서 현재 은닉 상태를 계산하는 공식을 약간 변환을 시켰는데, 이미지 정보를 반영해서 매 시점마다 세 입력을 받게 되었다.
시퀀스의 현재 요소와 이전 은닉 상태 그리고 선학습 합성곱 모델에서 얻어낸 특징까지 이 세가지 입력을 서로 다른 가중치 행렬 혹은 선형 사영을 한뒤 이들 모두를 합한 휘 tanh 함수를 적용시키는 형태로 기존의 순환 신경망 순환 함수를 변경시켰다. 이와 같이 변경 시킴으로서 이미지에 대한 특징 백터 정보를 추가적으로 반영할 수 있었고,
이 이후에는 언어 모델처럼 동작하게 되겠다.
훈련을 마치고나서 테스트 때 어떻게 동작하는지를 보면, 우선 첫번째 단어를 얻고자 사전에 있는 단어, 토큰에 대한 확률 분포를 예측하여 "man"이라는 단어를 얻을수가 있겠다.
이 단어 "man"을 순환 신경망의 다음 입력으로 사용해서 다음 단어인 in을 얻고
이 과정을 반복해나가면, "straw", "hat" 등 단어들을 얻을수가 있겠다.
그리고 마지막에는 <END> 토큰이 나오면서 멈추게 되겠다. 이 처럼 유한한 길이의 시퀀스를 처리하는경우 사전에 <START> 토큰을 시퀀스의 맨 앞에, <END> 토큰을 시퀀스의 맨 뒤에 추가시켜서 학습하는 과정에 사용하며, 테스트 시점에서 <END> 토큰을 구하는 순간 출력을 멈출 시점으로 판단하여 샘플링/예측 과정을 종료하게 된다.
(질문) 위 수식에서 파랑 항과 분홍 항의 차이는 무엇인가
위 변경된 함수를 보면 녹색, 파랑, 분홍 세 가지 항이 있는데, 녹색항은 현재 시점 시퀀스 입력으로 입력 토큰 값중 하나를 나타내며 이 예시에서는 <START>, man, in, straw, hat 중 하나가 사용되겠다. 파랑 항의 h는 이전 시점의 은닉 상태를 나타내며 예를들어 h2를 계산하는 경우 h1을 의마한다고 할수 있겠다. 이번에 분홍 항의 경우 합성곱 신경망으로부터 얻은 특징 벡터 v를 나타내는데, 순환 신경망의 모든 시점에서 사용되겠다.
이미지 데이터셋과 그에 대한 캡션들을 가지고 이미지 캡셔닝 모델을 학습시키켰을때 이미지를 아주 잘 설명하는 경우드를 한번 보자. 맨 왼쪽 위의 것을 보면, "고양이가 가방 안에 앉아있다."라는 결과가 나왔는데, 이전에 살펴보았던 단일 라벨만 출력시켰던 이미지 분류 모델보다 훨씬 자세하게 설명할수 있다.
다음으로 위의 맨 오른쪽을 보면 "하얀 곰인형이 잔디밭 위에 앉아있다."라면서 좋은 결과를 얻었고, 아래를 보면 "두 사람이 서핑 보드를 들고 해변가를 걷고 있다", "테니스 선수가 동작을 하고 있다"와 같이 이미지들을 상당히 잘 설명하고 있는걸 볼수 있겠다.
그래서 이미지 캡셔닝에 대한 첫 연구 결과가 나오면서 그동안 "고양이", "개", "트럭" 같은 단순한 단일 라벨이 아니라 주어진 이미지를 보고 의미있는 출력을 내면서 많은 사람들이 열광하곤 했었다.
하지만 얼마 안가서 이런 이미지 캡셔닝 모델이 생각 많큼 똑똑하지 못하다는게 드러났는데, 한번 실패한 경우들을 살펴보자.
왼쪽 위 이미지를 훈련된 이미지 캡션 모델에다가 주면, "한 여성이 고양이를 손에 쥐고있다"라는 결과가 나오고 있다. 아마 여성의 옷의 텍스처/질감이 훈련셋에 있는 고양이 털과 비슷해서 일수도 있겠다.
그 아래 이미지를 보면 "한 사람이 책상 위에서 컴퓨터 마우스를 쥐고 있다."라는 결과가 나온 경우인데 여기서 사용한 데이터셋이 아이폰이 나오기 전에 만들어지다보니, 여기 나오는 사람이 책상에서 뭘 쥐고 있던간에 컴퓨터 마우스나 다른 휴대폰으로 판단하게 되겠다.
이와 같이 이미지 캡셔닝 모델은 꽤 재미있을지는 몰라도 여전히 부족한 점이 많으며, 이런 문제들을 해결하려면 꽤 걸릴것으로 보인다.
다음으로 살펴봐야할것으로 순환 신경망의 그라디언트 플로우/흐름이 있겠다. 위를 보면 우리가 지금까지 다뤄온 바닐라 순환 신경망에 대한 그림이 있는데, 여기서 순환 신경망이 한 타임 스탭에서 어떻게 처리되는지를 보여주고 있다.
입력 x_t가 아래에서 들어오고, 왼쪽에서 이전 은닉상태 h_t-1이 들어온다. 이 두게를 연결시키고나서 가중치 행렬 W에 대한 선형 변환으로 정리 할수 있고, 여기다가 tanh 비선형 함수를 적용시켜서 현재 상태 h_t를 구할수가 있겠다.
여기서 우리가 알아야 하는 부분은 이 모델이 역전파 하는 과정에서 그라디언트가 어떻게 되는가인데
한번 역전파가 진행되는 과정에서 어떤일들이 생기는지 한번 생각해보면, 일단 출력 은닉 상태 h_t에 대한 비용함수의 미분치를 받을게 되겠다. 우리가 구하고자하는건 입력 은닉 상태 h_t-1에 대한 비용의 그라디언트를 계산해야 한다.
여기서 두가지 문제가 생기는데, 그 중 하나는 tanh 비선형 함수를 사용하는것으로 여러번 왜 tanh 함수가 안좋은지 이야기 했고 가능한 쓰지말아야하며, 문제가 생길 가능성이 있다고 보아야한다. 하지만 이 rnn모델이 90년대에 만들어진것이다보니 감안해야 되겠다.
이 순환 신경망 모델에서 역전파를 할때 생기는 또 다른 큰 문제로는 역전파시 행렬곱 부분인데, 역전파 과정에서 가중치 행렬의 전치 행렬을 곱해야 한다.
그러면 한번 단일 순환 신경망 셀이 아니라 여러 타임 스탭을 흘러간 순환 신경망을 다뤄보자. 그러면 여기서 전체 시퀀스를 역으로 흘러가는 그라디언트 플로우를 볼수 있겠다. 업스트림 그라디언트는 계속 계속 동일한 가중치 행렬의 전치행렬과 곱해나가게 된다.(순환 신경망에서는 하나의 가중치 행렬을 공유= 모든 시점의 가중치 행렬이 동일하므로)
이렇게 되면 아주 안좋은 결과를 얻을수 밖에 없는데, 이 슬라이드에서는 4개의 셀만 보여주고 있지만 100 혹은 200 혹은 수천 타임 스탭의 시퀀스를 풀어나가는 경우에 역전파 과정에서 동일한 가중치 행렬을 수천번 곱해나가면 두 가지 방향으로 잘못 동작하게 된다.
발생되는 문제들 중 하나는 행렬이 아주 크다면, 같은 행렬을 계속 곱하다보면 점점 커져 무한대로 커지게 될것이고, 가중치 행렬의 가장큰 특이 값이 1보다 작다면, 그라디언트는 급격히 줄어들어 0이되어 사라져버리게 되겠다.
다시 정리하면 가장큰 특이값이 1보다 크다면, 그라디언트가 무한대로 폭증할것이고, 가장 큰 특이값이 1보다 작다면 그라디언트가 0이 되어버리겠다. 그래서 이와 같은 그라디언트 폭증, 그라디언트 소멸 문제를 가지게 되므로, 아주아주 긴 시퀀스를 처리할때 안정적으로 학습시키기 위해서는 가중치 행렬의 모든 특이값이 정확히 1이 되도록 만들면 되겠다.
그래서 사람들이 그라디언트 폭증을 대처하기 위해서 사용하는 방법은 그라디언트 클리핑/다듬기?이라고 부르는 방법을 사용하는데, 역전파에서 실제 그라디언트를 사용하는것이아니라, 은닉 상태에 대한 그라디언트를 계산한 후에, 그라디언트의 유클리디안 노름이 너무 큰지 체크를해서 그렇다면, 그라디언트가 줄어들도록 위의 값을 곱해주는 방법이 되겠다.
그래서 이 그라디언트 클리핑을 사용한 덕분에 실제 그라디언트를 계산한것은 아니지만 적어도 그라디언트가 폭증하는건 막아 역전파를 계속할수 있게 되겠다. 하지만 이 방법은 실제 그라디언트를 계산해서 쓰는게 아니다보니 좋은 방법이라 할수 없고, 그저 그라디언트 폭증을 방지하기 위해서 사용했던 경험적인 방법이었습니다.
그리고 다뤄야 하는 또 다른 문제로는 그라디언트 소멸 문제로, 특이 값이 아주아주 작은 경우에 발생하는 이 문제를 피하기 위해서 사람들이 이 기본 아키텍처 대신 다른 순환 신경망 모델을 사용하였습니다.
'번역 > 컴퓨터비전딥러닝' 카테고리의 다른 글
딥러닝비전 13. 어텐션 - 1. sequence to sequence with attention (0) | 2021.03.17 |
---|---|
딥러닝비전 12. 순환 신경망 - 6. LSTM (0) | 2021.03.15 |
딥러닝비전 12. 순환 신경망 - 4. 텍스트 생성과 은닉 유닛 해석 (0) | 2021.03.13 |
딥러닝비전 12. 순환 신경망 - 3. 언어 모델과 역전파 (0) | 2021.03.12 |
딥러닝비전 12. 순환 신경망 - 2. 순환 신경망과 계산 그래프 (0) | 2021.03.11 |