Web Analytics Made Easy - Statcounter

Bouncing ideas 생각 작업실/exp sharing 경험.실험 나누기

fairseq translation task cross-attention 접근 쉽게하기

sleepy_wug 2024. 4. 10. 16:57

.translate() method에 verbose parameter가 있다는 걸 간과했다. verbose = True 주니까 각 hypothesis 별로 아래와 같은 log가 터미널에 뿌려졌다.

 

2024-04-10 00:27:55 | INFO | fairseq.hub_utils | H	-0.012383962981402874	c i m a lZ cc v ngZ
2024-04-10 00:37:22 | INFO | fairseq.hub_utils | P	-0.0000 -0.0000 -0.0001 -0.0000 -0.0000 -0.1113 -0.0000 -0.0000 -0.0000

 

beam = 5 였으므로 5개 후보형을 고려한다. 그래서 각 2줄, 총 10줄의 log가 떴다. 이 데이터는 이해하기 쉽다. 입력값 (내 경우 c i m a l c v ng) 에 대해서 5개의 후보형을 생성한 후, 그 중 가장 likelihood가 높은 것을 최종 출력하는데, verbose = True 를 주니까 각 후보형의 likelihood score까지 알려주는 것이다.

 

하지만 더 유익했던 것은 로그를 뿌린 위치인 fairseq.hub_utils 였다.

 

debugger로 step in 하여서 hub_utils.py에 들어가보니 GeneratorHubInterface class의 generate method 에 있는 if verbose: 분기로 접근할 수 있었다.

 

맥락을 보니 이 분기는 모든 과정이 다 끝난 후 target_hypotheses object의 각 element를 iterate하면서 score를 뿌려주는 모양이었다. target_hypotheses 는 list object인데, 각 후보형에 대한 주요정보들을 다 가지고 있었다. 

 

 

tokens 는 후보형을 이루는 각 token에 대하여 embedding 정보를 가지고 있고, 다시 문자열로 복원할 수 있다. 위 스크린샷 한 0번째 element의 경우 후보형이 문자열로 c i m a lZ cc v ngZ 이다. token 개수가 9인데, tokens 의 length가 10이다. 마지막 2는 <END>를 위함이다.

score 는 likelihood다. 

그리고 대망의 attention. 이것은 cross-attention weights를 표현하는 것으로 보인다. 좀 더 가까이 보자. c i m a lZ cc v ng Z 중에서 ㄹ뒤 경음화되는 cc 의 경우 attention이 아래와 같다.

        [3.9579e-02, 5.3386e-04, 8.8195e-04, 5.2714e-04, 3.0625e-01, 7.5811e-01,
         1.2528e-02, 7.3432e-03, 1.0443e-02],

6번째 token에 대한 weight가 가장 높고 5번째가 두 번째로 높다. 각각 input에서 c 와 l 에 해당한다. 

 

일단 이 데이터를, 특히 attention을 뽑아내서 저장한 다음 시각화하거나 통계처리할 수 있을 것 같다.

 

cross-attention 만 필요하다면 굳이 돌고 돌 필요 없이 여기서 뽑아낼 수 있을 것 같다.

반응형