1) 하나의 고정된 크기의 벡터(컨텍스트 벡터)에 모든 정보를 압축하려니 정보 손실 발생
2) RNN의 고질적인 문제 Vanishing gradient(기울기 소실) 문제 발생
이로인해 등장한 것이 ⭐Attention 기법⭐
: 매 time step마다 인코더에서의 전체 입력 문장을 다시 한번 참조한다.
단, 전체문장을 동일한 비율로 참고하는것이 아닌,
해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어부분을 좀더 집중(attention)해서 본다!
시각적 집중 현상을 구현하기 위한 신경망적 기법이다.
= 우리가 보는 것에 대해서는 높은 집중력, 보지않는 것은 낮은 집중력
[Encoder]
나
-(누적)-> 는
-(누적)-> 학생
-(누적)-> 이다
-(누적된 은닉상태= Context Vector)
나온 총 은닉상태 값인 컨텍스트 벡터를 디코더의 입력 은닉 상태값으로 사용한다.
즉, 나는 학생이다
란 전체 문장에 대한 은닉상태값을 계속해서 사용하는 것이다.
[Encoder]
나
-> 은닉1
는
-> 은닉2
학생
-> 은닉3
이다
-> 은닉4
은닉상태값이 각 단어의 시점마다 따로 갖고 있는다.
💢
attention은 한가지에 집중한다는 뜻인데, 디코더의 매순간에 어텐션하면 이게 어텐션인가?
어텐션(attention)은 주어진 쿼리에 대해 관련성이 높은 키-값 쌍을 찾아내는 메커니즘이다.
디코더의 매 시점에서 인코더에 어텐션을 적용하는 것은
주어진 쿼리와 관련된 정보를 인코더에서 선택하고 집중하여 활용하는 과정을 의미
그래서 디코더의 현재 상태와 인코더의 특성을 조합하여 가중치를 계산함으로써 어텐션을 수행합니다. 이를 통해 디코더는 매번 적합한 정보에 집중하고, 그에 따라 다양한 시점에서 적절한 출력을 생성할 수 있게 됩니다.
즉, 디코더가 인코더의 다양한 특성을 참고하여 매번 다른 부분(다양한 특성)에 집중하고, 그 부분의 정보를 활용하는 것!!!!!!
✨ Attention은 모델이나 layer가 아닌 기법이다!
우리가 보고자하는 부분에 높은 집중을 구현하기 위한
하나의 기법이다!
✨ 가중치와 attention 이 유사하다고 생각할 수 있지만..
attention은
가중치와 달리 전체 or 특정 영역의 입력값을 반영하여
그중에 어떤 부분에 집중해야 하는 지를 나타내는 것을 목표로 한다.
따라서, 특정 영역을 찾아내서 반영하는 것
가중치 같은 경우는
최종값과 같아지기 위해 (전체적인) 가중치를 늘릴지 줄일지 결정하는 것
RNN의 back propagtion 방법
-> BPTT
BackPropagation Trough Time : 백프로퍼게이션을 자기자신으로 오는 weight에 대해서도 n번의 시간만큼 학습시키는 것
🧑 attention VS dot-product attention
attention
: 주어진 입력 시퀀스 내에서 특정 위치에 주목하고, 그에 따라 가중치를 할당하는 ""메커니즘""
->이로인해, 입력 시퀀스 내에서도 중요한 정보를 강조하고+필요한 정보를 선택적으로 집중할 수 있도록 함!
dot-product attention (기본방식)
(어텐션 메커니즘의 한 구현 방식)
: 쿼리와 키의 내적을 계산하여 유사도를 측정 -> softmax함수를 사용하여 유사도 값을 정규화 -> 정규화된 가중치 값을 곱하여 어텐션 값을 얻게 됨.
이 방식은 가장 간단하면서도 널리 사용되는 어텐션 구현 중 하나! 다른 구현 방식도 있음
=> 다른 어텐션 메커니즘과의 차이 = 주로 중간 수식의 차이.(메커니즘 자체는 거의 유사함)
(의의)
1) 확률로 해석 가능해지게 됨
softmax의 형태를 취하고 있기에 어텐션을 사용함으로써 확률적으로 해석할 수 있게 됨
2) 장거리 의존성 문제 해결
attention 을 사용하여 인코더의 각각의 단어에 따라 다른 은닉상태의 값을 뽑아낼 수 있고,
각각의 어텐션 value값들에 따른 가중치들이 반영이 되기때문에
기존의 RNN에 비해서 장기의존성 문제가 발생하는 부분이 조금 해소될 수 있다.
🥙 어텐션 사용하는 이유!
어텐션 메커니즘을 사용하지 않는 경우
모든 입력 단어들의 정보가 하나의 고정된 벡터로 압축되어 디코더에 전달되기 때문에 입력 시퀀스가 길어질수록 정보의 손실이 발생할 수 있습니다.
하지만 어텐션 메커니즘을 사용하면
입력 시퀀스의 모든 단어들이 각각의 가중치를 가지고 상대적인 중요도가 반영된 문맥 벡터를 생성하게 됩니다.
(= 즉, 서로대응되는 단어에 큰 가중치를 줄수있도록 어텐션 계층을 추가하는 것!)
(학습과정)
(Encoder)
𝒉_𝒊
: 디코더의 현재 시점 상태를 기준으로
입력 시퀀스의 각 단어와의 관련성 계산
(Decoder)
Attention score
Encoder의 각 은닉상태마다 , Decoder의 3번째(attention할?) 은닉상태를 곱해준다.
e^𝑡
: 현재 시점 t에서 decoder의 (출력)단어를 예측하기위해 encoder의 모든 h_t(은닉상태) 각각이
decoder의 현 시점 은닉 상태 s_t와 얼마나 유사한지를 판단하는 스코어값
🥪 내적을 하는 이유!
두 벡터사이의 거리가 가까울 수록 내적값은 더 큰 값을 가진다!
= 즉, vector들 간의 비슷한 정도
= 유사한 단어를 찾아내는 것!
💢
"모든 어텐션 스코어 값은 스칼라이다"
어텐션 스코어 값이 스칼라(숫자) 값으로 나타난다는 것을 말함
즉, 어텐션 스코어는 벡터나 행렬이 아닌 단일 숫자들로 표현된다
💢 디코더의 hidden state에만 왜 전치를 해줌?
디코더의 hidden state는 일반적으로 2D텐서 형태로 표현.
인코더의 hidden state는 3D 텐서 형태이기 때문.
따라서 차원을 맞추기 위해 전치를 해주는 것.
(softmax함수를 사용해 확률로 변환한다.)
e^𝑡
에 softmax
함수를 적용하여 모든 값을 합하면 1이되는 확률분포를 얻어냄
= 어텐션 "분포"(Attention Distribution)
= 𝛼^𝑡
(알파임..ㅎ)
(분포 각각의 값들
= 어텐션 가중치(Attention Weight))
: 가중합
-> 디코더가 현시점에서 입력 시퀀스의 정보를 얼마나 활용해야하는 지를 나타내는 벡터
정보들을 하나로 합치는 단계
attention의 최종 결과값
인코더의 은닉상태(h_i 각각
) X 어텐션 가중치 값(𝛼^i
)
-> 위의 곱을 각 시점마다 계산한후, 모두 더해줌
= 𝑎_𝑡
= attention value (어텐션 함수의 출력값)
= 보정된 컨텍스트 벡터(context vector) : 인코더의 문맥을 포함하고 있어 컨텍스트 벡터라고 불리기도 함
소
모든 시점에 대해서 각 시점마다
크로스 엔트로피
)를 계산하고역전파
를 수행하여 모델의 가중치를 조절한다.어텐션 스코어 계산
디코더의 현재 시점의 상태를 기준으로
입력 시퀀스의 각 단어와의 관련성을 계산
어텐션 가중치 계산
softmax를 이용해 확률 분포로 해석
문맥 벡터 생성: 가중합하여 문맥벡터 생성
디코더가 현재 위치에서 입력 시퀀스(=인코더)의 정보를 얼마나 활용해야 하는지를 나타내는 벡터로 / 디코더가 예측하는 단어와 관련된 입력 시퀀스의 정보를 담고 있습니다.
디코더의 출력 토큰 예측: 문맥 벡터와 디코더의 현재 입력 토큰을 결합하여 디코더의 출력 토큰을 예측합니다. 이 예측된 출력 토큰은 다음 시점에서의 디코더 입력으로 사용됩니다.
: 중간 수식인 attention score 함수를 어떤거를 쓰냐에 따라 조금씩 달라짐
이해위해.. )
자신의 점수가 궁금한 Query는 자기와 비슷하게 생긴 Key들의 Value를 보고 자신의 점수를 추측한다.
🚫 seq2seq에서 디코더의 첫 input은 어케되는건가? 그냥 집어넣어?
🚫 전체 attention하는 것인데
특정부분에 집중할 수 있다는 attention의 특징은 뭘 얘기하는거?
🚫 attention은 seq2seq와 어떤 차이점에서 한계를 안느끼는가?
🚫 마지막 부분에 attention이 추가적인 신경망 쓰는 부분 아직 이해 못함
Attention 메커니즘에서의 가중치 행렬은 주로 시점 간의 관계를 계산하는 용도로 사용되며, 갱신되지 않습니다.
🚫 추가적인 신경망을 안쓰고 오직 seq2seq와 attention 만으로만 학습은 불가한 것인가???