GPT2 에서 문장을 생성 시, 마지막에 레이어를 하나 더 붙여 소프트 맥스로 출력
각 단어의 확률값이 나오게 됩니다. 여기에서 어떤 단어를 선택할 지에 대한 방법을 알아보았습니다.
출처 : jalammar.github.io/illustrated-gpt2/
1. Greedy Search
탐욕적 기법으로 말 그대로 가장 높은 확률의 단어 하나만 고릅니다. 매우 간단하지만 선택되지 않은 단어 다음에 더 높은 확률의 단어가 있을 경우 찾을 수가 없습니다.
'The' 뒤에서 가장 높은 확률인 'nice'가 선택 되지만 ('The','dog','has') =0.4*0.9=0.36 으로 ('The','nice','woman')=0.5*0.4=0.2 보다 큰데도 불구하고 선택되지 않는 단점이 생기게 됩니다.
이를 보완하기 위한 방법으로 두번째 방법인 Beam Search가 있습니다.
2. Beam Search
빔을 확률에 따라 여러 가닥으로 분기합니다. 그 중에서 연속적인 단어 확률의 곱이 가장 높은 것을 선택합니다. Greedy Search 의 문제를 보완할 수 있다는 장점이 존재합니다. 다만 무조건 확률이 높다고 해서 좋은 것은 아닙니다. 사람의 경우 모두 똑같이 글을 쓰지 않고 다양한 단어를 사용하며 제각각 글을 다르게 쓰기 때문입니다. Beam Search 는 최고우선탐색 기법을 기본으로 하되 기억해야 하는 노드수를 제한해 효율성을 높인 방식입니다.
**num_beam=2인 경우
3. Sampling
Sampling은 전체 단어의 확률값 만큼 랜덤하게 선택합니다. 따라서 틀에 박혀 있는 글쓰기를 피할 수 있는 방법입니다. 그러나, 랜덤하게 선택해서 문장이 일관성이 없을 수 있습니다. Tempearture라는 기법을 사용하여 좀 더 정교하게 조작도 가능합니다. Temperature가 높으면 자유롭게, 낮으면 고정적으로 글을 작성할 수 있습니다.
(Temperature가 0으로 가까워질 수록, greedy search와 동일하게 되고 이전과 똑같은 문제를 겪게 될 수 있습니다.)
4. Top-K Sampling
Top-K Sampling에서는 K가 현재 단어 다음으로 올 수 있는 단어 개수를 의미합니다. GPT2에서는 이 Sampling기법을 채택하여 성공적으로 문장을 생성할 수 있습니다.
위의 예시는 K가 6일 때 입니다. 'The'다음으로 나올 수 있는 단어 6개를 선택하고 'The', 'car'뒤에 나올 수 있는 단어 6개를 선택합니다. 하지만 개수로 선택하기 때문에 문제가 생길 수 있습니다. 예로 첫번째 그림에서 보면 ("people","big","house","cat")이 선택되지 않았지만 'The'뒤에 충분히 올 수 있는 단어입니다. 두번째 그림에서는 ("down","a")같은 경우 ("The","car")뒤에 어울리지 않는 단어입니다. 이는 계속 동일한 개수를 선택하기에 생기는 문제입니다.
5. Top-p Sampling
이러한 단어 개수를 선택하는 Top-K Sampling문제를 해결할 수 있는 방법으로 Top-p sampling기법이 있습니다. 위의 방법과 다르게 p는 확률로 누적확률이 p가 되는 지점까지 단어를 선택하게 됩니다. 확률로 선택하기에 단어의 개수는 위와는 다르게 매번 달라지게 됩니다.
예를 들어 p를 0.92로 설정한다면, 그림 1에서는 단어를 9개까지 선택할 수 있습니다. 위의 6개와는 다른 결과입니다. ('people','big','house')가 추가적으로 선택 되었습니다. 두번째 그림에서는 ('stops','down','a')가 선택되지 않은 것을 볼 수 있습니다. 이 처럼 Top-p를 하게 된다면 개수가 동적으로 선택되게 되고 가능성이 낮은 단어들이 걸러지는 장점이 있습니다.
Top-p 가 Top-K보다 더 우수해 보이지만 실제로는 두 방법 모두 잘 작동합니다. Top-p와 Top_K는 같이 쓰이기도 합니다. 이렇게 하면 순위가 매우 낮은 단어는 피하면서 동적으로 선택될 수 있게 합니다.
'Data > 자연어 처리' 카테고리의 다른 글
LLM(Large Language Model) 기본 정리 및 활용 방안 | LIM (0) | 2024.03.17 |
---|---|
Keyword Extract using KeyBERT (1) | 2020.12.29 |
TextRank를 이용하여 핵심 문장 추출하기 (1) | 2020.12.28 |
cdQA-annotator 데이터셋 구성 (0) | 2020.12.10 |
Question Generation (0) | 2020.12.10 |
댓글