분류 전체보기 39

[밑바닥부터 시작하는 딥러닝 1] 4. 신경망 학습 - 경사 하강법

신경망에서는 학습 시 최적의 매개변수(가중치와 절편)를 찾아내야 한다. 여기서 최적이란 손실함수가 최솟값이 될 때를 말한다. 그러나 일반적인 문제의 손실함수는 매우 복잡하기에 어디가 최솟값이 되는 곳인지 짐작할 수 없다. 이때 기울기를 사용하는 것이 경사법(경사 하강법)이다. 그러나 기울기가 가리키는 곳에 정말 함수의 최솟값이 있는지는 보장할 수 없다. 실제로 복잡한 함수에서는 기울기가 가리키는 방향에 최솟값이 없는 경우가 대부분이다. 꼭 최솟값을 가리키지는 않지만 그 방향으로 가야 함수의 값을 줄일 수 있다. 그래서 기울기 정보가 필요한 것이다. # 경사법 경사법은 현 위치에서 기울어진 방향으로 일정 거리만큼 이동한다. 그런 다음 이동한 곳에서도 기울기를 구하고, 또 그 기울어진 방향으로 나아가기를 반..

[밑바닥부터 시작하는 딥러닝 1] 4. 신경망 학습 - 미분

위 식은 함수의 미분을 나타낸 식이다. 좌변은 f(x)의 x에 대한 미분(x에 대한 f(x)의 변화량)을 나타내는 기호이다. x의 '작은 변화'가 함수 f(x)를 얼마나 변화시키느냐를 의미한다. 이때 시간 h의 작은 변화를 한없이 0에 가깝게 한다는 의미로 lim 기호를 붙인다. def numerical_diff(f, x): h = 1e-50 return (f(x+h) - f(x)) / h 위 식을 참고하여 곧이곧대로 구현하였다. 함수의 이름은 수치 미분에서 따온 이름이다. h에 작은 값을 넣어 위와 같이 계산한다. 하지만 좋은 구현은 아니다. 첫 번째로 반올림 오차가 있다. 소수점 아래 0이 50개라는 의미의 1e-50을 썼지만 반올림 오차는 작은값(가령 소수점 8자리 이하)이 생략되어 최종 계산 결과..

[밑바닥부터 시작하는 딥러닝 1] 4. 신경망 학습 - 손실함수

[학습]이란 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것을 말한다. 이미지에서 특징(feature)을 추출하고 그 특징의 패턴을 학습하는 방법이 있다. 기계학습에서 이미지를 벡터로 변환할 때 사용하는 특징은 여전히 사람이 설계해야하는 문제이다. 적합한 특징을 사용해서 모아진 데이터로부터 규칙을 찾아내는 역할을 기계가 담당하는 것이다. 그러나 신경망은 '있는 그대로' 학습한다. 신경망은 이미지에 포함된 특징까지도 기계가 스스로 학습한다. # 훈련 데이터와 시험 데이터 기계학습의 문제는 데이터를 훈련 데이터와 테스트 데이터로 나눠 학습과 실험을 수행하는 것이 일반적이다. 우선 훈련 데이터만을 사용하면서 최적의 매개변수를 찾는다. 그런 다음 시험 데이터를 사용하여 훈련한 모델의 실력을 평..

[밑바닥부터 시작하는 딥러닝 1] 3. MNIST 손글씨 숫자 인식

mnist.py github https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/dataset/mnist.py 위 파일을 다운받아 dataset 폴더에 넣는다. (책에는 안 나와있다......) MNIST 데이터셋은 0부터 9까지 숫자 이미지로 구성된다. 훈련 이미지가 60000장, 테스트 이미지가 10000장 준비되어 있다. # 데이터 불러오기 import sys, os sys.path.append(os.pardir) # 부모 디렉터리의 파일을 가져올 수 있도록 설정 from dataset.mnist import load_mnist (x_train, t_train), (x_test, t_test) = \ load_mnist(f..

.gitignore 생성, 사용법, 적용, 적용 안됨

# .gitignore 사용법 # 주석 다는 방법. 이 줄은 무시한다. # 파일명.확장자 하면 경로와 무관하게 같은 이름을 가진 파일을 모두 무시할 수 있다. FreePractice.java # 특정 파일만 무시하려면 경로/파일명.확장자 한다. # 이때 기준이 되는 경로는 .gitignore 이 있는 경로이다 src/FreePractice.java # src에 .gitignore이 있는 경우 /FreePractice.java # 특정 경로 하위 파일들을 모두 무시하는 방법 /bin/ # 특정 경로 아래 있는 모든 파일명.확장자 무시하는 방법 hello/**/Practice.java # 특정 경로의 특정 확장자 무시하는 방법 src/*.txt # 특정 확장자 모두 무시하는 방법 *.txt # 허나 무시 목..

딥러닝 활성화 함수 - 소프트맥스 함수 (softmax)

import numpy as np def softmax(a): c = np.max(a) exp_a = np.exp(a-c) # 오버플로 대책 sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y 밑바닥부터 시작하는 딥러닝 1에서 두고두고 쓰일 활성화 함수 중 하나여서 정리해본다. max()는 최댓값을 뽑아내는 넘파이 함수이다. 소프트맥스 함수 식은 위와 같다. exp(x)는 e^x을 뜻하는 지수함수이다. n은 출력층의 뉴런 수, k는 그중 k번째 출력임을 뜻한다. 소프트맥스 함수의 분자는 입력 신호 a_k 의 지수함수, 분모는 모든 입력 신호의 지수함수의 합으로 구성된다. 소프트맥스 함수를 그림으로 표현하면 아래와 같다. 출력은 모든 입력 신호로부터 화살표..

[밑바닥부터 시작하는 딥러닝 1] 3. 신경망 출력층 설계, 소프트맥스 함수(softmax)

신경망은 분류와 회귀 모두에 이용할 수 있다. 분류는 데이터가 어느 클래스에 속해있는지에 대한 문제이고 회귀는 수치를 예측하는 문제이다. 일반적으로 회귀에는 항등 함수, 분류에는 소프트맥스 함수를 사용한다. 소프트맥스 함수 식은 위와 같다. exp(x)는 e^x을 뜻하는 지수함수이다. n은 출력층의 뉴런 수, k는 그중 k번째 출력임을 뜻한다. 소프트맥스 함수의 분자는 입력 신호 a_k 의 지수함수, 분모는 모든 입력 신호의 지수함수의 합으로 구성된다. 소프트맥스 함수를 그림으로 표현하면 아래와 같다. 출력은 모든 입력 신호로부터 화살표를 받는다. # 소프트맥스 함수 구현 import numpy as np a = np.array([0.3, 2.9, 4.0]) exp_a = np.exp(a) print(e..

[밑바닥부터 시작하는 딥러닝 1] 3. 신경망, 3층 신경망 구현

import numpy as np A = np.array([1, 2, 3, 4]) print(A) # [1 2 3 4] print(np.ndim(A)) # 1 (배열의 차원 수) print(A.shape) # (4,) (배열의 형상(크기)) 1차원이어도 튜플로 반환 print(A.shape[0]) # 4 B = np.array([[1, 2], [3, 4], [5, 6]]) print(B) ''' [[1 2] [3 4] [5 6]] ''' print(np.ndim(B)) # 2 print(B.shape) # (3, 2) 1차원 배열 A와 2차원 배열 B를 작성하였다. 2차원 배열은 특히 행렬(matrix)이라고 부른다. 가로 방향을 행(row), 세로 방향을 열(column)이라고 부른다. # 행렬의 곱 ..

[밑바닥부터 시작하는 딥러닝 1] 3. 신경망, 활성화함수

앞 장에서는 퍼셉트론을 다루며 우리 인간이 적절한 가중치(w)를 설정했다. 하지만 신경망은 학습을 통해 자동으로 가중치를 결정할 수 있다는 장점이 있다. 이번 장에서는 신경망이 입력 데이터가 무엇인지 식별하는 처리 과정을 알아본다. # 신경망 신경망을 그림으로 나타낸 것이다. 가장 왼쪽 줄을 입력층, 맨 오른쪽 줄을 출력층, 중간 줄을 은닉층이라고 한다. 은닉층의 뉴런은 사람 눈에는 보이지 않는다. 이 책에서는 입력층부터 0층, 1층, 2층이라고 한다. 이전 장에서는 퍼셉트론을 수식으로 이렇게 나타냈었다. 이번 장에서는 좀 더 간결하게 해서 다루도록 한다. 이 h(x)를 활성화 함수(activation function)라고 한다. # 활성화 함수 y 식을 다시 쓰면 이렇게 된다. 가중치가 곱해진 입력 신..

[밑바닥부터 시작하는 딥러닝 1] 2. 퍼셉트론, 논리 회로

# 퍼셉트론 퍼셉트론은 인공 신경망의 기원이 되는 알고리즘이다. 퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다. 퍼셉트론 신호는 흐른다/안 흐른다(1이나 0)의 두 가지 값을 가질 수 있다. 이 책에서는 '신호가 흐른다'를 1, '신호가 흐르지 않는다'를 0으로 쓴다. 입력 신호 x가 뉴런에 보내질 땐 각각 고유한 가중치(weight)가 곱해진다. (w₁x₁, w₂x₂) 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다. 그 한계를 임계값이라고 하고, θ로 나타낸다. 이상을 수식으로 나타내면 아래와 같다. # 단순한 논리회로 AND, NAND, OR 게이트를 진리표로 나타내었다. 이 게이트를 퍼셉트론으로 표현하려면 w₁, w₂, θ를 설정하면 된다. (w₁, w₂, ..