이 냄새는...! 궁금증의 냄새가 나는군!
나 스피드웨건이 냄새를 맡고 나타났다!
요즘 핫하다는 챗GPT니 뭐니 하는 AI들의 뇌 구조인 '트랜스포머(Transformer)'!
그런데 이 녀석에게 치명적인 약점이 있었다는 사실, 알고 있었나?!
(화들짝 놀라며) 아니 뭐라고?! 천하의 AI가 약점이 있다고?!
바로 '순서'를 모른다는 것이다!
이 몸이 그 비밀과 해결책인 '포지셔널 인코딩'에 대해
뼛속까지 시원하게 설명해주지!
나 스피드웨건이 냄새를 맡고 나타났다!
요즘 핫하다는 챗GPT니 뭐니 하는 AI들의 뇌 구조인 '트랜스포머(Transformer)'!
그런데 이 녀석에게 치명적인 약점이 있었다는 사실, 알고 있었나?!
(화들짝 놀라며) 아니 뭐라고?! 천하의 AI가 약점이 있다고?!
바로 '순서'를 모른다는 것이다!
이 몸이 그 비밀과 해결책인 '포지셔널 인코딩'에 대해
뼛속까지 시원하게 설명해주지!
1. 트랜스포머의 치명적 결함?!
기존의 RNN이라는 녀석들은 단어를 하나씩 순서대로 먹었지.
"나는", "밥을", "먹는다" 순서로 말이야.
그래서 순서를 헷갈릴 일이 없었어!
하지만 트랜스포머는 다르다!
속도를 높이기 위해 문장 전체를 한꺼번에 병렬(Parallel)로 처리한다고!
(두 주먹을 불끈 쥐며) 빠르긴 하지만, 순서 정보가 싹 사라져 버린다는 거야!
🚨 스피드웨건의 긴급 예시!
AI 입장에서는:
A: "스피드웨건이 죠나단을 때렸다"
B: "죠나단이 스피드웨건을 때렸다"
이 두 문장의 단어 구성이 같아서 똑같은 뜻으로 인식할 수도 있다는 거야!
이건 정말 끔찍한 일이 아닐 수 없지 않나!
순서를 모르면 문맥이 완전히 파괴된다!AI 입장에서는:
A: "스피드웨건이 죠나단을 때렸다"
B: "죠나단이 스피드웨건을 때렸다"
이 두 문장의 단어 구성이 같아서 똑같은 뜻으로 인식할 수도 있다는 거야!
이건 정말 끔찍한 일이 아닐 수 없지 않나!
그래서 천재적인 개발자들이 고안해낸 것이 바로...
포지셔널 인코딩(Positional Encoding)이다!
2. 위치 정보를 문신처럼 새겨라!
해결책은 의외로 간단하다!
단어 자체가 가진 의미(임베딩 벡터)에다가
"너는 첫 번째야", "너는 두 번째야"라는 위치 정보값을 더해주는 것이다!
마치 마라톤 선수에게 등번호를 붙여주는 것과 같지!
아무리 섞여 있어도 등번호(위치 정보)가 있으면 순서를 알 수 있으니까!
💡 핵심 공식 요약
최종 입력값 = 단어 임베딩(Word Embedding) + 위치 인코딩(Positional Encoding)
단어의 원래 의미를 해치지 않으면서,
은근슬쩍 위치 정보를 더해주는 것이 포인트다!
최종 입력값 = 단어 임베딩(Word Embedding) + 위치 인코딩(Positional Encoding)
단어의 원래 의미를 해치지 않으면서,
은근슬쩍 위치 정보를 더해주는 것이 포인트다!
Q. 임베딩 벡터는 뭐지?
🎩 스피드웨건:
오오! 굉장한 질문이다! (모자를 고쳐 쓰며) 인공지능의 심장부를 꿰뚫어 보는 통찰력!
나 스피드웨건이 이 몸의 지식을 총동원하여 그 ‘임베딩 벡터’가 구체적으로 어떻게 생겨먹었는지 속 시원하게 알려주마!
---
임베딩 벡터, 그 정체는 숫자의 영혼이다!
가장 간단하게 말하면, 그것은 숫자들이 나열된 긴 리스트다! (손가락으로 세로선을 그리며)
컴퓨터는 '죠죠', '파문', '스탠드' 같은 단어의 의미를 바로 이해하지 못한다. 그래서 이 몸이 이 녀석들에게 단어의 의미를 주입해 줘야 한다! 그 의미를 담는 그릇이 바로 임베딩 벡터군!
예를 들어, 죠르노 죠바나의 'Giorno'라는 단어가 있다고 해보자. 이 단어는 512차원 혹은 768차원 같은, 어마어마하게 긴 숫자의 행렬로 표현된다!
```
[ 0.732, -0.115, 0.450, ..., 0.987, -0.001 ] <- 이런 식의 숫자 덩어리다!
```
이 숫자 하나하나가 의미의 좌표를 나타낸다! (흥분하며)
0.732는 '황금'과 얼마나 가까운지!
-0.115는 '파괴력'과 얼마나 먼지!
이 숫자들이 모여서 단어가 가진 고유한 '영혼'을 만들어내는 것이지! 임베딩 벡터는 곧 단어가 AI 세계에서 존재하는 좌표 그 자체다! 아주 멋진 일 아닌가!
---
3. 아니 여기서 삼각함수가 왜 나와?!
그런데 말이다!
그냥 1, 2, 3, 4 정수를 더하면 되는 거 아니냐고?
(검지 손가락을 흔들며) 쯧쯧, 그렇게 단순하지가 않다!
숫자가 계속 커지면 나중에는 단어 본래의 의미보다
위치 숫자가 너무 커져서 데이터를 망가뜨릴 수 있어!
게다가 학습 때 보지 못한 긴 문장이 나오면 AI가 당황해버린다고!
그래서 사용한 것이 바로 주기 함수인 사인(Sin)과 코사인(Cos)이다!
📐 Sin/Cos을 쓰는 이유!
1. 값의 범위가 일정하다! (-1에서 1 사이)
2. 규칙적이다! (파동처럼 부드럽게 연결됨)
3. 상대적 위치를 알기 쉽다! (수학적으로 아름다운 관계!)
이 파동을 이용하면 문장이 아무리 길어져도,1. 값의 범위가 일정하다! (-1에서 1 사이)
2. 규칙적이다! (파동처럼 부드럽게 연결됨)
3. 상대적 위치를 알기 쉽다! (수학적으로 아름다운 관계!)
각 위치마다 고유하고 유니크한 위치 값을 가질 수 있게 되는 거지!
정말 우아하지 않나! 마치 파문 호흡법처럼 말이야!
📝 스피드웨건의 3줄 요약!
1. 트랜스포머는 병렬 처리 때문에 단어 순서를 모른다! (치명적 약점!)
2. 그래서 단어 벡터에 '위치 정보(Positional Encoding)'를 더해준다!
3. 이때 Sin, Cos 같은 삼각함수를 써서 위치 값을 아주 예쁘게 만들어준다!
이것이 바로 AI가 우리가 쓰는 말의 어순을 이해하는 비법이었던 것이다!
이제 어디 가서 "포지셔널 인코딩이 뭔지 아나?" 하고 아는 척 좀 할 수 있겠군!
설명은 끝났다! 나 스피드웨건은 이만 쿨하게 떠나주지!
도움이 되었다면 "고마워요 스피드 웨건!" 이라는 댓글과 함께 공감 부탁한다!