🧐 RNN (RecurrentNeuralNetwork) 일반적으로 i의 단어는 그 이전에 발생한 i-1개 단어와 상호작용한다.
RNN
🧐 Long Term Dependency과 LSTM(LongShort-Term-Memory)
Long Range Dependency: RNN은 시간을 처리할 수 있는 능력을 갖추지만 길이가 긴 sample에는 한계가 있다. hi는 1, 2, ..., i 순간에 발생하는 단어의 정보가 혼합되기에 오래된 단어의 정보는 희미해진다. 즉, 앞쪽단어와 멀리있는 단어가 밀접하게 상호작용하는 long-range dependency를 제대로 처리하지 못하는 문제가 발생한다.
LSTM: RNN을 개조해 long-term dependency를 처리하는 능력을 강화한다. input과 output을 열거나 막는 gate를 두어 선별적으로 기억하는 기능으로 여닫는 정도를 조절한다. 이때, 여닫는 정도는 학습으로 알아낸 가중치로 결정된다.
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를 가중합하는 방법을 주로 사용한다.
벡터의 차원을d라 하면,q는 1xd행렬이고K와V는nxd행렬이다. 이때,n은 key와 value가 갖는 벡터의 개수이다.
[seq2seq withAttention] _ NLP
seq2seq는 입력문장의 모든 정보를 encoder의 마지막 hidden stateh5에 압축해 넣어야하는 부담이 있다. 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 vectora를 생성하면 encoder의 두번째 단어 '저절로'에 더 주목할 수 있어 성능이 향상될 수 있다.
- 이에 대해 query, key, value가 무엇이 되어야 위와 같이 될 수 있는지 살펴보자.
🤫 Auto - Encoder란? input을 code(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하게 초기화, 역전파법으로 학습됨)
은닉층에 해당하는 code를 decoding하는 과정은 아래와 같이 나타낼 수 있다. 𝜒' =ɸ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방법을 사용한다.