Greedy Decoding, BeamSearch
NLP 생성모델은 기본적으로 seq2seq모델 기반의 encoder-decoder 방식을 차용한다.
2) Decoder
써있는 바와 같이, 정답생성문(번역, 요약, 대화 등)을 찾는 방식을 decoding이라 한다.
한개의 decoder를 사용하여 정답문을 생성했을 때, 가장 큰 문제는 greedy decoding (각 단어별로 가장 확률이 높은 단어만을 선정함)이다. 이는 중간에 오류가 있을 경우 뒤 문장이 모두 잘못 생성될 수 있는 문제가 있다.
각 time별로 단어를 선택하여 문장을 생성하는 search 문제로 봤을 때, 가장 좋은 방법은 각 단어별로 생성되는 문장의 모든 가능성을 살펴보는 것이나 실질적으로 불가능하다.
그래서, Beam search를 이용하여, 가장 확률높은 k개만 선택해서 greedy하게 보고자 한다.
일반적으로 greedy decoding의 경우, <END> token이 나올 때 까지 생성하는 방식이나 beam search decoding의 경우 k개만큼 다른 시간에 멈출 수 있다.
그래서, 완성된 문장은 따로 저장해두고 다시 다른문장들로 search를 이어나가는데,
1) timestep T까지 생성하고 그때까지 생성된 문장을 모아 종료하거나
2) n개의 문장이 완성되면 종료한다.
이렇게 생성된 문장들간의 점수를 비교하여 가장 높은 score의 문장을 선택한다.
(긴 문장일수록 점수가 낮기 때문에, normalize는 필수)
외에 디코딩방식으로 viterbi( dynamic programming algorithm for finding the most likely sequence of hidden states) 등이 있다.
2) Decoder
써있는 바와 같이, 정답생성문(번역, 요약, 대화 등)을 찾는 방식을 decoding이라 한다.
한개의 decoder를 사용하여 정답문을 생성했을 때, 가장 큰 문제는 greedy decoding (각 단어별로 가장 확률이 높은 단어만을 선정함)이다. 이는 중간에 오류가 있을 경우 뒤 문장이 모두 잘못 생성될 수 있는 문제가 있다.
각 time별로 단어를 선택하여 문장을 생성하는 search 문제로 봤을 때, 가장 좋은 방법은 각 단어별로 생성되는 문장의 모든 가능성을 살펴보는 것이나 실질적으로 불가능하다.
그래서, Beam search를 이용하여, 가장 확률높은 k개만 선택해서 greedy하게 보고자 한다.
일반적으로 greedy decoding의 경우, <END> token이 나올 때 까지 생성하는 방식이나 beam search decoding의 경우 k개만큼 다른 시간에 멈출 수 있다.
그래서, 완성된 문장은 따로 저장해두고 다시 다른문장들로 search를 이어나가는데,
1) timestep T까지 생성하고 그때까지 생성된 문장을 모아 종료하거나
2) n개의 문장이 완성되면 종료한다.
이렇게 생성된 문장들간의 점수를 비교하여 가장 높은 score의 문장을 선택한다.
(긴 문장일수록 점수가 낮기 때문에, normalize는 필수)
외에 디코딩방식으로 viterbi( dynamic programming algorithm for finding the most likely sequence of hidden states) 등이 있다.
댓글
댓글 쓰기