[NLP] Beam search

hyunsooo·2022년 10월 13일
1
post-thumbnail

자연어 생성 모델에서 테스트 시점에 보다 좋은 품질을 얻을 수 있게 해주는 알고리즘인 Beam search를 알아보자.

Greedy decoding

앞서 배운 seq2seq와 같은 모델에서 단어를 생성할때 현재 time step에서 가장 확률이 높은것을 채택하는 방법을 Greedy decoding이라고 한다.

"Greedy decoding has no way to undo decisions"이 문장처럼 결정을 되돌릴 방법이 없다는게 큰 단점이다. 단어를 앞부분에서 잘못 생성되면 그 후부터는 계속 잘못된 문장이 생성될 수 있다.

joint probability

P(yx)=P(y1x)P(y2y1,x)...P(yTy1,...,yT1)=Π1TP(yty1,..,yt1,x)\begin{aligned} P(y|x) &= P(y_1|x)P(y_2|y_1,x)...P(y_T|y_1,...,y_{T-1}) \\ &= \Pi_1^TP(y_t|y_1,..,y_{t-1}, x) \end{aligned}

매순간 마다 가능한 모든 경우의 수를 찾아보는 방법도 존재하는데 이 경우 Vt(V=사전사이즈)V^t \,\,(V=사전사이즈)라는 굉장히 많은 탐색을 요구하게 된다.

따라서 우리는 Greedy(한가지만 고려)와 Exhaustive(전체를 고려)의 중간쯤에 있는 접근법을 생각하게 되는데 그게 Beam search이다.

이 알고리즘의 핵심 아이디어는 decoder의 매 time step마다 우리가 정하는 파라미터(beam size) kk개를 고려하고 최종적으로 kk개 중 가장 확률이 높은 선택을 하게 된다.

score(y1,...,yt)=logPLM(y1,..,ytx)=i=1tlogPLM(yiy1,...yi1,x)\begin{aligned} score(y_1,...,y_t) &= logP_{LM}(y1,..,y_t|x) \\ &= \sum_{i=1}^{t} logP_{LM}(y_i|y_1,...y_{i-1},x) \end{aligned}

일반적으로 kk는 5에서 10사이의 값을 사용한다.

확률값을 곱하는 형태로도 수식을 전개할 수 있지만 loglog의 성질을 사용하여 확률 값을 더하게끔 유도한다. loglog는 단조 증가함수이기 때문에 loglog를 취한값도 그 상태로 유지되기 때문에 가능하다.

Greedy decoding의 경우 <end>토큰이 나오는 시점에서 생성이 중단되지만 beam search의 경우 각 hypotheses(k개의 생성문장)마다 다른 시점에 <end>토큰이 생성된다.

  • 한 hypothesis에서 <end>가 발생했다면 끝났다고 가정하여 따로 저장을 한다.

  • 나머지 hypoheses도 <end>가 발생할때까지 beam search를 수행하는 과정을 반복한다.

  • beam search의 최종 종료는 우리가 정해둔 임의의 time step TT에 도달하면 멈추거나 따로 저장해둔 가설들의 개수가 nn개에 도달하면 종료하는 방법을 사용한다.

완성된 가설들의 리스트들 중 가장 높은 score를 가지는 하나의 후보를 뽑아야 한다. 이 후보를 선택하는 기준은 loglog확률 값을 사용하게 되는데 sequence의 길이가 긴 가설일수록 더 많은 음의 값이 더해지기 때문에 loglog확률은 낮은 값을 가질것이다.

따라서 공평한 비교를 위해 Normalize by length를 부여하게 된다.

score(y1,...,yt)=1ti=1tlogPLM(yiy1,...yi1,x)score(y_1,...,y_t) = \frac{1}{t} \sum_{i=1}^{t} logP_{LM}(y_i|y_1,...y_{i-1},x)
profile
지식 공유

0개의 댓글