기계번역
RNN -> LSTM -> Seq2Seq(고정된 크기의 vector 사용) -> Attention -> Transformer -> GPT-1 -> BERT
Seq2Seq로 딥러닝 기반 시계역 예측 등 기법이 등장
하지만, 성능상의 문제로 Attention 발전된 기법 등장.
이후, RNN을 아예 사용하지 않고, Attention 기법만 사용하는 Transformer모델 등장.
고정된 크기의 Vector : 병목이 발생하여, 성능 하락의 원인이 된다.
hidden state h1->h4, h4에서는 앞에서의 모든 단어?문장에 대한 정보를 가지고 있고, hidden state h4는 소스문장의 전체를 대표하는 context vector로 사용(문맥적인 정보를 담고 있다.)
디코더 부분에서 S1->S3에서는 이전에 출력했던 단어가 다시 입력으로 들어와서, 반복적으로 이전에 출력했던 단어에 대한 정보를 가지고 있던 hidden state와 같이 정보를 받아 새롭게 hidden state 값을 갱신하다. 기본적인 형태의 seq2seq의 동작 원리. -> 고정된 크기의 context vector로 압축하려고 하면, 입력 문장의 길이가 다를 수 있는 경우가 있는데, 이런 짧은문장, 긴문장의 정보를 고정된 크기로 가지고 있는 것은 전체 설명에서 병목현상의 원인이 될 수 있다.
-> 이러한 문제를 조금이나마 완화시키기 위해서, 고정된 크기의 context vector를 매번 RNN셀에서 참고 하도록 하여, 조금 더 성능을 개선 할 수 있다. 정보의 손실을 줄일 수 있어, 출력되는 문장이 길어진다고 하더라도, 기존보다 성능이 향상. 한계이다.
정리 : 하나의 문맥 벡터가 소스문장의 모든 정보를 가지고 있어야 하므로 성능이 저하된다. -> 특정행렬에 매번 단어가 출력되서, hidden state가 나올 떄 마다, 특정행렬에 정보를 기록, h1->h4의 정보를 다 가지고 있는 특정행렬이 생김. 디코더쪽에서, 매번 hidden state를 갱신하게 되는데, 이전의 hidden state값과 트정행렬에 있는 hidden state의 정보를 묶어서, 별도의 행렬 곱을 수행해서, 각각 h1,h2,h3,h4에 대한 energy값을 만들게 된다. 소스문장에서 어떤 단어에 초점을 둘 필요가 있는지 수치화해서 표현한 값이다. 그 에너지값에 소프트맥스를 취해서, 확률값을 구한뒤에 어떤 벡터(hidden state)에 더 많은 가중치를 두어서 참고하면 좋을 지를 반영해서, 그렇게 가중치 값을 다 hidden state에 곱한것을 각각의 비율에 맞게 더해 다음에, 그러한 weight sum 값을 반영해서, 출력 단어를 만들기 위해서 반영을 하겠다. context vector와 hidden state마다 있는 가중치를 반영해서(weighted sum값, 소프트맥스를 활용해서 나온 값), 어떤 단어에 더욱 집중을 해서 출력결과를 만들지 결정한다.
트랜스포머의 동작 원리: 입력 값 임베딩(Embedding)
트랜스포머의 이전의 전통적인 임베딩
각각의 정보들은 원핫인코딩을 거친다. 임베딩 디멘션은 모델을 아키텍처를 만드는 사람 마다 다르다. 네트워크에 넣기 전에, 입력값들을 임베딩 형태로 표현하기 위해서 사용한다.
(RNN을 사용할 경우, 각각의 단어들이 RNN을 통해서, 위치정보(순서에 대한 정보)를 가지게 되는데, RNN을 사용하지 않는 Transformer경우에는 위치정보(순서에 대한 정보)를 가지기 위해서, Positional Encoding을 사용한다.
성능 향상을 위해서,잔여학습(Residual Learning)을 사용한다.
Multi-head attention:입력 시퀀스 내의 각 단어가 다른 단어들과 얼마나 관련되어 있는지를 측정하는 메커니즘입니다.
Feed-Forward Neural Network
Feed-Forward Neural Network (FFNN) Layer: 이 층은 self-attention의 출력을 받아들이고, 각 위치에서 독립적으로 처리됩니다. 이 층은 주로 두 단계로 이루어져 있습니다. 먼저, 각 위치의 출력을 각 위치에 대해 독립적으로 처리하는 완전히 연결된 (fully connected) feed-forward 신경망을 사용합니다. 그런 다음, 이 신경망의 출력을 다시 각 위치에 대해 독립적으로 처리합니다.
이 FFNN 층은 크게 두 부분으로 나눌 수 있습니다:
a. 첫 번째 선형 변환 (Linear Transformation): 입력을 다음 층으로 전달하기 전에 선형 변환을 수행합니다. 즉, 입력 텐서에 가중치 행렬을 곱하고 편향을 더합니다.
b. 활성화 함수 (Activation Function): 일반적으로 ReLU (Rectified Linear Unit)나 GELU (Gaussian Error Linear Unit)와 같은 활성화 함수를 사용하여 비선형성을 추가합니다.
Multi-Head Attention
Multi-Head Attention
쿼리: 물어보는 주체,
키: 대상
값:
I am a teacher 문장에서, I가 I am a teacher 각각에 대해서 얼마나 많은 연관성이 있는지 구한다고 치면, 쿼리:I, 키: I, am, a, teacher. I가 문장 각각 단어 대한 가중치를 구하는.
마스크 행렬(Mask matrix):이용해 특정 단어는 무시할 수 있도록 한다.
Attention energies에서 love(무시할 단어가 love라면)에 가능한 0에 가까운 수를 넣어주게 되면, 실제로 softmax를 취하면, love를 무시하고 가중치를 확인할 수 있다.
Self-Attention
Self-Attention: it를 출력한다고 하면, 밑에 줄it이 의미하는 단어는, 첫번쨰 줄 Tree와 it과 관련해서,더 높은 score를 가지는 방식으로 학습이 된다.
Positional Encoding
Positional Encoding: 주기함수를 이용해서. sin과 cos둘다 성능에 차이가 크지 않아, 이후에 모델에는 sin과 cos 처럼 주기 함수를 사용하지 않고, 학습이 가능한 형태로, 별도의 인베딩 레이어를 사용.
전체 아키텍처
Transformer 모델은 Attention만으로 이루어진 encoder-decoder 구조의 seqence to seqence 모델입니다.
1. Encoder Self-Attention: 각각의 단어가 서로에게 어떠한 연관을 가지는지
2. Masked Decoder Self-Attention: 모두 참고 하지 않고, 앞쪽에 등장했던 단어들만 참고. 뒤에 나오는 단어까지 참고하면 치팅이 됨. 그래서 앞쪽에 등장하는 단어만 참고.
3. Encoder-Decoder Attention: 쿼리가 Decoder에 있고, key와 value는 인코더에 있는 상황. 인코더를 통해서, 어느 단어에 더 많은 가중치를 알아보기위해서.
Query, Key, Value
Attention 3가지, 왜 사용, 어떻게 사용
아키텍처 흐름, 설명
RNN, CNN 이전 모델들과 비교
정규화 3가지 방식
Positional Encoding
Residual Connection
Recurrence를 어떻게 없에고, 병렬처리가 가능하게 만들었는지?
Transformer 아키텍처는 순환 신경망(RNN)과 달리 자기 어텐션 메커니즘을 사용하여 recurrence를 없앴습니다. 이는 기존의 순환 네트워크보다 더 효율적인 학습과 병렬 처리를 가능하게 합니다.
자기 어텐션 메커니즘은 입력 시퀀스의 각 요소가 다른 모든 요소와 상호 작용할 수 있도록 하는 메커니즘입니다. Transformer에서는 Multi-head Self-Attention이라는 변형된 어텐션 메커니즘을 사용합니다. 이를 통해 각 입력 단어는 동시에 모든 다른 단어와 상호 작용할 수 있습니다.
병렬 처리 가능성은 여러 가지 측면에서 나타납니다:
Attention 메커니즘의 병렬 처리: Self-Attention 메커니즘이 각 단어 간의 상호 작용을 병렬로 계산할 수 있습니다. 이는 전체 입력 시퀀스의 모든 단어 간의 상호 작용을 동시에 계산할 수 있게 합니다.
층 간 병렬 처리: Transformer는 여러 층으로 구성되어 있으며, 각 층은 이전 층의 출력을 기반으로 독립적으로 계산됩니다. 이는 층 간에 병렬 처리를 가능하게 합니다.
포지션 임베딩: 순환 신경망과 달리 Transformer는 입력 시퀀스 내에서 단어의 위치 정보를 직접적으로 고려하지 않습니다. 대신에, 포지션 임베딩을 사용하여 각 단어의 상대적인 위치를 나타냅니다. 이는 입력 시퀀스의 단어들 간의 상대적인 위치를 병렬로 처리할 수 있게 합니다.
이러한 설계는 병렬 처리를 극대화하고 학습 속도를 높이는 데 도움이 됩니다. 더불어, Transformer 아키텍처는 더 긴 시퀀스에 대한 처리 능력도 향상시켰습니다.
Residual Connection이 무엇인지
Positional Encoding 하는 법
출처 :
https://www.youtube.com/watch?v=AA621UofTUA
Attention Is All You Need 논문
https://codingopera.tistory.com/43