케라스 창시자에게 배우는 딥러닝_2장

코넬·2022년 11월 21일
0

DeepLearning_Keras

목록 보기
2/13
post-thumbnail

딥러닝의 구조

: 신경망의 핵심 구성 요소, 데이터를 위한 필터(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)관점에서 생각하면 좋다 !
계산 그래프를 사용하면 계산을 데이터로 다룰 수 있기 때문에 컴퓨터 과학 분야에서 매우 성공적인 추상화 방식으로 사용된다.

출처 : 케라스 창시자에게 배우는 딥러닝(개정판)

profile
어서오세요.

0개의 댓글