RNN의 응용: 언어 모델에서 멀티모달까지
프롤로그
여러분 안녕하세요. 딥러닝 마지막 시간입니다. 오늘은 순환 신경망의 마지막 응용 사례에 대해 말씀드리겠습니다.
언어 모델
순환 신경망의 응용 사례로 언어 모델이 있습니다. 언어 모델이라는 건 하나의 문장이 있을 때, 이 문장의 단어 열을 보고 이 단어 열이 발생할 확률에 대한 확률 분포를 추정하는 일입니다.
예를 들어볼게요.
"자세히 보아야 예쁘다"
"예쁘다 보아야 자세히"
이 두 문장이 있다면 일반적으로 더 자연스러운 문장은 "자세히 보아야 예쁘다"입니다. 언어 모델은 이 문장에 대해서 높은 확률을 도출하는 겁니다.
그러면 이 확률 모델은 언제 활용되느냐? 음성 인식기나 번역기가 후보로 여러 문장을 출력할 수 있습니다. 그중에서 가장 확률이 높은 것을 선택할 때 언어 모델을 사용하게 됩니다.
확률 분포 추정 방법
확률 분포를 추정하는 방법은 여러 가지가 있을 수 있습니다. N-gram, 다층 perceptron, 순환 신경망 방법이 있는데요. N-gram은 가장 전통적인 기계학습에서 사용하던 방법입니다.
문장 X를 각각의 단어들의 순차적 나열로 표현한다면:
X = [x₁, x₂, x₃, ..., xₜ]
이 X가 발생할 확률을 결합 확률로 나타낼 수 있습니다:
P(X) = P(x₁, x₂, x₃, ..., xₜ)
이 결합 확률은 조건부 확률로 나타낼 수 있고요:
P(X) = P(x₁) × P(x₂|x₁) × P(x₃|x₁,x₂) × ... × P(xₜ|x₁,...,xₜ₋₁)
이 조건부 확률이 의미하는 건 이전에 단어가 나타났을 때 그다음 현재 t 시점에서 단어가 나타날 확률들의 곱으로 나타낼 수 있다는 겁니다. 그렇게 하면 자연스러운 순서에 대한 확률 값이 계산될 수 있는 거죠.
N-gram의 문제: 차원의 저주
그런데 이슈가 뭐냐 하면, N-gram에서 n은 내가 현재 고려해야 하는 단어의 개수, 다시 말하면 조건부 확률에서 조건부항에 들어가는 단어의 개수를 의미합니다. 이때 n의 길이가 굉장히 길 경우에 차원의 저주가 발생할 수 있습니다.
다시 말하면, n개의 단어에 대한 조건이 들어있을 때 그다음 1개의 단어에 대한 확률을 예측하는 것은:
필요한 확률 테이블 = M^n × M
(M: 어휘 크기)
엄청나게 많은 경우의 수!
→ 데이터 수집 불가능
→ 메모리 저장 불가능
차원의 저주 문제가 있기 때문에 조건식에 들어가는 n의 개수를 1에서 3 정도로 작게 해야만 할 수밖에 없습니다.
이렇게 작게 하면 지난 시간에도 말씀드렸다시피 장기 문맥 의존성을 고려할 수가 없게 됩니다. 순환신경망에서 매우 중요한 요소인데 말이죠. 그래서 N-gram 방법은 이런 차원의 저주 이슈가 있기 때문에 잘 사용하지 못한다는 문제가 있습니다.
그리고 또한 단어가 원핫 코드로 표현되기 때문에 단어 간의 의미 있는 거리를 반영하지 못하는 한계를 가지고 있죠.
RNN 언어 모델
그래서 순환 신경망을 이용한 언어 모델이 나왔습니다. 이 순환 신경망은 현재까지 본 단어 열을 기반으로 다음 단어를 예측하는 방법입니다.
"자세히" → "보아야" 예측
"자세히 보아야" → "예쁘다" 예측
확률 분포를 추정할 뿐만 아니라 문장도 생성해줄 수 있는 능력이 있습니다. 또 비지도 학습에 해당하죠.
왜냐하면:
입력: <시작> → "자세히" → "보아야" → "예쁘다"
출력: "자세히" → "보아야" → "예쁘다" → <끝>
시작 토큰을 입력으로 넣으면 "자세히", 그다음에 "자세히"를 넣으면 "보아야", "보아야"를 넣으면 "예쁘다", "예쁘다"를 넣으면 끝. 이런 식으로 하나의 문장이 있으면 그 문장을 가지고 시작만 딱 트리거링해주면 그 문장이 술술 나오도록 학습할 수 있기 때문에 이 순환 신경망을 이용한 언어 모델은 비지도 학습에 해당한다고 볼 수 있습니다.
여기서 시작과 끝은 각각 sentence가 시작한다는 것과 끝난다는 것을 가리키는 특수 문자라고 볼 수 있겠죠.
학습 방법
순환 신경망은 말뭉치에 있는 문장을 다음과 같이 변환합니다:
입력: 맨 처음에 시작 토큰
출력: 마지막에 끝 토큰
입력과 출력이 대응되도록 학습
이때 우리가 배웠던 BPTT 방법을 사용할 수 있습니다.
이렇게 학습이 끝나면 기계 번역이나 음성 인식기의 성능을 향상시키는 데 활용됩니다. 예를 들면 음성 인식기가 여러 솔루션을 도출하는 거죠:
후보 1: "자세히 보아야 예쁘다"
후보 2: "자세를 모아야 예쁘다"
→ 언어 모델로 확률이 높은 것을 선택
→ 훨씬 더 quality 높은 답변!
문장 생성의 역사
순환신경망을 통해서 실제 단어를 생성한 예시가 있었습니다. 2015년, 한 10년 전 일인데 그 당시에는 이런 문장을 생성하는 게 굉장히 놀라웠어요:
"Anyway to the city scene, you are an idiotination what ignore?"
"와, 드디어 순환신경망이 말이 되는 문장을 생성했구나!"라고 사람들이 생각했었는데, 지금은 ChatGPT가 굉장히 유려하게 문장을 잘 생성하고 있는 거죠.
순환 신경망을 이용해서 문장을 생성하는 방법은 간단합니다:
1. RNN 학습
2. 시작 토큰 입력
3. 끝 토큰이 나올 때까지:
- RNN 출력을 샘플링
- 그 출력을 다시 입력으로 되먹임
굉장히 간단한 방법으로 할 수 있습니다.
기계 번역
기계 번역도 마찬가지로 언어 모델과 비슷한 영역에 속하는데, 약간 더 어려운 영역이라고 볼 수 있습니다.
언어 모델은 문장이 얼마나 자연스러운지를 확률적 관점에서 예측했다면, 기계 번역은 거기에 추가로 자연스러움뿐만 아니라 어순이 다른 외국어로까지 변형을 해야 되는 문제이기 때문에 조금 더 어렵다고 볼 수 있겠죠.
또한 번역은 문장의 길이가 다를 수도 있는 겁니다:
한국어: 5단어 → 영어: 3단어
또는 그 반대
결국 sequence-to-sequence, 고정 길이가 아닌 가변 길이 입력에 대한 가변 길이 출력 문제로 볼 수 있습니다.
예전에 통계적 기계 번역 방법, 예를 들어 N-gram에 기반한 방법들은 한계를 가지고 있었고요. 당연히 현재는 딥러닝에 기반한 방법이 주류를 이루고 있습니다.
Encoder-Decoder 구조
기계 번역을 위해서 사용할 수 있는 것이 LSTM 모델입니다. 이 LSTM 모델을 한 개만 쓰는 게 아니라 우리가 지난 시간에 배웠듯이 두 개를 사용합니다.
앞: Encoder
뒤: Decoder
Encoder: 각 단어들을 순서에 맞게 입력받아서, 마지막 단어가 입력으로 들어갔을 때 그때 이 hidden vector를 Decoder에 넘겨줌
Decoder: 이 hidden vector로부터 다시 단어들을 생성해 나가는 과정
이렇게 하면 한국어 입력에서 영어 출력이 가능해집니다.
Context Vector의 병목
그럼에도 불구하고, 가변 길이의 문장을 고정 길이의 특징 벡터로 변환하는 부분이 있기 때문에, 고정 길이에서 또다시 가변 길이로 문장을 생성하는 부분이 있기 때문에, 문장의 길이가 크게 다를 경우에는 성능이 크게 저하될 수 있어요.
다시 말하면:
가변 길이 입력 (10개? 100개? 1000개?)
↓
하나의 Context Vector (고정!)
↓
가변 길이 출력 (10개? 20개?)
→ 굉장한 병목 발생!
단어의 개수가 10개일 수도 있고 100개일 수도 있지만, 얘들을 입력했을 때 결국에는 하나의 context vector 하나로 매핑이 돼버리는 거죠. 1000개의 단어가 한 개의 vector로 매핑이 되는 겁니다. 그렇게 매핑된 1개의 벡터로부터 또 10개인지 20개인지 모르는 단어들이 생성되는 거기 때문에 여기서 굉장한 병목이 발생한다는 것을 우리는 쉽게 알 수 있는 거죠.
Attention으로 해결
그래서 이 문제를 해결하기 위해서 모든 순간의 상태변수를 사용하는 방식으로 발전했습니다.
기존: 마지막 hidden vector만 전달
Attention: H₁부터 Hₜ까지 다 전달!
다시 말하면 인코더의 계산 결과 H₁부터 Hₜ까지를 다 넘겨줘서, 이 디코더에 각각의 단어들이 입력으로 들어왔을 때 인코더에서 입력된 모든 단어들을 다 참조할 수 있도록 하는 방식이 만들어진 거죠.
그게 우리가 지난 시간에 배웠던 Dot Product Attention과 같은 개념인 거죠.
이런 식으로 양방향 구조를 채택하면 어순이 다른 문제도 어느 정도 해결할 수 있습니다.
영상 주석 생성
다음 응용으로는 영상 주석 생성입니다. 영상 주석 생성이라는 건 영상을 입력으로 넣으면 이 영상에 대한 적절한, 쉽게 말하면 해시태그를 만들어내는 겁니다.
입력: 이미지
출력: "A group of young girls standing next to
each other on the beach"
지금은 ChatGPT에 영상 집어넣으면 굉장히 잘 설명해주지만, 그 당시만 해도 이건 굉장히 challenging한 일이었어요.
왜 어려웠나?
특별히 왜 challenging했냐 하면, 영상 해석을 하는 영상 도메인에 대한 연구가 따로 있었고, 텍스트에 대한 연구가 따로 있었는데, 이거는 영상을 집어넣어서 텍스트를 만들어내는, 또는 텍스트를 집어넣어서 영상을 만들어내는 것은 멀티모달 관점에서 굉장히 사람들이 어렵다고 생각했던 거죠.
그런데 지금은 그게 굉장히 잘 되고 있고, 그 기반은 Transformer가 되겠습니다. 어쨌든 이 Transformer의 초창기 모델로서 CNN과 LSTM을 같이 써서 영상에 대한 주석을 다는 응용이 있었습니다.
이게 왜 어렵냐 하면:
1. 영상 속 물체 검출
2. 물체의 속성 파악
3. 물체의 행위 인식
4. 물체 간 상호작용 이해
예를 들어 "두 사람이 같이 축구를 하고 있다" - 이런 것들은 두 사람, 그리고 그 사이에 놓인 공, 이런 것들의 상호작용을 보고 맞춰야 되는 일이기 때문에 굉장히 도전적인 일이라고 볼 수 있습니다.
전통적 방법 vs 딥러닝
예전에는:
물체 분할 모델 (따로)
↓
인식 모델 (따로)
↓
단어 생성 (따로)
↓
조립 단계 (따로)
→ 하이 레벨에서 합쳐서 구현
현재는 딥러닝을 이용해서 그냥 End-to-End로:
X(이미지) → [신경망] → 단어
X만 집어넣으면 단어가 바로 튀어나오도록 하는 방식으로 학습하고 있습니다.
CNN + LSTM 구조
초창기 모델은:
입력 영상 → CNN → Feature 추출
↓
LSTM → 단어 생성
CNN을 사용해서 입력 영상으로부터 중요한 Feature를 뽑아내고, 이 뽑아낸 Feature를 LSTM에 집어넣어서 단어들을, 거기에 맞는 해시태그들을 생성해내는 방식으로 진행됐습니다.
CNN: 영상을 분석하는 기능
LSTM: 분석된 영상 정보를 이용해서 문장을 생성하는 기능
이런 이미지를 집어넣으면 "a group of young girls standing next to each other on the beach"라는 문장을 생성해낼 수 있었던 거죠.
학습 데이터
훈련 집합의 경우:
X: 영상
Y: 그 영상을 기술하는 문장 (<시작>, <끝> 토큰으로 감쌈)
영상 + <시작> → z₁, z₂, ..., zₜ, <끝>
영상을 집어넣고 LSTM의 시작을 집어넣으면 알아서 z₁, z₂, zₜ라는 단어들이 만들어지고, 마지막으로 끝 특수문자가 출력되면 종료되는 방식이었습니다.
상세 구조
CNN은 LSTM의 hidden vector로 들어가는 Z를 만들어내고, 그다음에 이 LSTM에서는 원핫 벡터를 임베딩해서 임베딩된 벡터를 입력으로 넣어서 이 둘을 조합해서 단어를 만들어내는 형식이었습니다.
여기서:
CNN 파라미터
+ 임베딩 매트릭스 파라미터
+ LSTM 파라미터
→ 동시에 End-to-End로 학습!
목적 함수는 Cross Entropy를 사용했고요. 예측된 단어와 실제 단어 간의 차이를 줄이는 방식으로 학습이 진행되었습니다.
멀티모달의 확장
요약을 드리면, 순환 신경망이라는 게 다양한 응용을 가지고 있습니다:
1. N-gram → 문장이 얼마나 자연스러운지
2. 순환 신경망 → 번역
3. 멀티모달 → 이미지를 텍스트로 (또는 그 반대)
지금은 멀티모달이 굉장히 많이 확장됐어요. 텍스트와 이미지뿐만 아니라:
이미지 안에서도:
- 우리가 볼 수 있는 RGB 이미지
- 사람이 볼 수 없는 비가시광선 영역의 이미지들
이런 것들을 또 다른 modality로서 사용할 수 있고, 또는 음성, 신호, 다양한 그런 modality를 다 적극적으로 활용해서 얘들을 다 토큰으로 바꾸는 거예요.
이미지 → 토큰
텍스트 → 토큰
음성 → 토큰
비디오 → 토큰
그래서 이 토큰들을 잘 조합해서 우리가 원하는 태스크를 수행하는 방식으로, 현재는 이 Transformer와 토큰에 기반한 멀티모달 모델들이 많이 연구되고 있습니다.