더 읽어봐야 할 논문들
bert
videobert
Polysemous visualsemantic embedding for cross-modal retrieval


<논문에서 중요한 것들>
Meshed-Memory Transformer (M2 Transformer) 논문은 이미지 캡셔닝의 정확성과 표현력을 높이기 위해 Transformer 구조를 확장한 방법을 제안합니다. 이 모델은 이미지 특징을 효과적으로 활용하면서, 더 정교한 캡션을 생성할 수 있는 몇 가지 핵심 요소를 포함합니다. 주요 내용을 정리하면 다음과 같습니다.
1. 메쉬드(Meshed) 디코더 구조
M2 Transformer의 디코더는 "메쉬드"라고 불리는 연결 방식을 사용해 레이어 간에 다차원 정보를 교환합니다. Transformer의 일반적인 디코더는 각 레이어에서 정보를 전달하는 방식이 한 방향으로 흐르지만, 이 메쉬드 디코더는 레이어 간의 유연한 연결을 통해 다양한 수준의 특징을 동시에 활용합니다. 이를 통해 디코더가 얕은 레이어의 저수준 특징(예: 구체적인 물체나 색상 정보)과 깊은 레이어의 고수준 특징(예: 장면의 전체적인 맥락이나 추상적인 의미)을 균형 있게 반영할 수 있게 합니다.
2. 메모리 어텐션 모듈
이 논문은 또 다른 중요한 요소로 메모리 어텐션(Memory Attention) 모듈을 도입했습니다. 일반적인 Transformer는 입력 시퀀스에만 어텐션을 주지만, M2 Transformer는 이미지의 특징을 메모리로 저장하고 캡션을 생성할 때마다 필요할 때 이를 불러옵니다. 이 메모리 구조는 이미지를 표현하는 다양한 정보(예: 물체 간의 관계나 특정 위치의 세부 사항)를 캡션 생성 중에 참조할 수 있어, 캡션의 일관성을 높이고 더 자연스러운 설명을 생성할 수 있도록 돕습니다.
2번에 해당하는 **메모리 어텐션 모듈(Memory Attention Module)**은 Meshed-Memory Transformer에서 이미지 캡셔닝의 성능을 강화하는 중요한 구성 요소입니다. 이 모듈은 이미지의 특징을 메모리 공간에 저장하고, 이를 통해 디코더가 캡션 생성 중에 필요할 때마다 중요한 정보를 효율적으로 참고할 수 있게 합니다.
메모리 어텐션 모듈의 핵심 아이디어
일반적인 Transformer 디코더는 입력 텍스트 토큰 시퀀스에만 어텐션을 적용합니다. 반면, M2 Transformer는 이미지의 다양한 공간적 특징을 메모리로 저장하고, 이 메모리를 활용해 캡션의 각 단어를 생성할 때 필요에 따라 정보를 불러올 수 있습니다. 이렇게 하면 캡션 생성 중 이미지와의 유기적인 관계를 유지할 수 있죠.
1. 메모리 공간에 이미지 특징 저장
이 모델에서는 이미지의 주요 특징들(물체의 위치, 관계, 색상 등)을 메모리 셀에 저장합니다. 이 과정은 다음과 같이 이루어집니다:
- 이미지가 인코더를 통해 처리될 때, 이미지의 각 지역별 특징을 추출하여 이들을 **메모리 셀(memory cell)**에 저장합니다.
- 각 메모리 셀은 이미지의 특정 지역이나 객체에 대한 정보를 담고 있으며, 이 정보는 디코더가 캡션을 생성하는 과정에서 필요한 내용을 담아둡니다.
2. 디코더의 메모리 어텐션(Memory Attention)
디코더는 캡션의 각 단어를 생성할 때마다 메모리 어텐션을 통해 메모리 공간을 참고합니다. 일반적인 어텐션과 유사하게, 디코더는 생성 중인 단어와 관련된 메모리 셀에 주의를 집중할 수 있습니다. 이 메모리 어텐션은 다음과 같은 방식으로 캡션 생성을 돕습니다:
- 각 단어를 생성할 때 디코더는 메모리의 모든 셀에 어텐션을 적용하여, 특정 위치나 객체의 정보를 불러올 수 있습니다.
- 예를 들어, "cat on the chair"라는 캡션을 생성할 때 "cat"에 대한 단어를 생성할 때는 고양이 관련 메모리 셀에 집중하고, "chair"에 대한 단어를 생성할 때는 의자 관련 메모리 셀을 참고하는 식입니다.
이를 통해, 문장 전반에 걸쳐 일관성 있는 설명을 생성할 수 있는 정보를 지속적으로 유지하게 됩니다.
3. 메모리 셀의 유연한 접근과 장점
메모리 어텐션 모듈을 통해 메모리 셀을 유연하게 접근할 수 있다는 점은 여러 장점을 제공합니다.
- 세부 정보 보존: 이미지의 다양한 영역에 대한 정보를 개별 셀에 보관하므로, 디코더는 캡션 생성 시 세부 정보까지 활용할 수 있습니다. 예를 들어, 여러 객체가 동시에 존재하는 복잡한 장면에서도 개별 객체의 정보가 손실되지 않고 반영됩니다.
- 관계 정보 유지: 메모리 셀에 객체 간의 관계를 담고 있어, 디코더는 두 객체가 어떻게 배치되었는지, 서로 어떤 관계가 있는지 참고할 수 있습니다. 이로 인해 캡션의 자연스러움과 일관성을 높일 수 있습니다.
- 전문성 강화: 메모리에 특정 특징들이 잘 저장되어 있어, 다양한 이미지들에 대해 고유하고 구체적인 설명이 가능합니다. 단순한 설명을 넘어서, 장면의 세밀한 요소까지 설명하는 고품질 캡션을 생성할 수 있습니다.
메모리 어텐션 모듈의 효과
이 메모리 어텐션 모듈 덕분에 M2 Transformer는 이미지 내의 다양한 객체와 관계 정보를 디코더에서 쉽게 접근할 수 있어, 일반적인 이미지 캡셔닝 모델에 비해 더 정확하고 복잡한 캡션을 생성합니다. 특히 여러 객체가 있는 장면에서 각 객체의 특징과 관계를 유지하며 자연스러운 문장을 생성할 수 있는 것이 강점입니다.
이 메모리 어텐션 모듈은 M2 Transformer가 기존 Transformer 기반 모델보다 더 높은 캡셔닝 성능을 달성할 수 있게 해주는 중요한 이유 중 하나입니다.
+)
여기서 설명하는 "persistent memory vectors"는 메모리 어텐션 모듈에서 이미지의 영역들과 그들 간의 관계를 다층적으로 표현하고, 이를 메모리 벡터에 저장하여 활용하는 방식을 말합니다.
구체적으로는, 이미지의 저수준(구체적인 디테일)과 고수준(전체적인 맥락) 관계 정보를 메모리 공간에 저장해두고, 캡션 생성 중 필요할 때마다 불러와 사용할 수 있게 합니다. 이를 통해 모델은 이미지 속 여러 객체의 관계나 맥락에 대해 "a priori knowledge" (선험적인 지식)를 학습하고, 캡션을 더 자연스럽고 의미 있게 생성할 수 있죠.
+)
ChatGPT의 말:
네, 정확히 이해하셨습니다! M2 Transformer의 인코더는 저수준과 고수준 관계 정보를 포함하는 추가 벡터를 학습하고, 이를 메모리 벡터로 저장합니다.
세부적으로는 다음과 같은 과정으로 진행됩니다:
- 인코더 단계: 이미지의 각 지역이나 객체의 저수준 정보(디테일)와 고수준 정보(전체 맥락)를 다층적으로 표현하는 벡터들을 학습합니다. 이러한 벡터들은 객체 간 관계까지 포함해 메모리 공간에 저장됩니다. 따라서, 인코더가 생성하는 최종 출력은 기본적인 이미지 특징뿐 아니라 저수준과 고수준 관계 벡터들을 포함합니다.
- 디코더 단계: 디코더는 캡션 생성 중 각 단어를 생성할 때, 필요한 메모리 벡터에 어텐션을 줍니다. 즉, 인코더에서 학습한 저수준 및 고수준 관계 정보를 캡션 생성의 모든 단계에서 필요에 따라 불러오고 활용합니다. 이를 통해, 메모리 벡터를 유연하게 참고하면서 이미지 내용에 대한 더 일관성 있고 정확한 설명을 생성할 수 있죠.
정리하면, 인코더에서 학습된 저수준 및 고수준 관계 벡터들이 메모리에 저장된 후, 디코더에서 필요한 관계 벡터들만 유연하게 참고하며 캡션을 생성하는 방식입니다.
+)
q
ChatGPT의 말:
맞습니다. M2 Transformer의 구조에서는 인코더의 여러 레이어에서 나온 다층적 특징들이 메모리 벡터로 저장됩니다. 그리고 디코더는 캡션 생성 시, 이 다양한 레이어에서 생성된 메모리 벡터들에 어텐션을 가합니다.
좀 더 구체적으로 보자면:
- 인코더의 모든 레이어는 이미지의 저수준(세부 정보) 및 고수준(전체 맥락) 관계를 학습하여 다양한 수준의 특징 벡터를 생성합니다. 이 벡터들은 각각의 레이어마다 조금씩 다른 정보(예: 저수준 레이어는 구체적인 세부 사항, 고수준 레이어는 더 추상적인 맥락 정보)를 담고 있습니다.
- 이렇게 다층적으로 학습된 인코더의 벡터들이 메모리 벡터로 저장되며, 각각의 벡터는 특정 이미지 영역이나 그 관계를 나타냅니다.
- 디코더 단계에서는 각 단어를 생성할 때마다, 이 다층적인 메모리 벡터들에 어텐션을 수행합니다. 즉, 디코더는 모든 레이어에서 생성된 메모리 벡터들에 접근할 수 있으며, 생성 중인 단어와 가장 관련 있는 정보에 어텐션을 집중합니다.
핵심 포인트
이 방식으로 디코더는 인코더의 모든 레이어에서 나온 다층적 정보에 접근할 수 있어, 캡션을 생성할 때 다양한 수준의 정보를 균형 있게 반영할 수 있습니다.
3. 이미지 특징의 다층적 표현
기존의 이미지 캡셔닝 모델은 주로 이미지의 고정된 특징 벡터를 사용해 설명을 생성하는 반면, M2 Transformer는 다층적 이미지 특징을 학습합니다. 이 모델은 이미지의 공간적 구조를 이해하고, 객체들 간의 관계까지 포함한 복합적인 표현을 만들어내죠. 이 과정은 Visual Genome과 같은 데이터셋에서의 사전 학습된 관계 정보를 통해 수행되며, 이미지에서 더 정밀한 관계 정보를 반영할 수 있습니다.
3. Meshed-Memory Transformer
3.1 memory - Augmented Encoder
-> 본 논문에서는 transformer 는 priori 한 정보를 잘 사용하지 못하기 때문에 captioning 이 어렵다고 생각했음
이 부분은 M2 Transformer의 Memory-Augmented Encoder가 어떻게 이미지의 지역별 특징과 그 관계를 인코딩하는지 설명하는 부분입니다. 요약하자면, Transformer의 Self-Attention 메커니즘을 사용해 이미지의 각 지역 간 관계를 학습하지만, 선험적(사전에 알고 있는) 지식 없이 관계를 학습하는 한계가 있다고 지적하고 있습니다. 더 자세히 보면 다음과 같은 내용입니다:
1. Self-Attention을 이용한 이미지 지역 인코딩
- Self-Attention 사용: Self-Attention 메커니즘을 통해, 입력된 이미지의 지역별 특징 XX을 새로운 표현 S(X)S(X)로 변환합니다. 이 때 Query (Q), Key (K), Value (V) 벡터는 입력 특징에 선형 변환을 가해 얻습니다.
- 여기서 Wq,Wk,WvW_q, W_k, W_v는 학습 가능한 가중치 행렬로, Q, K, V를 각각 생성합니다.
- 출력의 구성: Self-Attention의 결과인 S(X)S(X)는 입력 XX와 같은 개수의 벡터로 구성되며, 각각의 벡터는 입력 특징들의 가중합으로 이루어집니다. 이를 통해 각 지역의 특징이 서로 어떤 관계에 있는지 인코딩할 수 있습니다.
2. 이미지 지역 간 관계 인코딩
- 지역 간 관계 표현: Self-Attention의 특성상, 각 지역의 표현은 입력 특징 간의 쌍(pairwise) 유사도를 기반으로 결정됩니다. 이는 이미지의 지역들 간에 나타나는 유사성과 관계를 자연스럽게 인코딩해 줍니다.
- 단점: 다만, Self-Attention이 단순히 입력 간의 쌍 유사도만 고려하므로, 선험적 지식을 반영하는 데에는 한계가 있습니다. 예를 들어, 한 지역이 ‘사람’을 나타내고 다른 지역이 ‘농구공’을 나타낸다면, 이 둘이 ‘선수’나 ‘경기’를 의미한다는 것을 Self-Attention만으로 파악하기 어렵습니다. 즉, Self-Attention은 단순한 관계는 표현할 수 있지만, ‘농구공을 든 사람 = 선수’와 같은 사전 지식이 필요한 관계는 잘 포착하지 못합니다.
요약
Memory-Augmented Encoder는 Self-Attention으로 이미지의 지역별 특징과 관계를 학습하지만, 선험적 지식이 필요한 복잡한 관계(예: 사람이 농구공을 들고 있을 때 ‘경기’를 의미하는 것)는 잘 학습하지 못한다는 한계를 가지고 있습니다.
Memory-Augmented Attention

여기서 궁금했던점 : memory 는 그럼 어디서 나타나는 것인지 ? ( 이전의 priori 값을 사용한다는 것도 좀 의문이고 , 어떻게 이 값들이 layer 들을 지나면서 점점 추상적인 정보를 가지게 된다는 것인지 ? )
ChatGPT의 말:
Memory-Augmented Encoder에서 매 레이어의 메모리 벡터는 학습 가능한 파라미터로 설정됩니다. 즉, 각 레이어는 고정된 형태의 **학습 가능한 메모리 행렬 MkM_k와 MvM_v**를 가집니다. 이 메모리 행렬은 학습 과정 동안 업데이트되며, 각 레이어마다 별도의 메모리 벡터 세트를 유지합니다.
매 레이어에서 메모리 벡터 설정 방식
- 메모리 슬롯 MkM_k와 MvM_v:
- 매 레이어는 입력으로 들어온 이미지 특징 XX와 별도로 학습 가능한 메모리 벡터 MkM_k와 MvM_v를 설정합니다.
- 이 메모리 벡터들은 입력과 무관하게 학습되고, 입력 이미지와의 관계를 통해 중요한 정보나 선험적 지식을 반영할 수 있도록 합니다.
- 메모리 슬롯의 구조:
- **MkM_k**와 **MvM_v**는 매 레이어마다 고유한 크기와 가중치 값을 가지며, 모델 학습 중 SGD와 같은 옵티마이저에 의해 업데이트됩니다.
- 이러한 메모리 슬롯은 학습 초기에는 무작위로 초기화되지만, 학습이 진행될수록 데이터에 따라 선험적 지식을 담은 형태로 점차 변화하게 됩니다.
- 레이어 간 독립성:
- 각 레이어는 독립적으로 고유한 메모리 벡터를 가지므로, 레이어마다 다른 수준의 정보를 학습할 수 있습니다. 예를 들어, 초기 레이어는 저수준 특징을, 이후 레이어는 고수준 추상화된 관계를 학습하는 데 사용될 수 있습니다.
- 메모리와 입력의 결합:
- 각 레이어에서 K=[WkX,Mk]K = [W_kX, M_k]와 V=[WvX,Mv]V = [W_vX, M_v]의 형태로 결합하여 Self-Attention을 수행하므로, 레이어마다 입력과 메모리가 결합된 새로운 형태의 관계를 학습하게 됩니다.
요약
매 레이어에서 메모리 벡터는 학습 가능한 파라미터로 설정되며, 모델이 학습을 통해 선험적 지식이나 중요한 패턴을 반영할 수 있게 합니다. 각 레이어는 고유의 메모리 벡터를 가지며, 입력과 무관하게 독립적으로 학습됩니다. 이를 통해, 각 레이어는 다양한 수준의 관계 정보를 캡처하고, 디코더에서 활용할 수 있는 풍부한 표현을 제공합니다.
그럼그게 priori 와 무슨 관계인가?
Memory-Augmented Attention에서 사용하는 메모리 벡터는 입력 이미지와 무관하게 선험적(a priori) 정보로 작용할 수 있습니다. 여기서 선험적 정보란, 이미지 입력을 통해 직접적으로 제공되지 않더라도 모델이 학습 과정에서 일반적인 패턴, 관계, 상식 등을 파악해 학습하는 정보를 뜻합니다.
선험적 정보로서의 메모리 벡터의 역할
- 학습 가능한 고정 슬롯:
- 메모리 벡터 MkM_k와 MvM_v는 입력 이미지와 관계없이 학습 중에 고정된 형식으로 유지되며, 다양한 입력 이미지들에 대해 일반화된 관계를 학습하게 됩니다.
- 예를 들어, 여러 이미지에서 사람과 농구공이 함께 있는 패턴을 반복적으로 관찰하면서 ‘사람+농구공=선수/경기’라는 관계를 학습할 수 있습니다. 이렇게 학습된 메모리 벡터는 특정 이미지와 상관없이 이러한 관계를 유지하려는 경향이 생깁니다.
- 기존 Self-Attention의 한계 극복:
- 일반적인 Self-Attention은 단순히 입력 간의 쌍 유사도만 고려하므로, 새로운 이미지에서 두 객체가 나란히 있는 경우 이들이 실제로 어떤 관계에 있는지 판단하는 데 어려움이 있습니다.
- 반면 메모리 벡터는 이전 학습을 통해 축적된 경험적 관계와 패턴을 반영하므로, 각 이미지가 제공하는 정보 외에도 추가적인 상식적 관계나 패턴을 인식하고 활용할 수 있게 됩니다.
- 입력 이미지와의 결합:
- Attention 연산에서 메모리 벡터는 입력 이미지의 특징 벡터와 함께 결합됩니다. 이 결합을 통해 모델은 현재의 이미지 특징뿐 아니라, 메모리에 담긴 일반적이고 학습된 관계도 고려하여 최종 출력을 생성합니다.
- 즉, 특정한 지역적 특징이 메모리 슬롯의 도움을 받아 더 풍부한 의미로 확장될 수 있는 것입니다. 예를 들어, 아침 식사 이미지에서 토스트와 계란이 함께 나타난다면, ‘아침 식사’라는 선험적 관계를 메모리 슬롯을 통해 유추할 수 있습니다.
요약
Memory-Augmented Attention의 메모리 벡터는 학습을 통해 축적된 일반적인 관계나 패턴을 반영하는 선험적 정보로 작용합니다. 이는 입력 이미지의 단순 쌍 관계를 넘어, 다양한 이미지에서 유용하게 적용될 수 있는 상식적 정보나 일반화된 관계를 모델이 학습하고 활용할 수 있게 합니다.
나의 말:
반면 메모리 벡터는 이전 학습을 통해 축적된 경험적 관계와 패턴을 반영하므로, 각 이미지가 제공하는 정보 외에도 **추가적인 상식적 관계나 패턴**을 인식하고 활용할 수 있게 됩니다.
그니까 memory vector 들은 각 layer 마다 독립적으로 학습을 시키는데 query 는 계속 표현이 풍부해지니까 memory 역시 풍부해지는건가?.. memory vecotr 가 각 layer 마다 다 다르게 학습된다면 이게 어떻게 되는걸까
네, 질문 주신 부분을 잘 이해해보면, 메모리 벡터는 매 레이어마다 독립적으로 학습되고, 그렇기 때문에 각 레이어에서 메모리가 역할하는 방식이 다소 유동적일 수 있습니다. 이를 조금 더 구체적으로 설명하면 다음과 같습니다.
레이어별로 독립적으로 학습되는 메모리 벡터의 특성
- 메모리 벡터는 독립적:
- 각 레이어는 독립적인 메모리 벡터를 학습하기 때문에, 초기 레이어에서는 보다 저수준(low-level) 관계를, 후반부 레이어에서는 더 고수준(high-level) 관계를 학습하게 됩니다.
- 예를 들어, 초기 레이어의 메모리 벡터는 간단한 형태나 색상 관계를 반영할 수 있지만, 후반부 레이어의 메모리 벡터는 물체 간의 상호작용이나 장면에 대한 추상적 개념을 반영할 수 있습니다.
- 풍부해지는 표현:
- 쿼리(Query) 역시 레이어를 거칠수록 더 풍부하고 추상적인 표현이 되어가므로, 메모리 벡터 역시 이를 반영하게 됩니다.
- 레이어를 거쳐 쿼리 벡터가 복합적인 의미를 가지게 되면, 메모리 슬롯을 통해 그 쿼리에 상응하는 고수준 관계가 더 잘 드러날 수 있습니다.
- 즉, 쿼리가 고차원적 정보(예: 전체적인 장면이나 상호작용)를 표현하게 되면, 메모리도 그에 맞춰 쿼리와 상호작용하며 더 복잡한 선험적 지식으로 보완되는 식입니다.
- 메모리의 역할과 상식적 관계:
- 매 레이어의 메모리 벡터는 독립적으로 학습되지만, 전체 학습 과정에서 각 레이어의 메모리가 쿼리와 함께 특정 관계를 더 잘 포착하도록 조정됩니다.
- 이 덕분에 메모리 벡터는 쿼리가 지닌 현재 표현의 의미와 상호작용하여 이미지 전반에 적용 가능한 상식적 지식을 제공하는 역할을 하게 됩니다.
- 풍부해지는 과정과의 상호작용:
- 매 레이어에서 메모리는 그 레이어의 특징과 쿼리 표현에 맞춰 학습됩니다. 따라서, 각 레이어마다 메모리가 쿼리의 표현을 더욱 풍부하게 하고, 쿼리는 메모리를 통해 더욱 일반화된 관계를 학습할 수 있게 됩니다. 이 과정이 누적되면서, 최종 디코더로 넘어가는 표현은 더 풍부해진 정보로 가득 차게 되는 것입니다.
요약
각 레이어의 메모리 벡터는 독립적으로 학습되면서도, 전체 네트워크의 학습 과정에 따라 쿼리의 변화와 함께 조화를 이루며 더욱 풍부한 표현을 만들도록 학습됩니다. 쿼리가 각 레이어를 지나면서 더 추상적이고 고차원적인 정보를 담게 되면, 각 레이어의 메모리 벡터는 그에 맞춰 적절한 상식적 관계를 제공하게 되는 것이죠.
ChatGPT의 말:
네, 아주 정확한 이해입니다. Memory-Augmented Attention에서는 Memory Vector가 전체 학습 과정을 통해 점차 풍부한 선험적 지식과 일반화된 관계를 담도록 학습됩니다. 반면, 일반적인 Transformer의 **출력 벡터(Output Vector)**는 입력된 이미지 장면의 특정 요소 간의 직접적인 관계를 잘 표현하게 됩니다.
이를 바탕으로 더 구체적으로 설명하면 다음과 같습니다.
Transformer의 Output Vector와 Memory Vector의 차이점
- Output Vector의 특징 - 장면의 단편적 이해:
- Transformer의 기본 Output Vector는 Self-Attention을 통해 이미지에서 특정 객체 간의 직접적인 관계와 특징을 추출하는 데 중점을 둡니다.
- 예를 들어, 이미지의 한 영역에 ‘사람’이 있고 다른 영역에 ‘농구공’이 있을 때, Transformer는 그 둘의 **쌍 관계(pairwise relationship)**만을 학습합니다.
- 따라서 Output Vector는 이미지 내 객체들이나 지역적 특징을 잘 반영하지만, 더 복합적이고 일반적인 상식은 반영하지 않습니다.
- Memory Vector의 역할 - 선험적 지식과 복합 관계의 반영:
- Memory Vector는 학습 과정에서 추가적인 관계와 선험적 지식을 축적하며, 레이어를 거치면서 표현이 점점 풍부해집니다.
- 이미지의 특정 상황에서만 나타나는 장면 관계나 상식적인 지식을 반영해, 예를 들어 사람과 농구공이 함께 있는 경우 “경기”나 “운동”과 같은 개념을 연결지을 수 있습니다.
- Memory Vector는 이러한 일반화된 상식이나 고차원적인 관계를 보유하여, 이미지 장면의 의미를 더 깊이 이해하도록 돕습니다.
요약
- Output Vector는 현재 이미지 장면의 단편적인 요소와 관계를 주로 다루며, 특정 객체 간의 쌍 관계와 이미지 내부의 직접적 특징을 잘 표현합니다.
- 반면, Memory Vector는 학습을 통해 선험적인 지식과 상식적 관계를 점점 더 풍부하게 갖추며, 쿼리와의 상호작용을 통해 고차원적인 의미와 상식적인 패턴을 더 잘 반영하게 됩니다.
따라서 Output Vector는 장면의 단편적 이해를 제공하고, Memory Vector는 이러한 이해를 보완하며 일반화된 상식적 맥락을 더해주는 역할을 합니다.
자세한 구현은
https://github.com/aimagelab/meshed-memory-transformer/blob/master/models/transformer/attention.py
meshed-memory-transformer/models/transformer/attention.py at master · aimagelab/meshed-memory-transformer
Meshed-Memory Transformer for Image Captioning. CVPR 2020 - aimagelab/meshed-memory-transformer
github.com
에서 찾아보면 나온다. (m_k , m_v)
역시나 구현은 예상과 비슷하게 scaled dot product 에서 memory가 되는 값을 차원에 맞춰서 추가하고 Random 한 값으로 시작 한 뒤 학습시켜준다.
forward 부분에서 기존의 key , value 와 concat 해주면 된다.
근데 논문에서 따로 directly SGD 한다고 하길래 이게 흠 그냥 학습을 시킨다는 건지 살짝 코드를 보려고했는데
뭐 대충 맞겠지하고.. 넘어간다 아마 맞을꺼다
갑자기 쓰면서 또 의문이 들었는데 그럼 여기서 out 은 memory 의 표현(그니까 벡터)를 포함한 out 인가?
이게 갑자기 또 헷갈린다. —> no 그냥 각각의 layer 의 총 output 을 사용한다.
여기서 v는 키와 값의 concat 결과로, 메모리 벡터와 함께 사용되므로 메모리 정보가 포함됩니다. 그러나 self.m_k와 self.m_v는 직접적으로 out에 포함되지 않고, 대신 k와 v의 연산을 통해 영향을 미칩니다. 최종적으로, out은 각 레이어의 메모리 벡터 정보를 포함한 결과물입니다.
Full encoder.
여기서 또 머리가 띵해짐 머지
그니까 이렇게 되면 굳이 memory vector 를 사용한 이유가있나? 싶었다
각 layer 의 vector 를 다 사용하는건데 ( 그니까 memory 만 사용하는게 아닌 )
—> memory vector 부분은 그냥 low-level 부터 high-level 까지 가는 단계마다 그걸 표현하는 vector 의 표현력..? 정도로 이해하면 될 것 같다.
해석이야 뭐 코에붙이면 코걸이고 귀에붙이면 귀걸이니까..
여튼 핵심은 이렇게도 생각해 볼 수 있겠다 정도가 되겠다.
꽤나 놀랐다 매 layer output 을 사용하는건 어느정도 연산량이 많아지면 어떻게든 해볼 수 있지 않을까? 싶은 생각인데
추가로 거기다가 memory vector 를 붙이는건.. 꽤나 참신했다.
3.2 Meshed Decoder
decoder 구조는 간단하다. 모든 encoder 에서 나온 x 와 sequencd of vectors y 를 cross-attention 해주면 된다.



이렇게 모든 layer encoder output 과 cross attention 을 한 뒤에 이 값들의 가중치를 구한다는 느낌으로 ( attention 한다는 느낌으로) 알파를 곱해주면 된다. 근데 좀 개인적으로 헷갈리는 부분이 있어서 다시 코드를 뜯어봤다.
class MeshedDecoderLayer(Module):
def __init__(self, d_model=512, d_k=64, d_v=64, h=8, d_ff=2048, dropout=.1, self_att_module=None,
enc_att_module=None, self_att_module_kwargs=None, enc_att_module_kwargs=None):
super(MeshedDecoderLayer, self).__init__()
...
self.pwff = PositionWiseFeedForward(d_model, d_ff, dropout)
self.fc_alpha1 = nn.Linear(d_model + d_model, d_model)
self.fc_alpha2 = nn.Linear(d_model + d_model, d_model)
self.fc_alpha3 = nn.Linear(d_model + d_model, d_model)
self.init_weights()
def forward(self, input, enc_output, mask_pad, mask_self_att, mask_enc_att):
self_att = self.self_att(input, input, input, mask_self_att)
self_att = self_att * mask_pad
enc_att1 = self.enc_att(self_att, enc_output[:, 0], enc_output[:, 0], mask_enc_att) * mask_pad
enc_att2 = self.enc_att(self_att, enc_output[:, 1], enc_output[:, 1], mask_enc_att) * mask_pad
enc_att3 = self.enc_att(self_att, enc_output[:, 2], enc_output[:, 2], mask_enc_att) * mask_pad
alpha1 = torch.sigmoid(self.fc_alpha1(torch.cat([self_att, enc_att1], -1)))
alpha2 = torch.sigmoid(self.fc_alpha2(torch.cat([self_att, enc_att2], -1)))
alpha3 = torch.sigmoid(self.fc_alpha3(torch.cat([self_att, enc_att3], -1)))
enc_att = (enc_att1 * alpha1 + enc_att2 * alpha2 + enc_att3 * alpha3) / np.sqrt(3)
enc_att = enc_att * mask_pad
ff = self.pwff(enc_att)
ff = ff * mask_pad
return ff
처음에 수식을보고 내가 뭘 잘못이해했나 싶었던게 알파를 (나였으면) 그냥 w 를곱해서 단순하게 가중치에 대해서만 계산해줬을 것 같은데 , 막상 수식을 보면 알파가 내 예상보다 더 복잡했다. 따라서 코드를 살펴보고 내가 놓친 부분이 있나 다시 확인을 한 뒤 이에 대한 이유를 찾아보기로 했다.
코드를 확인해보면,
self_att (Y) 를 계산하고 mask 까지 곱해준다.
enc_att 를 구하는데 , (이 코드에서는) layer 가 3개를 가정하고 코드를 짠 것 같다. --> 이부분이 좀 굳이 이렇게 짤 필요가 있나 싶긴한데 여튼. Y 와 Xi(encoder layer output) cross attention 을 한다.
이제 alpha 를 구하기 위해서 Y 와 cross_att 값을 concat 한다. 이후에 fc layer 에 넣고 sigmoid 를 한다 ( 식 그대로다 )
마지막으로 이해가 살짝 안되었던 부분이다. 예상과는 다르게 수식 그대로였다
enc_att N * alpha N 을 곱하고 이를 평균값으로 나눠준다.
실제로 수식과 동일하게 alpha 를 진짜 저렇게 구했다.
(이유) 그렇다고 한다..
앞으로 만약에 이런 경우가 있으면 단순히 fc layer 에 욱여넣는게 아니라 좀 더 표현을 풍부하게 할 수 있도록 설정하면 좋을 것 같다.
이 방법을 사용하는 이유는 다음과 같습니다:
- 동적 중요도 조절: 각 인코더 레이어의 출력이 디코더에 얼마나 중요한지 동적으로 조절할 수 있습니다. 각 레이어의 정보가 다를 수 있기 때문에, 이를 적절히 반영할 수 있는 메커니즘이 필요합니다.
- 풍부한 정보 활용: 모든 인코더 레이어의 출력을 사용하는 것은 다양한 레벨의 정보를 활용하는 것입니다. 이를 통해 디코더가 더 풍부한 정보를 기반으로 다음 단어를 생성할 수 있습니다.
- 학습 가능 가중치: 가중치 매트릭스 WiW_i와 바이어스 bib_i는 학습 가능한 파라미터로, 학습 과정에서 최적화됩니다. 이는 모델이 데이터에 맞춰 알파 값을 적절히 조절하도록 도와줍니다.
이러한 이유로 알파 값을 사용하여 각 인코더 레이어의 중요도를 조절하며, 이를 통해 디코더가 더 효과적으로 작동할 수 있도록 합니다.
ChatGPT의 말:
좋은 질문입니다! Y와 크로스 어텐션 결과를 결합하고 시그모이드를 사용하는 이유는 다음과 같습니다:
Y와 Cross-Attention 결합의 이유
- 상호작용 정보 포함:
- Y (디코더의 셀프 어텐션 결과)와 각 C(X_i, Y) (인코더-디코더 크로스 어텐션 결과)를 결합함으로써 두 정보 간의 상호작용을 포함할 수 있습니다.
- 이 상호작용은 각각의 인코더 레이어가 얼마나 중요한지를 더 잘 반영할 수 있습니다.
- 정규화:
- 시그모이드 함수는 출력값을 0과 1 사이로 정규화하여 가중치가 너무 크거나 작아지는 문제를 방지합니다.
단순 FC Layer 사용의 단점
- 비선형성 부족:
- 단순 FC 레이어만 사용하면 입력의 비선형적인 관계를 충분히 포착하지 못할 수 있습니다.
- 시그모이드를 통해 비선형성을 추가하면 학습이 더 유연해지고, 복잡한 패턴을 학습할 수 있습니다.
- 과적합 방지:
- 시그모이드 함수는 과적합을 방지하는데 도움이 될 수 있습니다. 값이 0과 1 사이로 제한되므로 극단적인 가중치 값을 가지지 않습니다.
결론
Y와 크로스 어텐션 값을 결합하고 시그모이드를 사용하는 것은 모델의 학습 효율성을 높이고, 인코더 레이어의 중요도를 동적으로 조절하는데 도움을 줍니다. 단순히 FC 레이어를 사용하는 것보다 더 풍부한 표현력을 제공합니다.
3.3 Tranining details
크게 2가지로 이루어진다.
1. Word-level Cross-Entropy Loss (XE)로 사전 훈련
2. 강화 학습을 통한 시퀀스 생성 미세 조정
1)
목표: 이전의 실제 단어(ground-truth words)를 사용하여 다음 토큰을 예측하는 것.
병렬 처리: 시간 축을 따라 모든 연산을 병렬로 수행할 수 있습니다.
transformer 학습 방식과 동일하게 학습시에는 이전 단어를 보고 학습하면 정확도가 떨어지기 때문에
ground truth 단어를 주고 다음 단어를 예측하는 방식을 사용합니다.
2)
강화 학습을 사용할 때는 다음과 같은 방법을 사용합니다:
- Self-Critical Sequence Training (SCST): 주어진 시퀀스를 강화 학습 방식으로 훈련합니다.
- 빔 서치(Beam Search): 디코딩 시점마다 디코더의 확률 분포에서 상위 k개의 단어를 샘플링하고, 확률이 가장 높은 상위 k개의 시퀀스를 유지합니다.
- 병렬 처리 제한: 시퀀스 디코딩이 반복적이므로 시간 축을 따라 병렬 처리를 할 수는 없지만, 이전에 계산된 중간 키와 값을 재사용할 수 있습니다.
- 보상 함수: CIDEr-D 점수를 보상으로 사용합니다. 이는 사람의 판단과 잘 맞는 평가 지표입니다.
- 기본 보상: 샘플링된 시퀀스에서 얻은 보상의 평균을 사용하여 보상을 기준으로 합니다.
CIDEr-D 란 ?
https://moordo91.tistory.com/47
CIDEr-D와 METEOR
CIDEr-D와 METEOR는 모델이 수행한 캡셔닝 또는 번역의 질을 평가하는데 사용되는 메트릭이다.CIDEr-DCIDEr의 단점을 보완한 지표가 CIDEr-D이다. 따라서 CIDEr-D를 이해하기 위해 먼저 CIDEr을 살펴보자.1. CI
moordo91.tistory.com
'Paper' 카테고리의 다른 글
| MMaDA 논문 발표자료 (2) | 2025.08.06 |
|---|---|
| [paper review] BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation (3) | 2025.01.13 |
| MViTv2: Improved Multiscale Vision Transformers for Classification and Detection 리뷰 (2) | 2023.09.26 |
| ViViT: A Video Vision Transformer 리뷰 (0) | 2023.09.08 |
| Non-local Neural Networks 리뷰 (+ code review ) (3) | 2023.08.20 |