Self-Attention과 게슈탈트
BoW에서 Self-Attention까지
- #PI Lab
- #AI 엔지니어링
- #머신러닝
- #Self-Attention
이 글은 Pi Lab AI 과정을 들으면서 정리한 노트입니다. 커리큘럼 따라 모델을 하나씩 구현해보다가 떠오른 생각들을 남겨둡니다.
별점 맞히기
Pi Lab AI 과정에서 가게 리뷰로 별점을 맞히는 분류 문제를 실습으로 진행했습니다. BoW(Bag of Words)에서 시작해서 임베딩, 다층 신경망, self-attention까지, 차근차근 기존 모델의 문제점과 단점을 하나씩 풀어가며 모델을 바꿔가며 실습하고 있어요.
모델을 좀 더 정교한 모델로 교체해 나갈수록, 작동 방식이 사람이 의미를 이해하는 방식이랑 닮아간다는 느낌을 받아서 그 흥미로운 지점을 블로그에 정리해보려고 해요. (결코 제가 철학 전공해서 그런 거 아닙니다.)
이 글은 그중 self-attention과 게슈탈트 이론을 연결해보는 이야기예요.
1. 단어를 그냥 세는 BoW
가장 단순한 출발점이 BoW예요. 이름 그대로 문장을 단어들이 든 가방으로 봐요. 단어가 몇 번 등장했는지만 세고 순서는 버립니다.
from sklearn.feature_extraction.text import CountVectorizer
reviews = [
"tasty but expensive",
"expensive but tasty",
]
vec = CountVectorizer()
X = vec.fit_transform(reviews)
print(X.toarray())
# [[1 1 1]
# [1 1 1]]두 문장이 똑같은 벡터로 나와요. 사람한테는 분명히 뉘앙스가 다른 두 문장입니다만... "tasty but expensive"는 결국 비싸다는 쪽으로 기울고, "expensive but tasty"는 그래도 맛있긴 하다는 쪽이잖아요? 모델은 이걸 인지하지 못 해요.
여기서 첫 단서가 나와요. 단어들의 합만으로는 잡히지 않는 게 있다는 것. 단어들이 어떻게 놓여 있느냐가 의미를 만든다는 것.
2. 단어가 관계 안에서 의미를 얻는 임베딩
다음은 임베딩이에요. word2vec 같은 기법으로 단어를 고차원 벡터로 바꾸는 거죠.
핵심 내용은 이래요. 비슷한 맥락에 나오는 단어들은 비슷한 벡터를 갖는다. "delicious"랑 "tasty"는 비슷한 문장에 자주 같이 나오니까 벡터 공간에서 가까이 자리잡습니다. "expensive"랑 "pricey"도 마찬가지구요.
유명한 예시...
king − man + woman ≈ queen
단어의 의미가 사전에 박혀 있는 정의로 주어지는 게 아니라, 다른 단어들과의 관계망 안에서 좌표로 정해진다는 발상입니다.
이건 사실 언어학에서는 분포가설(distributional hypothesis)이라고 부르는 오래된 직관이에요. "단어의 의미는 그 단어가 어떤 단어들과 함께 등장하는지로 결정된다." 그리고 이게 후기 비트겐슈타인의 "의미는 사용이다"랑 거의 같은 자리에 있어요. 단어의 뜻을 알려면 사전을 펴지 말고 그게 어떻게 쓰이는지를 봐라.
3. Self-Attention: 같은 단어, 다른 의미
임베딩에도 한계가 있어요. 동음이의어에요. 단어 하나에 벡터 하나가 고정으로 붙어요. "bank"는 강둑이든 은행이든 같은 벡터예요.
리뷰 데이터에서도 비슷한 일이 생깁니다. 영어 "sick"으로 예를 들어보면.
"This pasta is sick! Best meal of the month." "I felt sick after eating here. Never again."
같은 단어인데 위에서는 칭찬이고 아래에서는 식중독에 가까운 불만이에요. 임베딩만으로는 이걸 못 구분해요.
Self-attention은 이걸 이렇게 풀어요. 단어의 표현을, 문장 안의 다른 단어들과의 관계로부터 그때그때 다시 계산해요.
좀 더 풀어 설명하자면 "sick"이 자기 의미를 정하려고 문장의 다른 단어들을 둘러봐요. "best meal"이 옆에 있네? 그럼 나는 좋은 뜻이다. "after eating", "never again"이 있네? 그럼 나는 안 좋은 뜻이다. 이런 식이죠.
각 단어가 문장의 다른 모든 단어와 attention weight를 주고받고, 그 가중치 패턴이 모여서 그 단어의 최종 표현이 만들어져요. 같은 단어라도 옆에 누가 있느냐에 따라 매번 다른 벡터가 되는 셈이죠.
세 모델을 나란히 놓고 보면 이렇게 정리됩니다. BoW에서는 단어들이 그냥 더해질 뿐 관계가 없어요. 임베딩에서는 단어가 다른 단어들과의 통계적 관계 안에서 위치를 얻는데, 그 위치는 고정이에요. self-attention에서는 단어가 지금 이 문장 안에서의 관계에 따라 매번 다르게 재구성돼요.
부분이 모여서 전체가 되는 게 아니라, 어떤 의미에선 전체가 부분을 다시 정의해요.
4. 게슈탈트라는 오래된 이름
20세기 초에 독일 심리학자들이 사람의 지각을 두고 비슷한 얘기를 했어요. 베르트하이머, 쾰러, 코프카로 대표되는 "게슈탈트 심리학"!.
핵심 주장은 한 문장입니다.
전체는 부분의 합 이상이다(Das Ganze ist mehr als die Summe seiner Teile).
한 입 베어 문 동그라미 세 개를 적당히 놓으면 우리는 또렷한 삼각형을 봐요. 정작 삼각형을 이루는 선은 어디에도 그려져 있지 않은데도요.
멜로디를 다른 키로 옮겨 연주해도 같은 멜로디로 들려요. 음표는 다 바뀌었는데도요.
부분들이 모여서 전체가 될 때 부분에는 없던 새로운 질이 생기고 그 질은 부분들 사이의 관계와 구조에서 나온다는 이야기입니다.
이 관점에서 self-attention을 다시 볼까요. 게슈탈트 지각도, self-attention도, 부분들의 단순한 합으로 환원되지 않아요. 둘 다 부분들 사이의 관계가 전체를 결정해요. 같은 요소(점, 음표, 단어)라도 어떤 배치 안에 있느냐에 따라 다르게 지각되거나 다른 벡터가 되는 거죠. 그리고 전체가 부분의 의미를 거꾸로 규정하기도 하고요.
작동 메커니즘이 같다는 말은 아닙니다. 한쪽은 사람 지각에 관한 이론이고, 한쪽은 행렬 연산이니까요. 그런데 둘이 푸려고 하는 문제의 모양이 닮아 있는 것 같지 않나요? "부분의 단순한 합으로는 잡히지 않는 무언가를 어떻게 설명할 것인가."
물론 self-attention이 게슈탈트를 구현한 거라거나 신경망이 사람처럼 지각한다고 말하려는 건 아니에요. 신경망이 게슈탈트 이론을 참고해서 만들어진 것도 아니고, 게슈탈트 심리학자들이 행렬 연산을 염두에 둔 것도 아니니까요.
흥미로운 건 다른 시대, 다른 영역의 사람들이 부분과 전체의 관계라는 같은 문제에 부딪혔을 때 비슷한 모양의 해답에 도착했다는 점입니다. 한쪽은 지각을 설명하려고, 한쪽은 언어를 처리하려고.
그 외에 찾아볼만한 것들
생각보다 인지, 심리학, 인식론, 언어학 등의 주제에서 AI와 함께 다뤄볼만한 주제가 많이 있습니다.
비트겐슈타인의 "의미는 사용이다"와 분포가설. 이 글에서 잠깐 언급했는데 제법 깊게 다룰 만한 주제에요.
현상학의 지각 위계와 CNN의 계층 구조. 부분 지각이 전체 지평으로 통합되는 메를로퐁티의 묘사가 CNN이랑 묘하게 겹쳐요.
서로 다른 각 분야에서 만나게 되는, 이렇게 비슷한 모양의 구조 도식을 비교해는 것도 재미있을 것 같습니다.