[케라스 창시자에게 배우는 딥러닝] 교재를 바탕으로 작성되었습니다.
2.1 신경망과의 첫 만남
2.2 신경망을 위한 데이터 표현
2.3 신경망의 톱니바퀴 : 텐서 연산
2.4 신경망의 엔진 : 그래디언트 기반 최적화
2.5 첫 번째 예제 다시 살펴보기
2.6 요약
2.1 신경망과의 첫 만남
- 클래스(class) : 분류 문제의 범주(category)
- 샘플(sample) : 데이터 포인트
- 레이블(label) : 특정 샘플의 클래스
- 층(layer) : 일종의 데이터 처리 필터, 주어진 문제에 더 의미있는 표현(representation)을 입력된 데이터로부터 추출
-> 딥러닝 모델 : 데이터 정제 필터(층)가 연속되어 있는 데이터 프로세싱을 위한 여과기
신경망이 훈련 준비를 마치기 위한 컴파일 단계
- 손실 함수(loss function) : 훈련 데이터에서 신경망의 성능을 측정하는 방법, 네트워크가 옳은 방향으로 학습될 수 있도록 도와줌
- 옵티마이저(optimizer) : 입력된 데이터와 손실 함수를 기반으로 네트워크를 업데이트하는 메커니즘
- 훈련과 테스트 과정을 모니터링할 지표 : 정확도(정확히 분류된 이미지의 비율), ...
2.2 신경망을 위한 데이터 표현
텐서(tensor) : 데이터를 위한 컨데이너(container), 임의의 차원(dimension, 축(axis)) 개수를 가지는 행렬의 일반화된 모습
1. 스칼라 (0D 텐서) : 하나의 숫자만 담고 있는 텐서
- float32/ float64 타입의 숫자
- (ndim == 0), 축 개수(랭크(rank)) = 0
2. 벡터 (1D 텐서) : 숫자의 배열 (벡터(vector))
- 하나의 축
3. 행렬 (2D 텐서) : 벡터의 배열 (행렬(matrix))
- 2개의 축 (행(row)과 열(column))
- 첫 번째 축에 놓여 있는 원소(행), 두 번째 축에 놓여 있는 원소(열)
텐서의 3가지 핵심 속성
- 축의 개수(랭크) : ndim
- 크기(shape) : 텐서의 각 축을 따라 얼마나 많은 차원이 있는지를 나타낸 파이썬의 튜플(tuple)
- 데이터 타입 : 텐서에 포함된 데이터의 타입
- 슬라이싱(slicing) : 배열에 있는 특정 원소들을 선택하는 것
배치 데이터
- 샘플 축(sample axis), 샘플 차원(sample dimension) : 모든 데이터 텐서의 첫 번째 축
- 딥러닝 모델은 한 번에 전체 데이터셋을 처리하지 않고 데이터를 작은 배치(batch)로 나누어 처리함
-> 첫 번째 축(0번 축)을 배치 축(batch axis) 또는 배치 차원(batch dimension)이라고 부름
텐서의 실제 사례
- 벡터 데이터 : (samples, features) 크기의 2D 텐서
- 시계열 데이터/시퀀스(sequence) 데이터 : (samples, timesteps, features) 크기의 3D 텐서
- 이미지 : (samples, height, width, channels) 또는 (samples, channels, height, width) 크기의 4D 텐서
- 동영상 : (samples, frames, height, width, channels) 또는 (samples, frames, channels, height, width) 크기의 5D 텐서
1. 벡터 데이터
- 하나의 데이터 포인트가 벡터로 인코딩
- (samples, features) 크기의 2D 텐서
- 첫 번째 축은 샘플 축, 두 번째 축은 특성 축
2. 시계열 데이터 / 시퀀스 데이터
- (samples, timesteps, features) 크기의 3D 텐서
- 시간 축은 항상 두 번째 축(인덱스가 1인 축)
3. 이미지 데이터
- (samples, height, width, channels) 또는 (samples, channels, height, width) 크기의 4D 텐서
- 흑백 이미지는 하나의 컬러 채널만을 가지고 있어 2D 텐서로 저장될 수 있지만, 관례상 이미지 텐서는 항상 3D로 저장됨 (채널의 차원 크기 = 1)
이미지 텐서의 크기를 지정하는 2가지 방식
- 채널 마지막(channel-last) 방식 : 구글의 텐서플로 머신 러닝 프레임워크 (samples, height, width, color_depth)
- 채널 우선(channel-first) 방식 : 씨아노 (samples, color_depth, height, width)
4. 비디오 데이터
- (samples, frames, height, width, channels) 또는 (samples, frames, channels, height, width) 크기의 5D 텐서
- 컬러 이미지 > 프레임 > 비디오
- 프레임(3D) > 프레임의 연속(4D) > 여러 비디오의 배치(5D)
2.3 신경망의 톱니바퀴 : 텐서 연산 (tensor operation)
keras.layers.Dense(512, activation='relu')
2D 텐서를 입력받고, 또 다른 2D 텐서를 반환하는 함수
output = relu(dot(W, input) + b)
W는 2D 텐서, b는 벡터
- 입력 텐서와 텐서 W 사이의 점곰(dot)
- 점곱의 결과인 2D 텐서와 벡터 b 사이의 덧셈(+)
- relu(렐루) 연산
1. 원소별 연산(element-wise operaion)
: 텐서에 있는 각 원소에 독립적으로 적용됨
브로드캐스팅(broadcasting)
: 두 행렬 A, B 중 크기가 작은 행렬을 크기가 큰 행렬과 모양(shape)이 맞게끔 늘려주는 것
- 큰 텐서의 ndim에 맞도록 작은 텐서에 (브로드캐스팅 축이라고 부르는) 축이 추가됨
- 작은 텐서가 새 축을 따라서 큰 텐서의 크기에 맞도록 반복됨
2. 점곱 연산(dot operation) , 텐서 곱셈(tensor product)
: 원소별 연산과 반대로 입력 텐서의 원소들을 결합시킴
3. 텐서 크기 변환(tensor reshaping)
: 특정 크기에 맞게 열과 행을 재배열하는 것 (원래 텐서와 원소 개수 동일)
ex. 전치(transposition) : 행과 열을 바꾸는 것
2.4 신경망의 엔진 : 그래디언트 기반 최적화
output = relu(dot(W, input) + b)
- 텐서 W와 b는 층의 속성
- 가중치(weight) 또는 훈련되는 파라미터(trainable parameter)
- 커널(kernel)과 편향(bias)
- 가중치에는 훈련 데이터를 신경망에 노출시켜서 학습된 정보가 담겨있음
훈련 반복 루프(training loop)
- 훈련 샘플 x와 이에 상응하는 타깃 y의 배치를 추출
- x를 사용하여 네트워크를 실행하고(정방향 패스(forward pass) 단계), 예측 y_pred를 구함
- y_pred와 y의 차이를 측정하여 이 배치에 대한 네트워크의 손실 계산
- 배치에 대한 손실이 조금 감소되도록 네트워크의 모든 가중치를 업데이트
- 변화율(derivative)과 그래디언트(gradient)
- 확률적 경사 하강법
- 변화율 연결 : 역전파 알고리즘