word2vec의 속도 개선으로 새로운 계층을 도입하는 Embedding, 새로운 손실함수를 도입하는 negative sampling 이 두가지가 있다. Embedding word2vec 구현 시 단어를 one-hot vector 로바꿔 가중치 행렬을 곱한다. 만약 어휘수가 100만개일 경우, one-hot vector도 100만 차원이 된다. 도출되는 건 아래 사진 처럼 특정 행을 추출하는 것이다. 그러므로 원핫 표현 변환과 복잡한 행렬곱은 필요가 없다. embedding 계층은 단어 ID에 해당하는 행을 추출하여 사용한다. embedding 계층 구현 행 추출 행렬에서 W[2] W[5] 처럼 특정 행을 추출한다. import numpy as np W = np.arange(21).reshape(7, 3..
학습 데이터 준비 맥락: 각 행이 신경망의 입력으로 쓰임. 타겟: 각 행이 예측해야 하는 단어 맥락수는 여러개지만 타겟은 오직 하나, 그래서 맥락을 영어로 쓸 때는 's' 를 붙여 복수형임을 명시하는 것이 좋다. 말뭉치로부터 맥락과 타겟을 만드는 함수 구현 1.말뭉치 텍스트 ID 변환 2장에서 구현한 함수 사용 #util.py import numpy as np 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 in word_to_id: new_id = len(word_to..
통계 기반 기법 : 학습 데이터를 한꺼번에 처리(배치 학습)하고, 단어의 빈도를 기초로 단어를 표현한다. 추론 기반 기법: 학습 데이터의 일부를 사용하여 순차적으로 학습(미니 배치 학습) 추론 기반 기법과 신경망 맥락 정보를 입력받아 단어의 출현 확률 기반으로 맥락에서 나올 단어를 추측한다. 신경망에서는 단어를 원핫벡터로 변환한다. 인덱스와 단어 ID와 같은 원소를 1로, 나머지는 모두 0으로 설정한다. 원핫벡터 변환 과정을 거치면 단어를 고정길이 벡터로 변환할 수 있다. 단어를 백터로 나타낼 수 있고, 신경망으로 처리할 수 있다. 입력층 뉴런과의 가중합(weighted sum)은 은닉층 뉴런이다. 코드로 구현하면 다음과 같다. import numpy as np c = np.array([[1,0,0,0,..
통계 기반 기법 개선 상호정보량 만약 the car drive 라는 단어가 있으면, the와 car 과의 연관성 보다, car과 drive가 더 관련성이 깊다고 생각할 것입니다. 하지만 the가 더 많이 등장한다면, the와의 관련성이 더 높다고 생각할 것이다. 이러한 문제를 해결하기 위해 점별 상호정보량(PMI) 이라는 척도를 사용한다. P(x)는 x가 일어날 확률, P(y)는 y가 일어날 확률, P(x,y)는 x,y가 동시에 일어날 확률이다. C는 동시발생 행렬, C(x,y)는 단어 x와 y가 동시발생하는 횟수, C(x)와 C(y)는 각각 단어 x와 y의 등장 횟수이다. N은 말뭉치에 포함된 단어수를 의미한다. 만약 the 가 1000번, car가 20번, drive가 10번 등장했을 때, the와 ..
밑딥1은 대부분이 배웠던 내용이라 복습의 목적으로 일주일만에 책 한권 다했다. 밑딥2 1장은 밑딥1의 총망라라 정리하지 않았고 2장부터 시작합니다 밑딥1보다 좀 더 꼼꼼히 기록할 예정임 통계 기반 기법 말뭉치 전처리 하기 통계 기반 기법에서는 말뭉치(corpus)를 이용한다. 말뭉치란 대량의 텍스트 데이터를 의미한다. 우리가 흔히 볼 수 있는 뉴스, 소설과 같은 글도 말뭉치로 되어 있다. 다음과 같은 말뭉치로 앞으로의 분석을 진행할 것이다. text = 'You say goodbye and I say hello.' 이 텍스트를 단어 단위로 분할한다. txt = 'You say goodbye and I say hello.' txt = txt.lower() #단어 소문자화 txt = txt.replace('..
출처: do it 자료구조와 함께 배우는 알고리즘 입문 선형 검색 알고리즘 직선 모양으로 늘어선 배열에서 원하는 키값을 가진 원소를 찾을 때까지 맨 앞부터 스캔하여 검색한다. from typing import Any,Sequence def seq_search(a: Sequence,key:Any) -> int: #시퀀스에서 a에서 key와 값이 같은 원소를 선형 검색 i = 0 while True: if i == len(a): return -1 #검색에 실패하여 -1을 반환 if a[i]==key: return i #검색에 성공하여 현재 검사한 배열의 인덱스를 반환 i +=1 if __name__ == '__main__': num = int(input('원소 수를 입력하세요: ')) #num값을 입력받음 ..
출처: do it 자료구조와 함께 배우는 알고리즘 입문 ## 뮤터블과 이뮤터블의 대입 n = 5 print(id(n)) n = 'ABC' print(id(n)) #변수에 어떤값을 대입하면 값이 아니라 식별번호가 바뀐다 133477962137968 133477960949168 n = 12 print(id(n)) n += 1 #int형 객체가 12에서 13으로 업데이트함 print(id(n)) 133477962138192 133477962138224 변경할 수 있는 자료형(mutable) - 리스트, 딕셔너리, 집합 변경할 수 없는 자료형(immutable) - 수, 문자열, 튜플 내포 표기 생성 리스트 numbers의 홀수 원소값을 *2 한 리스트 생성 numbers = [1,2,3,4,5] twise =..
im2col 코드 출처: https://github.com/youbeebee/deeplearning_from_scratch/blob/master/common/util.py import numpy as np def smooth_curve(x): """손실 함수의 그래프를 매끄럽게 하기 위해 사용 참고:http://glowingpython.blogspot.jp/2012/02/convolution-with-numpy.html """ window_len = 11 s = np.r_[x[window_len-1:0:-1], x, x[-1:-window_len:-1]] w = np.kaiser(window_len, 2) y = np.convolve(w/w.sum(), s, mode='valid') return y[5:..