피드 포워드 신경망(Feed-forward Neural Network)
NNLM(Neural Network Language Model)
정해진 개수의 단어 만을 참고하여 다음 단어 예측.
window를 4라고 가정하면 will the fat cat을 이용해 sit을 예측.
Input layer에서 Output layer로 정보가 한 방향으로 전파됨.
고정된 길이라는 것이 한계
Word2Vec
RNN(Recurrent Neural Network)
Feed Forward 방식이 아니라, 은닉층의 출력이 다시 은닉층의 입력으로 들어가는 재귀적인 연결이 특징.
이를 통해 이전 시점의 정보를 현재 시점에서 활용할 수 있다.
RNN은 Sequence의 길이에 제한이 없어, 가변 길이의 Sequence를 처리할 수 있다.
RNN 내부
RNN 한계
RNN이 이론적으로 long-term dependencies를 완전히 다룬다고 하지만 실제 문제에선 그렇지 않다. 이를 해결하기 위해 LSTM이 등장했다.
LSTM도 RNN의 한 종류다. 모든 RNN은 neural network 모듈을 반복 시키는 체인 구조로 반복되는 단순한 구조를 가지고 있다. LSTM도 같은 체인 구조를 가지는데, 단순한 neural network layer 한 층이 아닌 4개의 layer가 상호작용 한다.
논문에서는 LSTM을 사용해 입력 문장을 고정 차원의 벡터 표현으로 매핑한다.
Main Flow
Forget gate(망각 게이트)
Input gate(입력 게이트)
새로운 정보 중 어떤 것을 cell state에 저장할 것인지 정하는 단계.
sigmoid layer와 tanh layer가 존재.
계산과정
Sigmoid layer vs Tanh layer
최종적으로 현재 시점의 Cell state : 가 된다.
sigmoid와 tanh 비교 출력 코드
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(1, 2, figsize=(20,5), facecolor='#F0EEEE')
def tanh(x, deriv = False):
if deriv == True:
return (1 - (tanh(x)**2))
return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
# Functions Axes Lines
ax[0].axvline(linewidth=1.3, color='k')
ax[0].axhline(linewidth=1.3, color='k')
# Derivatives Axes Lines
ax[1].axvline(linewidth=1.3, color='k')
ax[1].axhline(linewidth=1.3, color='k')
x = np.arange(-5,5,.0001)
# y = tanh, z = sigmoid
y = np.tanh(x)
z = 1 / (1 + np.exp(-x))
# Plot Activation Functions
ax[0].plot(x, y, linewidth=4, color='r', label='Tanh')
ax[0].plot(x, z, linewidth=4, color='b', label='Sigmoid')
# Derivative Equations
tanh_deriv = (1 - tanh(x)**2)
sig_deriv = np.exp(-x) / (1 + np.exp(-x)**2)
# Plot Derivatives
ax[1].plot(x, tanh_deriv,linewidth=4, color='g', label='Tanh Derivative')
ax[1].plot(x, sig_deriv,linewidth=4, color='m', label='Sigmoid Derivative')
# Main Title
fig.suptitle("Sigmoid vs Tanh", fontsize=25)
# Grid
ax[0].grid(True)
ax[1].grid(True)
# Legend
ax[1].legend(fontsize=15)
ax[0].legend(fontsize=15)
# First Graph Limits (looks prettier)
ax[0].set_xlim(-5, 5)
ax[0].set_ylim(-1, 1)
plt.show()
output gate(출력 게이트)
Seq2Seq의 구조는 Encoder / Decoder의 구조를 가진다.
Sequence를 원하는 Sequence로 변환하는 작업.
Encoder / Decoder
이미지출처
Encoder
Decoder
Model 구조
인코더/디코더에 더 자세한 구조
Dataset
Decoding and Rescoring
T : 올바른 번역 , S : 훈련 source 문장
log 확률을 최대화 하도록 학습 시킨다.
n-best list의 점수를 rescore하기 위해 모든 hypothesis의 로그 확률을 LSTM으로 계산했고, 그 값들과 LSTM score의 짝수 평균을 취해줬다.
Decoding 방식
Greedy Decoding
Beam Search
Greedy Searchs는 확률이 0.5, 0.49여도 0.49에 대한 반영 없이 무조건 0.5만 고려.
비교적 모든 경우의 수를 고려하려고 해서 나온 방식.
최종 모습
결과 비교
Rescoring(재채점) :
reversed order Input sequence
input sequence 순서를 바꾸면 dataset의 많은 short term dependencies가 도입되기 때문에 gradient의 전파가 원활해진다.
Parallelization(병렬화)
BLEU Score (Bilingual Evaluation Understudy)
실제로 나왔던 결과
학습 결과
실제 추론
해석