일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- boj
- algorithm
- 딥러닝
- stak
- skip-gram
- 파이썬
- CBOW
- SQL
- Numpy
- dl
- Sigmoid
- sort
- Python
- hash
- Stack
- 프로그래머스
- FullyConnectedLayer
- Programmers
- Heap
- 자연어처리
- MySQL
- 신경망
- DeepLearning
- kakao
- affine
- backward
- select
- que
- PPMI
- Word2vec
- Today
- Total
목록Deep Learning (15)
혜온의 이것저것
4.2.1 은닉층 이후 계산의 문제점 어휘가 100만개, 은닉층 뉴런이 100개일 때의 word2vec을 예로 생각해보자. 이때 word2vec이 수행하는 작업은 그림과 같다. 입력층과 출력층에는 뉴런이 가 100만개씩 존재한다. 앞 절에서는 Embedding 계층을 도입하여 입력층 계산에서의 낭비를 줄였다. 남은 문제는 은닉층 이후의 처리이다. 은닉층 이후에서 계산이 오래 걸리는 곳은 다음 두 부분이다. - 은닉층의 뉴런과 가중치 행렬의 곱 첫번째는 거대한 행렬을 곱하는 문제이다. 은닉층의 벡터 크기가 100이고, 가중치 행렬의 크기가 100X100만이다. 이렇게 큰 행렬의 곱을 계산하려면 시간이 오래 걸리고 메모리도 많이 필요하다. 또한 역전파 때도 같은 계산을 수행하기 때문에 이 행렬 곱을 가볍게 ..
4.1.1 Embedding 계층 앞장의 word2vec 구현에서는 단어를 원핫 표현으로 바꿨다. 그것을 MatMul 계층에 입력하고, MatMul 계층에서 가중치 행렬을 곱했다. 여기서 어휘 수가 100만개인 경우를 상상해보자. 이때 은닉층 뉴런이 100개라면, MatMul 계층의 행렬 곱은 그림처럼 된다. 그림에서 결과적으로 수행하는 일은 단지 행렬의 특정 행을 추출하는 것뿐이다. 따라서 원핫 표현으로의 변환과 MatMul 계층의 행렬 곱 계싼은 사실 필요가 없다. 그러면 가중치 매개변수로부터 단어ID에 해당하는 행을 추출하는 계층을 만들어보자. 그 계층을 Embedding 계층이라 부르겠다. 4.1.2 Embedding 계층 구현 행렬에서 특정 행을 추출하는 것은 쉽다. 가중치 W가 2차원 넘파이 ..
3.5.1 CBOW 모델과 확률 A라는 현상이 일어날 확률은 P(A)라고 쓰고, 동시 확률은 P(A,B)라고 쓴다. 사후 확률은 P(A|B)로 쓴다. B가 주어졌을 때 A가 일어날 확률 이라고 해석할 수 있다. CBOW 모델을 확률 표기법으로 기술해보자. CBOW 모델이 하는 일은 맥락을 주면 타깃 단어가 출현할 확률을 출력하는 것이다. w_t-1과 w_t+1이 주어졌을 때 타깃이 w_t가 될 확률을 수식으로 쓰면 다음과 같다. w_t-1과 w_t+1이 일어난 후 w_t가 일어날 확률을 뜻한다. 그리고 w_t-1과 w_t+1이 주어졌을 때 w_t가 일어날 확률로 해석할 수 있다. CBOW는 위의 식을 모델링하고 있는 것이다. 1장에서 설명한 교차 엔트로피 오차를 적용하면 다음 식을 유도해낼 수 있다. C..
우리가 구현할 신경망은 다음과 같다. 우리는 이 신경망을 SimpleCBOW라는 이름으로 구현할 것이다. 클래스의 초기화 메서드부터 시작해보자. import sys sys.path.append('..') import numpy as np from common.layers import MatMul, SoftmaxWithLoss class SimpleCBOW: def __init__(self, vocab_size, hidden_size): V,H=vocab_size, hidden_size # 가중치 초기화 W_in = 0.01*np.random.randn(V,H).astype('f') W_out= 0.01*np.random.randn(H,V).astype('f') # 계층 생성 self.in_layer0=M..
3.3.1 맥락과 타깃 word2vec에서 이용하는 신경망의 입력은 '맥락'이다. 그리고 그 정답 레이블은 맥락에 둘러싸인 중앙의 단어, 즉 '타깃'이다. 다시 말해, 우리가 해야 할 일은 신경망에 '맥락'을 입력했을 때 '타깃'이 출현할 확률을 높이는 것이다. 그림에서 말뭉치로부터 목표로 하는 단어를 타깃으로, 그 주변 단어를 맥락으로 뽑아냈다. 이 작업을 망뭉치 안의 모든 단어에 대해 수행한다. 이 맥락의 각 행이 신경망의 입력으로 쓰이고, 타깃의 각 행이 정답 레이블이 된다. 참고로, 각 샘플 데이터에서 맥락의 수는 여러 개가 될 수 있으나, 타깃은 올직 하나 뿐이다. 우선 말뭉치 텍스트를 단어 ID로 변환해야 한다. import sys sys.path.append('..') from common...