일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 행사다리꼴
- 사조사
- 수학적확률
- 통계학입문
- 이변량자료
- 이산확률질량함수
- 조건부확률
- 첨가행렬
- 이항분포
- 이산형
- 모수
- 범주형자료
- 균일분포
- 베르누이분포
- 포아송분포
- 표본평균
- 표본공간
- 확률밀도함수
- 기댓값과 분산
- 누적분포함수
- 연속확률변수
- pmf
- 절삭평균
- 기본행연산
- 수치형자료
- Anaconda
- 통계학개론
- jupyter notebook
- 피어슨상관계수
- 모평균
- Today
- Total
summ의 블로그
자연어처리 (6) transformer 본문
부스트코스 자연어 처리의 모든 것
Transformer
https://www.boostcourse.org/ai330/lecture/1455763?isDesc=false
" Attention is all you need "
attention 으로만 구현한 인코더 디코더 구조의 모델
RNN의 문제점
Long-term dependency
- 인코더는 입력 시퀀스를 처리하면서 각 시점마다 hidden state를 업데이트하고
- 최종적으로 마지막 시점의 hidden state가 context vector로 사용
- 전체 입력 시퀀스의 정보를 요약한 것으로, 디코더가 이를 이용해 출력을 생성
- 단어의 위치에 따라 순차적으로 입력받아 처리하기에 각 단어의 위치 정보를 가질 수 있음
- 문장이 길어질수록 앞에 있는 단어에 대한 정보 유실이 존재함
해결책
1. bi-directional RNNs
forward backward RNN 을 각각 만든 다음, 해당 hidden state vector를 concatenate하여 2배로 만든다.
---------> <----------
forward backward
I go home. I go home.
go 에대해 forward 는 I 를 담고
backward는 home 을 담음
단일 RNN보다 정보를 잘 반영함
2. Transformer
기본 구조
인코더 - 디코더 형태
입력 시퀀스를 인코더가 처리하고 이를 기반으로 디코더가 출력 시퀀스를 생성함
인코더
- input: 원문
- 각 인코더는 multi-head self-attention, 피드포워드 신경망으로 이루어진 서브층의 반복 블록 구조
- multi-head attention (self-attention): 입력 단어들이 서로 관계를 고려하여 가중치를 계산하고 연결되어 있음
- feedforwad: 각 위치의 출력 벡터에 대해 독립적으로 작동하며, 동일한 네트워크가 모든 단어에 적용
- 최종 output
- 각 단어의 워드 임베딩 벡터는 인코더의 마지막 단까지 독립적으로 유지됨
- 디코더의 multihead attention 으로 연결됨
- self attention 출력은 자신에게 영향을 미치는 단어들의 정보가 결합되어 있음
- 주어진 쿼리에 대해서 모든 키와의 유사도를 각각 구함
- 유사도가 반영된 벨류를 모두 가중합하여 리턴
디코더
- input: 현재까지 생성된 단어의 시퀀스
- 각 디코더는 multi-head self-attention, 피드포워드 신경망으로 이루어진 서브층의 반복 블록 구조
- 최종 output은 분류기에서 다음 단어의 예측에 사용됨
self attention 의 원리
각 입력 vector가 가중치 행렬을 이용해 3가지 벡터 양상을 가짐 (qeury, key, value)
why?
나에게 영향을 미치는 단어들의 정보를 모아서 내 인코딩 벡터에 반영하고 싶음
입력 시퀀스 내의 각 벡터가 다른 벡터들과 관계를 평가하고 가중치를 할당함
W_Q, W_K, W_V: 학습이 가능한 가중치 행렬
X: input vector
Query:
- 입력된 각 벡터가 다른 벡터들과의 관계에서 중요한지를 판단할 때,
- 어느 vector를 가져올지를 기준으로 사용하는 벡터
- "내가 어떤 정보를 찾고 있는가?"
Key:
- Query 벡터가 다른 벡터들과의 유사도를 비교할 때, 각 key vector와 유사도를 계산하는 기준이 되는 벡터
- "각 벡터가 갖는 특징을 요약한 벡터"
Value:
- Query, Key의 내적으로 산출된 점수에 softmax를 취해 가중치가 적용되는 정보 vector
- "최종 어텐션 벡터를 만들 때 사용되는 실제 정보"
동작 원리
- 입력 벡터 X는 W_Q, W_K, W_V 가중치 행렬에 의해 query, key, value vector로 변환
- query vector 와 key vector 간 내적을 수행하여 유사도 계산
- 계산한 유사도를 softmax함수를 적용해 확률 분포 형태로 변환하여 가중치로 사용
- 가중치를 value vector에 곱하고 합산하여 최종 self-attention output vector 만듦
어텐션 계산
q, K, V 를 입력으로 받아 i에 대한 합 계산
쿼리의 행렬 Q를 이용하여 표현
Q 와 K 전치행렬 내적계산 후 softmax를 취해 나온 가중치 값을 V에 곱하여 어텐션 벡터를 생성한다.
이때 !
scaled 된 내적 사용
과정:
찾고자 하는 정보를 갖는 vector 내적 수행 -> 유사도 계산 -> softmax를 취해 가중치의 가중합 -> 가중 평균 동일
(문제점 발생)
유사도 계산에서 자기 자신에 대한 내적을 계산하면 자기 자신에 대한 가중치가 제일 크다.
Query 와 key의 내적 결과값이 벡터 차원이 커지면 값이 커짐
이러한 결과는 특정 벡터에 너무 집중되거나, 확률 분포를 왜곡시킴
→ 방지하기 위해 scaled dot-product attention 사용
QK를 내적한 다음, d_k의 루트로 나눠주고 softmax를 취해줌
(내적 값을 벡터 차원의 제곱근으로 나누어 줌)
표준편차로 나눔 : scaling
→ 분산이 1로 유지되어 입력 벡터의 차원 수가 증가해도 내적 계산이 과도하게 커지는 것을 방지함
→ 안정된 확률 분포를 유지해 최종 가중합을 구할 때 균형 잡힌 출력 값을 가짐
multi-head attention
<< 기존의 어텐션 매커니즘을 확장한 구조 >>
여러 개의 attention 매커니즘(헤드)을 병렬로 사용하는 것
Q, K, V 에 대해 각각 선형변환을 하고
각각의 헤드로부터의 결과를 concat 하고, 선형변환을 통해 전체 인코딩 벡터를 얻음
계산 과정
- 입력벡터에 대해 Q,K,V 생성
- 각 헤드는 scaled 내적 attention을 계산해 서로 다른 벡터 출력 생성
- 모든 헤드에서 나온 결과 벡터를 concat해 큰 벡터 형성
- 다시 선형 변환을 해 최종 출력 벡터로 변환
헤드가 8개, 어텐션 결과 벡터가 차원이 3인 벡터라면
결과를 concat : 총 24개의 차원인 결과벡터를 선형변환하여 원하는 차원의 출력 벡터로 변환
입력으로 들어오는 입력값의 길이에 따라 메모리와 연산량에 영향을 받음
단일 어텐션을 병렬로 조합하여 성능을 향상
block-based 모델
Transformer의 전체 구조나 컴퓨팅 방식에 관한 설계. 블록 단위로 구성하여 반복하는 방식으로 트랜스포머 확장
각 인코더와 디코더는 블록 단위로 구성됨
하나의 블록 안에 멀티 헤드 어텐션, 피드포워드, 잔차 연결, 레이어 정규화 등 여러 layer를 포함되어 있음
이 블록이 여러번 반복되며 입력 시퀀스를 효율적으로 처리하고 정보를 학습함
일반적으로 2개의 주요 서브층으로 구성됨
멀티헤드 어텐션 서브층
- 입력 시퀀스의 self-attention 또는 cross-attention을 수행
- 입력 데이터를 다양한 방식으로 분석하여 단어 간의 관계를 학습
피드포워드 네트워크(FFN) 서브층
- 각 위치의 출력 벡터에 대해 독립적으로 작동하는 완전 연결 신경망
- 비선형 변환을 통해 더 복잡한 패턴을 학습
각 서브층의 출력은 다음 서브층의 입력으로 사용됨
두 서브층은 잔차 연결 및 레이어 정규화를 통해 연결되어 한개의 블록이 됨
3개의 벡터가 각각 query, key, value 로 들어가 멀티헤드 어텐션에 의해 계산
residual connection
- attention 을 거친 임베딩 벡터 (결과) + 기존의 임베딩 벡터 (입력)
- self-attention의 결과는 영향을 미치는 다른 단어들의 정보를 요약했기에 본래의 정보는 많이 변형됨.
- 잔차연결을 통해 본래 정보를 더해줌으로써 정보를 복원하는 것
- 서브층의 입력과 출력은 동일한 차원을 갖고 있기에 덧셈 연산 가능
layer normalization
- 평균 0 분산 1로 만들어주는 여러 normalization 존재
- 텐서의 마지막 차원에 대해 평균 0 과 분산1 으로 정규화하고, 가중치와 편향을 적용하여 학습을 도움
- batch normalization 과 유사하나 레이어 정규화는 각 시퀀스, 입력 단위에 독립적으로 적용
- 학습 효율을 높이기 위한 장치
Positional Encoding
각 위치마다 위치를 나타내는 정보를 추가함
why?
트랜스포머는 RNN 과 달리 단어 입력을 순차적으로 입력 받지 않음
단어의 임베딩 벡터에 위치정보를 더하여 모델의 입력으로 사용함
포지셔널 인코딩 값을 만드는 방법 2가지
: sin cos 함수를 사용
pos: 입력 문장에서의 임베딩 벡터의 위치
i: 임베딩 벡터 내의 차원의 인덱스 - 짝수면 sin 홀수면 cos
이를 사용하면 같은 단어라도 문장의 위치에 따라 입력으로 들어가는 임베딩 값이 달라짐
어텐션 매커니즘의 하이퍼파라미터 모음
주요 하이퍼파라미터
d_model: 임베딩 벡터의 차원. 피드포워드 신경망 은닉층 크기 (입력, 출력층 크기)
num_layers: 하나의 인코더와 디코더를 층으로 생각했을 때, 총 몇층인지? layer 갯수
num_heads: attention을 여러 개로 분할하여 병렬로 수행하고 결과값을 하나로 합치는 방식. 병렬의 갯수
d_ff: 피드포워드 신경망의 은닉층의 크기. d_model보다 더 큰 값으로 설정
너무너무 어렵다
교수님의 pdf 파일
https://jalammar.github.io/illustrated-transformer/
'자연어처리' 카테고리의 다른 글
자연어처리 (7) GPT와 BERT (0) | 2024.11.11 |
---|---|
자연어처리 (5) 출력값 생성기법 (1) | 2024.10.29 |
자연어처리 (4) seq2seq with attention (1) | 2024.10.24 |
자연어처리 (3) RNN (0) | 2024.10.15 |
자연어처리 (2) w2v & glove (2) | 2024.09.30 |