'머신러닝'에 해당되는 글 2건

  1. 2022.02.15 :: 딥러닝 - 어텐션 메커니즘(Attention Mechanism)
  2. 2022.01.20 :: 자연어 처리 개요
머신러닝 2022. 2. 15. 17:18

어텐션 메커니즘

시퀀스-투-시퀀스(seq2seq) 모델 같은 경우는 인코더에서 입력 시퀀스를 컨텍스트 벡터(context vector)라는 하나의 고정된 크기의 벡터 표현으로 문장 시퀀스를 압축하고, 디코더는 해당 컨텍스트 벡터를 이용해 출력 시퀀스를 만들어낸다.

 

하지만, 이러한 RNN에 기반한 seq2seq 모델에는 아래와 같은 문제점이 있다.

  1. 하나의 고정된 크기의 벡터에 문장 시퀀스 정보 모두를 압축하려 하기에 정보 소실이 발생한다.
  2. RNN의 고질적인 문제인 기울기 소실(vanishing gradient)문제가 존재한다.

 

즉, 위와 같은 문제로 기계번역 같은 분야에서 입력된 문장의 길이가 길어지게 되면 번역 성능이 크게 줄어든다. 하지만 어텐션이라는 아이디어로 긴 입력 시퀀스에 대한 품질이 떨어지는 것을 보정 해줄 수 있다.

 

어텐션의 아이디어

어텐션은 디코더에서 출력 단어를 예측하는 매 시점마다, 인코더에서의 전체 입력 문장을 다시 한번 참고하는 것이다. 하지만 여기서 중요한 것은 입력 문장 전체를 동일 비율로 참고하는 것이 아니라, 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분에 조금 더 집중(attention)해서 보게 된다.

 

어텐션 함수

Attention(Q, K, V) = Attention Value

 

어텐션 함수는 주어진 쿼리(Q)에 대해서 모든 키(K)와의 유사도를 각각 구한 후 각 키와 매핑된 값(V)에 반영해준다. 그리고 유사도가 반영된 값을 모두 더해 리턴하는데, 여기서 리턴된 값을 어텐션 값(Attention Value)라고 한다.

 

Q = Query : t 시점의 디코더 셀에서의 은닉 상태
K = Keys : 모든 시점의 인코더 셀의 은닉 상태들
V = Values : 모든 시점의 인코더 셀의 은닉 상태들

 

닷-프로덕트 어텐션(Dot-Product Attention)

디코더의 세번째 시점의 LSTM 셀에서 출력 단어를 예측하는 예제

 

디코더의 세번째 LSTM 셀은 출력 단어를 예측하기 위해서 인코더의 모든 입력 단어들의 정보를 다시 한번 참고한다. 인코더 쪽의 소프트맥스 함수를 통해 나온 결과값은 I, am, a, student 단어 각각이 출력 단어(suis가 입력으로 들어간 세번째 시점의 LSTM 출력 )를 예측할 때 얼마나 도움이 되는지의 정도를 수치화한 값이다. 그리고 각 입력 단어가 디코더의 예측에 도움이 되는 정도를 수치화하여 하나의 정보로 담아서 디코더로 전송한다. 결과적으로 해당 어텐션 값을 이용해 디코더는 출력 단어를 더 정확하게 예측할 확률이 높아진다.

 

어텐션 스코어

 

 

인코더의 각 시점의 은닉 상태(hidden state)를 각각 h1,h2,..hn이라고 하고, 디코더의 현재 시점 t에서의 디코더의 은닉 상태를 st라고 한다. 다시 돌아가서, 디코더의 현재 시점 t에서 필요한 입력값은 바로 이전 시점인 t-1의 은닉 상태와 이전 시점 t-1에서 나온 출력단어이다. 그런데 어텐션 메커니즘에서는 출력 단어 예측에 어텐션 값이라는 새로운 값이 필요하다. 여기서 t시점의 출력을 예측하기 위한 어텐션 값을 at라고 하자.

 

우선 어텐션 스코어(Attention score)를 구해보자. 어텐션 스코어란 현재 디코더의 시점 t에서 단어를 예측하기 위해, 인코더의 모든 은닉 상태 각각이 디코더의 현 시점의 은닉상태 st와 얼마나 유사한지를 판단하는 스코어값이다.

 

닷-프로덕트 어텐션에서는 이 스코어 값을 구하기 위해 st를 전치(transpose)하고 각 은닉 상태와 내적(dot product)을 수행한다. 아래 그림은 st과 인코더 i번째의 은닉 상태의 어텐션 스코어의 계산 방법이다. 여기서 어텐션 스코어 값은 모두 스칼라 값을 가진다.

 

 

 

소프트맥스 함수를 통해 어텐션 분포 구하기

 

위 et에 소프트 맥스 함수를 적용하여, 모든 값을 합하면 1이 되는 확률 분포를 얻어낸다. 이를 어텐션 분포라고 하며, 각각의 값은 어텐션 가충치(Attention Weight)라고 한다. 예를 들어 소프트맥스 함수를 적용하여 얻은 출력값인 I, am, a, student의 어텐션 가중치를 각각 0.1, 0.4, 0.1, 0.4라고 하고, 이들의 합은 1이다.

 

디코더의 시점 t에서의 어텐션 가중치의 모음값인 어텐션 분포를 αt이라고 할 때, αt을 식으로 정의하면 다음과 같다.

 

 

각 인코더의 어텐션 가중치와 은닉 상태를 가중합하여 어텐션 값(Attention Value)을 구한다.

 

어텐션 값을 얻기 위해 각 인코더의 은닉 상태와 어텐션 가중치 값들을 곱하고, 최종적으로 모두 더한다. 요약하자면 가중합(weighted Sum)을 진행한다. 수식으로 표현하면 아래와 같다.

 

이러한 어텐션 값은 종종 인코더의 문맥을 포함하고 있다고 하여, 컨텍스트 벡터(Context Vector)라고도 불린다.

 

어텐션 값과 디코더의 t 시점의 은닉 상태를 연결한다.(Concatenate)

 

 

어텐션 함수의 최종값인 어텐션 값 at을 구했고 그리고 at st와 결합(concatenate)하여 하나의 벡터 Vt로 만드는 작업을 수행한다. 그리고 이 Vt y^ 예측 연산의 입력으로 사용하므로서 인코더로부터 얻은 정보를 활용하여 y^를 좀 더 잘 예측할 수 있게 된다. 이것이 어텐션 메커니즘의 핵심이다. 하지만 여기서 나온 Vt를 바로 출력의 입력으로는 사용하지 못하고, 아래 그림과 같이 출력층으로 보내기 전에 신경망 연산을 통해 기존 은닉층과 같은 벡터 차원으로 만들어준 후에 나온 St^값을 입력으로 넣는다.

 

 

 

위와 같이 St^를 출력층의 입력으로 사용해 예측 벡터를 얻는다.

 

위에서 설명한 dot-product 어텐션 말고도 다양한 어텐션 종류가 있다. 하지만 그 차이는 중간에 수식 차이이다.

 

위에서 St는 Query, Hi는 keys, Wa와 Wb는 학습 가능한 가중치 행렬이다. 즉, 쿼리는 디코더의 현재 시점의 은닉 상태, 키는 모든 인코더의 은닉 상태를 뜻하며 이러한 값들을 이용해 최종적인 어텐션 값을 구하게 된다.

posted by 여성게
:
머신러닝 2022. 1. 20. 10:49


해당 포스팅은 위 이미지의 책의 챕터3을 읽은 리뷰입니다. :)

자연어 처리 개요

단어 표현

텍스트를 자연어 처리를 위한 모델에 적용할 수 있게 언어적인 특성을 반영해서 단어를 수치화하는 방법을 찾는 것이다. 보통 단어를 수치화할 때는 주로 벡터로 표현한다. 따라서 단어 표현은 "단어 임베딩(word embedding)" 또는 "단어 벡터(word vector)"로 표현한다.

단어 임베딩 기법

  • 원-핫 인코딩(one-hot encoding) : 단어를 하나의 벡터로 표현하며 각 단어는 벡터 값 가운데 하나만 1이라는 값을 가지고 나머지는 모두 0값을 가짐.
  • 분포 가설(Distributed hypothesis)
    • 카운트 기반 방법 : 어떤 글의 문맥 안에 단어가 동시에 등장하는 횟수를 세는 방법(동시 등장 횟수를 하나의 행렬로 나타낸 뒤 그 행렬을 수치화해서 단어 벡터를 만듬)
    • 예측 방법 
      • Word2vec
        • CBOW(Continuous Bag of Words) : 어떤 단어를 문백 안의 주변 단어들을 통해 예측하는 방법(창욱은 냉장고에서 _____ 꺼내서 먹었다.)
        • Skip-Gram : 어떤 단어를 가지고 특정 문맥 안의 주변 단어들을 예측하는 방법(____ ________ 음식을 _____ _____)
      • NNLM(Neural Network Language Model)
      • RNNLM(Recurrent Neural Network Language Model)
    • 카운트 기반 방법과 예측 방법 모두를 차용해서 쓰는 단어 임베딩 기법
      • Glove

텍스트 분류

텍스트 분류는 자연어 처리 문제 중 가장 대표적이고 많이 접하는 문제다. 자연어 처리 기술을 활용해 특정 텍스트를 사람들이 정한 몇 가지 범주(class) 중 어느 범주에 속하는지 분류하는 문제다.

분류해야 할 범주의 수에 따라 문제를 구분

  • 이진 분류(binary classification) : 2가지 범주에 대해 구분하는 문제
  • 다중 범주 분류(Multi classfication) : 3가지 이상의 범주에 대해 구분하는 문제

지도 학습을 통한 텍스트 분류


위 그림과 같이 지도 학습은 샘플(데이터)에 대해 각각 속한 범주에 대한 값(레이블)이 이미 주어져 있다. 따라서 주어진 범주로 글들을 모두 학습한 후 학습한 결과를 이용해 새로운 글의 범주를 예측하는 방법이다.

  • KNN
  • 나이브 베이즈 분류
  • 서포트 벡터 머신
  • 신경망
  • 선형 분류
  • 로지스틱 분류
  • 랜덤 포레스트

비지도 학습을 통한 텍스트 분류



비지도 학습에서는 데이터만 존재하고, 각 데이터는 범주로 미리 나눠져 있지 않다. 따라서 특성을 찾아내서 적당한 범주를 만들어 각 데이터를 나눈다.
비지도 학습을 통한 분류는 어떤 특정한 분류가 있는 것이 아니라 데이터의 특성에 따라 비슷한 데이터끼리 묶어주는 개념이다.

  • K-means Clustering
  • Hierarchical Clustering

텍스트 유사도

텍스트 유사도란 말 그대로 텍스트가 얼마나 유사한지를 표현하는 방식 중 하나다. 유사도를 판단하는 척도는 매우 주관적이기 때문에 데이터를 구성하기가 쉽지 않고 정량화하는 데 한계가 있다. 이를 최대한 정량화해서 모델을 만드는 것이 중요하다.
일반적으로 유사도를 측정하기 위해 정량화하는 방법에는 여러 가지가 있다. 단순히 같은 단어의 개수를 사용해서 유사도를 판단하는 방법, 형태소로 나누어 형태소를 비교하는 방법, 자소 단위로 나누어 단어를 비교하는 방법 등 다양하다.
또한 딥러닝을 기반으로 텍스트의 유사도를 측정하는 방식도 있다. 단어, 형태소, 유사도의 종류에 상관 없이 텍스트를 벡터화한 후 벡터화된 각 문장 간의 유사도를 측정하는 방식이다.

자카드 유사도

두 집합(각 문자을 형태소 분리한 형태소의 집합)의 교집합인 공통된 단어의 개수를 두 집합의 합집합, 즉 전체 단어의 수로 나눈다.

유클리디언 유사도


n차원 공간에서 두 점 사이의 최단 거리를 구하는 접근법이다.

맨하탄 유사도


유클리디언 유사도처럼 출발점과 도착점까지를 가로지르지 않고 갈수 있는 최단 거리를 구하는 공식이다.

코사인 유사도


코사인 유사도는 두 개의 벡터값에서 코사인 각도를 구하는 방법이다. 코사인 유사도 값은 -1과 1 사이의 값을 가지고 1에 가까울수록 유사하다는 것을 의미한다. 다른 유사도 접근법에 비해 일반적으로 성능이 좋은데,
이는 단순히 좌표상의 거리를 구하는 다른 유사도 측정 방법에 비해 코사인 유사도는 말 그대로 두 벡터 간의 각도를 구하는 것이라서 방향성의 개념이 더해지기 때문이다.

posted by 여성게
: