Loading...
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)이 동시에 일..

2021. 10. 19. 21:13

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

이번 글에서는 추론 기반 기법과 신경망에 대해 알아볼 것이다. 지난 글까지 통계 기반 기법에 대해 배웠다. 하지만 통계 기반 기법에는 문제점이 존재한다. 대규모 말뭉치를 다룰 때 문제가 발생한다. 영어의 어휘 수는 100만이 넘는다고 하는데, 어휘가 100만 개라면, 통계 기반 기법에서는 100만 X 100만이라는 엄청나게 큰 행렬을 만들게 된다. 이렇게 큰 행렬에 SVD를 적용하는 일은 현실적이지 않다. 추론 기반 기법 개요 추론 기반 기법에서는 '추론'이 주된 작업이다. 추론이란 아래 그림처럼 주변 단어(맥락)가 주어졌을 때 "?"에 무슨 단어가 들어가는지를 추측하는 작업이다. 추론 문제를 풀고 학습하는 것이 '추론 기반 기법'이 다루는 문제이다. 이러한 추론 문제를 반복해서 풀면서 단어의 출현 패턴..

2021. 10. 18. 22:08

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

벡터 간 유사도 이전 글에서 동시발생 행렬을 활용해 단어를 벡터로 표현하는 방법을 알아봤다. 이번 글에서는 벡터 간 유사도에 대해 알아볼 것이다. 벡터 사이의 유사도를 측정하는 방법은 다양하다. 대표적으로 벡터의 내적이나 유클리드 거리가 있다. 그 외에도 단어 벡터의 유사도를 나타낼 때는 코사인 유사도를 자주 사용한다. 위의 식에서 분자는 벡터의 내적, 분모에는 각 벡터의 노름(norm)이 사용된다. 노름이란 벡터의 크기를 나타낸 것으로, 여기에선 L2 노름을 계산한다. 위의 식의 핵심은 벡터를 정규화하고 내적을 구하는 것이다. def cos_similarity(x, y): nx = x / np.sqrt(np.sum(x**2)) # x의 정규화 ny = y / np.sqrt(np.sum(y**2)) # ..