본문 바로가기

분류 전체보기

(124)
6장 게이트가 추가된 RNN (1) Simple RNN은 시간적으로 멀리 떨어진 long term 의존 관계를 잘 학습할 수 없다는 단점이 있다. 그래서 'gate'라는 구조가 추가된 LSTM이나 GRU가 주로 쓰인다. RNN의 문제점 장기 의존 관계를 학습하기 어려운 원인은 BPTT(시간 방향의 역전파)에서 기울기 소실 혹은 폭발이 일어난다. 기울기 소실과 폭발의 원인 hidden state의 역전파인 빨간색 선에만 주목해서 보면 tanh, +, MatMul 연산을 통과한다는 것을 알 수 있다. + 노드는 미분 값을 그대로 흘려보내기 때문에 문제가 되지 않는다. tanh의 미분 그래프는 다음과 같다. 보다시피 값이 1.0 이하이고 x가 0에서 멀어질수록 작아진다. 즉 역전파에서 기울기가 tanh 노드를 지날 때마다 값이 계속 작아진다는 ..
서브워드 토크나이저 (Subword Tokenizer) 예를 들어 텍스트를 분류하는 문제를 다룬다고 하였을 때 토크나이저가 모든 단어에 대해서 알 필요가 없는 것은 사실이다. 그래서 vocabulary size를 정하고 빈도가 낮은 단어들은 OOV(out-of-vocabulary) 또는 UNK로 표현한다. 그렇지만 만약에 OOV로 표현된 단어가 분류 작업에 결정적인 단서인 경우엔 어떨까? 예를 들어 어떤 카테고리로 분류할 때 quit이라는 동사가 영향이 크다고 가정해보자. 그런데 이의 현재 진행형인 quitting은 출현 빈도가 낮아 OOV 처리가 되었다. 이럴 때 사용하는 것이 서브워드 분리 작업이다. 하나의 단어가 더 작은 단위의 의미있는 여러 서브워드(quit + ing)들로 구성되어 있는 경우가 많아, 이를 분리해서를 단어를 인코딩 및 임베딩 하겠는다..
5장 RNN (2) 시계열 데이터 처리 계층 구현 RNN을 시계열 데이터 처리를 위해 TimeRNN 클래스를 구현한 것 처럼 Embedding, Affine, Softmax 계층도 Time 계층 구현이 필요하다. 그런 다음 이를 조합하면 RNNLM(RNN Language Model)을 구현할 수 있다. RNNLM의 처리는 다음과 같다. 현재 타임 스텝의 입력을 받고 그 다음 타임스텝의 단어를 예측한다. corpus로부터 데이터 입력과 정답을 만들어낼 때 다음과 같이 만들어야 한다. xs = corpus[:-1] # 입력 ts = corpus[1:] # 정답 Softmax with Loss 계층도 다음과 같이 Time 계층으로의 처리가 필요하다. 모든 타입 스텝의 손실함수를 더해서 평균한 것이 최종 손실이 된다. 수식으로는 ..
5장 RNN (1) 언어 모델 언어 모델은 단어 나열(시퀀스)에 확률을 부여한다. 그 시퀀스가 일어날 가능성이 어느정도인지를 확률로 평가하는 것이다. 언어 모델을 수식으로 이해해보자. $w_1$, ..., $w_m$이라는 m개 단어로 된 문장이 있고, 이때 단어가 $w_1$, ..., $w_m$이라는 순서로 출현할 확률을 $P(w_1, ..., w_m)$으로 나타낸다. 이 확률은 여러 사건이 동시에 일어날 확률이므로 동시 확률이라 한다. 이 동시 확률을 사후 확률(조건부 확률)을 사용하여 다음과 같이 분해할 수 있다. 식 5.4의 결과는 확률의 곱셈정리로부터 유도할 수 있다. 이 곱셈 정리를 사용하면 m개 단어의 동시확률을 사후 확률로 나타낼 수 있다. 이를 반복하여 식 5.4를 유도한다. 식 5.4를 보면 알 수 있는 것..
4장 word2vec 속도 개선 word2vec 개선 (1) 은닉층의 뉴런이 100개인 CBOW 모델을 생각해보자 다음의 두 계산이 병목이 된다. 1. 입력층의 원핫 표현과 가중치 행렬 $W_{in}$의 곱 계산 뉴런의 크기가 100만개라면 원-핫 벡터는 상당한 메모리를 차지하게된다. 또 이 원핫 벡터와 가중치 행렬의 곱 계산에도 상당한 자원을 소모하게 된다. 이는 Embedding 계층을 도입하여 해결한다. 2. 은닉층의 가중치 행렬 $W_{out}$의 곱 및 Softmax 계층의 계산 마찬가지로 다루는 어휘가 많아짐에 따라 계산량이 증가한다. 이는 네거티브 샘플링이라는 새로운 손실 함수를 도입해 해결한다. Embedding 계층 사실 이 계산은 단어 ID에 해당하는 행벡터를 추출하는 것뿐이다. 따라서 원핫 표현으로의 변환과 MatM..
3장 word2vec 통계 기반 기법의 문제점 대규모 말뭉치의 어휘 수는 엄청 많기 때문에 통계 기반 기법에서는 거대한 행렬(PPMI 같은)을 만들게 된다. 이러한 거대한 행렬에 SVD를 적용하는 것은 현실적이지 않다. 또한 미니배치 학습이 불가능하다. 반면 추론 기반 기법은 신경망을 통해 미니배치 학습이 가능하고 이것의 부산물로 단어의 분산 표현을 얻어낼 수 있다. 추론 기반 기법 개요 추론이란 위의 그림처럼 맥락이 주어졌을 때 "?"에 들어갈 단어를 추측하는 작업이다. 모델 관점에서 보면 다음과 같다. 신경망에서의 단어 처리 신경망에서 you, say 같은 단어를 처리할 수 있는 방법으로 고정 길이의 벡터로의 변환을 사용할 수 있다. 여기서는 one-hot을 사용한다. (이 방법도 문장의 길이가 길어지면 문제점이 생길 것..
2장 자연어와 단어의 분산 표현 시소러스 시소러스는 유의어 사전으로, 동의어나 유의어가 한 그룹으로 분류되어 있다. 또한 단어들의 의미에 상하위 관계가 존재한다. 시소러스는 다음과 같은 문제점들이 있다. 시대 변화에 대응하기 어렵다. 사람을 쓰는 비용이 크다 단어의 미묘한 차이를 표현할 수 없다. 통계 기반 기법 말뭉치(corpus)라고 부르는 텍스트 데이터를 이용한다. 통계 기반 기법은 말뭉치로부터 효율적으로 그 핵심을 추출하는 것이다. 말뭉치 전처리 def preprocess(text): text = text.lower() text = text.replace('.', ' .') words = text.split(' ') word_to_id = {} id_to_word = {} for word in words: if word not ..
nonzero 주어진 어레이에서 0이아닌 요소의 인덱스를 어레이로 반환 non_zero_indices = np.nonzero([1,2,0,0,4,0]) print(non_zero_indices) (array([0, 1, 4]),)