.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 만 필요하다면 굳이 돌고 돌 필요 없이 여기서 뽑아낼 수 있을 것 같다.
'Bouncing ideas 생각 작업실 > exp sharing 경험.실험 나누기' 카테고리의 다른 글
음성 데이터만 있어도 분석해버리기 (0) | 2024.05.14 |
---|---|
신경망 이용한 음운론 연구 workflow (feat. Fairseq) (0) | 2024.05.01 |
Never assume anything (0) | 2024.04.02 |
Python으로 textgrid 생성했는데 왜 먹지를 못하니 (0) | 2024.03.22 |
Fairseq transformer model에서 attention 뽑아내기 (2) | 2024.03.08 |