[사진=게티이미지뱅크]
[사진=게티이미지뱅크]

“주가 예측, 자연어처리, 기계번역, 음성인식, DNA 시퀀스 데이터 처리”

이들 정보는 이전에 정보가 그 다음 순서의 정보에 영향을 미친다는 의미에서 순차적 처리, 즉 입력되는 순서가 중요한 정보들이다. 

딥러닝(DL)으로 자연어처리를 공부하기 시작하면 이러한 순차적 정보 처리를 위한 심층신경망 구조를 배우게 된다. 특히 처음 접하는 내용이 아마도 순환신경망 즉 RNN(Recurrent Neural Network) 일 것이다. 

RNN은 영상처리를 하는 CNN(Convolutional Neural Network)에 비해 상대적으로 원리를 이해하기 어려워하는 이들이 많다. 이번 글에서는 RNN을 알기 쉽게 비유를 들어가며 설명한 자료를 참조하며 설명해보려 한다. 

그림 1. 4차원 입력의 RNN 예
그림 1. 4차원 입력의 RNN 예

위와 같은 RNN 구조에서 아래 입력 글자는 “hell” 이고 맨 위의 출력 층의 목표 문자는 “ello”로, 결국 아래에서 hello를 입력하는데 목표 문자는 그 다음 글자를 예측하는 것을 알 수 있다. 그런데 이 구조를 보면 아래와 같은 형태이다. 

그림 2. RNN 구조
그림 2. RNN 구조

즉 새롭게 입력되는 정보가 다음 단계 신경망에 영향을 주는 구조다. 이는 우리 말의 문장을 이해하려면 순서대로 오는 정보를 마침표가 올 때까지 모아서 봐야 맥락을 이해하듯이 이전 정보가 중요해 계속 순차적으로 다음 신경망으로 전달됨을 뜻한다. 

사각형으로 표시된 RNN이라는 부분이 궁금할 텐데, 이 부분의 신경망 구조를 아주 단순화 시켜서 아래와 같은 예를 가지고 한번 살펴보자. 

요리와 날씨에 따른 다음 요리 예측
핫도그, 피자, 스파게티를 요리하는 요리사가 있다. 다음 날 해가 뜰 것으로 날씨가 예상되면 요리사는 오늘 요리와 같은 메뉴를 내일 요리 일정에 넣고, 만약 다음 날 날씨로 비가 오면 오늘 한 요리의 다음 순서 요리를 선보인다.

요리 순서는 핫도그, 피자, 스파게티 순서로 빙글빙글 돈다. 자 그러면 아래와 같은 요리 일정이 될 것이다. 

그림 3. 요리 일정표
그림 3. 요리 일정표

심층신경망에는 입력 정보가 벡터로 입력되어서 ‘one hot encoding’으로 아래와 같은 형태로 입력된다. 우선 요리와 날씨가 각각 아래와 같다. one hot encoding 이란 물체를 서로 구별되게 벡터를 표시하는 것이다. 핫도그, 피자, 스파게티는 아래와 같은 3가지 벡터로, 날씨는 2가지 벡터로 서로 구별된다. 

그림 4. 요리와 날씨의 원핫 벡터
그림 4. 요리와 날씨의 원핫 벡터

자, 이제 아래와 같은 그림을 보자. 어떤 ‘요리’ 행렬이 있다고 가정하고 요리 행렬은 3행3열의 행렬 두개를 연결(concatenated)한 행렬이라고 생각하자.

①핫도그 벡터가 입력되어 요리 행렬과 만나면 내부적으로는 벡터의 합성곱(multiply)이 일어난다. 

그림 5. 핫도그와 요리의 합성곱 연산
그림 5. 핫도그와 요리의 합성곱 연산

② 요리 행렬의 윗부분(3x3 행렬 2개가 연결(concatenated)된)과 핫도그 벡터의 합성곱 연산은 아래와 같이 된다. 이 부분은 결과가 핫도그 벡터와 같은 값으로 나온다.

그림 6. 행렬의 합성곱 계산
그림 6. 행렬의 합성곱 계산

③ 요리 행렬의 연결된(concatenated) 아랫부분과 핫도그 벡터의 합성곱 연산을 위와 같은 형태로 연산해보면 피자와 같은 벡터 값을 출력한다. 

이와 마찬가지로, 피자를 위의 ①②③ 과정을 수행해보면, 결과는 상위 3x3 행렬은 같은 피자, 아래 3x3 행렬 부분은 스파게티가 출력된다. 스파게티도 역시 ①②③ 과정을 수행하면, 앞에 경우와 같다.

마찬가지로, 날씨 행렬도 해와 비 각각의 벡터와 합성곱 연산을 통해 아래 그림과 같은 출력을 표시하게 된다.

그림 7. 날씨 행렬과 해, 비 벡터의 합성곱 연산
그림 7. 날씨 행렬과 해, 비 벡터의 합성곱 연산

그림 5와 그림 7의 요리 와 날씨 행렬은 예시를 위한 것으로 왜 그렇게 되는지 큰 의미를 두지는 말자. 아래 그림 8과 같이 왼쪽에 있는 행렬은 입력되어 심층신경망 안에서는, 노드와 노드 사이의 네트워크 상의 값(가중치(weight) 혹은 네트워크 파라미터)으로 나타난다. 

행렬의 원소 즉 1과 0이 각 층의 노드로부터 다음 층의 노드로 연결되는 선상에 값으로 인식됨을 알 수 있다.

그림 8. 행렬과 신경망
그림 8. 행렬과 신경망

앞에서 본 요리와 날씨의 행렬은 각각 요리, 날씨의 벡터와 만나서 같은 출력을 상단에 다음 내용을 하단에 출력하는 행렬이라는 것을 알 수 있다.

좀 더 복잡한 순환신경망(RNN) 
자 이제 요리와 날씨 행렬이 어떻게 결과를 출력하는 지를 안 상태에서 보다 복잡한 순환신경망을 살펴보자. 

결국 요리와 날씨 행렬은 상단의 행렬은 입력과 같은 내용을, 그리고 하단은 다음 내용을 출력하는 행렬임을 알았다. 만약 이 두 행렬을 더하기 연산을 행한다음 병합하면 어떤 일이 벌어질까?

그림 9. 요리와 날씨 행렬의 병합
그림 9. 요리와 날씨 행렬의 병합

일단 아래와 같이 오늘 핫도그를 요리하고 내일 날씨가 비가 오는 경우를 생각해보자.

그러면 연산은 아래와 같은 형태로 일어날 것이다. 즉 요리는 상단에 핫도그 하단에는 다음날 요리인 피자가, 그리고 날씨는 상단은 해가, 하단은 비가 위치하고, 이 둘을 더하면 맨 오른쪽의 행렬의 값으로 나타난다. 

그림 10. 요리 더하기 날씨 연산
그림 10. 요리 더하기 날씨 연산

우리가 알고자 하는 것은 핫도그와 비오는 날(위의 심볼), 즉 오늘 핫도그 요리를 하고 내일 비가 올 경우에 다음에 어떤 요리를 할 것 인가가 관심사이다. 따라서 마지막 출력된 행렬의 하단이 주목된다.

다음에 이 출력 값을 아래 그림과 같은 동작을 수행한다.

① 출력 값에 최대값을 1로 하고 나머지는 0으로 하는 함수(활성화함수라고 함)를 통과시킨다. 이렇게 되면, 가장 큰 2를 제외한 나머지 값들은 0으로 변한다. 
② 연결(concatenated)된 상위 와 하위의 3x1의 행렬 둘을 병합한다.
③ 그 결과 맨 오른쪽에 피자에 상응하는 출력이 나옴을 알 수 있다.

그림 11. 비선형 함수와 병합 수행
그림 11. 비선형 함수와 병합 수행

지금까지 살펴본 내용은 순차적으로 요리와 날씨라는 요소가 다음 요리에 영향을 미치는 경우를 알기 쉽게 예시를 들어서 설명한 것이다.

순환신경망으로 입력되는 순차적 정보들은 심층신경망의 학습을 하는 과정을 통하여 옆자리에 이웃할 확률 등이 계산되는 보다 복잡한 과정을 거치게 된다. 

순환신경망은 신경망 층(layer)의 깊이가 늘어날수록, 즉 다시 말하면 문장의 길이가 늘어날수록 맨 앞의 정보를 놓치는 약점이 있어 이러한 정보를 놓치지 않도록 메모리를 추가한 LSTM, GRU 등의 보다 진보된 구조로 진화하였다.

이후 2017년에 사람이 문장을 이해하는데 주목할 단어에 보다 집중하여 긴 문장을 직관적으로 이해하듯이 순차적 정보가 상대적으로 늘어나도 각 처리하는 단계에서 어떤 단어에 보다 집중해야 하는 지의 가중치를 감안한 정보를 활용하여 처리하는, 정보의 양과 예측 정확성을 획기적으로 향상한 기술이 발표되었다. 

이후로는 RNN 같은 구조를 전혀 사용하지 않고 attention이라는 기능만을 구현한 transformer라는 기술이 발표되면서 발전하였다. 

이상 살펴본 바와 같이, 자연어처리와 같은, 순차적으로 입력되는 정보를 다루는 심층신경망이 어떻게 동작하는지 간단하게 살펴보았다.

 

글 : 주철휘 / 인공지능연구소 소장(CAO) / 에이프리카(구 엔쓰리엔클라우드)

관련기사

저작권자 © IT비즈뉴스(ITBizNews) 무단전재 및 재배포 금지