Loading...
2021. 11. 12. 16:54

밑바닥부터 시작하는 딥러닝 - 어텐션(3)

어텐션을 갖춘 seq2seq 구현 Attention 계층의 구현을 끝낸 뒤 어텐션을 갖춘 seq2seq를 구현할 것이다. Encoder 구현 AttentionEncoder 클래스를 구현할 것이다. 앞에서 구현한 Encoder 클래스와 거의 같다. Encoder 클래스의 forward() 메서드는 LSTM 계층의 마지막 은닉 상태 벡터만을 반환했다. 그에 반해, 이번에는 모든 은닉 상태를 반환할 것이다. 코드로 살펴보자. class AttentionEncoder(Encoder): def forward(self, xs): xs = self.embed.forward(xs) hs = self.lstm.forward(xs) return hs def backward(self, dhs): dout = self.lst..

2021. 11. 11. 22:26

밑바닥부터 시작하는 딥러닝 - 어텐션(2)

Decoder 개선② 각 단어의 중요도를 나타내는 가중치 a가 있다면, 가중합을 이용해 "맥락 벡터"를 얻을 수 있다. 그렇다면 각 단어의 가중치 a를 구하는 방법이 뭐가 있을까? 이 방법을 설명하려면 우선 Decoder의 첫 번째 LSTM 계층이 은닉 상태 벡터를 출력할 때까지의 처리를 알아야 한다. 위의 그림에서 Decoder의 LSTM 계층의 은닉 상태 벡터를 h라 정했다. 목표는 h가 hs의 각 단어 벡터와 얼마나 "비슷한가"를 수치로 나타내는 것이다. 가장 단순한 방법은 벡터의 "내적"을 이용하는 것이다. 내적 계산은 다음과 같다. 직관적인 의미는 "두 벡터가 얼마나 같은 방향을 향하고 있는가"이다. 따라서 두 벡터의 "유사도"를 표현하는 척도로 내적을 이용하는 것은 자연스러운 선택이라고 할 수..

2021. 11. 10. 20:37

밑바닥부터 시작하는 딥러닝 - 어텐션(1)

앞에서 RNN을 사용해 문장을 생성해봤다. 그리고 2개의 RNN을 연결하여 하나의 시계열 데이터를 다른 시계열 데이터로 변환도 했었다. 이를 seq2seq라고 하며, 덧셈 같은 간단한 문제를 푸는 데 성공했다. 마지막으로, seq2seq에 몇 가지 개선을 적용한 결과, 간단한 덧셈이라면 거의 완벽하게 풀 수 있었다. 이번 글부터 seq2seq의 새로운 기법인 어텐션이라는 것에 대해 알아볼 것이다. 어텐션의 구조 지금까지 배운 seq2seq를 한층 더 강력하게 하는 어텐션 메커니즘이라는 기법에 대해 살펴보자. 어텐션이라는 메커니즘 덕분에 seq2seq는 필요한 정보에만 "주목"할 수 있게 된다. seq2seq의 문제점 seq2seq에서는 Encoder가 시계열 데이터를 인코딩한다. 그리고 인코딩된 정보를 ..

2021. 11. 9. 22:05

밑바닥부터 시작하는 딥러닝 - seq2seq(3)

엿보기(Peeky) seq2seq의 두 번째 개선은 엿보기(Peeky)이다. Encoder 동작은 입력 문장(문제 문장)을 고정 길이 벡터 h로 변환한다. 이때 h 안에는 Decoder에게 필요한 정보가 모두 담겨 있다. 그러나 현재의 seq2seq는 아래 그림과 같이 최초 시각의 LSTM 계층만이 벡터 h를 이용하고 있다. 이 중요한 정보인 h를 더 활용할 수는 없을까? 여기서 두 번째 개선안으로 중요한 정보가 담긴 Encoder의 출력 h를 Decoder의 다른 계층에게도 전해주는 것이다. 위의 그림과 같이 모든 시각의 Affine 계층과 LSTM 계층에 Encoder의 출력 h를 전해준다. 개선 전 그림과 비교해보면 기존에는 하나의 LSTM만이 소유하던 중요 정보 h를 여러 계층이 공유함을 알 수 ..

2021. 11. 5. 21:47

밑바닥부터 시작하는 딥러닝 - seq2seq(2)

seq2seq 클래스 이어서 seq2seq 클래스를 구현할 것이다. 이 클래스가 하는 일은 Encoder 클래스와 Decoder 클래스를 연결하고, Time Softmax with Loss 계층을 이용해 손실을 계산하는 것이다. class seq2seq(BaseModel): def __init__(self, vocab_size, wordvec_size, hidden_size): V, D, H = vocab_size, wordvec_size, hidden_size self.encoder = Encoder(V, D, H) self.decoder = Decoder(V, D, H) self.softmax = TimeSoftmaxWithLoss() self.params = self.encoder.params + ..

2021. 11. 4. 20:58

밑바닥부터 시작하는 딥러닝 - seq2seq(1)

이번 글에서는 시계열 데이터를 다른 시계열 데이터로 변환하는 모델을 생각해볼 것이다. 이를 위한 기법으로, 2개의 RNN을 이용하는 seq2seq라는 기법을 살펴볼 것이다. seq2seq의 원리 seq2seq를 Encoder-Decoder 모델이라고도 한다. Encoder는 입력 데이터를 인코딩하고, Decoder는 인코딩된 데이터를 디코딩(복호화)한다. 더보기 인코딩(부호화)이란 정보를 어떤 규칙에 따라 변환하는 것이다. 문자 코드를 예로 들면, 'A'라는 문자를 '1000001'이라는 이진수로 변환하는 식이다. 한편, 디코딩(복호화)이란 인코딩된 정보를 원래의 정보로 되돌리는 것이다. 문자코드를 예로 들면, '1000001'이라는 비트 패턴을 'A'라는 문자로 변화하는 일이 바로 디코딩이다. 그럼 s..

2021. 11. 3. 21:44

밑바닥부터 시작하는 딥러닝 - RNN을 사용한 문장 생성

지금까지 RNN과 LSTM의 구조와 구현을 살펴봤다. 이번 글에서는 언어 모델을 사용해 '문장 생성'을 수행해볼 것이다. 말뭉치를 사용해 학습한 언어 모델을 이용하여 새로운 문장을 만드는 것이다. 그런 다음 개선된 언어 모델을 이용하여 더 자연스러운 문장을 생성하는 것을 해볼 것이다. RNN을 사용한 문장 생성의 순서 언어 모델은 지금까지 주어진 단어들에서 다음에 출현하는 단어의 확률분포를 출력한다. 위의 그림은 'I'라는 단어를 주었을 때 출력한 확률분포이다. 이 결과를 기초로 다음 단어를 새로 생성하려면 어떻게 해야 할까? 첫 번째로 확률이 가장 높은 단어를 선택하는 방법이다. 확률이 가장 높은 단어를 선택할 뿐이므로 결과가 일정하게 정해진다. 또한 '확률적'으로 선택하는 방법이다. 각 후보 단어의 ..

2021. 11. 2. 21:30

밑바닥부터 시작하는 딥러닝 - 게이트가 추가된 RNN(4)

LSTM 계층 다층화 RNNLM으로 정확한 모델을 만들고자 한다면 많은 경우 LSTM 계층을 깊게 쌓아 효과를 볼 수 있다. LSTM을 2층, 3층 식으로 여러 겹 쌓으면 언어 모델의 정확도가 향상될 수 있다. LSTM을 2층으로 쌓아 RNNLM을 만든다고 하면 위의 그림처럼 된다. 첫 번째 LSTM 계층의 은닉 상태가 두 번째 LSTM 계층에 입력된다. 이와 같은 요령으로 LSTM 계층을 몇 층이라도 쌓을 수 있으며, 그 결과 더 복잡한 패턴을 학습할 수 있게 된다. 피드포워드 신경망에서 계층을 쌓는 것이다. 몇 층이나 쌓는 거는 하이퍼파라미터에 관한 문제이다. 쌓는 층 수는 하이퍼파라미터이므로 처리할 문제의 복잡도나 준비된 학습 데이터의 양에 따라 적절하게 결정해야 한다. 드롭아웃에 의한 과적합 억제..