
RNN
언어 모델이라는 건, 사실 다음에 올 단어를 확률로 예측하는 것이다. 이러한 언어 모델들을 어떻게 발전시켜왔는 지 살펴보자. 이미 이전 포스트에 서 자세히 살펴보았던 내용이다.…
2025/04/27
Jinsoolve.
Categories
Tags
4월 안에는 꼭...
About
Seq2Seq에서 RNN을 아예 빼버리고 attention으로 구성해보면 어떨까? → Transformer의 구조
현재는 seq2seq + attention에서는 하나의 벡터로 요약해서 decoder로 넘겨준다. 이건 여전히 RNN의 방식을 따르고 있다.
cross attention은 원본 문장을 참고하면서 번역하는 것이고, self attention은 지금까지 내가 쓴 문장을 참고하면서 다음 단어를 고르는 것이다. 이 2개를 모두 합치는 것이 Transformer이다.
전에 seq2seq에서 decoder의 query와 encoder의 key/value를 보았다면
이젠 스스로의 query에서 스스로의 key/value를 보는 구조라고 생각하면 된다.
근데 여기서 문제가 이렇게 되면 글의 순서를 모른다는 점이다.
따라서 단어 벡터에다가 위치 정보를 더해 준다.
Position Representation은 여러 가지 방식이 있다.
sin, cos 함수를 이용해서 주기적으로 반복해서 위치 정보를 만든다.
여기서 주기적이기 때문에, 값이 커져도 주기성으로 인해 해당 값에 대해서도 예상이 가능하다.(extrapolation)
하지만, 학습이 불가능하다보니 실제로 extrapolation이 잘 안 된다.
말 그대로 p 벡터를 학습 가능한 파라미터로써, 학습시켜서 값을 얻겠다는 생각이다.
학습 가능하다보니, 유연하다. 하지만 주기성이 없어서 extrapolate할 수 없다. 범위를 나가버리면 정의할 수 없다.
i와 j의 차이에만 집중하고 i, j 각각의 값은 신경 쓰지 않겠다는 방식이다.
내적은 회전시켜도 값이 그대로인 것을 이용해서 위치를 회전을 통해서 반영시키는 방식이다.
그냥 Feed-forward network(은닉층이 1개인 신경망, MLP(Multi-Layer Perceptron)) 을 넣어서 해결한다.
언어 모델은 오른쪽 Context를 실제로 보지 못 하는데 이걸 어떻게 반영할 것이냐의 문제.
attention score를 로 설정하면 exp 했을 때 0이 되므로 해당 단어를 무시하게 된다.
이런 식으로 오른쪽 context의 단어를 무시하게 만든다.
그래서 transformer는 어떻게 생겼는지를 보자.
먼저 transformer의 decoder를 한 번 보자.
오른쪽이 transformer decoder, 왼쪽이 개선된 self-attention이다.
약 3가지 정도가 다르다.
head가 여러 개라는 것은 글을 여러 개의 관점으로 바라본다. 즉, 각자 집중해서 보는 게 다르다는 의미다.
이떄 각 head는 독립적으로 계산하고 계산 효율을 위해 기존 d 차원을 나눠써 쓰기만 하다보니 결과적으로 cost는 크게 변하지 않는다.
이런 식으로 덩어리만 나눈 것이 된다.
이때 d가 커지면 dot product가 너 무 켜지게 될 수 있다.
dot product는 softmax의 입력인데, softmax 그래프 특징 상 입력값이 너무 크면 gradient가 0에 수렴한다. 따라서 업데이트가 잘 안 된다.
다르게 보면 결과가 마치 one-hot vector처럼 되어버려서 업데이트가 안 된다고도 생각해 볼 수 있다.
이걸 해결하기 위해 로 나눠준다.
이전 입력을 더해주면서 다음과 같은 효과를 지닌다.
정규화의 효과는 워낙 유명하다.
데이터를 안정화시켜 주기 때문에(너무 크거나 작은 걸 막아줌) 학 습이 잘 된다.
결론적으로 이런 식의 구조를 Transformer Decorder는 갖는다.
Transformer Encoder는 사실 Transformer Decoder에서 masking 여부만 하지 않는 차이다.
이때 Decoder에서는 앞뒤 문맥을 모두 확인하고 싶을 때, Encoder에게 정보를 참고해서 생성하게 된다.
이런 식으로 Encoder는 bi-directional 하게 양방향의 context를 모두 알고 있고, Decoder는 uni-directional하게 생성하고 있다. 이때 decoder는 미래를 알 수 없어서 오른쪽 context를 모르고 있지만 encoder는 알고 있다. 따라서 encoder의 출력을 보고 decoder가 필요한 정보를 attend해서 갖고 온다.
위 decoder가 encoder에게서부터 갖고 오는 것을 Cross-Attention이라 한다.
쉽게 말하면 디코더의 query가 encoder의 key / value를 차고해서 decoder 값을 출력하는 방식이라는 의미다.
Self-attention의 계산량이 sequence 길이의 제곱(𝑂(n²)) 에 비례한다는 문제.
RNN은 선형(𝑂(n)) 이라서 긴 문장 처리에 유리한데, Transformer는 길어질수록 계산량이 급증한다.
Attention을 할 때는 모든 토큰쌍 (query-key)을 계산해야 해서,
예를 들면 n=30이면 900번 계산이지만,
긴 거리(long-range) 의존성을 쉽게 잡는다
Self-attention은 모든 단어 쌍 사이에 연결을 만든다.
예를 들어, 첫 번째 단어랑 100번째 단어 사이 관계도 바로 연결할 수 있어.
RNN처럼 순서대로 거쳐야 하지 않으니까 멀리 떨어진 관계도 바로 포착 가능.
병렬화가 쉽다 (Easier to parallelize)
RNN은 시퀀스를 순서대로 처리해야 해서 한 번에 여러 작업을 못했어.
Transformer는 모든 단어를 동시에 처리할 수 있어서,
→ GPU 같은 병렬 장비에서 엄청 빠르게 학습할 수 있어.
위치 정보(Positional Information)를 충분히 담을 수 있나?
기본 self-attention은 순서를 고려하지 않고 “집합(set)“처럼 데이터를 본다.
그래서 positional encoding(위치 정보를 넣는 방법)이 꼭 필요하다.
→ 만약 positional encoding이 약하면 문장의 순서를 모델이 잘 이해 못할 수도 있음.
Self-attention은 계산량이 Quadratic (𝑂(n²))이다
모든 단어 쌍을 비교해야 해서, 문장 길이(n)가 길어지면 n²만큼 계산량이 늘어남.
→ 문장이 길어지면 매우 느려진다.
예를 들어, n이 10배 길어지면 연산량은 100배 늘어나는 거야.
언어 모델이라는 건, 사실 다음에 올 단어를 확률로 예측하는 것이다. 이러한 언어 모델들을 어떻게 발전시켜왔는 지 살펴보자. 이미 이전 포스트에 서 자세히 살펴보았던 내용이다.…
2025/04/27
이전 포스트에서 RNN에서 Vanishing Gradient로 인해 장기 의존성 문제가 있다는 사실을 이야기했다. 이런 Vanishing Gradient를 해결하기 위해 크게…
2025/04/27
기존 RNN의 병목 현상을 해결하기 위해 Attention이 등장했다. Decoder에서 한 단어를 예상할 때, 해당 단어와 특별히 관련되어 있는 Encoder의 특정 단어를…
2025/04/27
저번에 word vector에 대해서 알아봤는데, 이번에는 word vector의 프레임워크인 Word2Vec에 대해서 좀 더 알아보자. 먼저 Word2Vec이 어떤 식으로…
2025/04/26