Friday, August 3, 2018

논문 - A Structured Self-attentive Sentence Embedding



https://arxiv.org/abs/1703.03130 입니다. ICLR 2017이군요. 아주 간단히 요약하겠습니다.

목적

문장벡터 (sentence embedding)을 구합니다.

방법

Bi-LSTM과 self-attention을 이용합니다. Bi-LSTM이야 워낙 널리 쓰이니 self-attention이 포인트죠. 기존에는 단어의 representation 에 평균을 내는 방식같은걸 간단하게 썼었는데 (물론 더 복잡한것도 있습니다) 각각 문장의 어떤 부분을 봐야할지를 현명하게 결정하여 더 문장을 잘 요약해보자! 하는것입니다. 

Self-attention

일반적으로, 각 히든 레이어의 피쳐맵 혹은 피쳐벡터 $\mathbf{h}$가 있을 때 여기에서 어떤 부분에 집중해야 할지(attention)를, $\mathbf{h}$ 자기 자신을 기반으로 정하는거죠. 

논문의 2.1 부분을 봅시다.

<Bi-LSTM>


문장 $S$는 모종의 word embedding의 나열로 나타낼 수 있습니다.

$$S = (\mathbf{w_1}, \mathbf{w_2}, ... \mathbf{w_n})$$

여기에서 단어 하나는 각각 $d$차원 벡터입니다. 따라서 $S$는 ($n$-by-$d$) 차원이 되는군요.

여기에 Bi-LSTM을 적용합니다. 그러면 word embedding의 나열이 hidden vector의 나열로 바뀝니다. 그 결과가  $H$입니다.

$$H = (\mathbf{h_1}, \mathbf{h_2}, ... \mathbf{h_n})$$


<Self-attention>


Self-attention은 이 $H$를 기반으로합니다. 일단 $H$는 $n$-by-$2u$ 크기의 행렬입니다. $n$이 단어 갯수고 $2u$가 각 히든 유닛의 차원이지요. 이제 이 $2u$ 차원의 벡터를 $d_a$ 차원의 벡터로 바꿔줍니다. $d_a$는 하이퍼파라미터로 우리가 임의로 정해야합니다. 히든유닛 벡터를 어느정도 압축해야 좋을지 잘 고민해봐야겠죠. $W_{s1}$은 학습되는 weights가 되구요.

$$W_{s1} H^T$$

일반적인 행렬곱입니다. 이 결과에 tanh를 적용하여 결과를 [-1, 1] 사이로 압축합니다. 이 선택이 이론상 정당화되는건 아니지만 장점이 몇가지 있습니다. 일단 비선형성이고, 값의 범위를 제한해줘서 좋은점이 있는데 이는 식 (8, 9) 근처에 잘 나와있습니다. tanh(0) == 0이라서, 단어 수가 $n$보다 짧은 경우에 0벡터를 넣으면 최종적으로 attention 행렬 $A$도 0이 나오게 되어 그부분을 완전 무시한 representation $M$을 구할 수 있는건데요, 근데 지인에게 물어보니 이런 특징은 그닥 필요없고 걍 0벡터는 마스킹해서 처리하는것같기도 합니다.

$$tanh(W_{s1} H^T)$$

지금 상태가 $d_a$ 차원 벡터의 나열로 되어있죠. 여기에 *벡터* $\mathbf{w_{s2}}$를 다시 곱합니다. 이렇게하면 결과로 길이가 n인, 즉 단어수와 같은 길이를 갖는 벡터가 나오게 됩니다. 이 벡터도 학습이 필요한 weights입니다.

$$W_{s2}tanh(W_{s1} H^T)$$

마지막으로,  softmax를 적용해서 이 전체 합이 1이 되도록 합니다. 이 결과가  $a$ 입니다. 논문의 식 (5)입니다.

$$a = softmax(W_{s2}tanh(W_{s1} H^T))$$

이렇게 하면 a라는 벡터가 나오죠. 이 벡터는 히든유닛의 나열인 $H$에 element-wisely 곱해질거에요. 그 결과 히든유닛의 나열은 해당 작업의 '중요성'이 반영된 representation이 됩니다.

그런데, 목적에 따라 각각 다른 단어에 집중(attention)할 필요가 있습니다. 따라서 $a$같은걸 여러개 구해야해요. 논문의 표기로는 $r$개를 구하게 됩니다. 그러려면  *벡터* $\mathbf{w_{s2}}$ 대신에  *행렬* $W_{s2}$을 적용하면 됩니다. 그 결과도 행렬 $A$가 나오게 되구요. (식 (6))

길게 풀어썼는데, 논문에서 사실 간단히 요약합니다. 식 6은 바이어스가 없는 레이어 2개짜리 MLP를 적용한거라구요.


최종적으로, 이 가중치, 혹은 attention 행렬을 적용한 결과로 우리는 sentence embedding 행렬을 얻습니다.  $A$는 $r$-by-$n$, $H$는 $n$-by-$2u$ 행렬인데, 따라서 이를 곱한 결과는 단어수에 관계없이 $r$-by-$2u$ 크기의 행렬이 됩니다.

$$M = AH$$

식 (6, 7)은 M이 무의미한 값을 학습하지 않도록 regularise하는 내용입니다.

<모델 전체>

식을 보고나면 그림 1이 잘 이해가 됩니다. 지금까지 설명한 과정으로 $ M$을 구했고 여기에 fully-connected layer가 붙는군요. 최종적으로는 sentiment analysis작업을 수행합니다.




attention을 그대로 원래 단어에 적용하면 모델이 어떤 단어를 보고 작업을 수행하는지 잘 알 수 있습니다.



그 외의 실험 결과와 다른 내용은 논문을 직접 참고하시길 바랍니다.


2 comments:

  1. 좋은 논문 소개 감사드려요. 처음에 문장 하나가 d 차원이란 말씀은 각 word embedding W_i 의 차원이 d 라는 말씀이지요?

    ReplyDelete
    Replies
    1. 안녕하세요, 맞습니다. 제가 단어가 아니라 문장이라고 적었네요. 수정해야겠군요 - 감사합니다!

      Delete