Loading...
2021. 11. 1. 22:10

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

Time LSTM 구현 다음으로 Time LSTM 구현을 해볼 것이다. Time LSTM은 T개분의 시계열 데이터를 한꺼번에 처리하는 계층이다. 전체 그림은 아래 그림과 같다. RNN에서는 학습할 때 Truncated BPTT를 수행했다. Truncated BPTT는 역전파의 연결은 적당한 길이로 끊었지만, 순전파의 흐름은 그대로 유지한다. 위의 그림처럼 은닉 상태와 기억 셀을 인스턴스 변수로 유지할 것이다. 이렇게 하여 다음번에 forward()가 불렸을 때, 이전 시각의 은닉 상태에서부터 시작할 수 있다. Time LSTM 계층 구현을 코드로 알아보자. class TimeLSTM: def __init__(self, Wx, Wh, b, stateful = False): self.params = [Wx,..

2021. 10. 29. 21:09

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

RNN은 순환 경로를 포함하며 과거의 정보를 기억할 수 있었다. 구조가 단순하여 구현도 쉽게 가능했다. 요즘에는 RNN 대신 LSTM이나 GRU라는 계층이 주로 쓰인다. LSTM이나 GRU에는 '게이트'라는 구조가 더해져 있는데, 이 게이트 덕분에 시계열 데이터의 장기 의존 관계를 학습할 수 있다. RNN의 문제점 1. 기울기 소실 또는 기울기 폭발 언어 모델은 주어진 단어들을 기초로 다음에 출현할 단어를 예측하는 일을 한다. "?"에 들어가는 단어는 "Tom"이다. RNNLM이 이 문제에 올바르게 답하려면, 현재 맥락에서 "Tom이 방에서 TV를 보고 있음"과 "그 방에 Mary가 들어옴"이란 정보를 기억해둬야 한다. 이런 전보를 RNN 계층의 은닉 상태에 인코딩해 보관해야 한다. 위의 그림과 같이 정..

2021. 10. 27. 21:08

밑바닥부터 시작하는 딥러닝 - 순환 신경망(RNN)(2)

Time RNN 계층 구현 Time RNN 계층은 T개의 RNN 계층으로 구성된다. Time RNN 계층은 아래 그림처럼 표현된다. 위에 그림에서 보면, Time RNN 계층은 RNN 계층 T개를 연결한 신경망이다. 이 신경망으로 Time RNN 클래스로 구현할 것이다. 여기에서는 RNN 계층의 은닉 상태 h를 인스턴스 변수로 유지한다. RNN 계층의 은닉 상태를 Time RNN 계층에서 관리한다. 이렇게 하면 Time RNN 사용자는 RNN 계층 사이에서 은닉 상태를 '인계하는 작업'을 생각하지 않아도 된다는 장점이 생긴다. 다음은 Time RNN 계층의 코드이다. class TimeRNN: def __init__(self, Wx, Wh, b, stateful = False): self.params =..

2021. 10. 26. 21:03

밑바닥부터 시작하는 딥러닝 - 순환 신경망(RNN)(1)

지금까지 살펴본 신경망은 피드포워드라는 유형의 신경망이다. 피드포워드란 흐름이 단방향인 신경망을 말한다. 즉 입력 신호가 다음 층(중간층)으로 전달되고, 그 신호를 받은 층은 그다음 층으로 전달하고, 또 다음 층으로 전달되는 한 방향으로만 신호가 전달된다. 피드포워드 신경망은 구성이 단순하여 구조를 이해하기 쉽고, 많은 문제에 응용할 수 있다. 그러나 시계열 데이터를 잘 다루지 못한다는 단점이 있다. 단순한 피드포워드 신경망에서는 시계열 데이터의 성질을 충분히 학습할 수 없다. 그래서 순환 신경망(CNN)이 등장하게 된다. RNN RNN이란 '몇 번이나 반복해서 일어나는 일'을 뜻한다. 즉 '순환하는 신경망'이라는 뜻이 된다. 어느 한 지점에서 시작한 것이, 시간을 지나 다시 원래 장소로 돌아오는 것, ..

2021. 10. 25. 21:42

밑바닥부터 시작하는 딥러닝 - word2vec 속도 개선(3)

네거티브 샘플링 긍정적인 예인 'say'만을 대상으로 이진 분류를 해왔다. 만약 여기서 '좋은 가중치'가 준비되어 있다면 Sigmoid 계층의 출력은 1에 가까울 것이다. 그러나 부정적 예에 대해서는 어떠한 정보도 없다. 즉 해야 할 것은 긍정적인 예에 대해서는 Sigmoid 계층의 출력을 1에 가깝게 만들고, 부정적인 예('say' 이외의 단어)에 대해서는 Sigmoid 계층의 출력을 0에 가깝게 만드는 것이다. 위의 그림처럼 맥락이 'you'와 'goodbye'일 때, 타깃이 'hello'일 확률은 낮은 값이어야 바람직하다. 위의 그림에서 타깃이 'hello'일 확률은 0.021이다. 이런 결과를 만들어주는 가중치가 필요하다. 그러나 모든 부정적 예를 대상으로 하여 이진 분류를 학습시키는 것은 불가능..

2021. 10. 24. 21:35

밑바닥부터 시작하는 딥러닝 - word2vec 속도 개선(2)

이번 글에서는 word2vec의 두 번째 개선을 해볼 것이다. 은닉층 이후의 처리(행렬 곱과 Softmax 계층의 계산)이다. 네거티브 샘플링이라는 기법을 사용해 볼 것이다. Softmax 대신 네거티브 샘플링을 이용하면 어휘가 아무리 많아져도 계산량을 낮은 수준에서 일정하게 억제할 수 있다. 은닉층 이후 계산의 문제점 어휘가 100만 개, 은닉층 뉴런이 100개일 때의 word2vec을 예로 생각해보자. 입력층과 출력층에는 뉴런이 각 100만 개씩 존재한다. 이전에는 Embedding 계층을 도입하여 입력층 계산에서의 낭비를 줄였다. 남은 문제는 은닉층 이후의 처리이다. 첫 번째는 거대한 행렬을 곱하는 문제이다. 큰 행렬의 곱을 계산하려면 시간이 오래 걸린다. 또한 역전파 때도 같은 계산을 수행하기 때..

2021. 10. 23. 20:56

밑바닥부터 시작하는 딥러닝 - word2vec 속도 개선(1)

지금까지 word2vec의 구조를 배우고 CBOW 모델을 구현해봤다. CBOW 모델은 단순한 2층 신경망이라 간단하게 구현할 수 있었다. 그러나 말뭉치에 포함된 어휘 수가 많아지면 계산량도 커진다는 문제점이 있었다. 그래서 이번 글에서는 속도 개선에 대해 배울 것이다. 앞에서 배운 word2vec에 두 가지 개선을 추가할 것이다. Embedding 계층 앞에서는 단어를 원핫 표현으로 바꿨다. 그리고 그것을 MatMul 계층에 입력하고, MatMul 계층에서 가중치 행렬을 곱해 사용했다. 그럼 어휘 수가 100만 개인 경우에는 어떨까? 은닉층 뉴런이 100개라면, MatMul 계층의 행렬 곱은 아래 그림처럼 된다. 만약 100만 개의 어휘를 담은 말뭉치가 있다면, 단어의 원핫 표현도 100만 차원이 된다...

2021. 10. 20. 20:36

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

skip-gram 모델 word2vec은 2개의 모델을 제안하고 있다. 하나는 CBOW 모델이고, 다른 하나는 skip-gram 모델이다. skip-gram은 CBOW에서 다루는 맥락과 타깃을 역전시킨 모델이다. 위 그럼처럼 CBOW 모델은 맥락이 여러 개 있고, 그 여러 맥락으로부터 중앙의 단어(타깃)를 추측한다. 한편, skip-gram 모델은 중앙의 단어(타깃)로부터 주변의 여러 단어(맥락)를 추측한다. skip-gram 모델의 입력층은 하나이다. 한편 출력층은 맥락의 수만큼 존재한다. 따라서 각 출력층에서는 개별적으로 손실을 구하고, 이 개별 손실들을 모두 더한 값을 최종 손실로 한다. skip-gram 모델을 확률로 표기한 것이다. 'W(t)가 주어졌을 때 W(t-1)과 W(t+1)이 동시에 일..