AI 기초 및 활용 16회: 어텐션과 트랜스포머 — 압축을 그만두자 열린 문

AI 기초 및 활용 16회: 어텐션과 트랜스포머 — 압축을 그만두자 열린 문

오늘의 질문 — 왜 문장 전체를 하나에 욱여넣어야 하죠

15회차 끝에서 인코더-디코더의 병목을 봤습니다. 원문을 끝까지 읽어 고정 크기 묶음 하나로 압축하고, 번역문은 그 묶음만 보고 만들어야 했죠.

여기서 이상한 점이 하나 있습니다. 사람이 번역할 때는 그렇게 하지 않아요. 원문을 한 번 통째로 외운 다음 원문을 덮고 번역하지 않습니다. 지금 옮기는 부분에 해당하는 원문 자리를 계속 되돌아봅니다.

'고양이'를 옮길 차례면 원문의 '고양이' 근처를 봅니다. '앉아 있었다'를 옮길 차례면 그쪽을 보고요. 필요할 때마다 필요한 곳을 본다.

오늘의 질문은 이것입니다. 기계도 그렇게 하면 안 될까요. 이 단순한 질문 하나가 오늘날 AI의 형태를 전부 결정했습니다.

지난 회차 연결 — 두 개의 벽

15회차 마지막에 RNN의 한계 둘을 정리했습니다. 오늘 이야기는 이 둘을 차례로 무너뜨리는 과정입니다.

첫째, 기억이 유한하다는 것이었어요. 고정 크기 상태에 계속 눌러 담으니 오래된 것이 밀려났습니다. LSTM이 열 걸음을 수백 걸음으로 늘렸지만 눌러 담는다는 방식 자체는 그대로였죠.

둘째, 순차 처리라 병렬화가 안 된다는 것이었습니다. 열 번째를 처리하려면 아홉 번째가 끝나야 했어요. 수천 개를 동시에 계산하는 그래픽카드를 두고도 줄을 세워야 했습니다.

오늘의 답은 둘 다 같은 아이디어 하나에서 나옵니다.

넓게 퍼져 있던 청록빛이 매끈한 어두운 판의 좁은 틈 하나를 지나며 가느다란 줄기로 줄어드는 모습 — 문장 전체를 고정 크기 묶음 하나에 밀어 넣어야 했던 병목을 뜻하는 개념 이미지

병목을 직접 봅시다

병목이 얼마나 심각했는지 수치로 감을 잡아 봅시다. 인코더의 은닉 상태가 숫자 천 개라고 해보죠. 문장이 다섯 낱말이든 백 낱말이든 담는 그릇은 똑같이 천 개입니다.

다섯 낱말이면 여유가 있습니다. 그런데 백 낱말이면 낱말당 열 개꼴이에요. 그것도 골고루 나뉘는 게 아니라 뒤에 읽은 것이 앞의 것을 밀어냅니다.

실제로 2014~15년 신경망 번역 연구에서 이 현상이 뚜렷하게 관측됐습니다. 문장이 길어질수록 번역 품질이 계단처럼 떨어졌어요. 특히 문장 앞부분의 정보가 번역에서 사라졌습니다.

당시의 대응은 "상태를 더 크게 만들자"였습니다. 그런데 그건 병을 키우는 것이지 병목을 없애는 게 아니었죠. 문장은 언제든 더 길어질 수 있으니까요.

발상의 전환 — 압축하지 말고 그때그때 돌아보기

2015년, 조경현·요슈아 벤지오 연구팀의 드미트리 바다나우가 다른 길을 제안합니다. 압축을 잘하려 하지 말고, 압축을 그만두자.

구체적으로 이렇습니다. 인코더가 원문을 읽을 때, 마지막 상태 하나만 남기지 말고 각 낱말 위치의 상태를 전부 보관합니다. 낱말이 백 개면 상태 백 개를 그대로 들고 있어요.

그리고 디코더가 번역문의 낱말 하나를 만들 때마다, 그 백 개를 전부 훑어보고 지금 필요한 것들에 집중합니다. 어디에 얼마나 집중할지는 학습됩니다.

이것이 어텐션입니다. 병목은 사라졌습니다. 눌러 담을 필요가 없으니까요. 그리고 이 방식에는 뜻밖의 선물이 하나 딸려 왔습니다. 모델이 어디를 보고 있었는지 들여다볼 수 있게 된 겁니다. 어텐션 값을 살펴보면 번역할 때 원문의 어느 낱말과 짝지었는지가 드러납니다.

나란히 놓인 청록빛 마디들 가운데 하나만 유독 크고 환하게 빛나고 나머지는 작고 흐린 모습 — 여러 곳을 훑어보되 지금 필요한 곳에 더 크게 집중하는 어텐션 가중치를 뜻하는 개념 이미지

어텐션 ① 무엇을 찾는가, 무엇을 가졌는가

어텐션이 실제로 어떻게 계산되는지 봅시다. 수식 없이 도서관 비유로 갑니다.

여러분이 도서관에서 자료를 찾는다고 해보죠. 손에는 "내가 지금 찾는 것"이 있습니다. 이것을 쿼리라고 부릅니다.

서가의 책마다 "나는 이런 내용입니다"라는 표지가 붙어 있어요. 이것이 입니다. 그리고 책을 펼치면 나오는 실제 내용입니다.

중요한 것은 키와 값이 다르다는 점입니다. 찾을 때 쓰는 단서와 실제로 가져올 내용이 같을 필요가 없어요. 어텐션은 이 셋을 각각 다른 가중치로 만들어 냅니다. 같은 낱말이라도 찾는 자로서의 얼굴, 찾히는 자로서의 얼굴, 내어 줄 내용으로서의 얼굴이 따로 있는 겁니다.

어텐션 ② 점수를 매기고 섞는다

이제 계산은 세 단계입니다.

하나, 점수를 냅니다. 내 쿼리를 모든 키와 하나씩 맞춰 봅니다. 잘 맞으면 높은 점수, 안 맞으면 낮은 점수. 여기서 "맞춘다"는 것은 두 숫자 묶음이 얼마나 같은 방향을 가리키는지를 재는 일입니다.

둘, 점수를 비율로 바꿉니다. 점수들을 전부 더해서 1이 되도록 고칩니다. 그러면 "이 낱말에 40퍼센트, 저 낱말에 25퍼센트" 하는 식의 집중 비율이 나와요.

셋, 값을 그 비율로 섞습니다. 40퍼센트짜리 낱말의 값을 0.4만큼, 25퍼센트짜리를 0.25만큼 가져와 전부 더합니다. 이렇게 나온 하나의 묶음이 어텐션의 출력입니다.

정리하면 어텐션은 "지금 필요한 것과 관련 있는 정보들을, 관련도에 비례해 섞어 오는 장치"입니다. 무엇에 얼마나 관련이 있는지는 전부 학습으로 정해집니다.

넓게 퍼져 있던 청록빛 줄기들이 한 점으로 모여 밝게 응축되는 모습 — 여러 곳에서 관련도에 비례해 정보를 끌어와 하나로 섞어 내는 어텐션의 동작을 뜻하는 개념 이미지

2015년 바다나우 — 번역이 달라집니다

어텐션을 붙인 번역 모델의 성적은 즉각적이었습니다. 특히 긴 문장에서의 붕괴가 사라졌어요. 문장 길이에 따라 품질이 떨어지던 곡선이 평평해졌습니다.

그리고 앞서 말한 선물, 어디를 보는지 들여다볼 수 있다는 성질이 연구자들을 놀라게 했습니다. 어텐션 값을 살펴보니 모델이 스스로 낱말 대응 관계를 찾아냈더라는 겁니다.

영어와 프랑스어처럼 어순이 비슷한 쌍에서는 대체로 나란한 대응이 나왔고, 어순이 다른 부분에서는 대응이 교차했습니다. 아무도 문법을 가르치지 않았는데 말이죠.

이 시점에서 어텐션은 여전히 RNN에 덧붙이는 보조 장치였습니다. 뼈대는 순환 구조였고 어텐션은 그 위에 얹힌 개선이었어요. 2년 뒤에 이 관계가 뒤집힙니다.

그리고 2017년, 더 과감한 질문

2017년, 구글 연구팀이 논문 하나를 냅니다. 제목이 그 자체로 주장이었어요. 필요한 것은 어텐션뿐이다.

질문은 이랬습니다. 어텐션이 문장 안의 관계를 다 잡아낸다면, 순환 구조는 대체 무엇을 하고 있는가? 어텐션이 이미 멀리 있는 낱말까지 직접 연결하는데, 굳이 한 걸음씩 상태를 넘겨 가며 정보를 나를 이유가 있을까?

그래서 순환 구조를 통째로 걷어냈습니다. LSTM도, 게이트도, 은닉 상태를 넘기는 고리도 전부 없앴어요. 남은 것은 어텐션과 평범한 완전연결층뿐이었습니다.

이렇게 만든 구조가 트랜스포머입니다. 결과는 번역 성능이 더 좋았고, 학습 시간은 훨씬 짧았습니다. 두 번째가 훨씬 중요한 결과였어요.

한 줄로 늘어선 청록빛 마디들이 서로 빠짐없이 가는 선으로 연결되어 그물을 이룬 모습 — 문장 안의 모든 낱말 쌍을 한 번에 직접 잇는 셀프 어텐션을 뜻하는 개념 이미지

셀프 어텐션 — 문장이 자기 자신을 돌아본다

트랜스포머의 핵심 부품은 셀프 어텐션입니다. 이름 그대로, 어텐션을 자기 자신에게 씁니다.

번역에서의 어텐션은 디코더가 인코더를 돌아보는 것이었죠. 셀프 어텐션은 한 문장 안에서 낱말들이 서로를 돌아봅니다.

"그 동물은 길을 건너지 않았다. 너무 피곤했기 때문이다." 여기서 '피곤했기'의 주체는 무엇일까요. '동물'이죠. 셀프 어텐션은 '피곤했기'를 처리할 때 '동물'에 높은 점수를 줍니다. 지시 관계를 스스로 찾아내는 겁니다.

그리고 결정적인 점이 있습니다. '동물'과 '피곤했기'가 아무리 멀리 떨어져 있어도 거리가 문제되지 않습니다. RNN에서는 열 걸음이면 흐려졌지만, 셀프 어텐션에서는 모든 낱말 쌍이 한 걸음 거리예요. 15회차의 장기 의존성 문제가 여기서 근본적으로 사라집니다.

그러면 순환 구조는 왜 필요한가

이제 앞의 질문에 답할 수 있습니다. 순환 구조가 하던 일은 먼 곳의 정보를 한 걸음씩 날라 오는 것이었습니다.

그런데 셀프 어텐션은 먼 곳을 직접 봅니다. 날라 올 필요가 없어요. 그러니 순환 구조는 이제 하는 일이 없는 겁니다.

그리고 순환 구조를 걷어내자 그것이 강제하던 제약도 함께 사라졌습니다. 바로 순차 처리라는 제약이요.

줄지어 선 청록빛 기둥들이 앞뒤 차례 없이 같은 순간에 한꺼번에 환하게 밝아지는 모습 — 모든 위치를 동시에 처리하는 병렬 계산을 뜻하는 개념 이미지

병렬 처리 — 이것이 진짜 혁명입니다

트랜스포머가 세상을 바꾼 진짜 이유는 성능이 아니라 이것입니다.

RNN에서는 열 번째 낱말을 처리하려면 아홉 번째가 끝나야 했습니다. 낱말이 천 개면 천 번을 줄 서서 지나가야 했어요.

셀프 어텐션에는 그 의존이 없습니다. 모든 낱말의 쿼리·키·값을 동시에 만들고, 모든 쌍의 점수를 동시에 계산합니다. 천 개짜리 문장을 한 번에 처리해요.

이것이 왜 결정적일까요. 14회차에서 본 대로 그래픽카드는 같은 계산을 수천 개 동시에 하는 장치입니다. RNN은 이 힘을 쓸 수 없었지만 트랜스포머는 남김없이 씁니다.

그래서 같은 시간에 훨씬 큰 모델을, 훨씬 많은 데이터로 학습시킬 수 있게 됐습니다. 18회차에서 다룰 규모의 법칙이 성립하려면 먼저 규모를 키울 수 있어야 하는데, 트랜스포머가 그 문을 연 것입니다. 오늘의 거대 언어 모델은 전부 이 문을 통과해 나왔습니다.

그런데 순서 정보가 사라집니다

공짜는 없습니다. 순환 구조를 걷어내자 순서 정보도 함께 사라졌어요.

셀프 어텐션을 다시 보세요. 모든 낱말 쌍의 관계를 계산합니다. 그런데 이 계산 어디에도 "이 낱말이 몇 번째인가"가 들어가지 않습니다.

그래서 낱말 순서를 뒤섞어 넣어도 결과가 똑같습니다. "개가 사람을 물었다"와 "사람이 개를 물었다"가 구별되지 않아요. 15회차의 낱말 가방으로 되돌아간 셈입니다.

RNN은 순서를 처리 방식 자체로 표현했습니다. 앞에서 뒤로 읽으니 순서가 저절로 반영됐죠. 그 방식을 버렸으니 순서를 다른 데 실어 줘야 합니다.

같은 크기의 청록빛 점들이 저마다 조금씩 다른 높이에 놓여 완만한 물결을 이루며 늘어선 모습 — 각 낱말에 자리 정보를 더해 주는 위치 인코딩을 뜻하는 개념 이미지

위치 인코딩 — 순서를 값에 새겨 넣기

해법은 단순합니다. 낱말을 나타내는 숫자 묶음에 위치를 나타내는 숫자를 더합니다. 이것을 위치 인코딩이라고 해요.

비유하자면 이렇습니다. 낱말마다 몇 번째 자리인지가 배어든 미묘한 색조를 입히는 겁니다. 같은 '개'라는 낱말이라도 첫 번째 자리의 '개'와 세 번째 자리의 '개'는 값이 살짝 달라져요. 그러면 어텐션이 그 차이를 읽어 순서를 파악할 수 있습니다.

원래 논문은 서로 다른 주기의 파동을 겹쳐 위치마다 고유한 무늬를 만들었습니다. 파동을 쓴 이유는 훈련에서 본 적 없는 긴 위치까지도 자연스럽게 이어지기 때문이었어요.

요즘 모델들은 이 자리를 계속 개량하고 있습니다. 위치를 절대값이 아니라 상대적 거리로 다루는 방식이 표준에 가까워졌어요. 뉴스에 나오는 "문맥 길이를 늘렸다"는 발표의 상당수가 실은 이 위치 표현을 손본 결과입니다.

멀티헤드 — 여러 관점으로 동시에 보기

어텐션을 한 번만 하면 아쉬운 점이 있습니다. 집중할 곳이 하나로 좁혀지기 때문이에요. 그런데 한 낱말은 여러 관계를 동시에 맺습니다.

"그 동물은 길을 건너지 않았다"에서 '건너지'는 누가 건너는지(동물), 무엇을 건너는지(길), 그리고 건넜는지 아닌지(않았다)를 동시에 알아야 합니다. 세 개의 다른 관계예요.

그래서 어텐션을 여러 벌 동시에 돌립니다. 각각을 헤드라고 부르고, 이 방식을 멀티헤드 어텐션이라고 합니다. 헤드마다 쿼리·키·값을 만드는 가중치가 달라서 서로 다른 관계에 집중하도록 학습돼요.

실제로 학습된 모델을 들여다보면 헤드마다 역할이 갈립니다. 어떤 헤드는 주로 바로 앞 낱말을 보고, 어떤 헤드는 지시 관계를 따라가며, 어떤 헤드는 문장 부호에 집중합니다. 아무도 그렇게 시키지 않았는데 분업이 생기는 겁니다.

똑같이 늘어선 청록빛 마디 줄이 세 겹으로 쌓여 있고 각 겹마다 연결선이 서로 다른 무늬를 그리는 모습 — 서로 다른 관계에 집중하도록 나뉜 멀티헤드 어텐션을 뜻하는 개념 이미지

트랜스포머 블록의 구성

이제 부품을 조립해 봅시다. 트랜스포머 블록 하나는 네 가지로 이루어집니다.

멀티헤드 셀프 어텐션이 낱말들 사이에서 정보를 섞습니다. 여기서 낱말 간의 관계가 처리돼요.

그다음 완전연결층이 각 낱말의 값을 따로따로 변환합니다. 여기서는 낱말들이 서로 섞이지 않아요. 어텐션이 가로로 섞었다면 이 층은 세로로 깊게 파는 셈입니다. 재미있게도 요즘 모델에서 파라미터의 대부분은 어텐션이 아니라 이 층에 들어 있습니다.

여기에 두 가지 안정 장치가 붙습니다. 잔차 연결은 14회차 레스넷의 그 지름길이에요. 층을 통과한 결과에 입력을 그대로 더해서, 아주 깊게 쌓아도 학습 신호가 앞까지 도달하게 합니다.

층 정규화는 각 층을 지날 때마다 값들의 크기를 일정한 범위로 맞춰 줍니다. 값이 지나치게 커지거나 작아져 학습이 불안정해지는 것을 막아요.

같은 블록을 그냥 쌓습니다

그리고 트랜스포머의 가장 놀라운 점이 여기 있습니다. 이 블록을 똑같이 여러 번 쌓는 것이 전부입니다.

층마다 다른 구조를 설계하지 않아요. 완전히 동일한 블록을 열두 번, 스물네 번, 요즘은 백 번 넘게 쌓습니다. 층이 깊어질수록 더 추상적인 관계를 다루게 되지만, 그것도 설계가 아니라 학습의 결과입니다.

이 단순함이 규모를 키우기 쉽게 만들었습니다. 모델을 키우고 싶으면 블록을 더 쌓거나 각 블록을 넓히면 됩니다. 새로 설계할 것이 없어요.

15회차 GRU에서 말한 교훈이 여기서 극단적으로 반복됩니다. 무엇이 본질인지 알고 나면 훨씬 단순하게 다시 만들 수 있다. 그리고 단순한 구조가 확장에서 이깁니다.

청록빛 테두리를 두른 똑같은 모양의 어두운 블록들이 위로 차곡차곡 쌓여 높은 기둥을 이룬 모습 — 완전히 동일한 블록을 반복해 쌓는 트랜스포머의 구성을 뜻하는 개념 이미지

인코더와 디코더, 그리고 갈라진 세 갈래

원래 트랜스포머는 번역용이라 인코더와 디코더를 모두 가졌습니다. 그런데 이후 연구는 셋으로 갈라집니다.

인코더만 쓰는 계열이 있습니다. 문장 전체를 놓고 이해하는 데 특화돼 있어요. 분류, 검색, 문장 의미 비교에 강합니다. 버트가 대표적입니다.

디코더만 쓰는 계열이 있습니다. 앞의 낱말들을 보고 다음 낱말을 만들어 내는 데 특화됐어요. GPT가 이 계열이고, 오늘날 우리가 쓰는 대화형 AI의 거의 전부가 여기 속합니다. 18회차의 주인공이에요.

둘 다 쓰는 계열도 남아 있습니다. 번역이나 요약처럼 입력과 출력이 뚜렷이 나뉘는 일에 쓰입니다.

결과적으로 디코더 계열이 주류가 됐습니다. "다음 낱말 맞히기"라는 단순한 목표 하나로 거의 모든 언어 과제를 흡수할 수 있다는 것이 밝혀졌기 때문인데, 그 이야기가 18회차입니다.

아래에서 올라온 하나의 청록빛 줄기가 위에서 두 개의 기둥으로 나뉘어 나란히 서는 모습 — 하나의 구조에서 인코더 계열과 디코더 계열로 갈라진 흐름을 뜻하는 개념 이미지

마스킹 — 답을 미리 보지 못하게

디코더 계열에는 반드시 필요한 장치가 하나 있습니다. 마스킹입니다.

문제는 이렇습니다. 셀프 어텐션은 모든 낱말이 서로를 봅니다. 그런데 "다음 낱말 맞히기"를 훈련시킬 때, 세 번째 낱말을 맞히는 중에 네 번째 낱말을 볼 수 있으면 어떻게 될까요. 답을 보고 답을 쓰는 셈입니다.

그러면 훈련 성적은 완벽하게 나오고 실제로는 아무것도 못 합니다. 10회차에서 다룬 데이터 누수의 아주 순수한 형태예요.

그래서 자기보다 뒤에 있는 낱말은 아예 보지 못하게 막습니다. 어텐션 점수를 계산할 때 뒤쪽 자리를 전부 차단하는 거예요. 이것을 인과적 마스킹이라고 합니다.

이 덕분에 훈련은 여전히 병렬로 할 수 있습니다. 모든 위치의 예측을 동시에 계산하되, 각 위치는 자기 앞쪽만 보게 하는 거죠. 병렬성을 지키면서 시간 순서를 지킨 영리한 장치입니다.

대가는 제곱입니다 — 문맥 길이의 비용

트랜스포머에도 분명한 대가가 있습니다. 그리고 이것이 오늘날 가장 큰 실무적 제약이에요.

셀프 어텐션은 모든 낱말 쌍의 점수를 계산합니다. 낱말이 열 개면 백 쌍, 백 개면 만 쌍, 천 개면 백만 쌍입니다. 길이가 두 배가 되면 계산은 네 배가 돼요.

RNN은 길이에 비례했습니다. 두 배면 두 배였죠. 트랜스포머는 제곱입니다. 병렬화를 얻은 대신 이 비용을 진 겁니다.

메모리도 마찬가지입니다. 그래서 문맥 길이를 늘리는 것이 어렵고, 늘렸다는 발표가 뉴스가 되는 거예요. "백만 토큰 문맥"이 왜 대단한 일인지가 여기서 설명됩니다.

이 제곱을 깨려는 연구가 활발합니다. 일부 쌍만 계산하는 방식, 근사로 대체하는 방식, 순환 구조를 다른 형태로 되살리는 방식까지. 15회차에서 물러났던 순환의 아이디어가 다른 모습으로 돌아오고 있다는 점이 흥미롭습니다.

왼쪽의 작은 무리는 몇 가닥의 연결선만 갖고 있는데 오른쪽의 큰 무리는 비교할 수 없이 빽빽한 연결선으로 뒤덮인 모습 — 길이가 늘면 계산이 제곱으로 불어나는 어텐션의 비용을 뜻하는 개념 이미지

실전 ① 문맥 길이가 왜 뉴스가 되나

이제 AI 뉴스의 한 축이 완전히 해독됩니다. 문맥 길이는 모델이 한 번에 볼 수 있는 분량이에요.

문맥이 짧으면 긴 문서를 통째로 넣을 수 없습니다. 잘라서 나눠 넣어야 하고, 그러면 문서 앞뒤를 연결하는 이해가 불가능해집니다. 계약서 전체를 놓고 모순을 찾는 일 같은 건 못 하죠.

문맥이 길면 책 한 권, 코드베이스 전체를 한 번에 넣을 수 있습니다. 그런데 비용이 제곱으로 늘어납니다. 그래서 문맥 길이는 언제나 성능과 비용의 맞바꿈이에요.

실무에서 알아 둘 점이 하나 더 있습니다. 문맥에 넣을 수 있다는 것과 잘 활용한다는 것은 다릅니다. 긴 문맥에서 중간에 있는 정보를 모델이 놓치는 현상이 꾸준히 보고되고 있어요. 넣을 수 있는 양이 아니라 실제로 쓰이는 양을 봐야 합니다.

실전 ② 트랜스포머는 언어만의 것이 아닙니다

트랜스포머의 어텐션에는 언어에 특화된 가정이 없습니다. "여러 조각이 있고 그들 사이의 관계가 중요하다"면 무엇에든 쓸 수 있어요.

그래서 이미지에도 갔습니다. 사진을 작은 조각으로 잘라 낱말처럼 다루면 그대로 작동합니다. 14회차의 CNN이 오랫동안 지키던 자리를 상당 부분 넘겨받았어요.

음성에도, 단백질 구조 예측에도, 코드에도 갔습니다. 아미노산 서열의 먼 위치끼리 접히며 만나는 관계를 어텐션이 잘 잡아냈죠.

이것이 22회차 멀티모달의 밑바탕입니다. 텍스트와 이미지와 음성을 같은 방식으로 다룰 수 있게 되자, 하나의 모델이 셋을 함께 다루는 길이 열렸어요.

실전 ③ 접근성에서 달라진 것

트랜스포머가 접근성에서 바꾼 것은 맥락입니다.

15회차에서 자동 자막과 자동 대체텍스트의 한계를 이야기했죠. 맥락을 모른다는 것이 공통된 약점이었습니다.

어텐션은 여기에 직접 작용합니다. 자막에서는 앞 문장 전체를 보고 지금 소리를 해석하니 동음이의어와 전문용어 정확도가 올라갔어요. 이미지 설명에서는 사진 안의 요소들 사이 관계를 다룰 수 있게 되어, 나열이 아니라 문장이 나오기 시작했습니다.

다만 14·15회차의 결론은 그대로입니다. 맥락을 더 잘 다룬다는 것이 맥락을 안다는 뜻은 아닙니다. 모델은 이 이미지가 왜 이 자리에 있는지, 이 회의에서 무엇이 중요한지를 모릅니다. 자동 생성물은 여전히 안전망이지 대체재가 아니에요. 25회차에서 이 선을 정면으로 다룹니다.

어둠 속에 같은 높이와 밝기의 청록빛 기둥 세 개가 나란히 솟아오른 모습 — 이번 회차의 핵심 정리 세 가지를 뜻하는 개념 이미지

핵심 정리 — 세 줄

첫째, 어텐션은 압축을 그만두고 필요할 때마다 원본을 돌아보는 장치입니다. 쿼리와 키로 관련도 점수를 내고, 그 비율대로 값을 섞어 옵니다. 인코더-디코더의 병목이 사라졌고, 모든 낱말 쌍이 한 걸음 거리가 되어 장기 의존성 문제가 근본적으로 풀렸습니다.

둘째, 트랜스포머의 진짜 혁명은 성능이 아니라 병렬 처리입니다. 순환 구조를 걷어내자 줄 서서 처리할 이유가 사라져 그래픽카드의 힘을 전부 쓸 수 있게 됐고, 그래서 모델을 지금 크기까지 키울 수 있었습니다. 대신 사라진 순서 정보는 위치 인코딩으로 값에 실어 보냅니다.

셋째, 구조는 단순하고 대가는 제곱입니다. 완전히 같은 블록을 반복해 쌓는 단순함이 확장에서 이겼지만, 모든 낱말 쌍을 계산하므로 길이가 두 배면 비용은 네 배가 됩니다. 문맥 길이가 뉴스가 되는 이유이고, 넣을 수 있는 양과 실제로 활용되는 양은 다릅니다.

용어 정리

어텐션 — 지금 필요한 것과 관련 있는 정보를 관련도에 비례해 섞어 오는 장치. 무엇에 얼마나 집중할지는 학습됩니다.

쿼리·키·값 — 각각 지금 찾는 것, 찾히기 위한 표지, 실제로 내어 줄 내용. 같은 낱말이라도 이 셋이 서로 다른 값으로 만들어집니다.

셀프 어텐션 — 한 문장 안에서 낱말들이 서로를 돌아보는 어텐션. 모든 낱말 쌍이 거리에 상관없이 직접 연결됩니다.

트랜스포머 — 순환 구조를 완전히 걷어내고 어텐션과 완전연결층만으로 만든 구조. 2017년 발표.

위치 인코딩 — 순서 정보를 낱말의 값에 더해 주는 장치. 순환 구조를 없애면서 잃은 순서를 되살립니다.

멀티헤드 어텐션 — 어텐션을 여러 벌 동시에 돌려 서로 다른 관계에 각각 집중하게 하는 방식. 헤드마다 역할 분업이 저절로 생깁니다.

잔차 연결 — 층을 통과한 결과에 입력을 그대로 더하는 지름길. 깊게 쌓아도 학습 신호가 앞까지 도달하게 합니다.

층 정규화 — 층을 지날 때마다 값의 크기를 일정 범위로 맞춰 학습을 안정시키는 장치.

인코더 계열 / 디코더 계열 — 각각 전체를 놓고 이해하는 데, 앞을 보고 다음을 만들어 내는 데 특화된 구조. 오늘날 대화형 AI는 대부분 디코더 계열입니다.

인과적 마스킹 — 각 위치가 자기보다 뒤의 낱말을 보지 못하게 차단하는 장치. 병렬성을 지키면서 시간 순서를 지킵니다.

문맥 길이 — 모델이 한 번에 볼 수 있는 분량. 어텐션 비용이 제곱으로 늘어 확장이 어렵습니다.

다음 회차 예고 — 그리고 생각해볼 질문

17회차는 「생성 모델」입니다. 제3부의 마지막 회예요.

지금까지 다룬 망은 대부분 판별을 했습니다. 이건 고양이인가 아닌가, 다음 낱말은 무엇인가. 그런데 오늘날 AI가 놀라움을 주는 영역은 없던 것을 만들어 내는 쪽이죠.

다음 회차에서는 판별과 생성이 어떻게 다른지부터 짚고, 위조범과 감별사가 서로를 훈련시키는 GAN의 발상, 그리고 오늘날 이미지 생성의 표준이 된 디퓨전을 다룹니다. 디퓨전은 노이즈 덩어리에서 조금씩 잡음을 걷어내며 그림을 조각하듯 만들어 내는 방법인데, 이 블로그의 삽화들도 그렇게 만들어졌어요.

생각해볼 질문. 오늘 어텐션의 핵심은 "전부 기억하려 하지 말고, 필요할 때 필요한 곳을 보라"였습니다. 압축을 잘하려던 노력을 포기하고 원본을 그대로 두는 쪽을 택한 거죠.

이건 사람이 정보를 다루는 방식과도 닮았습니다. 우리는 모든 것을 외우는 대신 어디를 찾아보면 되는지를 기억하죠. 여러분은 무엇을 외우고 무엇을 찾아보나요? 그리고 그 경계는 검색과 AI가 생기기 전과 후에 어떻게 달라졌나요? 댓글로 들려주세요.


이 포스트는 SVIL 연구소 「AI 기초 및 활용」 30회 시리즈의 16회차이며, 제3부 「딥러닝과 신경망」의 다섯 번째 회입니다. 하버드 CS50 AI, MIT 6.S191 등 공개 교육과정의 구조를 참고했으며, 모든 내용은 이미지 없이 본문만으로 이해할 수 있도록 구성되어 있습니다. 모든 이미지에는 내용을 설명하는 대체텍스트가 포함되어 있습니다.


협업문의 : kuroicode@gmail.com
블로그 : https://blog.svil.dev/
홈페이지 : https://kuroicode-beep.github.io/svil-homepage/