일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- pytorch
- error
- ai tech
- ubuntu
- kde
- 네이버 부스트캠프
- RNN
- GRU
- kernel density estimation
- 크롬 원격 데스크톱
- tril
- nn.Sequential
- forward
- Chrome Remote Desktop
- LSTM
- band_part
- Til
- triu
- Linux
- tensorflow
- Today
- Total
무슨 생각을 해 그냥 하는거지
[학습정리] 2021-09-09 본문
※ 정보전달이 목적인 포스트가 아니라 개인 학습 기록 및 정리가 목적인 포스트입니다 ※
해당 포스트는 네이버 커넥트 재단의 부스트캠프 마스터님이신 주재걸 교수님의 강의를 바탕으로 작성되었습니다.
1. 강의 복습 내용
[Beam Search]
자연어 생성 모델(e.g. Seq2Seq)의 test time에서 더 좋은 품질의 생성 결과를 얻을 수 있는 기법이 바로 beam search다. 왜 beam search가 나오게 되었는지, 극과 극인 greedy decoding과 exhaustive search에 대해 살펴보며 알아보자!
Greedy decoding
- 이전 포스트에서 다뤘던 기본적인 decoding 방법
- 전체적인 문장의 확률값을 보는 게 아니라, 근시안적으로 현재 timestep에서 가장 좋아보이는 단어를 그때 그때 선택하는 방식.
- 한 번 잘못된 결과가 나오면 되돌릴 수 없다... → 치명적인 단점
Exhaustive search
- 모든 가능한 출력 sequence를 생각해보는 방법. (그래서 exhaustive)
- P(y|x)는 입력 문장 x가 들어왔을 때 출력 문장 y가 나올 확률이다. 문장 y는 단어 y_1, y_2, ... y_T가 동시에 나오는 사건으로 해석할 수 있다.
- 매 time마다 전체 단어 수 V를 고려해야 하기 때문에 O(V^t)라는 어마어마한 복잡도를 갖는다.
Beam search
- 위의 greedy decoding과 exhaustive search의 중간이라고 생각할 수 있다.
- greedy decoding은 하나의 단어만 선택하여 출력 문장을 만들고, exhaustive search는 모든 단어(V)를 고려하여 출력 문장을 만드는데, beam search는 beam size k개의 경우를 고려하여 출력 문장을 만든다. (k는 보통 5~10)
- 각 가설들은 아래와 같은 score를 가지고, 이를 비교하여 선택된다.
- P_LM은 확률값이기 때문에 0에서 1 사이의 값을 갖게 되고, 0에서 1 사이 값에 log를 취하면 모두 음수값을 갖는다.
- 하지만 log 함수는 단조증가함수이기 때문에 음수값 중에서도 큰 상위 k개의 score를 갖는 경우만 고려하면 된다.
- 역시 모든 경우를 고려하는 것이 아니기 때문에 최적의 해라고 보장할 수는 없다.
- 하지만 exhaustive search보다는 훨씬 효율적이고, greedy decoding보다는 좋은 결과를 얻을 가능성이 높다!
score가 높은 두 경우를 선택하여 decoding 하는 것을 확인할 수 있다.
Stopping criterion
- greedy decoding의 경우, end token을 만들어내면 문장의 끝이라 여기고 종료했다.
- beam search는 다른 timestep에서 end token이 생성될 가능성이 높다. (경우에 따라 어떤 문장은 7개의 단어로, 어떤 문장은 10개의 단어로 출력될 것이다)
- 그래서 각 가설에 대해 end token을 생성하면, 해당 가설은 완성(문장이 끝난 것)된 것으로 정의하고,
- 완성된 가설은 임시 메모리 공간에 넣어둔 뒤 이어서 다른 가설들을 탐색한다.
- 그렇다고 문장이 무한대로 길어지게 둘 수 없으니 stop 하는 기준을 정하는데, 사전에 정한 일정 timestep이 되면 종료하거나 사전에 정한 n개의 가설들이 완성되면 종료하는 방식을 사용한다.
그렇다면, n개의 가설들 중에서는 어떻게 최종 아웃풋을 결정할까?
당연히 score가 높은 문장을 선택하면 되는데, 문제는 위에서 다뤘던 score 계산 방식은 문장이 길면 score가 낮을 수 밖에 없다는 단점이 있다. (score가 음수라서 계속 더하면 더 score가 낮아짐)
그래서 문장 길이로 normalize 해주는 방식을 사용한다.
[BLEU Score]
문장 생성 평가 metric으로 accuracy는 적합하지 않다.
I love you가 ground truth라고 할 때,
Oh, I love you는 의미상으로는 크게 다르지 않지만 단어의 위치를 고려하는 accuracy는 0이 된다.
이를 해결하기 위해 먼저 precision과 recall을 고려해보자.
Precision (정밀도)
: 출력 문장 중 위치에 상관없이 reference 문장에도 있는 단어의 수를, 전체 출력 문장의 길이로 나눈다.
예측 결과들 중, 가장 괜찮은 결과를 선별하는 metric이라고 생각하면 된다.
Recall (재현율)
: 출력 문장 중 위치에 상관없이 reference 문장에도 있는 단어의 수를, 전체 정답 문장의 길이로 나눈다.
실제 정답과 얼마나 비슷한지, 필요한 정보가 다 있는지 평가하는 metric이다.
F-measure
: precision과 recall의 조화평균. (같은 수들에 대해 산술평균 >= 기하평균 >= 조화평균)
예제로 이해해보자.
reference(정답 문장)이 Half of my heart is in Havana ooh na na
prediction(모델 예측 문장)이 Half as my heart is in Obama ooh na
출력 문장 중 위치에 상관없이 reference 문장에도 있는 단어의 수는 Half, my, heart, is, in, ooh, na 이렇게 7개이다.
예측 문장의 길이가 9이므로, precision은 7/9 = 78%
reference 문장의 길이가 10이므로, recall은 7/10 = 70% 이다.
따라서 F-measure는 73.78%로 계산되고, 이는 precision 값 78과 recall 값 70의 산술 평균 74보다 작은 값에 가중치를 준 것이라 해석할 수 있다.
F-measure의 단점은 정말 순서에 상관없이 reference에 있는 단어 자체만을 신경쓰기 때문에, 문법적으로/맥락적으로 엉망이어도 단어만 존재한다면 높은 점수를 얻는다는 것이다.
위와 같은 예시에서 다른 모델이 Havana na in heart my is half ooh of na 를 출력했다면, 해당 단어들은 모두 reference에 있는 단어들이기 때문에 precision, recall, F-measure 모두 100%라는 납득할 수 없는 결과를 얻게 된다.
BLEU score
그래서 인접한 단어들도 고려해서 평가하는 metric이 만들어졌다.
- BiLingual Evaluation Understudy
- reference 문장과 prediction 문장 사이에 단순 단어 하나만이 아니라 N-gram (연속된 단어들)이 얼마나 겹치는지 비교한다.
- F-measure와 다르게 precision만 이용한다. (reference 문장에서 빠져도 크게 손실 되지 않는 것도 있기 때문에(?))
- 문장이 짧으면 높은 점수를 획득하기 쉽기 때문에 짧은 문장에 대해 패널티를 준다. (brevity penalty)
- 보통 하나의 문장에 대한 BLEU score를 구하기 보다는 전체 corpus의 BLEU score를 구한다.
조화평균은 크기가 작은 값에 지나치게 큰 가중치를 주기 때문에, 조화평균보다 큰 값을 갖는 기하평균을 사용한다.
BLEU score 예제) 예시 문장은 위의 예제와 같음
reference: Half of my heart is in Havana ooh na na
prediction1: Half as my heart is in Obama ooh na
prediction2: Havana na in heart my is Half ooh of na
1-gram인 경우
1-gram | precision | |
reference | Half, of, my, heart, is, in, Havana, ooh, na, na | |
prediction 1 | Half, as, my, heart, is, in, Obama, ooh, na | 7/9 |
prediction 2 | Havana, na, in, heart, my, is, Half, ooh, of, na | 10/10 |
2-gram인 경우
2-gram | precision | |
reference | Half of, of my, my heart, heart is, is in, in Havana, Havana ooh, ooh na, na na | |
prediction1 | Half as, as my, my heart, heart is, is in, in Obama, Obama ooh, ooh na | 4/8 |
prediction2 | Havana na, na in, in heart, heart my, my is, is Half, Half ooh, ooh of, of na | 0/9 |
3-gram인 경우
3-gram | precision | |
reference | Half of my, of my heart, my heart is, heart is in, is in Havana, in Havana ooh, Havana ooh na, ooh na na | |
prediction1 | Half as my, as my heart, my heart is, heart is in, is in Obama, in Obama ooh, Obama ooh na | 2/7 |
prediction2 | Havana na in, na in heart, in heart my, heart my is, my is Half, is Half ooh, Half ooh of, ooh of na | 0/8 |
2. 과제 수행 과정 / 결과물 정리
[Seq2Seq with attention 실습]
Dot-product attention vs Concat attention
dot-product attention은 encoder hidden states(key)와 decoder hidden state(query)를 내적하고 softmax를 통과한 attention score를 encoder output과 곱해 attention value를 계산한다.
concat attention은 key와 query를 concat한 후 1차적으로 linear transformation 한 뒤, softmax를 통해 attention score를 얻고 해당 attention score와 encoder output을 곱해 attention value를 계산한다.
찾아보니까 dot-product attention (Luong attention 중 하나)과 concat attention(Bahdanau attention)의 큰 차이 중 하나는 Query(decoder의 hidden state)의 timestep이 t인지, t-1인지 인 것 같은데 실습 코드에서는 동일한 timestep인 것 같다. (그럼 bahdanau attention이 아니라 Luong attention 중 concat attention이 아닌가..)
두 개의 어텐션 비교 정리를 엄청 잘해주신 블로그 (과연 언제 정독할지..)
3. 피어세션 정리
Q) BLEU score도 loss로 활용할 수 있을까?
남은 P stage를 함께할 팀에 대한 논의를 했다.
4. 학습 회고
- cs224n의 강의자료를 보면서 내적 반가움이 드는 중... 주재걸 교수님께서도 해당 자료를 사용하시는 걸 보면 cs224n이 정말 좋은 강의이긴 한가보다.
- beam search, bleu score에 대해
드디어확실하게 이해하였다. - attention을 사용하는 seq2seq의 흐름을 이해하였다.
'Naver AI Tech 2기 > Today I Learned' 카테고리의 다른 글
[학습정리] 2021-09-13 ~ (0) | 2021.09.23 |
---|---|
[학습정리] 2021-09-10 (0) | 2021.09.12 |
[학습정리] 2021-09-08 (0) | 2021.09.09 |
[학습정리] 2021-09-07 (1) | 2021.09.08 |
[학습정리] 2021-09-06 (4) | 2021.09.07 |