전체 글 251

MNIST Lab 4편 - Cross Entropy Loss 직접 구현하기

MNIST Lab 기본 구현 4편Cross Entropy Loss는 모델이 정답 클래스에 얼마나 낮은 확률을 줬는지 벌점으로 바꾸는 함수다. MNIST에서는 정수 label을 이용해 정답 칸의 확률만 뽑아 계산한다.1. 손실 함수는 모델의 벌점이다정답이 3인데 모델이 3번 칸에 0.9를 주면 잘한 것이다. 반대로 0.01을 주면 크게 틀린 것이다. Cross Entropy는 이 차이를 -log(정답 확률)로 벌점화한다.정답 확률-log 값해석0.9작음정답을 강하게 믿었으므로 벌점이 작다.0.5중간애매하게 맞혔다.0.01큼정답을 거의 믿지 않았으므로 벌점이 크다.2. 최종 구현 코드def cross_entropy_loss(y_pred, y_true): batch_size = y_pred.shape[0..

카테고리 없음 2026.05.28

MNIST Lab 3편 - Affine 계층 xW+b와 backward shape 구현하기

MNIST Lab 기본 구현 3편Affine은 완전연결층이다. forward에서는 xW+b를 계산하고, backward에서는 이전 입력으로 보낼 dx와 파라미터를 고칠 dW, db를 만든다.1. Affine은 차원을 바꾸는 계층이다값shape 예시역할x(5, 4)batch 5개, 입력 feature 4개W(4, 3)4차원 입력을 3차원 출력으로 바꾸는 가중치b(3,)출력 feature마다 더하는 편향out(5, 3)각 데이터가 3차원 점수로 변환된 결과Affine을 볼 때 먼저 봐야 하는 것이 계층은 숫자를 섞는 계층이면서 동시에 차원을 바꾸는 계층이다. 그래서 forward 결과만 맞아도 부족하고, backward에서 dx, dW, db가 각각 원래 자리로 돌아갈 수 있는 shape인지까지 확인해야 한..

카테고리 없음 2026.05.28

MNIST Lab 2편 - Softmax forward/backward 직접 구현하기

MNIST Lab 기본 구현 2편Softmax는 모델이 만든 10개 점수를 확률처럼 바꾸는 출력층 함수다. 핵심은 각 행의 합이 1이 되게 만들고, 큰 값에서 exp가 터지지 않도록 안정화하는 것이다.1. Softmax가 필요한 이유모델의 마지막 Affine 출력은 아직 점수(logit)일 뿐이다. 숫자 0~9 중 무엇일 가능성이 높은지 비교하려면 이 점수를 확률처럼 바꿔야 한다.1logit예: [2.0, 1.0, 0.1]처럼 정규화되지 않은 점수다.2exp점수를 양수로 바꾸고 큰 점수의 영향이 더 커지게 한다.3normalize각 행을 자기 행의 exp 합으로 나눠 합이 1이 되게 한다.2. 최종 구현 코드class Softmax: def forward(self, x): shifted..

카테고리 없음 2026.05.28

MNIST Lab 1편 - ReLU forward/backward 직접 구현하기

MNIST Lab 기본 구현 1편첫 번째 구현 대상은 ReLU다. ReLU는 음수를 0으로 만드는 함수처럼 보이지만, 실제 구현에서는 forward에서 막힌 위치를 기억해 backward에서도 gradient를 막아야 한다.1. ReLU가 맡은 역할Affine 계층은 xW+b 계산으로 음수와 양수가 섞인 값을 만든다. ReLU는 그중 0 이하 값을 막고, 양수만 다음 계층으로 보낸다.1입력[-1, 2, 0, 3]처럼 음수, 0, 양수가 섞여 들어온다.2forward0 이하 값은 0으로 바꾸고, 양수는 그대로 둔다.3backwardforward에서 막힌 위치는 gradient도 흐르지 않게 한다.2. 최종 구현 코드class ReLU: def __init__(self): self.mask..

카테고리 없음 2026.05.28

MNIST Lab 0편 - TODO와 21개 테스트로 보는 NumPy 신경망 구현 지도

MNIST Lab 기본 구현 시리즈 0편이 시리즈는 결과 요약글이 아니라, MNIST Lab의 투두를 하나씩 직접 구현하기 위한 글이다. 먼저 전체 구현 지도를 잡고, 각 테스트가 무엇을 묻는지 확인한 뒤, 다음 글부터 ReLU, Softmax, Affine 순서로 실제 코드를 채운다.핵심부터 말하면이 과제는 "MNIST 정확도 몇 퍼센트"만 찍는 과제가 아니다. 딥러닝 프레임워크 없이 NumPy만으로 계층, 손실 함수, 옵티마이저, 네트워크 조립, 학습 루프를 직접 만드는 과제다. 그래서 앞으로의 글은 테스트가 요구하는 작은 동작 조건을 코드로 채우는 방식으로 간다.1. 전체 구조는 부품 조립이다완성된 모델을 한 번에 이해하려고 하면 복잡하다. 하지만 투두 단위로 쪼개면 구조가 단순해진다. 각 계층은 ..

카테고리 없음 2026.05.28

[밑바닥부터 시작하는 딥러닝 1] 10c. 드롭아웃과 검증 데이터는 과대적합을 서로 다른 위치에서 막는다

밑바닥부터 시작하는 딥러닝 1 - 과대적합과 검증 데이터 심화학습이 잘 된다는 말은 훈련 데이터 점수가 높다는 뜻만은 아니다. 처음 보는 데이터에서도 잘 맞아야 한다. 이때 문제가 되는 것이 과대적합이다.이번 글은 드롭아웃, 가중치 감소, 검증 데이터를 한 줄 요약으로 끝내지 않고, 각각이 과대적합을 어느 위치에서 막는지 구분한다.이번 글에서 잡을 것과대적합은 훈련 데이터에는 잘 맞지만 새로운 데이터에는 약한 상태다.가중치 감소는 큰 가중치에 페널티를 주어 모델이 과하게 날카로워지는 것을 막는다.드롭아웃은 훈련 중 일부 뉴런을 꺼서 특정 뉴런 의존을 줄인다.검증 데이터는 하이퍼파라미터 선택용이고, 시험 데이터는 최종 평가용이다.과대적합을 숫자로 보면과대적합은 훈련 정확도만 보면 좋아 보인다. 하지만 시험..

[밑바닥부터 시작하는 딥러닝 1] 10b. 배치 정규화는 왜 평균 0, 분산 1로 맞춘 뒤 다시 scale과 shift를 배울까

밑바닥부터 시작하는 딥러닝 1 - BatchNorm 심화초깃값은 학습 시작 시점의 분포를 다룬다. 배치 정규화(Batch Normalization)는 한 걸음 더 나아가 학습 중간에 각 층으로 들어가는 값의 분포를 직접 조정한다.이번 글은 BatchNorm을 '학습을 빠르게 한다'는 효과만 외우지 않고, 미니배치 평균과 분산으로 무엇을 바꾸는지, 왜 다시 gamma와 beta를 두는지까지 정리한다.이번 글에서 잡을 것BatchNorm은 미니배치 단위로 평균과 분산을 계산한다.입력값을 평균 0, 분산 1에 가깝게 정규화한다.정규화만 하면 표현이 너무 제한될 수 있으므로 gamma와 beta로 다시 확대/이동한다.초깃값 의존을 줄이고 학습을 안정적으로 만드는 데 도움을 준다.BatchNorm이 끼어드는 위치..

[밑바닥부터 시작하는 딥러닝 1] 10a. 가중치 초깃값은 왜 0이면 안 되고, 왜 Xavier와 He가 나오는가

밑바닥부터 시작하는 딥러닝 1 - 초깃값 심화신경망 학습은 가중치를 조금씩 고쳐가는 과정이다. 그런데 시작점이 나쁘면 아무리 좋은 학습 루프를 만들어도 신호가 잘 흐르지 않거나, 모든 뉴런이 비슷한 일만 하게 된다.이번 글은 초깃값을 단순히 '랜덤으로 둔다'에서 멈추지 않고, 왜 0이면 안 되는지와 왜 활성화 함수에 따라 Xavier와 He 초깃값을 다르게 쓰는지까지 정리한다.이번 글에서 잡을 것모든 가중치를 0으로 두면 여러 뉴런이 같은 값으로 갱신되어 대칭성이 깨지지 않는다.초깃값이 너무 크면 활성화값이 극단으로 몰려 기울기 흐름이 약해질 수 있다.초깃값이 너무 작으면 여러 뉴런의 출력이 비슷해져 표현력이 줄어든다.Sigmoid/tanh 계열에는 Xavier, ReLU 계열에는 He 초깃값이 자주 쓰..

[밑바닥부터 시작하는 딥러닝 1] 10. 초깃값, 배치 정규화, 드롭아웃은 학습을 안정시키는 장치다

밑바닥부터 시작하는 딥러닝 1 - 학습 관련 기술들신경망은 구조만 만든다고 잘 학습되지 않는다. 출발점이 나쁘거나, 층을 지나며 값이 치우치거나, 훈련 데이터에만 지나치게 맞춰지면 성능이 흔들린다.6장의 여러 기술은 서로 다른 문제를 다룬다. 초깃값은 출발점을, 배치 정규화는 중간 분포를, 드롭아웃과 가중치 감소는 과대적합을 다룬다.이번 글에서 잡을 것가중치를 모두 0으로 시작하면 대칭성이 깨지지 않는다.Sigmoid/tanh에는 Xavier, ReLU에는 He 초깃값이 자주 쓰인다.배치 정규화는 미니배치 단위로 데이터 분포를 평균 0, 분산 1에 가깝게 맞춘다.가중치 감소와 드롭아웃은 과대적합을 막는 대표적인 방법이다.하이퍼파라미터는 시험 데이터가 아니라 검증 데이터로 조정한다.초깃값을 모두 0으로 하..

[밑바닥부터 시작하는 딥러닝 1] 09b. SGD, Momentum, AdaGrad, Adam은 실제로 무엇을 다르게 계산하나

밑바닥부터 시작하는 딥러닝 1 - optimizer 심화앞 글에서는 SGD가 왜 지그재그로 움직이고, Momentum과 AdaGrad가 무엇을 기억하는지 큰 흐름을 잡았다. 이번 글은 그 흐름을 코드와 숫자 표로 조금 더 내려놓는 심화편이다.목표는 optimizer 공식을 모두 외우는 것이 아니다. 같은 기울기가 들어왔을 때 각 방법이 어떤 값을 저장하고, 다음 갱신에 그 값을 어떻게 다시 쓰는지 확인하는 것이다.이번 글에서 잡을 것SGD는 현재 기울기만 사용한다.Momentum은 이전 이동량 `v`를 누적해 관성을 만든다.AdaGrad는 과거 기울기 제곱합 `h`를 누적해 보폭을 줄인다.Adam은 기울기의 방향 평균과 크기 정보를 함께 사용한다.optimizer의 차이는 결국 기억 변수와 보폭 조절 방..