다양한 모델들

MostlyFor·2023년 1월 9일

자연어처리

목록 보기
3/11

해당 글은 wikidocs의 '딥 러닝을 이용한 자연어 처리'를 학습하고 내용을 재구성하여 다음과 같은 순서로 작성되었습니다.

순서

  1. 텍스트 전처리 (Text Preprocessing)
  • 문장에서 불필요한 부분들 제거
  1. 단어의 다양한 표현 방법
  • 모델이 학습할 수 있게 text를 숫자로 표현하는 방법
  1. 다양한 모델들
  • 숫자로 표현된 단어들을 input으로 가지고 목적에 맞는 output을 내는 다양한 모델들

참고 자료
https://wikidocs.net/31767

언어 모델 : 언어라는 현상을 모델링하고자 단어 시퀀스(문장)에 확률을 할당하는 모델.

언어 모델을 만드는 방법은 크게 통계를 이용한 방법과 인공 신경망을 이용하는 방법 2가지가 있다.

1. 언어 모델(통계를 이용한 방법)

통계적 언어 모델(Statistical Language Model, SLM)

단어 시퀀스의 이전 맥락에 따라 다음 단어가 나올 확률이 각각 달라지므로 단어가 n개인 시퀀스 W가 나올 확률은 다음과 같다.

P(W)=P(w1,w2,w3,...  wn)=i=1nP(wiw1,...  wi1)P(W) = P(w_1,w_2,w_3,...\;w_n) = \prod_{i=1}^n P(w_i|w1, ...\;w_{i-1})

An fresh apple in the box is delicious. 라는 문장이 있다고 하자.

P(isAn  fresh  apple  in  the  box)=count(An  fresh  apple  in  the  box  is)count(An  fresh  apple  in  the  box)P(is|An\;fresh\;apple\;in\;the\;box) = \cfrac{count(An\;fresh\;apple\;in\;the\;box\;is)}{count(An\;fresh\;apple\;in\;the\;box)}

모델이 학습한 코퍼스에서 An fresh apple in the box가 100번 나왔는데 그 이후 60번에 is가 나왔으면 확률은 60%가 되고 다른 것들이 아무리 커봐야 40%이니 가장 높은 확률을 가진다.

만약 An fresh apple in the box이라는 말이 한 번도 학습이 되지 않았다면..?

이런 방식으로 학습하기 위해선 정말 많은 학습 데이터가 필요함. 이렇게 충분한 데이터가 없어서 정확한 모델링을 하지 못하는 것을 희소 문제(sparsity problem) 라고 한다.

이를 해결하기 위해 N-gram 언어 모델을 사용하기도 한다.

N-gram 언어 모델은 이전에 등장한 모든 단어를 고려하는 것이 아니라 일부 단어만 고려하여 접근 하는 방법을 사용한다. 몇 개의 일부 단어를 볼 것인가를 n이 결정한다.

예를 들어 위 예제에서 n이 2인 bigram을 이용할 경우 P(is| the box)가 된다.

이럴 경우 희소 문제가 어느 정도 해결 되지만 전혀 이상한 맥락으로 문장이 이어질 수도 있다.

n을 낮출 수록 희소 문제는 해결되지만 정확도는 떨어진다. 둘은 trade - off 관계에 있다.

통계를 이용한 모델의 평가 방법

: 펄플렉서티 (Perplexity, PPL) - 헷갈리는 정도, 즉 낮을수록 성능이 좋음.

PPL은 어떠한 조건에서 가능한 경우의 수를 분기계수(branching factor)라고 한다.

PPL이 10이라는 의미는 평균적으로 모든 문장이 판단할 때 분기계수가 10개라고 볼 수 있다.

단, PPL은 테스트 데이터 상에서만 판단하므로, 테스트 상에서의 정확도지 사람이 직접 느끼기엔 다를 수도 있다는 점을 유의해야 한다.

2. 언어 모델 (인공 신경망을 이용한 방법)

머신러닝 알고리즘은 피처 기반 데이터만 입력받을 수 있기 때문에 머신러닝에서 비정형 텍스트 데이터를 어떻게 피처 형태로 추출하고 추출된 피처에 의미 있는 값을 부여하는가 하는 것이 매우 중요함.

NNLM (Neural Network Language Model) - 피드 포워드 신경망 언어 모델

https://wikidocs.net/45609

자연어는 프로그래밍 언어 처럼 딱 정해서 규칙을 정할 수 없기 때문에 인공지능을 활용하는 게 맞다.

과거에는 통계적 언어 모델을 사용했지만 요즘은 인공 신경망을 사용하는 언어 모델들로 대체되기 시작했다.

그 중 시초인 하나의 모델이 피드 포워드 신경망 언어 모델이다.

언어 모델링 (Language Modeling)이란 이전 단어들로부터 다음 단어를 예측하는 것이다.

자연어 생성 NLG (Natural Language Generation)은 말 그대로 자연어를 생성하는 것.

만약 언어 모델 또한 단어의 의미적 유사성을 학습할 수 있도록 설계한다면, 훈련 코퍼스에 없는 단어 시퀀스에 대한 예측이라도 유사한 단어가 사용된 단어 시퀀스를 참고하여 보다 정확한 예측을 할 수 있다. 그리고 이러한 아이디어를 반영한 언어 모델이 신경망 언어 모델 NNLM이다.

그리고 이 아이디어는 단어 벡터 간 유사도를 구할 수 있는 벡터를 얻어내는 워드 임베딩(word embedding) 의 아이디어이기도 하다.

n-gram 처럼 정해진 개수의 단어를 참고함.

예를 들어서 4개라고 하면 입력층은 4개가 됨. 이때 정해진 개수의 단어 n을 window라고 함.

투사층의 역할이 중요한데 활성화 함수가 존재하지 않아서 그대로 나옴.

근데 뭐가 그대로 나오냐면 원핫벡터와 가중치 행렬과의 곱이기 때문에 특정 i 번째의 가중치가 그대로 나오는 거임.

그래서 투사층이라고 하는 듯 하다.

투사를 시켜서 그대로 나오는 이 과정을 lookup(그대로 읽어오다) table이라고 한다.

학습이 끝난 후에는 같은 단어는 같은 one hot 벡터로 입력층에서 들어오기 때문에 항상 같은 위치의 가중치를 가져옴.

그러나 학습 중에는 projection layer weight matrix가 계속 바뀌므로 투사층을 거친 벡터가 계속 바뀌는데 이 단어 벡터를 임베딩 벡터라고 함.

테이블 룩업을 통해 임베딩 벡터로 변형되면 모든 임베딩 벡터들은 하나로 이어 붙여짐.(concatenate)

NNLM(Neural Network Language Model)과 Word2Vec의 차이

  1. 예측하는 대상으로 인한 학습할 때 뒷 단어를 보는가 안보는가.
    NNLM - 다음 단어 Word2Vec - 중심 단어
  2. Hidden layer의 유무 → 속도 차이
  3. 네거티브 샘플링, 계층적 소프트맥스
  • 네거티브 샘플링이란?
    만약 단어가 10000개이고 임베딩 벡터가 100차원이라면 가중치 행렬은 10000 100 개의 파라미터를 가진다. 여기에다가 윈도우의 수 만큼 연산을 거쳤으므로 오류 역전파 과정에서 2n 10000 * 100만큼의 파라미터 학습이 일어난다. 매 학습마다 이만큼을 학습하는건 상당히 무거운 작업이다. 이를 극복하기 위해 만든 작업이다.

    자세한 내용은 링크를 참고하자

    https://wikidocs.net/69141

RNN(Recurrent Neural Network) -순환 신경망

가장 기본적인 RNN을 Vanilla RNN이라고도 함.

입력과 출력을 시퀀스 단위로 처리하는 시퀀스 모델.

번역기의 경우 입력은 단어의 시퀀스이고 출력 또한 단어의 시퀀스임.

시퀀스들을 처리하기 위해 만들어진 모델들을 시퀀스 모델이라고 하는데, RNN은 가장 기본적인 인공 신경망 시퀀스 모델임.

LSTM, GRU 또한 근본적으로는 RNN에 속함.

은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드를 cell 이라고 함. 셀은 이전의 값을 기억하는 메모리 역할을 수행하므로 메모리 셀 또는 RNN 셀 이라고도 표현함.

RNN에서는 시간 개념이 들어가기 때문에 시간을 t로 표현함.

은닉 상태 (hidden state) : t+1 시점의 자신에게 보내는 h(t)값.

hidden_units = 은닉 상태의 크기를 정의. 메모리 셀이 다음 시점의 메모리 셀과 출력층으로 보내는 값의 크기(output_dim)과 동일.

timesteps = 입력 시퀀스의 길이, 시점의 수, 몇개의 입력을 넣을건지?

input_dim = 입력의 크기

RNN을 뉴런 단위로 시각화 한 그림.

참고하기 좋은 자료

*하이퍼볼릭 탄젠트를 시그모이드 함수 대신 쓰는 이유

  1. 시그모이드 함수는 미분 최댓값이 0.25인데 반해 하이퍼볼릭 탄젠트는 미분 최댓값이 1임. 즉 기울기 소실 문제가 덜 일어남
  2. 시그모이드 함수의 범위는 0~1인데 하이퍼볼릭 탄젠트는 -1~1임. 즉 중앙값이 0.5, 0으로 차이가 나서 학습 효율성이 더 뛰어나다. (이건 의미를 잘 모르겠음)

DRNN (Deep Recurret Neural Network)

운동을 열심히 하는 것은 [        ]을 늘리는데 효과적이다.

1) 근육
2) 지방
3) 스트레스

다음과 같은 빈칸 추론을 하기 위해서는

기존의 RNN처럼 이전 입력만 받아서는 불가능하다. 이를 해결하기 위해 나온게 BRNN이다.

X2의 은닉 상태가 x1의 은닉층의 계산에 영향을 미친다. 즉, 이전 입력 뿐만 아니라 이후 입력도 영향을 받는다.

LSTM (Long Short-Term Memory)

LSTM은 바닐라 RNN의 문제를 해결하기 위해 등장했다.

바닐라 RNN은 어떤 문제가 있었을까?

  • RNN의 시점이 길어질 수록 앞의 정보가 뒤로 충분히 전달되지 못함. 바로 앞으로만 전달하기 때문. 이를 장기 의존성 문제라고 함.
    장기 의존성 문제 = the problem of Long-Term Dependencies

LSTM은 은닉층의 메모리 셀에 입력 게이트, 망각 게이트, 출력 게이트를 추가하여 불필요한 기억을 지우고, 기억해야 할 것들을 남김.

필요한 배경 지식
다변수 함수의 연쇄법칙 (Chain Rule)

LSTM의 구조가 타당한 이유를 수학적으로 이해하긴 쉽지 않아서 RNN과의 차이를 통해 이해를 해보자.

RNN과 다르게 이전 입력을 받는 구조가 hidden state에다가 cell state까지 있다는 것을 확인할 수 있다.

  1. forget gate 에서는 시그모이드 함수의 특성 (0~1 사이의 값을 가짐)을 이용하여 직전의 입력을 얼마나 잊을 것인가를 결정한다. (WfW_f는 얼마나 잊을지를 생각하는 weight이다.)

  2. input gate는 현재 정보와 관련된 값으로 i는 f와 같이 0~1 사이의 값을 가진다.

  3. Cell state의 식을 보면 *는 원소별 곱이다. f 값이 0이라면 이전 Cell state는 무시되어 현재 입력만이 작용한다고 볼 수 있고, i 값이 0이라면 이전 입력값만 작용한다고 볼 수 있다.

    추가적으로 C~\tilde{C}와 i의 원소별 곱을 통해 현재 중요하지 않은 입력을 학습할 수 있다.

  4. Output gate에서는 예측을 위해 현재를 포함한 이전 정보들이 담긴 C를 이용하여 hidden state값을 낸다.

참고 자료:

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

https://wikidocs.net/22888

https://medium.com/analytics-vidhya/lstms-explained-a-complete-technically-accurate-conceptual-guide-with-keras-2a650327e8f2

GRU (Gated Recurrent Unit) - 게이트 순환 유닛

GRU는 LSTM의 목적인 장기 의존성 문제의 해결을 유지하면서 LSTM에서의 복잡했던 계산을 줄인 모델

CNN

자연어에서는 1D 합성곱 연산을 쓰는데 CNN이 어떻게 쓰이는지 한 번 알아보자.

자연어 기본적인 학습 과정을 통해 워드 임베딩까지 완료된 단어 집합이 있다고 하자.

wait for the video and don’t rent it 문장으로 워드 임베딩까지 했다면,

다음과 같은 행렬을 얻을 것이다. 이때 k는 embedding vector의 차원 수이며, n은 단어의 수이다.

1D 합성곱 과정은 다음과 같다.

우선 여기서 커널의 폭은 임베딩 차원과 같으므로 커널의 크기라 함은 높이를 말한다. 즉, 함께 볼 단어의 수라고 이해할 수 있겠다. 위 그림에서는 커널의 크기는 2가 된다.

이러한 과정을 거쳐서 1차원 벡터를 얻고 이를 이용하여 인공 신경망 연산을 할 수 있다.

RNN을 이용한 인코더 - 디코더

하나의 RNN을 인코더로 사용하고 다른 하나의 RNN을 디코더로 사용하여 두 RNN을 연결해서 사용하는 구조를 인코더 - 디코더 구조라함.

이러한 모델은 주로 입력 문장과 출력 문장의 길이가 다를 경우에 사용함. 예를 들어, 주로 번역기나 텍스트 요약 같은 경우에 쓰임.

대표적인 모델로는 seq2seq이 있음.

어텐션 메커니즘 (Attention Mechanism)

요즘 ai 분야 대세 모듈인 트랜스포머 기반이 되는 메커니즘임.

seq2seq 모델은 두 가지 문제가 존재한다.

  1. 인코더와 디코더로 RNN을 사용하므로 vanishing gradient 문제.

    → LSTM

  2. encoder → context vector 에서 고정된 크기의 벡터에 입력 데이터의 모든 정보를 압축하다보니 정보 손실이 발생함.

아 두 가지 문제가 기계 번역 분야에서 입력 문장이 길면 번역 품질이 떨어지는 현상으로 나타났다. 이를 위한 대안으로 나온 기법이 어텐션이다.

어텐션의 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다는 점이다. 이때 입력 문장에서 중요한 단어를 좀 더 집중(attention)해서 참고함.

중요한 문장이란?

→ Attention Function을 이용하여 구분함.

Attention(Q,K,V)=Attention  ValueAttention(Q,K,V) = Attention\; Value

Q = Query : t 시점의 디코더 셀에서의 은닉 상태

K = Keys : 모든 시점의 인코더 셀의 은닉 상태

V = Values : 모든 시점의 인코더 셀의 은닉 상태

닷 - 프로덕트 어텐션

어텐션의 다양한 종류 중 수식적으로 이해하기 쉬운 어텐션.

결국 어텐션 벡터를 구해서 출력값을 추측하는데 입력값으로 사용함. 이때 특이했던 점은 어텐션 벡터를 어떻게 이용할 것인가에 대한 가중치도 넣어서 학습함.

트랜스포머 (Transformer)

Attention is all you need 라는 논문에서 나옴.

RNN을 사용하지 않고 인코더 - 디코더 를 설계했는데 RNN보다 좋은 성능..

원래 어텐션 사용한게 인코더에서 문맥 벡터로 만들 때 정보 손실때문임.

어텐션을 RNN의 보정을 위한 용도 (기억력 보존)가 아니고 RNN 대신 어텐션만으로 인코더와 디코더를 설계한다면?

기존에 RNN을 사용했던 이유는 RNN이 시점 대비 데이터를 입력하는 것이기 때문에, 벡터로는 표현할 수 없었던 단어들의 연결 정보를 넣을 수 있기 때문이었음.

트랜스포머는 단어의 위치 정보를 얻기 위해서 각 단어의 임베딩 벡터에 위치 정보를 더하여 입력으로 활용함.

이를 포지셔널 인코딩 positional encoding 이라함.

transformer에서의 3가지 attention

  • Encoder Self-Attention
  • Masked Decoder Self-Attention
  • Encoder-Decoder Attention

BERT(Bidirectional Encoder Representations from Transformers)

트랜스포머의 한 종류.

사전 훈련된 워드 임베딩이나 데이터로 학습시킨 워드 임베딩은 문맥을 고려하지 못하여 다의어나 동음이의어를 구분하지 못했다.

예를 들어, 먹는 사과와 하는 사과의 경우 ‘사과는 맛있다.’ 와 ‘나는 사과했다’ 두 문장을 학습시키다보면 단어 하나에 임베딩 벡터가 하나이므로 의미가 희석되거나 변형될 수 있다.

이러한 문제를 극복한 것이 ELMo나 BERT 등이다.

극복 방법은 사전 훈련된 워드 임베딩 대신 사전 훈련된 언어 모델을 사용하는 것이다.

bert 동작

참고자료 : https://hwiyong.tistory.com/392

0개의 댓글