Link
10-22 06:19
«   2020/10   »
        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 31
Archives
Today
253
Total
1,079,383
관리 메뉴

꿈 많은 사람의 이야기

기계 번역에 어텐션 메커니즘 적용하기 - 딥러닝 자연어처리 공부 본문

deep learning(딥러닝)

기계 번역에 어텐션 메커니즘 적용하기 - 딥러닝 자연어처리 공부

이수진의 블로그 이수진의 블로그 2019. 7. 22. 12:56

지난 포스팅에 seq2seq 모델을 적용시켜서 기계 번역에 대해서 알아보았습니다.

인공지능 기반 자연어 처리 번역 즉, 기계 번역(NMT)은 규칙 기반부터 확률, 통계 기반으로 시작하여 현재 딥러닝을 활용해 기계 번역을 하는 역사를 가지고 있다는 것도 배웠죠

또한, 그 중심에 seq2seq 모델이 있다는 것도 배웠습니다.

 

하지만 seq2seq는 한계가 있습니다. 그 한계는 바로 번역이 잘 되지 않는다는 것이죠

 

그래서 어텐션 메커니즘이 나오게 됩니다.

Attention Mechanism은 무언가에 집중한다는 개념입니다. 이 어텐션 메커니즘의 효과는 정말 어마어마합니다.

현재 자연어처리 분야에 있어서 어텐션 메커니즘을 안쓰는 곳이 없기 때문이죠. 또한 인공지능, 딥러닝 분야에서도 핫한 기술이기도 합니다.

이 어텐션 메커니즘을 더 크게 적용시킨 것이 구글의 트랜스포머(transformer)입니다. 

 

그래서 오늘은 트랜스포머까지는 아니지만, 어텐션 메커니즘에 대해서 알아보고자 합니다.

자! 그러면 딥러닝 자연어처리(deep learning nlp) 어텐션 메커니즘 시작합니다.

 

 

먼저 왜 어텐션 메커니즘을 쓰게 되었냐는 것입니다.

어텐션 메커니즘은 seq2seq의 문제점으로 인해 나오게 되었습니다. 지난 포스팅에 보면 encoder에서 항상 고정 길이의 벡터를 담는다고 했습니다. 근데 이게 필요한 정보가 모두 담기지 못한다는 문제점이 있습니다.

 

번역을 하는데 문장의 길이가 짧은 것들만 들어올까요? 아닙니다. 어마어마한 길이의 문장도 들어옵니다. 즉, 길이가 길어지면 앞의 문장의 정보를 잃어버리는 문제가 발생하게 되죠

그래서 어텐션 메커니즘이 나오게 됩니다.

 

 

그럼 어텐션 메커니즘으로 어떻게 적용이 되었을까요? 바로 위와 같이 적용이 되었습니다.

encoder와 decoder가 전부 개선이 되었는데요. encoder에 대한 개선은 위와 같습니다.

마지막 은닉층만 전달하는 것이 아니라, LSTM에서 나온 각 출력값을 모아줍니다. 이 출력값들을 하나하나 모아서 hs라는 벡터를 만들어줍니다. 즉, hs는 기존 처럼 마지막 h 벡터가 아니라 모든 LSTM층의 정보를 담고 있습니다.

그리고 word_1에서 나온 h 정보는 word1에 대한 정보를 가장 많이 담고 있겠죠? 그리고 word_0에 대한 정보도 담고 있을겁니다. 하지만 word_1에 대한 정보를 더 많이 담고 있을겁니다.

이런 특징을 가진 h를 모아서 hs로 모아줍니다

 

 

자! 이제 decoder에 대한 개선입니다. decoder는 앞서 글과 마찬가지로 h 벡터를 받습니다. 그리고 마지막 은닉층의 대한 정보를 받게 되어있죠. 입력이 그렇게 들어가니까요. 이거를 hs 전부를 이용할 수 있도록 개선합니다.

즉, '나' 라는 단어를 'i'에 집중할 수 있도록 하는 것이죠

 

 

그래서 위와 같이 진행될 것입니다. 어떤 계산을 진행하는데 이 어떤 계산은 LSTM의 은닉 상태와 hs를 받아서 적용시킵니다.

그리고 첫 번째 LSTM은 hs의 마지막 줄을 받게 되죠.

 

이제 이 어떤 계산에 대해서 알아보죠

 

 

어떤 계산의 방법은 위와 같습니다. 모든 단어를 기여도(가중치)를 별도로 계산을 합니다.

예를 들어 '나'와 'i'에 대한 부분이면 '나'와 'i'에 대한 가중치가 높아야겠죠? 그래서 a라는 부분을 통해 가중치를 줍니다.

그리고 이 가중치는 0.0 ~ 1.0 사이의 값을 뜻하고 나머지 가중치를 다 더하면 1이 됩니다.

이후에 가중합(weighted sum)을 통해서 원하는 벡터를 추출합니다. 즉, 이렇게 가중합을 통해 나온 벡터는 '나'에 대한 가중치가 높으니까 '나'에 대한 값이 많이 담겨있겠죠?

 

그럼 궁금합니다. 저 a는 어떻게 구하나???

 

 

a를 구하는 방법은 위에 나와있습니다. h와 hs가 얼마나 비슷한가?를 수치적으로 표현하는 것이죠

이것을 구하는 방법은 벡터의 내적을 이용한다고 합니다. 벡터의 내적을 구하면 어떤 값이 나오겠죠?

 

 

이렇게 말입니다. 어떤 값이 나오게 될 것입니다. 그럼 이 값을 score라고 표현합니다. 이 score 값을 이제 softmax를 통해서 확률 값으로 바꿔줍니다!

 

 

softmax 과정을 거치고 나면 이렇게 score 값이 앞서 설명한 벡터 a와 같은 형태로 됩니다. 즉, 모두 합치면 1이 되고, 가중치가 적용된 형태이죠

이렇게 해서 a를 구하게됩니다.

 

 

 

앞서 저희가 보아왔던 과정을 위처럼 간략하게 표현할 수 있습니다. h와 hs가 들어오고 attention weight를 구하고 여기서 나온 a를 토대로 weighted sum(가중합)을 하면 어떤 c가 나오죠

 

이 과정을 어텐션(attention)이라고 합니다!

 

 

그 말인 즉 저희가 아까 봤던 '어떤 계산'은 바로 어텐션이라고 말할 수 있습니다.

그리고 그 어텐션 과정은 h와 hs를 토대로 a라는 값을 뽑고 어떤 단어가 어디에 focus가 맞춰지는지 attention 값을 매기는 것이죠.

 

이것이 바로 어텐션 메커니즘입니다.

그럼 실제로 적용시키면 무슨 일이 발생할까요?

 

 

지난번 toy problem에서는 덧셈을 테스트 해보았습니다. 여기서는 날짜 번역에 대한 문제인데요

날짜를 번역하는데 잘 번역하는 것을 볼 수 있습니다.

즉 july 18, 1970은 1970-07-18  로 잘 번역이 되는 것이죠

 

 

그리고 어텐션 메커니즘을 사용하면 이렇게 시각화를 할 수 있습니다.

어텐션이 어느쪽에 포커스를 맞추었는지 해당되는 부분을 시각화 해주면 이렇게 보이게 됩니다.

값을 보니까 2,6은 2,6에 august는 08에 집중이 되어 있는 것을 볼 수 있습니다.

정말 신기하죠?

 

자연어 처리 분야에서는 이것을 더 확장시켜 적용시키고 있습니다.

어느 분들은 어텐션이 자연어 처리의 미래가 될 것이다 라고 말하는 분들도 있었습니다. 그만큼 중요하다는 것이죠

 

오늘 포스팅은 여기까지입니다!

 

4 Comments
댓글쓰기 폼