-
Beam Search머신러닝 및 딥러닝 2020. 12. 22. 23:31
NLP(자연어처리)에서 많이 사용되는 Beam Search에 대해서 알아보고자 한다.
나는 이번 논문 주제인 챗봇에 대한 모델을 만들때 해당 알고리즘을 사용했다. 마침 이번학기 때 (3-2학기) 알고리즘 수업을 들었는데 Greedy search 그리고 DFS 와 비슷한 느낌을 받았다.
Beam Search 어떻게 생겼고 어떠한 이유때문에 NLP에서 사용되는지 알아보자
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersdef naive_beam_search_decoder(predictions, k): sequences = [[list(), 1.0]] for row in predictions: all_candidates = list() for i in range(len(sequences)): seq, score = sequences[i] for j in range(len(row)): new_seq = seq + [j] new_score = score * -log(row[j]) candidate = [new_seq, new_score] all_candidates.append(candidate) ordered = sorted(all_candidates, key=lambda tup: tup[1]) sequences = ordered[:k] return sequences This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersimport beam_search import random seq_len = 4 V = 10 predictions = [[random.random() for _ in range(V)] for _ in range(seq_len)] def main(): beam_search.naive_beam_search_decoder(predictions , 5) if __name__ == "__main__" : main() main.py 로 인하여 prediction은 2차원 리스트가 만들어 진다. 즉, 형태가 [[10개의 랜덤숫자], [10개의 랜덤숫자], [10개의 랜덤숫자], [10개의 랜덤숫자]] 으로 만들어진다.
여기서 beam_search를 호출한다. beam_size(여기서는 k에 해당한다)는 5로 놓았다.
차근차근히 봐보자. 원래 남의 코드 보는게 진짜 인내의 과정이다. 나도 천천히 설명해 보겠다.
beam_search.py 에서는 방금 만든 prediction과 beam_size인 5를 인풋으로 받는다. 그 후 prediction의 하나인 row 즉, [10개의 랜덤숫자]를 for문에
하고 있던 도중 수학 재시험을 본다고 한다. 다 하고 돌아오겠다. 그럼 안녕
왜 그럼 log를 이용할까?
'머신러닝 및 딥러닝' 카테고리의 다른 글
nn.Module에서 super (1) 2021.01.10 np.zeros 와 np.zeros_like 의 차이 (0) 2021.01.06 NLP 에서의 embedding size (0) 2021.01.01 numpy의 rand와 randn의 차이 (0) 2020.08.09 시계열 데이터란? (0) 2020.08.08