층
: 신경망의 핵심 구성 요소, 데이터를 위한 필터(filter)
옵티마이저
(optimizer) : 성능을 향상시키기 위해 입력된 데이터를 기반으로 모델을 업데이트 하는 메커니즘
손실 함수
(loss function) : 훈련 데이터에서 모델의 성능을 측정하는 방법으로 모델이 옳은 방향으로 학습할 수 있도록 도와줌.
훈련과 테스트 과정을 모니터링할 지표
: 정확도(정확히 분류된 이미지의 비율)를 지표로 사용
텐서
: 다차원 넘파이 배열에 데이터 저장 - 임의의 차원 개수를 가지는 행렬의 일반화된 모습 (차원(dimension)을 종종 축(axis)라고 부른다)
스칼라
: 하나의 숫자만 담고 있는 텐서 (= 스칼라 텐서, 랭크-0텐서, 0D 텐서)스칼라 텐서의 축 개수는 0(ndim==0)
벡터
: 숫자의 배열을 뜻함 (= 랭크-1 텐서, 1D 텐서)
행렬
: 벡터의 배열 (= 랭크-2 텐서, 2D 텐서), 보통 행과 열이라고 부름
랭크 -3 텐서보다 더 높은 랭크의 텐서
: 행렬들을 하나의 새로운 배열로 합치며 숫자가 채워진 직육면체 형태로 해석할 수 있는 랭크-3 텐서가 만들어짐.
축의 개수(랭크)
: 랭크-3 텐서에는 3개의 축, 행렬에는 2개의 축과 같이 ndim 속성에 저장되어있는 값
크기(shape)
: 텐서의 각 축을 따라 얼마나 많은 차원이 있는지를 나타낸 파이썬의 튜플(tuple)
데이터 타입(dtype)
: 텐서에 포함된 데이터의 타입 (ex) float16, float32, unit8 등
슬라이싱(slicing)
: 배열에 있는 특정한 원소들을 선택하는 것
my_slice = train_images[10:1000]
my_slice.shape
(90,28, 28)
배치 데이터
: 딥러닝에서 사용하는 모든 데이터 센서의 첫 번째 축을 샘플 축이라고 하고, 배치 데이터를 다룰 때 첫 번째(0번 축)을 배치 축 또는 배치 차원 이라고 한다.
벡터 데이터
: (samples, features) 크기의 랭크-2 텐서, 각 샘플은 수치 속성으로 구성된 벡터이다.
대부분의 경우에 해당된다. 첫 번째 축은 샘플 축이고, 두 번째 축은 특성 축이다.
시계열 데이터 또는 시퀀스 데이터
: (samples, timesteps, features) 크기의 랭크-3 텐서, 각 샘플은 특성 벡터의 시퀀스이다.
시간이 중요할 때 시간 축을 포함한 이 텐서를 사용한다.
이미지
: (samples, height, width, channels) 크키의 랭크-4 텐서, 각 샘플은 픽셀의 2D 격자이며, 각 픽셀은 수치 값의 벡터이다.
이미지는 전형적으로 높이, 너비, 컬러 채널의 3차원으로 이루어져있다.
()의 순서에 따라 채널 마지막 방식(흔히사용)과 채널 우선 방식으로 나누어져있다.
동영상
: (samples, frames, height, width, channels) 크기의 랭크-5 텐서, 각 샘플은 이미지의 시퀀스이다.
하나의 비디오는 프레임의 연속이고 각 프레임을 하나의 컬러 이미지이다.
텐서 연산 : 심층 신경망이 학습한 모든 변환을 수치 데이터 텐서에 적용하는 방식
원소별 연산
: 텐서에 있는 각 원소에 독립적으로 적용된다.고도의 병렬 구현이 가능한 연산
브로드캐스팅
: 작은 텐서가 큰 텐서의 크기에 맞춰지는 과정.
1. 큰 텐서의 ndim에 맞도록 작은 텐서에 축이 추가됨.
2. 작은 텐서가 새 축을 따라서 큰 텐서의 크기에 맞도록 반복됨.
import numpy as np
X = np.random.random((32, 10))
y = np.random.random((10,))
y = np.expand_dims(y, axis=0)
Y = np.concatenate([y] * 32, axis=0)
def naive_add_matrix_and_vector(x, y):
assert len(x.shape) == 2
assert len(y.shape) == 1
assert x.shape[1] == y.shape[0]
x = x.copy()
for i in range(x.shape[0]):
for j in range(x.shape[1]):
x[i, j] += y[j]
return x
import numpy as np
x = np.random.random((64, 3, 32, 10))
y = np.random.random((32, 10))
z = np.maximum(x, y)
텐서 곱셈
: 점곱이라 하고, 넘파이에서 텐서 곱셈은 np.dot 함수를 사용하여 수행한다.
x = np.random.random((32,))
y = np.random.random((32,))
z = np.dot(x, y)
def naive_vector_dot(x, y):
assert len(x.shape) == 1
assert len(y.shape) == 1
assert x.shape[0] == y.shape[0]
z = 0.
for i in range(x.shape[0]):
z += x[i] * y[i]
return z
def naive_matrix_vector_dot(x, y):
assert len(x.shape) == 2
assert len(y.shape) == 1
assert x.shape[1] == y.shape[0]
z = np.zeros(x.shape[0])
for i in range(x.shape[0]):
for j in range(x.shape[1]):
z[i] += x[i, j] * y[j]
return z
def naive_matrix_vector_dot(x, y):
z = np.zeros(x.shape[0])
for i in range(x.shape[0]):
z[i] = naive_vector_dot(x[i, :], y)
return z
def naive_matrix_dot(x, y):
assert len(x.shape) == 2
assert len(y.shape) == 2
assert x.shape[1] == y.shape[0]
z = np.zeros((x.shape[0], y.shape[1]))
for i in range(x.shape[0]):
for j in range(y.shape[1]):
row_x = x[i, :]
column_y = y[:, j]
z[i, j] = naive_vector_dot(row_x, column_y)
return z
초기 : 가중치 행렬이 작은 난수로 채워져있음. (무작위 초기화 단계)
훈련 진행 : 훈련 반복 루프
사용
1. 훈련 샘플 x와 이에 상응하는 타깃 y_true의 배치 추출
2. x를 사용하여 모델 실행, 예측 y_pred를 구함
3. y_pred와 y_true의 차이를 측정하고 배치에 대한 모델의 손실을 계산함
4. 배치에 대한 손실이 감소되도록 모델의 모든 가중치 업데이트 진행
여기서 확률적이란, 각 배치 데이터가 무작위로 선택된다는 의미이다.
가중치를 계산할 때 현재 그레이디언트 값만 보지 않고 이전에 업데이트 된 가중치를 여러 가지 다른 방시긍로 고려하는 최적화 방법
또는 옵티마이저
라고 한다.
모멘텀
: SGD에 있는 2개의 문제점인 수렴 속도와 지역 최솟값을 해결한다.
미니 배치 확률적 경사 하강법
1. 훈련 샘플 배치 x와 이에 상응하는 타깃 y_true를 추출한다.
2. x로 모델을 실행하고 예측 y_pred를 구한다.(정방향 패스)
3. 이 배치에서 y_pred 와 y_true 사이의 오차를 측정하여 모델의 손실을 계산한다.
4. 모델의 파라미터에 대한 손실 함수의 그레이디언트를 계산한다.(역방향 패스)
5. 그레이디언트의 반대 방향으로 파라미터를 조금씩 이동한다. (학습률 : 경사 하강법 과정의 속도를 조절하는 스칼라 값)
2개의 층을 가진 모델의 경우 가중치에 대한 손실의 그레이디언트를 구하는 방식.
연쇄 법칙
: 역전파는 간단한 연산의 도함수를 사용해서 기초적인 연산을 조합한 복잡한 연사의 그레이디언트를 쉽게 계산하는 방법. 신경망은 기본적으로 서로 연결된 많은 텐서 연산으로 구성되어있다.
ex) 미적분의 연쇄 법칙(chain rule)을 사용해보자.
def fg(x):
x1 = g(x)
y = f(x1)
return y
연쇄 법칙 사용 시, grad(y, x) == grad(y, x1)
즉, f와 g의 도함수를 알고있다면, fg의 도함수를 계산할 수 있다.
계산 그래프를 활용한 자동 미분
역전파를 계산 그래프(computation graph)관점에서 생각하면 좋다 !
계산 그래프를 사용하면 계산을 데이터로 다룰 수 있기 때문에 컴퓨터 과학 분야에서 매우 성공적인 추상화 방식으로 사용된다.