Loading...
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)) # ..

2021. 10. 16. 22:30

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

이번 글부터는 자연어 처리에 대해 기초적인 것들을 알아볼 것이다. 한국어와 영어 등 우리가 평소에 쓰는 말을 자연어(Natural Language)라고 한다. 자연어 처리(Natural Language Processing)를 문자 그대로 해석하면 '자연어를 처리하는 분야'이고 '우리의 말을 컴퓨터에게 이해시키기 위한 기술'이라고 볼 수 있다. 그래서 자연어 처리가 추구하는 목표는 사람의 말을 컴퓨터가 이해하도록 만들어서, 컴퓨터가 우리에게 도움이 되는 일을 수행하게 하는 것이다. 단어의 의미 단어는 의미의 최소 단위이다. 자연어를 컴퓨터에게 이해시키는 데는 무엇보다 '단어의 의미'를 이해시키는 게 중요하다. 컴퓨터의 단어의 의미를 잘 파악하는 표현 방법에는 세 가지가 있다. 시소러스를 활용한 기법 통계 ..

2021. 10. 15. 21:29

밑바닥부터 시작하는 딥러닝 - 신경망(4)

저번 글까지 신경망의 대해 알아보았다. 이번 글에서는 준비된 데이터셋으로 신경망을 학습시켜 볼 것이다. 스파이럴 데이터셋 Spiral(나선형) 데이터를 불러오는 클래스를 구현한다. import sys sys.path.append('..') from dataset import spiral import matplotlib.pyplot as plt x, t = spiral.load_data() print('x', x.shape) print('t', t.shape) spiral.py 파일을 임포트 하여 이용한다. 그 후 spiral.load_data()로 데이터를 읽어 온다. 이때, x가 입력 데이터이고, t가 정답 레이블이다. x와 t의 형상을 출력해보면 각각 300개의 샘플 데이터를 담고 있으며, x는 2차..

2021. 10. 14. 22:40

밑바닥부터 시작하는 딥러닝 - 신경망(3)

신경망의 학습 손실 함수 신경망 학습에는 학습이 얼마나 잘 되고 있는지를 알기 위한 '척도'가 필요하다. 일반적으로 학습 단계의 특정 시점에서 신경망의 성능을 나타내는 척도로 '손실'을 사용한다. 손실은 학습 데이터(학습 시 주어진 정답 데이터)와 신경망이 예측한 결과를 비교하여 예측이 얼마나 나쁜가를 산출한 단일 값(스칼라)이다. 신경망의 손실은 손실 함수를 사용해 구한다. 다중 클래스 분류 신경망에서는 손실 함수로 흔히 교차 엔트로피 오차를 이용한다. 교차 엔트로피 오차는 신경망이 출력하는 각 클래스의 '확률'과 '정답 레이블'을 이용해 구할 수 있다. 앞에서 구현한 신경망에 Softmax 계층과 Cross Entropy Error 계층을 새로 추가한다. x는 입력 데이터, t는 정답 레이블, L은 ..

2021. 10. 13. 23:01

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

지난 글에 이어 신경망에 대해 알아볼 것이다. 신경망에서 수행하는 작업은 크게 두 단계로 나눌 수 있다. '학습'과 '추론'이다. 이번 글에서는 '추론'에 대해 알아볼 것이다. 신경망의 추론 신경망 추론 그림 입력층에는 뉴런 2개, 출력층에는 뉴런 3개를 각각 준비한다. 그리고 은닉층에도 적당한 수의 뉴런을 배치한다. 여기서는 4개의 뉴런을 두기로 한다. 위의 그림의 신경망은 인접하는 층의 모든 뉴런과 연결되어 있다는 뜻에서 완전연결계층이라고 한다. x는 입력, h는 은닉층의 뉴런, W는 가중치, b는 편향을 뜻한다. 이 기호 각각은 모두 행렬이다. # 완전연결계층에 의한 변환의 미니배치 버전 구현 import numpy as np W1 = np.random.randn(2, 4) b1 = np.rando..

2021. 10. 12. 22:34

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

벡터와 행렬 벡터 : 크기와 방향을 가진 양 숫자가 일렬로 늘어선 집합 1차원 배열로 취급 행렬 : 숫자가 2차원 형태로 늘어선 것 벡터와 행렬은 np.array() 메서드로 생성 가능 넘파이의 다차원 배열 클래스인 np.ndarray 클래스를 생성 ndim : 차원 수 W : 2차원 배열, 2 X 3 행렬 행렬의 원소별 연산 피연산자인 다차원 배열들에서 서로 대응하는 원소끼리 연산이 이뤄짐 브로드캐스트 넘파이의 다차원 배열에서는 형상이 다른 배열끼리도 연산 가능 스칼라 값 10이 2 X 2 행렬로 확장된 후에 원소별 연산을 수행 벡터의 내적과 행렬의 곱 왼쪽 행렬의 행벡터(가로 방향)와 오른쪽 행렬의 열벡터(세로 방향)의 내적(원소별 곱의 합)으로 계산 벡터의 내적과 행렬의 곱 모두에 np.dot()을..