자연어 처리에서 공부를 하다보면 어텐션 메커니즘에 대해서 많이 듣게 됩니다
아무래도 구글에서 발표한 attention is all you need의 transformer에서도
self-attention(셀프 어텐션)을 사용하고
기존의 LSTM(RNN)과 seq2seq 문제를 극복하기 위해서 많이 사용되기 때문에 계속 듣게 됩니다
어텐션(attention)에 대해서 공부를 하려면 먼저 저 메커니즘에 대해서 알아야겠죠
그래서 이번 포스팅은 어텐션 메커니즘(attention machanism)에 대해서 정리합니다.
어텐션은 영상 처리쪽에서도 많이 사용됩니다.
아마 CS231n 강의 같은 것을 보셨으면 아래 사진을 보셨을 겁니다.
대충 느낌 오시죠? 이것은 인간의 시각적 집중(visual attention) 현상을 구현하는 신경망 기법입니다.
사람은 어떤 사진을 보면 그 사진의 전체를 보는 것이 아닌 한 포인트를 집중해서 봅니다
만약, 축구장에 공이 있다고 하면 '공'에 대해서 집중해서 보게되죠
그런 방법을 이용하는 것입니다.
기존에는 '가중치'에 대해서 계속 하고 있었는데요.
흔히 W라고 보는 것이었죠. 이것과 어텐션은 해당 값을 얼마나 가중시키냐?에 대해서는 같습니다.
하지만 어텐션은 전체 또는 특정 영역의 입력값을 반영해서 그 중 어떤 부분에 집중해야 하는지를 나타내줍니다
특히 기계번역(NMT, Neural Machine Translation)에서 사용합니다. 기존 컴퓨터 비전(cv, computer vision) 분야에서 시각적 집중을
자연어 처리에 활용을 하는 것이죠
기존 기계 번역(NMT) 는 인코더(encoder)와 디코더(decoder) 방식의 seq2seq 모델이 대부분이었는데 이것은 좀 단점이 있습니다.
보통의 경우 좋은 성능을 보이지만, 하나의 벡터에 인코더 부분에 해당하는 문장에 대한 모든 정보를 담고 있어서 문장 안의 개별 단어와의 관계를 확인하기도 어렵고 문장이 길어지면 앞서 나온 정보가 손실될 수도 있습니다.
그래서 어텐션 메커니즘이 부상하게됩니다!
구조는 아래처럼 됩니다.
이 그림으로 설명하겠습니다. (https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/10/06/attention/)
ratsgo 블로그에서 참고했습니다. 더 깔끔하고 명확한 설명은 위의 블로그 글을 보시면 됩니다.
인코더는 i번째 단어벡터 x_i를 받아서 해당되는 히든스테이트 벡터 h_i를 만듭니다.
그리고 이것을 양방향(bidirectional)로 해서 F에 둡니다. 화살표 방향을 보면 방향 값이 나옵니다.
디코더 계산 과정은 아래와 같습니다.
e_ij는 디코더가 i번째 단어를 예측할 때 쓰는 직전 스텝의! 히든스테이트 벡터 S_i-1가 인코더의 j번째 열벡터 h_j와 얼마나 유사한지를 나타내는 값입니다
만약 ‘딥러닝 자연어 처리’와 ‘deeplearning nlp’가 있으면 ‘자연어 처리’와 ‘nlp’가 점수가 높아야겠죠.
그리고 소프트 맥스 함수를 적용해 합이 1이 되도록 확률 값으로 변환해줍니다.
이제 디코더가 i번째 단어를 예측할 때 쓰이는 C_i는 아래와 같이 정의됩니다.
인코더의 j번째 열벡터를 어텐션 확률값으로 ‘가중합’을 했습니다.
가중합이라는 것은 각 확률값과 그 단어 벡터를 곱한 후 더하는 연산입니다.
이런 방법이 어텐션 메커니즘입니다.
어떤 단어를 예측할 때(s_i) s_i-1과 가장 유사한 인코더의 열벡터(hj)를 찾아내서 내적해서 값을 구해냅니다. 그리고 이 값이 또 다시 s_i로 들어가게 되죠
이렇게 유사하다고 판단되는 벡터를 찾아내서 가지고 옵니다.
예제로 보시고 싶으시면 케라스(keras)로 만들어진 attention-mechanism이 있습니다.
https://github.com/philipperemy/keras-attention-mechanism
'deep learning(딥러닝)' 카테고리의 다른 글
파이썬 딥러닝 기반 욕설 탐지 시스템 개발(개인 프로젝트)해보기! (22) | 2019.05.15 |
---|---|
keras 딥러닝 gpu 사용이 되고 있나? 확인해보자 keras gpu 확인 (0) | 2019.04.24 |
딥러닝을 활용한 번역기를 만들어보자!(python keras seq2seq translate model) (0) | 2019.03.13 |
텐서플로우(tensorflow) 모델 shape(모델 summary) 확인하기! (2) | 2019.03.07 |
파이썬 케라스(keras) LSTM으로 딥러닝하자! 네이버 영화 평점 데이터를 활용한 자연어 처리(NLP) (5) | 2019.03.04 |