일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- sparse coding
- 논문리뷰
- Computer Vision
- 데이터 증강
- kt희망나눔재단
- Attention
- tcga
- Data Augmentation
- cnn
- 데이터 분석
- 데이터 시각화
- Tableau
- VGG16
- 개 vs 고양이
- Deep Learning
- 파이썬 구현
- 머신러닝
- kt디지털인재
- 논문 리뷰
- k-fold cross validation
- data analysis
- super resolution
- SRCNN
- 장학프로그램
- 딥러닝
- ResNet
- LLM
- 태블로 실습
- 데이터과학
- 태블로
- Today
- Total
기억의 기록(나의 기기)
[Transformer] Attention Is All You Need (기초부터 코드 구현까지) 본문
Attention Is All You Need
안녕하세요, 데이터 과학 전공하고 있는 황경하입니다.
오늘은 Transformer 모델의 기초가 되는 Attention과 Self-Attention에 대한 내용을 공부하고, Transformer 모델의 아키텍처를 분석해보려 합니다. Transformer는 LLM 뿐 아니라 Vision 영역에서도 매우 좋은 성능을 보이고 있기에 이젠 영역 상관없이 관심을 가지고 연구해봐야 할 모델이라고 생각합니다.
* 리뷰할 논문: https://proceedings.neurips.cc/paper/2017/hash/3f5ee243547dee91fbd053c1c4a845aa-Abstract.html
Attention is All you Need
Requests for name changes in the electronic proceedings will be accepted with no questions asked. However name changes may cause bibliographic tracking issues. Authors are asked to consider this carefully and discuss it with their co-authors prior to reque
proceedings.neurips.cc
* 해당 글에 첨부된 사진들은 모두 위 논문에서 발췌한 것임을 미리 밝힙니다.
* 해당 글에 설명은 논문을 기반으로 한 주관적 해석이므로 틀린 부분이 있다면, 댓글로 지적 부탁드립니다!
* 참고 자료: https://youtu.be/6s69XY025MU?si=PlHcWkZyoHkDBAx6
* 코드: https://github.com/kyeongha-git/Study/tree/main/Transformer
Study/Transformer at main · kyeongha-git/Study
Paper Review and Implementation. Contribute to kyeongha-git/Study development by creating an account on GitHub.
github.com
# Abstract
기존의 번역 모델 (시퀀스 변환 모델)은 인코더와 디코더를 포함한 RNN 구조 혹은 컨볼루션 신경망에 기반합니다. 그러나, 본 논문에서는 RNN 같은 순환 혹은 컨볼루션 레이어를 완전히 배제하고 Attention 만을 이용한 네트워크 구조인 Transformer를 제안합니다. Transformer의 경우, 영어-독일어 번역 작업에서 기존 SOTA 모델보다 2 BLEU 이상 향상시킨 28.4 BLEU를 기록하였으며, 영어-프랑스 번역 작업에서는 기존 SOTA 모델보다 훨씬 더 적은 학습 비용을 소모하여 41.8 BLEU로 SOTA 성능을 달성하였습니다.
* BLEU 평가지표에 대한 설명은 위 블로그에 나와있습니다. 참고해주세요.
"Transformer 모델은 Attention 메커니즘만을 활용하여 아키텍처를 구성하였고, 번역 작업에서 기존 SOTA 모델보다 수행 시간은 줄이고, 성능은 높였다."
# Introduction
기계 번역 분야에서 RNN, LSTM, GRU는 매우 좋은 성능을 보였고, 이후 인코더-디코더 아키텍처를 발전시켜왔습니다. 그러나, 이런 순환 모델의 경우에는 이전 정보의 출력이 다음 층의 입력으로 들어가기 때문에 병렬화(동시에 처리)가 불가능합니다. 또한, 시퀀스의 길이가 길어질 수록 메모리를 크게 차지하여 배치 사이즈를 늘리기도 어려워집니다. 이에, factorization (나누어서 넣기), 조건부 계산 (특정 조건에서만 실행하기)을 넣어 계산 효율성을 크게 높였습니다. 그럼에도 불구하고, 근본적인 한계인 "병렬화가 어렵다"는 여전히 존재합니다.
Attention 메커니즘은 입력 또는 출력 시퀀스의 거리에 관계없이 모델링할 수 있게 합니다. 즉, 시퀀스 간의 위치에 영향을 받지 않고 계산 가능하기 때문에 순차적 계산의 근본적인 문제를 극복할 수 있어 병렬화를 가능케합니다. 하지만, 몇 가지 예외를 제외하고 Attention 매커니즘은 순환신경망과 함께 사용되고 있습니다.
따라서, 본 논문에서는 순환신경망과 함께 사용하지 않고 Attention 메커니즘에 완전히 의존하는 모델 Transformer를 제안합니다. 이는 순환 과정이 없기 때문에 훨씬 더 많은 병렬화를 가능하게 하며, 이는 수행 속도 향상에 직접적인 영향을 줍니다.
"순환 신경망은 순차적으로 계산한다는 점에서 병렬화가 불가능하다는 한계가 존재하였고, Attention은 시퀀스 간 거리에 관계없이 모델링할 수 있기에 이 순차적이라는 조건에서 오는 한계를 극복할 수 있다."
# Background
순차적 계산을 극복하기 위해 다양한 모델들이 제안되었지만, 이는 모두 컨볼루션 신경망을 기반으로 하여 병렬화를 성공하였습니다. 하지만, 컨볼루션을 기반으로 함에 따라 임의의 두 입력 또는 출력 위치의 신호를 연결하는 데 필요한 연산 수는 위치 간 거리에 따라 증가하며 많게는 로그적으로 증가합니다. 따라서, 수행 시간은 크게 증가하고, 신경망이 깊어지거나 혹은 시퀀스의 길이가 길어지면 장거리 위치 종속성을 학습하기가 어려워집니다. Transformer는 이 연산수를 상수 수준으로 줄였지만, 해상도 감소 문제가 발생하여 Multi-Head Attention을 도입하였습니다.
* 여기서 해상도는 각 단어의 고유성을 뜻합니다. 즉, Transformer의 Self-Attention 과정에서 각 단어의 가중 평균을 구하다보면, 각 단어의 고유성이 사라진다는 것입니다.
Self-Attention 혹은 Intra-Attention이라고 하는 것은 시퀀스의 표현을 계산하기 위해 단일 시퀀스의 서로 다른 위치를 연결하는 어텐션 메커니즘입니다. 이는 독해, 요약 등 다양한 작업에서 좋은 성능을 보입니다.
End-to-End Memory Network는 RNN 대신 반복 어텐션 매커니즘을 기반으로합니다. 그러나, 이 역시도 RNN 기반이기 때문에 순차적 한계가 존재합니다. 이에 Transformer는 Self-Attnetion만을 활용합니다. 이는 Q&A 및 언어 모델링 작업에서 좋은 성능을 보입니다.
"Transformer는 이러한 순환 혹은 컨볼루션을 사용하지 않아 수행 시간을 상수 수준으로 줄이며, 장거리 의존성을 줄인 Self-Attention에만 의존하는 최초의 변환 모델입니다."
# Model Architecture
좋은 성능을 보이는 모델은 대부분 인코더-디코더 구조를 따릅니다. 인코더는 입력 시퀀스 x가 들어오게 되면, 이를 연속적인 표현의 시퀀스 z로 매핑합니다. 그런 다음 디코더는 z가 입력되면 이를 출력 시퀀스 y로 변환하고 이게 output이 됩니다. Auto Regressive 방식을 추가하게 되면, 이 y가 그다음 입력 시퀀스와 함께 입력됩니다. 그렇게 되면 그 다음 y는 이전 y의 정보를 담고 있는 결과가 되죠. Transformer는 인코더와 디코더 모두에 대해 Self-Attention과 position-wise, fully connected layer 구조를 따릅니다.
여기서, Auto Regressive 방식을 추가하게 되면, 순차적 특성이 입력되는 것이 아닌가하는 의문이 들었는데 이는 학습시에 사용하지 않고 테스트시에 사용하여 추론 속도는 늦어질 수 있지만 병렬화에 문제가 생기진 않습니다. 또한, 순환 신경망의 두 번째 문제인 시퀀스 길이가 길어지거나 신경망이 커지면 앞 단어의 정보가 뒤까지 전해지지 못한다는 점도 Self-Attention을 한 번에 수행하기 때문에 극복할 수 있습니다.
## Encoder and Decoder Stacks
지금부터, 모델의 구조에 대해 간략하게 설명할 것인데 이는 글만 읽는 것보다 그림과 함께 보시는 것이 더 도움이 될 것입니다. 논문에서는 인코더와 디코더를 따로 설명하였지만 이 글에서는 함께 묶어서 보겠습니다.
우선 인코더는 두 개의 서브레이어가 존재합니다. 하나는 Multi-Head Self-Attention이며, 두 번째는 Position-wise Fully Connected Feed-Forward Network입니다. 각 레이어 주위에는 학습 안정성을 높이기 위하여 잔차 연결과 층 정규화가 존재합니다. 따라서, 인코더의 구조를 단순화한다면, 아래와 같이 표현할 수 있습니다.
또한, 잔차 연결을 원활히 하기 위하여 모든 임베딩 dimension은 512로 통일하였습니다. 이런 구조가 N개 존재합니다.
디코더는 인코더와 같은 두 서브레이어에 추가로 Masked Multi-Head Attention이 존재합니다. 이는 Self-Attention 레이어를 수정하여 미래 위치 정보를 참조하지 못하도록 설정합니다. 이는 학습시에 미래 정보를 보고 정답을 유추하는 것을 방지하기 위하여 작동합니다.
예시를 들어 설명해 보겠습니다. 아래와 같은 문장을 번역해 보는 태스크를 수행한다고 해봅시다.
- 예제: 나는 사과가 먹고 싶다.
인코더는 입력 시퀀스(예: '나는 사과가 먹고 싶다.')를 처리하여 문맥 정보를 추출하고, 디코더는 이 정보를 바탕으로 출력 시퀀스(영어 번역)를 생성합니다. 인코더와 디코더는 각각 멀티 헤드 어텐션과 피드 포워드 네트워크를 포함합니다.
디코더의 마스킹된 멀티 헤드 어텐션은 현재 단어('사과가')를 예측할 때 미래 단어('먹고 싶다')를 참조하지 않도록 가중치 값을 0으로 설정합니다. 이는 디코더가 과거 출력('나는'의 번역)만을 기반으로 현재 단어를 번역하도록 하여 자기 회귀적 특성을 유지하고, 미래 정보 유출을 방지하여 올바른 번역을 가능하게 합니다. 즉, 마스킹은 디코더가 순차적으로 단어를 생성하면서도 문맥을 효과적으로 파악하도록 돕는 핵심적인 역할을 합니다.
또한, 멀티 헤드 어텐션은 입력 및 출력 시퀀스 내의 단어 간 관계를 효과적으로 모델링하여 번역 품질을 향상하는 데 기여합니다. 또한, 이전에 언급한 것처럼 해상도 저하 문제를 극복합니다. 본 논문에서는 이렇게 N을 6으로 설정하여 박스 내에 있는 레이어를 6번 반복하여 설정했다고 합니다.
## Self-Attention
Attention을 이해하기 위해서는 기본 지식 세 가지가 필요합니다.
- 정보를 가지고 있는 텐서는 행렬 곱을 하더라도 기존의 정보를 유지하고 있다.
- Weighted Sum은 여러 벡터를 합치려 할 때에 가중치를 주어 중요한 정보의 비중을 더 크게 설정하게 하여 정보를 혼합할 수 있다.
- dot product (내적)는 유사한 값과의 계산값은 최대가 되고, 유사하지 않은 값과의 계산값은 최소가 된다. 즉, 내적 값은 정보의 유사성을 의미한다.
Attention에는 세 가지 개념이 존재합니다. Query, Key, Value.
이를 예시를 통해 쉽게 이해해 보겠습니다. 우리가 인터넷에 "오렌지"라는 것을 검색해 본다고 합시다.
그러면, "오렌지"를 검색창에 입력하겠죠. 즉, "오렌지"라는 "정보를 요청"하게 됩니다. 이를 Query라고 부릅니다. 그러면, 검색했을 때 나오는 여러 개의 블로그, 기사들이 존재할 것이고 이는 "오렌지"라는 정보를 포함하고 있을 것입니다. 이 값들의 집합을 Key라고 부릅니다. 마지막으로, 검색된 많은 글들에 직접 들어가서 나오는 정보를 Value라고 볼 수 있습니다.
이를 Attention과 연결 지어 보면, 검색 메커니즘에서는 Query를 통해 정보를 요청하게 되고 Key와의 유사성을 체크하여 유사도가 가장 높은 순서대로 글들을 보여줍니다. 그러고 나서, 글을 클릭하게 되면 Value가 나오는 것이죠.
이제 수학적으로 다가가봅시다.
먼저 Query 값을 W_q에 통과시키고, Key값도 W_k에 통과시키고, Value는 W_k에 통과된 Key 값을 다시 W_v에 통과시켜 만듭니다. 즉, Value는 완성된 Key 값에 W_v라는 행렬을 곱한 값입니다.
우리는 이 Query를 Key 값에 있는 모든 정보와 내적을 수행합니다. 즉, Query와 Key값들의 유사성을 계산하는 것이죠. 우리는 이 "유사성"이라는 것에 집중할 필요가 있습니다. 내적 값은 음수가 될 수도 있고, 0과 1 사이 값이 아닐 수도 있습니다. 하지만, 우리는 이 유사성을 Weight로 사용하여 Value값과 Weighted Sum을 해줄 것입니다.
그러면, 이 Weight를 0과 1 사이 값으로 만들어야 하는데, 단순히 음수를 양수로 만들어준다면 그 크기가 달라질 것입니다. 예를 들어, 한 단어와 유사성이 매우 떨어져 내적값이 -7이 나왔는데 이를 단순히 양수로 만들어준다면 7이 되어 유사도가 매우 높은 것으로 잘못 계산되겠죠. 따라서, 우리는 양수로 만들되, 기존 값의 크기는 유지해야 하는 것입니다.
이를 위한 값으로 Exp()을 취할 수 있습니다. Exp()을 취하게 되면, 기존에 작았던 값은 그대로 작게 나타나고, 큰 값은 그대로 크게 나타나게 되며 양수로 변환되죠. 그 후에는 0과 1 사이로 바꾸기 위하여 Exp() 취한 값들을 다 더하고 나눠주면 됩니다. 이를 우리는 Softmax 변환이라고 부릅니다.
이렇게 가중치를 구했다면, Value 값과 곱하고 그 값들을 다 더해주면 됩니다.
## Scaled Dot-Product Attention
논문에서는 이 Dot-Product 과정을 Scaled Dot-Product로 변환하여 사용합니다. 차이점은 말 그대로, Scaling을 시켜주는 과정만 차이가 있습니다. 각 쿼리들의 Attention 결과를 입력의 차원 (Query와 Key의 차원) d_k에 루트를 씌워 나눠주면 됩니다. 이렇게 하는 이유는, 논문에서는 Additive Attention과 Dot-Product Attention 두 가지의 Attention이 존재하는데, Dot-Product는 계산이 훨씬 더 빠른 반면, d_k가 커짐에 따라 내적의 값이 너무 커져서 Softmax 변환의 기울기가 매우 작아지게 된다는 것 때문에 학습 성능이 더 떨어지기 때문이라고 합니다. 생각해 보면, 입력 문장이 길어질수록 d_k의 값은 더 커지게 될 텐데, 그럼 단어들 간의 유사성 혹은 비유사성은 훨씬 더 커질 것입니다. 그러다 보니, 내적값은 더 커질 것이고 Softmax를 취한 값은 똑같이 크기를 유지하기에 작은 값에 대한 기울기가 더 작아지게 되겠죠. 따라서, 단어들간의 유사도를 적절히 반영하지 못하고 극단적으로 반영하게 됩니다.
이에, 내적 값 자체에 sqrt(d_k)로 나눠줘서 그 값의 크기를 정규화시켜 준 후에 Softmax에 넣겠다는 것입니다. 이를 통해, Additive Attention 보다 성능은 더 뛰어나고 속도는 더 빠르게 할 수 있었다고 합니다.
## Multi-Head Attention
이는 단순히 Self-Attention을 나누어 여러 번 병렬적으로 수행하고, 이를 Concatenate 시키는 방식입니다.
즉, 한 번의 512 차원으로 Self-Attention을 한 번 하는 것보다 64차원으로 8번 Self-Attention을 수행하고 결과를 Concatenate 시키는 것이 수행 시간도 더 빠르면서 성능이 뛰어나다는 것이죠. 마치 배치처리와 같은 현상입니다. 실제 코드에서도 단순히 n_head (h)를 정의하고 w_q, w_k, w_v를 지정하는 과정에 linear 함수의 출력값을 head_dim/n_head로 설정하여 나중에 concatenate를 합니다.
## Applications of Attention in our Model
Transformer는 세 가지 방식으로 Multi-Head Attention을 사용합니다.
- "인코더-디코더 어텐션"레이어에서는 Query는 이전 디코더 층의 출력에서 가져오고, Key와 Value는 인코더의 출력에서 가져옵니다. 이를 통해 디코더의 모든 위치가 입력 시퀀스의 모든 위치에 주의를 기울일 수 있습니다. 이는 seq2 seq 모델의 인코더-디코더 어텐션 메커니즘을 모방합니다.
- 인코더에 사용됩니다. 이 경우에는 Self-Attention으로 인코더의 이전 층 출력이 쿼리, 키, 값이 되어 Attention을 수행합니다. 이를 통해, 인코더의 각 위치는 인코더의 이전 층 모든 위치에 대해 어텐션을 수행하며, 모든 단어가 서로 연결된 관계를 학습할 수 있습니다.
- 디코더에서도 마찬가지로 이전 층 출력이 쿼리, 키, 값이 됩니다. 하지만, 디코더에서는 Masked Multi-Head Attention을 사용합니다. 현재 단어를 출력하는 데에 미래 단어를 사용하지 않게끔 합니다. "나는 오렌지가 먹고 싶다"에서 "나는"을 예측하는 데에 "나는", "오렌지가", "먹고 싶다"를 사용하여 예측한다면 일종의 cheating과 같습니다. 따라서, 이후 단어들의 내적값을 매우 큰 음수로 설정하여 softmax값이 0에 가깝게 설정합니다. 이를 우리는 Masking이라고 부릅니다.
## Position-wise Feed-Forward Networks
Attention 레이어를 통과하고 나면 인코더와 디코더 마찬가지로 FFN (Fully Connected Feed-Forward Network)를 통고하게 됩니다. 이는 단순히 linear transformation 두 번과 ReLU 함수를 포함합니다.
사용되는 Linear Transformation의 가중치는 서로 다른 파라미터를 사용하며, 입력 차원은 512, 내부 레이어의 차원은 2048이며 출력 차원은 512 차원입니다. 즉, 512 → 2048 → 512차원으로 구성됩니다.
## Embedding and Softmax
이 절에서는 Self-Attention과 순환 신경망, 합성곱 신경망을 비교합니다. 지표는 계층별 복잡도(Complexity per Layer), 계산량(Sequential Operations), 장거리 의존성 길이(Maximum Path Length)을 사용합니다. 우선, 결과는 아래와 같습니다.
계층별 복잡도(Complexity per Layer)는 신경망의 각 Layer의 복잡도를 표현한 것인데, Self-Attention의 경우 n(시퀀스의 길이)가 d(표현 차원)보다 작을 때 순환 신경망보다 빨라집니다. 본 논문에서는 d를 512로 설정하였기 때문에 시퀀스 길이가 512보다 작은 경우에 Self-Attention이 더 빠르다고 볼 수 있습니다.
계산량(Sequential Operations)은 시퀀스를 처리할 때 걸리는 계산량을 이야기합니다. 순환 신경망의 경우, 모든 단어를 하나씩 처리하기 때문에 문장의 길이만큼 시간이 소요되는 반면, Transformer는 모든 단어를 한 번에 입력하여 처리(병렬 처리)하기 때문에 항상 O(1)만큼 같은 시간이 소요됩니다.
장거리 의존성이란 순환 신경망에서 자주 발생하는데 신경망의 길이(Maximum Path Length) 또는 시퀀스의 길이가 길어지면 학습 과정에서 기울기 소실로 인해 앞의 정보가 뒤까지 전달되지 않는 현상을 이야기합니다. 따라서, 입력과 출력 간의 거리가 짧을수록 이런 장거리 의존성을 줄일 수 있습니다. 이 경우, Self-Attention은 모든 단어를 한 번에 처리하기 때문에 O(1)로 상수의 시간이 소요되지만, 순환 신경망의 경우에는 O(n)의 시간이 소요됩니다.
Convolutional 하고 비교한다고 하면, Convolutional에서도 커널 크기(k)를 시퀀스 길이(n)으로 설정한다면, 모든 단어를 한 번에 처리할 수 있기 때문에 Sequential Opertations가 O(1)이라고 볼 수 있습니다. 하지만, 모든 단어 간 직접 연결을 위해서는 여러 층이 필요합니다. 따라서, Maximum Path Length는 O(log_k(n))만큼 소요됩니다.
* O(log_k(n))은 선형대수학에서 배운 것처럼 층의 개수를 의미합니다.
Self-Attention (restricted)는 입력 시퀀스가 매우 긴 경우를 고려합니다. Self-Attention은 각 단어마다 모든 단어들과의 연관성을 계산하기 때문에 시퀀스가 길어질 수록 성능 저하가 발생할 가능성이 커집니다. 따라서, 출력 위치를 반경으로 r개의 이웃 위치들만 고려하도록 제한하여 계산 범위를 축소합니다. 이 경우에는 최대 경로 길이가 O(n/r)로 변경됩니다.
## Positional Encoding
Transformer는 Recurrence나 컨볼루션을 포함하지 않기 때문에, 각 단어에 대한 위치 정보를 포함하지 않습니다. 따라서, 모델이 단어의 위치 정보를 알기 위해서는 절대적 위치 정보를 주어야 합니다. 이를 위해 입력 임베딩에 Positional Encoding을 추가합니다. 이는 입력 정보와 동일한 차원으로 설정하여 입력 데이터에 더할 수 있도록 합니다.
본 논문에서는 아래 두 주기함수 sin과 cos을 이용해 값을 계산하였습니다. sin과 cos함수는 다양한 주파수를 가지는 함수로써 주기가 다르므로 단어 간 상대적 거리를 모델이 쉽게 구별할 수 있기 때문입니다.
여기서 pos는 단어의 위치이고, i는 임베딩 벡터의 차원 인덱스입니다. 즉, 짝수 인덱스에는 sin함수를, 홀수 인덱스에는 cos함수를 사용하여 positional encoding 벡터를 계산합니다.이렇게 설정하지 않고 파라미터로 설정하여 학습하는 방식도 실험했다고 하는데, 두 버전이 거의 동일한 결과를 보였다고 합니다. 그런데도 sin, cos를 사용한 이유는 테스트시에 처음 본 시퀀스에 대해서도 일반화가 가능하여 확장이 가능하기 때문입니다.
# Conclusion
이 연구에서 우리는 인코더-디코더 아키텍처에서 가장 일반적으로 사용되는 순환 레이어를 멀티 헤드 자기-어텐션으로 대체하여 전적으로 어텐션에 기반한 최초의 시퀀스 변환 모델인 Transformer를 제시했습니다.
번역 작업에서 Transformer는 순환 또는 컨볼루션 레이어 기반 아키텍처보다 훨씬 빠르게 훈련될 수 있습니다. WMT2014 영어-독일어 및 WMT2014 영어-프랑스어 번역 작업 모두에서 BLEU 28.4로 기존 모델보다 2.0 이상 높은 성능을 달성했습니다. 특히, 앙상블 모델보다도 더 높은 성능을 보였다는 점이 인상 깊습니다.
향후에는 텍스트뿐 아니라 이미지, 오디오 및 비디오와 같은 것도 처리해보려 한다고 합니다.
마무리...
이렇게 Transformer에 대한 논문리뷰가 끝났습니다. 사실 이 논문을 예전부터 읽고 싶었는데 여러 프로젝트들 때문에 미루고 미루다 이렇게 읽게 됐네요. 저는 비전부터 접하게 되어서 이런 LLM 쪽에는 기초 지식도 없어서 이 논문을 이해하기 너무 어려웠습니다. 그래도 유튜브에 잘 설명된 영상들이 많아서 하루를 다 쏟으니 겨우겨우 어느 정도 이해하게 됐네요. 다음에는 이를 활용한 Vision Transformer와 Swin Transformer 그리고 이를 통한 Survey 논문을 찾아보려 합니다.
제 작은 글이 여러분의 이해에 조금이나마 도움이 되었으면 합니다. 감사합니다 :)
