자연어의 경우, 단어가 나타나는 순서가 중요해서 시간개념이 중요하다.

[RNN LSTM] _ NLP

🧐  RNN (Recurrent Neural Network)
일반적으로 i의 단어는 그 이전에 발생한 i-1개 단어와 상호작용한다.
RNN



🧐  Long Term Dependency과  LSTM(Long Short-Term-Memory)

Long Range Dependency : RNN은 시간을 처리할 수 있는 능력을 갖추지만 길이가 긴 sample에는 한계가 있다.
hi는 1, 2, ..., i 순간에 발생하는 단어의 정보가 혼합되기에 오래된 단어의 정보는 희미해진다.
즉, 앞쪽단어와 멀리있는 단어가 밀접하게 상호작용하는 long-range dependency를 제대로 처리하지 못하는 문제가 발생한다.

LSTM : RNN을 개조해 long-term dependency를 처리하는 능력을 강화한다.
input과 output을 열거나 막는 gate를 두어 선별적으로 기억하는 기능으로 여닫는 정도를 조절한다.
이때, 여닫는 정도는 학습으로 알아낸 가중치로 결정된다.

 

 

[seq2seq ] _ NLP

🧐  seq2seq

seq2seq : Sequence to Sequence[Sutskever2014; https://arxiv.org/abs/1409.3215]의 혁신성은 "가변길이의 문장을 가변길이의 문장으로 변환"할 수 있다는 것이다.

ex) 한국어→영어로 번역 시, 둘의 문장길이가 달라 seq2seq model이 필요하다.
- 학습 시 Decoder의 input부분과 output부분이 모두 동작한다. 
즉, 정답에 해당하는 출력을 알려주는 교사강요(teacher forcing)방법을 사용한다.

- 예측 시 정답을 모르기 때문에  위의 회색표시한 input 부분을 제외하고 자기회귀(auto-regressive) 방식으로 동작한다.
자기회귀에서 <SOS>가 입력되면 첫 단어 'That'을 출력하고 'That'을 보고 그 다음 둘째 단어 'can't'를 출력한다.
즉, 이전에 출력된 단어를 보고 현재단어를 출력하는 일을 반복하며, 문장끝을 나타내는 <EOS>가 발생하면 멈춘다.


- 한계 : 가장 큰 문제는 encoder의 마지막 hidden state만 decoder에 전달한다는 점이다.
그림에서 보면 h5만 decoder로 전달된다.
따라서 encoder는 마지막 hidden state에 모든 정보를 압축해야하는 부담이 존재한다.

 

 

 

[query-key-value로 계산하는 attention] _ NLP

🧐  query-key-value

QKV : attention을 계산하는 방법을 여러가지인데, 최근에는 query가 key와 유사한 정도를 측정하고 유사성 정보를 가중치로 사용해 value를 가중합하는 방법을 주로 사용한다.

Non-local Neural Networkex) f(xi, xj)의 xi와 xj가 query와 key에 해당하고, g(xj)가 value에 해당한다.


query-key-value로 attention 계산하기
query와 key의 유사도 벡터 s는 벡터의 내적으로 계산한다 가정하며
attention 벡터 a는 유사도벡터 s에 softmax를 적용한 벡터이다.
이때, s = (s1, s2, s3, s4)이고 a = (0.1895, 0.1843, 0.4419, 0.1843)이 된다.

이제 a를 가중치로 사용해 value의 가중합을 구하면 context 벡터 c
c = 0.1895*(1 2 5) + 0.1843*(1 1 5) + 0.4419*(3 2 4) + 0.1843*(6 1 2)
   = (2.8053  1.6314  4.0052).

벡터의 차원을 d라 하면, q는 1xd행렬이고 K V nxd행렬이다.
이때, n은 key와 value가 갖는 벡터의 개수이다.

 

 

 

[seq2seq  with Attention] _ NLP

seq2seq는 입력문장의 모든 정보를 encoder의 마지막 hidden state h5에 압축해 넣어야하는 부담이 있다.
Bahdanau는 아래 식의 attention을 이용해 decoder가 encoder의 모든 state(
h1, h2, ... , h5)에 접근할 수 있게 허용하여 성능을 향상한다.[Bahdanau2014; https://arxiv.org/abs/1409.0473]


🧐 Bahdanau Attention
위의 seq2seq의 경우, decoder는 i=6일 때, encoder가 i=2일 때, 단어 '저절로'에 주목해야 'itself'라는 단어를 제대로 생성할 수 있다.
decoder가 i=6일 때, (.01  .9  .02  .03  .04)처럼 2번째 원소값이 큰 attention vector a를 생성하면 encoder의 두번째 단어 '저절로'에 더 주목할 수 있어 성능이 향상될 수 있다.

- 이에 대해 query, key, value가 무엇이 되어야 위와 같이 될 수 있는지 살펴보자.

<Attention Map>

 

 

'A.I > 자연어 처리' 카테고리의 다른 글

self.NLP(3-2). Transformer with pytorch  (0) 2023.06.30
self.NLP(3-1). Pytorch 기본설명.  (0) 2023.06.29
self.NLP(3). Transformer & etc.  (0) 2023.06.29
self.NLP(1). tokenization  (2) 2022.12.29
self.NLP(0). 자연어 처리란?  (0) 2022.12.28

🧐  Auto - Encoder 

🤫 Auto - Encoder란?
inputcode(hidden layer)로 encoding하는 encoder부분과
encoding된 code를 다시 decoding하는 decoder부분으로 구성되어 있다.
Encoding원래 data를 차원축소(dimensionality reduction)하는 것이다.
- 이때, 입력층보다 적은 수의 노드로 이루어진 은닉층(일명, code)을 중간에 넣어 차원을 줄인다.
Decoding은 차원축소(dimensionality reduction)된 data를 원래 data로 복원하는 것이다.
- code를 다시 원래 입력층과 같은 크기의 결과물로 출력한다.

원래 auto-encoder는 이전 기계학습에서 말했듯, PCA(주성분 분석)과 같은 차원축소를 위해 사용했었다.
하지만, 현재는 데이터 생성모형으로도 사용되고 있으며, 이때 auto-encoder는 비지도학습(unsupervised learning)에 속한다.





🤫  Auto-Encoder의 내부 구조 및 formula

입력데이터와 출력층의 벡터를 𝜒,  code(은닉층)에 해당하는 벡터를  𝟋 라 할 때,
encoder ɸ와  decoder 𝜓에 대해 아래의 수식과 같을때,

은닉층에 해당하는 code는 아래와 같이 나타낼 수 있다.
h = ɸ1 (W1x + b1). 
(이때, ɸ는 은닉층의 활성함수를 의미, W와 b는 random하게 초기화, 역전파법으로 학습됨)

은닉층에 해당하는 codedecoding하는 과정은 아래와 같이 나타낼 수 있다.
𝜒' = ɸ2 (W2x + b2). 

이후 auto-encoder는 입력 데이터 벡터 𝜒와 출력층으로 복원된 data벡터𝜒'간의 복원 에러를 줄이는 방향으로 학습한다.


=  || x -  ɸ2 (W2(ɸ1(W1x + b1)) + b2) || ^2



🤫  Auto-Encoder의 효과



🤫  Auto-Encoder  vs. GAN

GAN: original과 상관없는 결과물을 생성
Auto-Encoder:
original의 특징을 잘 살린 결과물을 생성

 

 

 

 

 

 

 

 

 

 

 

 

🧐  GAN (Generative Adversarial Networks

🤫 GAN이란?
초기 딥러닝: Drop-out과 BackPropagation을 기반으로 판별모델(discriminative model)을 사용
이는 데이터 판별에서 좋은 성능을 발휘했는데, 대표적으로 classification, regression이 있다.
반면, 생성모델(generative model)의 경우, 복잡한 확률계산으로 어려움을 겪었다.

GAN(Generative Adversial Network)판별모델생성모델, 두 신경망의 경쟁(adversial)을 통해 학습시키는 신경망이다.
판별모델의 목적: 주어진 데이터가 original인지 생성모델이 만든 가짜인지 구분하는 것
생성모델의 목적: 판별모델이 구분할 수 없도록 진짜같은 가짜 데이터를 생성하는 것
이런 GAN판별모델이 진짜와 가짜의 구분이 불가할 때까지 발전하는데, 아래와 같다.

1. 가짜 데이터는 판별모델의 학습단계에서 target data 0을 라벨링판별모델의 학습대상이 된다.
2. 생성모델의 학습단계에서 가짜데이터의 target data를 1로 설정, 가짜를 진짜로 판별하는 확률을 구한다.
이때, 경쟁의 대상이 되는 진짜는 판별모델의 학습단계에서 target data를 1로 받아 판별모델을 거친다.




🤫  Auto-Encoder  vs. GAN

GAN: original과 상관없는 결과물을 생성
Auto-Encoder: original의 특징을 잘 살린 결과물을 생성

 

 

🧐  GAN   Algorithm 

1. 랜덤 데이터 분포 Pz로부터 랜덤데이터 z를 추출.

2. 1에서 추출한 random data를 생성모델에 넣고 생성모델을 통해 가짜를 생성.


3. 2에서 얻은 가짜중 m개를 추출해 미니 배치 {z1, . . . , zm}으로 설정.

4. 진짜데이터인 train dataset 분포 Pdata(x)에서 m개를 추출, 미니 배치 {x1, . . . , xm}으로 설정.

5. 아래와 같은 gradient를 이용, 판별모델을 update.
판별모델은 가치함수(value function)를 최소화하는 것이 아닌 최대화 하는 것이 목적.
따라서 아래와 같은 gradient ascent방법을 사용한다.

이전의 gradient descent는 gradient에 (-)부호를 붙이지만
gradient ascent는 gradient에 (+)부호를 붙인다.


6. 1~5의 과정을 k번 반복 (k는 판별기 학습단계로 사용자가 직접 설정 가능)

7. 랜덤 데이터 분포 Pz로부터 random data z를 추출

8. 7에서 추출한 random data를 생성모델에 넣고 가짜data 생성

9. 8에서 얻은 가짜 중 m개를 추출, 미니 배치 {z1, . . . , zm}으로 설정.

10. 아래와 같은 gradient를 이용해 생성기를 update.
생성모델은 가치함수(value function)를 최소화하는 것이 목적.
따라서 아래와 같은 gradient descent방법을 사용한다.

11.  1~10단계를 반복 

 

+ Recent posts