> For the complete documentation index, see [llms.txt](https://lswkim322.gitbook.io/til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lswkim322.gitbook.io/til/til-ml/boostcamp/u-stage-nlp/05-sequence-to-sequence-with-attention.md).

# (05강) Sequence to Sequence with Attention

> * Sequence를 Encoding, Decoding 할 수 있는 sequence to sequence(Seq2Seq)
> * Seq2Seq에 Attention 로직을 추가한 모델
>
> **Further Reading**
>
> * [Sequence to sequence learning with neural networks, ICML’14](https://arxiv.org/abs/1409.3215)
> * [Effective Approaches to Attention-based Neural Machine Translation, EMNLP 2015](https://arxiv.org/abs/1508.04025)
> * [CS224n(2019)\_Lecture8\_NMT](https://web.stanford.edu/class/cs224n/slides/cs224n-2019-lecture08-nmt.pdf)

## 1. Seq2Seq (Sequence to Sequence)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk0fiMb-r2fdsbMjSLV%2F-Mk0hT5qd1XaKZoJb5Oy%2Fimage.png?alt=media\&token=240b32ed-2086-4fdf-b0db-0b7ac1a7061b)

Many to Many에 속하는 모델로 아래와 같은 Task에서 활용된다.

* 기계 번역 (Machine Translation)
* 챗봇 (Chatbot)
* 내용요약 (Text Summarization)
* STT (Speech to Text)

### 1.1. Basic Structure

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk0fiMb-r2fdsbMjSLV%2F-Mk0hobNwcsSYgrK-v-0%2Fimage.png?alt=media\&token=780cdff9-bffe-472c-847a-febd96528046)

* Encoder와 Decoder 영역으로 나뉘며 각각이 RNN모델로 구성되어 있다.
* 인코더에서 입력 문장의 모든 단어들을 순차적으로 입력 받은 뒤 이를 Context Vector로 만들고, Decoder는 이 Context Vector를 받아 번역된 단어를 순차적으로 출력하게 된다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk0fiMb-r2fdsbMjSLV%2F-Mk0iYVhyqR9uI84yasA%2Fimage.png?alt=media\&token=505ac3ec-45aa-403f-8191-fd4ed6a35c4a)

* 위의 내용을 다시 정리해보면 문장의 단어(토큰) 단위를 순차적 인코더에 입력하게 되고 인코더 RNN의 마지막 셀에서 Hidden State (은닉상태)를 디코더 RNN에게 넘겨주게 되는데 이를 Context Vector라고 한다.
* 디코더는 초기 입력으로 \<sos>(start of sentence)로 시작하게 되고, 마지막은 \<eos> (end of sentence)로 마침으로써 문장의 시작과 끝에 대해 알 수 있도록 하였다.
* 디코더 과정은 \<sos>를 디코더 RNN에 입력하여 다음에 올 단어를 예측하고 -> 예측한 단어를 그 다음 RNN 셀에 입력하는 식으로 \<eos>가 예측값으로 나올때까지 반복된다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk0fiMb-r2fdsbMjSLV%2F-Mk0jM5uYnL9l9nJLknQ%2Fimage.png?alt=media\&token=c035d51f-a54b-441b-9769-0ba768a78db7)

* 출력 단어로 나올 수 있는 단어들은 다양한 단어들이 있다. 여기서 한 단어를 선택하기 위해 Softmax 함수를 사용하게 된다.
* 디코더는 각 시점(time step)의 RNN 셀에서 출력 벡터가 나오면, 해당 벡터는 softmax 함수를 통해 출력 시퀸스의 각 단어별 확률값을 반환하고, 디코더는 출력 단어를 결정한다.&#x20;

### 1.2. Teacher Forcing (교사강요)

Seq to Seq 모델에서 ***Train***&#xC5D0; 사용하는 기법이다. 만약 초기에 예측한 값이 틀린 값이라면 그 이후로도 계속 잘못된 정보를 가지고 예측하게 될 가능성이 높고 연쇄작용으로 디코더 전체의 예측을 어렵게 한다. 이를 방지하기 위해 모든 시점에 대해서 예측값이 아닌 실제값을 입력해 주는 방법이다.

### 1.3. 한계점

* 하나의 고정된 크기의 벡터(Context Vector)에 모든 정보를 압축하다보니 정보손실이 발생한다.
* RNN의 고질적인 문제인 기울기 소실(Vanishing Gradient) 문제가 발생한다.

위와 같은 문제를 보완하기 위해 ***Attention***&#xC774;란 기법이 등장하였다.

## 2. Attention (어텐션 메커니즘)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk0fiMb-r2fdsbMjSLV%2F-Mk0rHO31CGDiAXfOdhp%2Fimage.png?alt=media\&token=7532a976-397c-4a31-aa1a-8025b059b4ba)

어텐션의 기본 아이디어는 디코더에서 출력단어를 예측하는 매 시점마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고 한다는 점이다. 단, 전체 입력문장을 동일 비율이 아닌 가중치를 줌으로서 연관이 있는 입력 단어부분을 좀 더 집중(Attention) 한다.

* $Attention(Q, K, V) = Attention Value$
* 어텐션 함수는 주어진 쿼리(Q) 에 대해서 모든 키(K) 와의 유사도를 각각 구합니다.
* 구해낸 유사도를 키와 매핑되어있는 각각의 값(V) 에 반영해줍니다.
* 유사도가 반영된 값(V)를 모두 더해서 리턴하며 이를 'Attention Value' 라고 한다.

### 2.1. Basic Structure

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk0fiMb-r2fdsbMjSLV%2F-Mk0rSP_xsOjhG9602ty%2Fimage.png?alt=media\&token=09165fa6-e772-4e69-8966-f94ed7ac2606)

* $$h\_1, h\_2, ..., h\_N$$ : 인코더의 hidden state
* $$s\_t$$ : t에서의 디코더의 hidden state&#x20;
* $$score(s\_t, h\_i) = s\_t^T  h\_i$$ : $$h\_N$$과 $$s\_t$$ Transpose 의 내적 값을 score로 정한다.(score 함수는 다양한 기법으로 사용가능, 여기서는 dot-product)
* $$e^t = \[s\_t^Th\_1, ..., s\_t^Th\_N]$$ : $$s\_t$$의 모든 $$h$$와의 $$score$$의 모음

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk0fiMb-r2fdsbMjSLV%2F-Mk0riVkxfvRFQtJk9zA%2Fimage.png?alt=media\&token=264b18ec-fa51-4b53-b706-f4755872184b)

* $$e^t$$에 소프트맥스 함수를 적용하여 확률분포를 얻어낸다. 이를 어텐션 분포(Attention Distribution)라고 한다.
* 어텐션 분포의 각각의 값을 어텐션 가중치 (Attention Weight)라고 한다.
* $$\alpha^t = softmax(e^t)$$

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk0fiMb-r2fdsbMjSLV%2F-Mk0rthSbedwCUfICdAv%2Fimage.png?alt=media\&token=11915d7e-545e-4301-98ff-7abce8259456)

* 어텐션의 최종 결과값을 구하기 위해 각 인코더의 hidden state와 어텐션 가중치값을 곱하고, 최종적으로 모두 더합니다. &#x20;

  $$at = \sum\_{i=1}^{N}{\alpha\_i^th\_i}$$
* 이러한 어텐션 값 $$a\_t$$를 Context Vector 라고도 불립니다. (seq2seq와 같은 개념은 아님.)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk0fiMb-r2fdsbMjSLV%2F-Mk0s4a-thZQv7QY7iG5%2Fimage.png?alt=media\&token=5daea97e-b415-4105-8594-670b9289ba3d)

* 어텐션 값($$a\_t$$)과 디코더의 hidden state ($$s\_t$$)의 결합(Concatenate)하여 하나의 벡터로 생성한다.
* $$v\_t = concat(s\_t, a\_t)$$

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk0fiMb-r2fdsbMjSLV%2F-Mk0sEaIIbcGmTObwpZF%2Fimage.png?alt=media\&token=da41697f-a841-45b6-9fd2-cef6b02844d5)

* 논문에서는 $$v\_t$$를 바로 출력층으로 보내기 전에 신경망 연산을 한번 더 추가하였습니다.
* 가중치 행렬과 곱한후 tanh함수를 씌워 새로운 벡터 $$\widetilde{s\_t}$$를 얻습니다.
* seq2seq에서는 출력층의 입력이 $$s\_t$$였다면, 여기서는 $$\widetilde{s\_t}$$이 되는 것이다.
* 즉, $$\widetilde{s\_t} = tanh(W\_c\[a\_t;s\_t] +b\_c)$$로 볼 수 있다.(위 그림)
* 출력 : $$\hat{y\_t} = Softmax(W\_y\widetilde{s\_t} + b\_y)$$

### 2.2. 요약

1. 인코더의 hidden state(h)와 디코더의 hidden state(s)를 활용하여 score를 구한다.(다양한 기법의 score함수 존재)
2. 위에서 구한 score 집합 $e^t$를 소프트맥스 함수를 적용하여 attention 분포와 가중치값을 구한다.
3. 각 인코더의 hidden state(h)와 어텐션 가중치를 각각 곱하고, 이를 모두 더해 어텐션 값($a\_t$)을 구한다.
4. 어텐션 값과 디코더의 hidden state(s)를 결합(Concat)하여 하나의 벡터로 생성한다,
5. 위 concat값을 output layer의 입력값으로 입력되어 결과를 얻게 된다.

### 2.3. 장점

* **Attention significantly improves NMT performance**
  * It is useful to allow the decoder to focus on particular parts of the source
* **Attention solves the bottleneck problem**
  * Attention allows the decoder to look directly at source; bypass the bottleneck
* **Attention helps with vanishing gradient problem**
  * Provides a shortcut to far-away states
* **Attention provides some interpretability**
  * By inspecting attention distribution, we can see what the decoder was focusing on
  * The network just learned alignment by itself

## 관련코드 Link

{% embed url="<https://drive.google.com/file/d/1d5hYpCAs6cUvxQtjOUdftXRioIYGu-Fw/view?usp=sharing>" %}

{% embed url="<https://drive.google.com/file/d/1dMhghw5pCz95Sd89VpsmkGH-HrH646K1/view?usp=sharing>" %}

{% content-ref url="/pages/-MjhLvKa4Z8oTC6f8leP" %}
[Sequence to Sequence](/til/til-ml/untitled/sequence-to-sequence.md)
{% endcontent-ref %}

## Reference

* [시퀀스 투 시퀸스](https://wikidocs.net/24996)
* [어텐션 메커니즘](https://wikidocs.net/22893)
* [딥러닝을 이용한 자연어 처리 입문](https://wikidocs.net/24996)
