언어 모델
- 단어 나열에 확률 부여
- 특정한 단어의 시퀀스에 대해서, 그 시퀀스가 일어날 가능성이 어느 정도인지를 확률로 평가
- 기계 번역과 음성 인식에 언어 모델 응용
- 음성 인식 시스템의 경우, 사람의 음성으로부터 몇 개의 문장 후보 생성
- 그런 다음 언어 모델을 사용하여 후보 문장이 '문장으로써 자연스러운지'를 기준으로 순서를 매김
- 또한 언어 모델은 새로운 문장을 생성하는 용도로도 이용
- 단어 순서의 자연스러움을 확률적으로 평가하여 그 확률분포에 따라 다음으로 적합한 단어를 '자아낼' 수 있음
- P(w1,...,wm): w1,...,wm이라는 순서로 출현할 확률(동시확률)
- 동시 확률은 사후 확률의 총곱으로 나타낼 수 있음
- 주목할 점은 이 사후 확률은 타킷 단어보다 왼쪽에 있는 모든 단어를 맥락으로 했을 때의 확률
- 위 결과는 확률의 곱셈정리로부터 유도
- 정리하자면 목표는 P(wt | w1, ..., wt-1) 확률을 얻는 것 (조건부 언어 모델)
- 이 확률을 계산할 수 있다면 언어 모델의 동시 확률 P(w1, ... , wm)을 구할 수 있음
CBOW 모델을 언어모델에 적용
- CBOW에서는 맥락의 크기를 특정 값으로 한정하여 근사적으로 나타낼 수 있음
- 예시에서는 맥락을 왼쪽 2개 단어로 한정(임의로 설정 가능)
- 임의의 길이로 설정할 수 있다고 해도, 결국 특정 길이로 '고정'
- 긴 맥락이 필요한 문제에 제대로 된 답을 도출 못함
- 맥락 크키는 얼마든지 키울 수 있으나 CBOW 모델에서는 맥락 안의 단어 순서 무시(bag-of-words)
- 왼쪽 그림과 같이 CBOW 모델의 은닉층에서는 단어 벡터들이 더해지므로 맥락의 단어 순서 무시
- 그렇다면 오른쪽 그림처럼 맥락의 단어 벡터를 은닉층에서 연결하는 방식 생각할 수 있음
- But, 연결하는 방식을 취하면 맥락의 크기에 비례해 가중치 매개변수도 늘어나게 됨
=> RNN 사용하여 해결 (맥락이 아무리 길더라도 그 맥락의 정보를 기억하는 매커니즘)
RNN
- 순환하는 신경망
- 순환하기 위해서는 '닫힌 경로' 필요
- 순환 경로를 따라 데이터는 끊임없이 순환하기 때문에 과거의 정보를 기억하는 동시에 최신 데이터로 갱신될 수 있음
- 아래 그림처럼 RNN 계층은 순환하는 경로 포함
- t: 시각 (시계열 데이터가 입력됨을 표현)
- xt: 각 단어의 분산 표현(단어 벡터)
- 각 시각의 RNN 계층은 그 계층으로의 입력과 1개 전의 RNN 게층으로부터의 출력을 받음
- 이 두 정보를 바탕으로 현 시각의 출력 계산
- RNN에서는 가중치가 2개 존재
- 하나는 입력 x를 출력 h로 변환하기 위한 가중치 W(x)
- 다른 하나는 1개의 RNN 출력을 다음 시각의 출력으로 변환하기 위한 가중치 W(h)
- 또한 편항 b도 존재, h(t-1)과 x(t)는 행벡터
- 행렬 곱을 계산하고, 그 합을 tanh 함수 이용해 변환
- h(t)는 다른 계층을 향해 위쪽으로 출력되는 동시에, 다음 시각의 RNN 계층을 향해 오른쪽으로도 출력
- 위 식을 보면 현재의 출력(ht)은 한 시각 이전 출력(ht-1)에 기초에 계산
- 다른 관점으로 보면, RNN은 h라는 '상태'를 가지고 있으며, 위 식을 통해 갱신된다고 해석
- '상태를 가지는 계층' or '메모리가 있는 계층'
BPTT
- 순환 구조를 펼친 후의 RNN에는 오차역전파법을 적용할 수 있음
- 여기서의 오차역전파법은 '시간 방향으로 펼친 신경망의 오차역전파법'(=BPTT)
- But, 긴 시계열 데이터를 학습할 때 문제
- 시계열 데이터의 시간 크기가 커지는 것에 비례하여 BPTT가 소비하는 컴퓨팅 자원도 증가
- 큰 시계열 데이터를 취급할 때는 흔히 신경망 연결을 적당한 길이로 끊어 작은 신경망 여러 개로 만듦
- 그리고 이 잘라낸 작은 신경망에서 오차역전파법 수행(=Truncated BPTT)
- 제대로 구현하려면 '역전파'의 연결만 끊고 순전파 연결은 반드시 그대로 유지(기울기 소실 방지)
- 아래 그림에서 RNN 계층을 길이 10개 단위로 학습할 수 있도록 역전파 연걸을 끊음
- RNN에서 Truncated BPTT를 수행할 때는 데이터를 '순서대로' 입력해야 함
Truncated BPTT
- 지금까지의 이야기는 미니배치 수가 1일 때 해당
- 미니배치의 수를 '2'로 하여 학습하기 위해서는 데이터를 주는 시작 위치를 각 미니배치의 시작 위치로 '옮겨줘야' 함
- 첫 번째 미니배치 -> 처음부터 순서대로 데이터 제공
- 두 번째 미니배치 -> 500번째 데이터를 시작 위치로 정하고 순서대로 제공
- Time RNN 계층 : 순환 구조를 펼친 후의 계층들을 하나의 계층으로 간주
RNNLM
- RNN을 사용한 언어 모델 (RNN Language Model)
- 첫 번째 층은 Embedding 계층(단어 ID를 단어의 분산 표현으로 변환)
- 분산 표현이 RNN 계층에 입력
- 그리고 RNN 계층이 위로 출력한 은닉 상태는 Affine 계층을 거쳐 Softmax 계층으로 전해짐
- "say" 입력 시 Softmax 계층 출력은 "goodbye"와 "hello", 두 곳에서 높게 나옴
- 여기서 주목할 것은 RNN 계층은 "you say"라는 맥락을 '기억'하고 있다는 사실
- 더 정확하게 말하면 RNN 계층은 "you say"라는 과거의 정보를 응집된 은닉 상태 벡터로 저장
Time Softmax with Loss (Cross Entropy Error)
- x0이나 x1등의 데이터는 아래층에서부터 전해지는 '점수'
- 또한, t0 나 t1등의 데이터는 정답 레이블
- T개의 Softmax with Loss 계층이 각각 손실을 산출을 해 합산한 뒤 평균한 값이 최종 손실
언어 모델의 평가
- 언어 모델의 예측 성능을 평가하는 척도로 퍼플렉서티(perplexity) 자주 이용(값이 작을수록 좋은 성능)
- 퍼플렉서티는 간단히 말하면 '확률의 역수'
- ex) 모델 1에 "you" 단어를 입력하여 정답인 "say"의 확률을 0.8로 예측 -> 퍼플렉서티 = 1/0.8=1.25
- ex) 모델 2는 정답인 "say"의 확률이 0.2라고 예측 -> 퍼플렉서티 1/0.2=5.0
- 1.25 나 5.0은 '분기 수'로 해석할 수 있음
- 분기 수란 다음에 취할 수 있는 선택사항의 수
- 즉, 좋은 모델이 예측한 '분기 수'가 1.25라는 것은 다음에 출현할 수 있는 단어의 후보를 1개 정도로 좁혔다는 뜻
- 반면 나쁜 모델에서는 후보가 아직 5개나 된다는 의미
입력 데이터가 여러 개일 경우
- N : 데이터의 총개수
- tn : 원핫 벡터로 나타낸 정답 레이블
- tnk : n개째 데이터의 k번째 값
- ynk : 확률분포
- L : 신경망의 손실
- eL : 퍼플렉서티(perplexity)
RNN의 문제점
- 시계열 데이터의 장기 의존 관계를 학습하기 어려움
- BPTT에서 기울기 소실 혹은 기울기 폭팔이 일어나기 때문
기울기 소실 또는 기울기 폭발 원인
- 시간 방향 기울기에 주목하면 역전파로 전해지는 기울기는 차례로 'tanh' , '+', 'MatMul' 연산 통과
- 점선이 y = tanh(x)의 미분
- 그 값은 1.0 이하이고, x가 0으로부터 멀어질수록 작아짐
- 달리 말하면, 역전파에서는 기울기가 tanh 노드를 지날 때마다 값은 계속 작아진다는 뜻
- ReLU로 바꾸면 기울기 소실을 줄일 수 있음
- tanh 노드 무시 가정
- MatMul 노드에서의 역전파는 dhWh^T라는 행렬 곱으로 기울기를 계산
- 그리고 같은 계산을 시계열 데이터의 시간 크기만큼 반복
- Wh가 '스칼라'인 경우 1보다 크면 지수적으로 증가하고, 1보다 작으면 지수적으로 감소
- Wh가 '행렬'인 경우 '특잇값' 척도를 활용하여 1보다 크면 지수적으로 증가하고, 1보다 작으면 지수적으로 감소할 가능성이 높다고 예측 할 수 있음(반드시 X)
기울기 폭발 대책
기울기 클리핑(gradients clipping)
- g^은 신경망에서 사용되는 모든 매개변수의 기울기를 하나로 모은 것
- 기울기의 L2 노름이 문턱값(threshold)을 초과하면 두 번째 줄의 수식과 같이 기울기를 수정
기울기 소실 대책
- 게이트가 추가된 RNN
LSTM
- c(기억 셀)라는 경로 추가
- 기억 셀의 특징은 데이터를 LSTM 계층 내에서만 주고받는다는 것
- 즉, LSTM 계층 내에서만 완결되고, 다른 계층으로는 출력하지 X
- 반면, LSTM의 은닉상태 h는 RNN 계층과 마찬가지로 다른 계층으로 출력
- ct는 과거로부터 시각 t까지 필요한 모든 정보가 저장돼 있다고 가정
- ct는 3개의 입력(ct-1, ht-1, xt)으로부터 '어떤 계산'을 수행
- 핵심은 갱신된 ct를 사용해 은닉 상태 ht를 계산
- ht = tanh(ct)
게이트
- 게이트의 열림 상태는 0.0~1.0 사이의 실수로 나타냄 (1.0은 완전 개방)
- 중요한 것은 '게이트를 얼마나 열까'라는 것도 데이터로부터 자동으로 학습한다는 점
output 게이트
- tanh(ct)의 각 원소에 대해 '그것이 다음 시각의 은닉 상태에 얼마나 중요한가'를 조정
- 한편, 이 게이트는 다음 은닉 상태 ht의 출력을 담당하는 게이트(=output 게이트)
- output 게이트의 열림 상태는 입력 xt와 이전 상태 ht-1로부터 구함
- 여기서 사용하는 가중치 매개변수와 편향에는 output의 첫 글자인 o 첨자 추가
- 시그모이드 함수를 거쳐 출력 게이트의 출력 o를 구함
- 마지막으로 o와 tanh(ct)의 원소별 곱을 ht로 출력하는 것(= 아다마르 곱)
* tanh(-1.0~1.0) -> 그 안에 인코딩된 '정보'의 강약(정도)을 표시한다고 해석
* sigmoid(0.0~1.0) -> 데이터를 얼마만큼 통과시킬지를 정하는 비율
forget 게이트
- ct-1의 기억 중에서 불필요한 기억을 잊게 해주는 게이트 추가
- forget 게이트의 출력 f와 이전 기억 셀인 ct-1과의 원소별 곱을 통해 ct를 구함
새로운 기억 셀
- 새로 기억해야 할 정보를 기억 셀에 추가('게이트' X) -> 따라서 tanh 함수 사용
- tanh 노드가 계싼한 결과가 이전 시각의 기억 셀 ct-1에 더해짐
input 게이트
- g에 게이트 하나 추가
- g의 각 원소가 새루 추가되는 정보로써의 가치가 얼마나 큰지를 판단
- i와 g의 원소별 곱 결과를 기억 셀에 추가
LSTM의 기울기 흐름
- '+' 노드는 상류에서 전해지는 기울기를 그대로 흘릴 뿐이라 기울기 변화는 일어나지 X
- 'x' 노드는 '행렬 곱'이 아닌 '원소별 곱'으로 계산되어 곱셈 효과 누적 X -> 기울기 소실 X
- 'x' 노드는 forget 게이트가 제어하여 '잊어서는 안 된다'고 판단한 원소에 대해 그 기울기가 약화되지 않은 채로 과거 방향으로 전해짐 -> 기억 셀의 기울기가 소실 없이 전파되리라 기대
* 아핀 변환을 수행해 한꺼번에 계산하고 slice을 통해 나눠줌
* 역전파에서는 반대로 slice을 통해 기울기를 결합
RNNLM 추가 개선
LSTM 계층 다층화
- LSTM 계층을 2층, 3층 식으로 여러 겹 쌓으면 언어 모델의 정확도 향상 기대
- 첫 번째 LSTM 계층의 은닉 상태가 두 번째 LSTM 계층에 입력
- 층 수 결정은 하이퍼파라미터에 관한 문제 -> 처리할 문제 복잡도나 준비된 학습 데이터의 양에 따라 결정
- 참고로, PTB 데이터셋의 언어 모델에서는 LSTM의 층 수는 2~4 정도일 때 좋은 결과
드롭아웃에 의한 과적합 억제
- LSTM 계층의 시계열 방향으로 삽입(좋은 방법 X)
- 시간의 흐름에 따라 정보가 사라질 수 있음
- 즉, 흐르는 시간에 비례해 드롭아웃에 의한 노이즈가 축적
- 깊이 방향(상하 방향)으로 삽입
- 시간 방향(좌우 방향)으로 아무리 진행해도 정보를 잃지 않음
- 최근 연구에서는 RNN의 시간 방향 정규화를 목표로 하는 방법이 다양하게 제안
- 예컨대 변형 드롭아웃
- 깊이 방향은 물론 시간 방향에도 이용할 수 있어서 언어 모델의 정확도를 한층 더 향상
- 같은 계층에 속한 드롭아웃들은 같은 마스크를 공유(통과/차단을 결정하는 이진형태의 무작위 패턴)
- 이에 따라 정보를 잃게 되는 방법도 '고정'되므로, 일반적인 드롭아웃 때와 달리 정보가 지수적으로 손실되는 사태 X
가중치 공유
- Embedding 계층의 가중치와 Affine 계층의 가중치를 연결하는 기법
- 두 계층의 가중치를 공유함으로써 학습하는 매개변수 수가 크게 줄어드는 동시에 정확도도 향상
'Study > DL' 카테고리의 다른 글
[밑시딥2] Chapter 8. 어텐션 (0) | 2024.02.03 |
---|---|
[밑시딥2] Chapter 7. RNN을 사용한 문장 생성 (0) | 2024.02.02 |
[밑시딥2] Chapter 3~4. word2vec & 속도 개선 (0) | 2024.01.24 |
[모두를 위한 딥러닝 시즌2] lab 10-5. Advanced CNN(VGG) (0) | 2024.01.21 |
[밑시딥2] Chapter 2. 자연어와 단어의 분산 표현 (0) | 2024.01.20 |