데이크루 5기

데이크루 | 서포터즈 | 5기

  • moneyIcon 상금 : 기프티콘, 인증서
  • 114명 마감

 

GPT4가 알려주는 Transformer_5(기초부터 심화까지)_Full_CODE

2023.04.07 14:44 959 조회 language

Multi-Head Attention 추가

코드
로그인이 필요합니다
0 / 1000
he_is_wicked
2023.04.09 17:22

안녕하세요 :) 
Positional Encoding 파트에서 질문이 있습니다. 
(제가 좀 혼동하는 것 같아서 문의드립니다. )

```
        ###  Q: 이미 여기서 for문에서 2i 부분을 구현을 하셨는데 
        for i in range(0, embed_dim, 2):
            #### 아래 for문 안에서의 코드를 보면, pos_enc에 위치정보를 부여하는 부분에서
            #### 10000 ** ((2 * i) / embed_dim)) 이렇게 한 번 더 구현 하신 연유가 있을까요?
            pos_enc[pos, i] = math.sin(pos / (10000 ** ((2 * i) / embed_dim)))
            pos_enc[pos, i + 1] = math.cos(pos / (10000 ** ((2 * (i + 1)) / embed_dim)))
                                                         
```

쥬혁이
2023.04.09 18:06

넵 안녕하세요! 

for 문에서의 2와 밑에서의 2는 다른 역할입니다.

외부 for문의 range(0, embed_dim, 2)에서 2를 사용하는 것은 i를 짝수 인덱스(0, 2, 4, ...)로 설정하고, 각 sin 및 cos 값이 연속되는 임베딩 차원에 저장되도록 하는 것입니다. 이렇게 설정하면, i가 짝수일 때에는 sin 값을 저장하고, i+1이 홀수일 때에는 cos 값을 저장합니다.

그런데, 공식에서 사용되는 (10000 ** ((2 * i) / embed_dim))는 다른 목적을 가집니다. 이 부분은 위치 인코딩 함수들(sin, cos)의 주기를 조절하는 역할을 합니다. i 값이 증가함에 따라 주기가 길어지도록 하여, 긴 문장에서도 위치 정보를 효과적으로 표현할 수 있도록 해줍니다.

따라서 외부 for문에서 사용되는 2*i와 공식 내부의 2*i는 각각 다른 목적을 가지고 있습니다. 하나는 짝수 인덱스를 설정하는 데 사용되고, 다른 하나는 주기를 조절하는 데 사용됩니다. 

이 둘을 혼동하지 않으셔야 합니다.


결론적으로 밑의 숫자 2의 자리에는 사실상 1, 2, 3 등 다양한 숫자를 사용할 수 있지만, 각각의 선택에 따라 인코딩 벡터의 주기 변화에 영향을 미칩니다. 숫자를 변경하면 주기의 증가 패턴이 달라지며, 이에 따라 모델이 위치 정보를 인식하는 방식에도 영향을 미칩니다.

예를 들어, 숫자를 1로 설정하면 주기가 선형적으로 증가하게 되고, 숫자를 3으로 설정하면 주기가 더욱 빠르게 지수적으로 증가하게 됩니다. 


이러한 변경으로 인해 모델의 성능에 영향을 미칠 수 있습니다!

쥬혁이
2023.04.09 18:08

짧게 요약드리자면

외부 for문의 2*i는 짝수 인덱스를 설정하고, 각 sin 및 cos 값을 연속되는 임베딩 차원에 저장합니다.

for문 내부의 (10000 ** ((2 * i) / embed_dim)) 부분은 위치 인코딩 함수들의 주기를 조절합니다. 주기 조절을 통해 긴 문장에서도 위치 정보를 효과적으로 표현할 수 있도록 해줍니다.

공식 내부의 숫자 2는 다양한 숫자를 사용할 수 있고, 변경 시 모델 성능에 영향을 줄 수 있습니다!

틀린 부분이 존재할 수 있으니 , 읽으시다 이해 안되는 부분 질문 주시면 감사하겠습니다!

he_is_wicked
2023.04.09 18:15

 앗 그런가요?
 제가 확인하고 공부해왔던 Reference에 따르자면 i는 같은 i로 알고 있습니다. 

- "Attention is all you need" (https://arxiv.org/pdf/1706.03762.pdf)
- [Weights and Biases] 트랜스포머(Transformer) 심층 분석 (https://wandb.ai/wandb_fc/korean/reports/-Transformer---Vmlldzo0MDIyNDc)
- [Github repo] hyunwoongko/transformer (https://github.com/hyunwoongko/transformer)

제가 잘못 알고 있었던 것일까요?

쥬혁이
2023.04.09 18:16

원래 논문에서 제안된 숫자 2는 지수적인 주기 변화를 제공하면서도, 위치 정보를 효과적으로 인코딩할 수 있는 균형을 찾기 위해 선택된 값으로, 다른 숫자를 사용해도 된다고 알고 있습니다! 아니면 제가 지금 질문 포인트를 놓치고 있는 걸까요?ㅠ

he_is_wicked
2023.04.09 18:50

그런가요? ㅠ

 말씀하신 "원래 논문에서 제안된 숫자 2는 지수적인 주기 변화를 제공하면서도, 위치 정보를 효과적으로 인코딩할 수 있는 균형을 찾기 위해 선택된 값으로, 다른 숫자를 사용해도 된다고 알고 있습니다! " 내용은 제가 처음 접하는 내용입니다. 

 > "Attention is all you need"에서 말씀하신 부분을 제가 못 찾아서 여쭤봅니다. 말씀하신 부분이 어디있는 지 알려주실 수 있을까요?
 > 다른 레퍼런스나 논문 리뷰에서도 제가 못 본 내용 같아서요. 제가 잘못 알고 있는 게 있다면 바로 알고 싶습니다.

제가 아는 바에 의하면, 
 > `... (10000 ** ((2 * i) / embed_dim ...`에서의 i는 emb_dim의 차원(2i면 짝수번째 차원)을 의미합니다. "Attenion is all you need" 논문 6p에서 "... where pos is the position and i is the dimension. ..." 이라고 명시가 되어있구요.

쥬혁이
2023.04.09 19:57

"다른 숫자를 사용해도 된다고 알고 있습니다!"  이 부분은 제가 코드를 이해하고 임의로 바꾸면 모델의 성능이 더 좋아질수도, 나빠질수도 있겠구나 라고 이해해서 이렇게 말씀 드렸습니다. 

숫자 2는 논문에서 제안된 값이지만, 꼭 고정된 값으로 사용할 필요는 없지 않을까요?

이 값은 sin과 cos 함수의 주기 조절 방식에 영향을 주기 때문에, 다른 값을 사용해 위치 정보 인코딩에 영향을 줘서 모델의 성능을 바꿀 수 있다고 생각합니다. 
논문에서 제안된 값이 실제 문제에 대한 해결책으로 잘 작동할 수 있지만, 다른 값으로 실험해보고 성능 변화를 확인해보는 것도 괜찮지 않을까요?

제가 물론 틀릴수도 있습니다!

he_is_wicked
2023.04.09 20:02

아아 
임의로 바꾼 값이군요! 물론 성능이 나아질 수 있다면, 바꾸어보는 것도 매우 좋은 시도라고 생각합니다 : )   
논문이나 다른 레퍼런스에 말씀하신 대로 나와있는 줄 알고 제가 잘못 알고 있었나 했습니다!

쥬혁이
2023.04.09 20:16

앞으로도 많은 질문 부탁드려요 ㅎㅎ