2026/05/29 5

MNIST Lab 9편 - Dropout forward/backward 직접 구현하기

MNIST Lab 기본 구현 9편Dropout은 학습 중 일부 뉴런을 무작위로 끄는 계층이다. 핵심은 학습 모드에서는 mask를 만들고, backward에서는 같은 mask로 gradient도 막는 것이다.1. Dropout이 막는 문제모델이 특정 뉴런 몇 개에만 과하게 의존하면 훈련 데이터에는 잘 맞지만 새로운 데이터에는 약해질 수 있다. Dropout은 학습 때 일부 뉴런을 랜덤하게 꺼서 이런 의존을 줄인다.1학습 모드랜덤 mask를 만들고 일부 뉴런 출력을 0으로 만든다.2역전파꺼졌던 뉴런 위치는 gradient도 흐르지 않게 한다.3평가 모드랜덤하게 끄지 않고 평균적인 출력 크기만 맞춘다.2. 최종 구현 코드class Dropout: def __init__(self, drop_ratio=0...

카테고리 없음 2026.05.29

MNIST Lab 8편 - BatchNorm forward/backward 직접 구현하기

MNIST Lab 기본 구현 8편BatchNorm은 미니배치의 평균과 분산을 이용해 값을 정규화한다. 구현에서는 학습 모드와 평가 모드가 다르고, backward에서는 gamma, beta, x에 대한 gradient를 모두 계산해야 한다.1. BatchNorm의 역할1평균 계산현재 미니배치 feature별 평균을 구한다.2분산 계산feature별 값이 평균 주변에 얼마나 퍼졌는지 구한다.3정규화평균 0, 분산 1에 가까운 값으로 바꾼다.4scale/shiftgamma와 beta로 다시 적절한 크기와 위치로 조정한다.2. forward에서 값이 어떻게 변하는가BatchNorm은 입력 shape를 바꾸지 않는다. 대신 각 feature 열의 분포를 정리한다. 예를 들어 x가 (128, 512)라면 128개..

카테고리 없음 2026.05.29

MNIST Lab 7편 - NeuralNetwork로 계층 조립하기

MNIST Lab 기본 구현 7편이제 개별 부품을 하나의 모델로 묶는다. NeuralNetwork는 params를 만들고, 계층을 순서대로 쌓고, forward와 backward를 통해 전체 신경망을 통과시킨다.1. 모델 구조베이스 모델은 784개 입력을 512, 256 은닉층을 거쳐 10개 숫자 클래스로 보낸다.1입력MNIST 28x28 이미지를 펼친 784차원 벡터2은닉층 1Affine1 - BatchNorm1 - ReLU1 - Dropout13은닉층 2Affine2 - BatchNorm2 - ReLU2 - Dropout24출력층Affine3 - Softmax2. params, layers, grads가 어떻게 연결되는가NeuralNetwork 구현에서 헷갈리는 지점은 계층을 쌓는 코드보다 이름의 연..

카테고리 없음 2026.05.29

MNIST Lab 6편 - Adam update 직접 구현하기

MNIST Lab 기본 구현 6편Adam은 SGD보다 코드가 길지만, 생각은 단순하다. gradient의 방향 기록 m과 크기 기록 v를 따로 저장하고, 초반 보정을 거쳐 파라미터별 이동량을 조절한다.1. Adam이 기억하는 두 가지기록의미직관mgradient의 이동평균최근 어느 방향으로 계속 가려 했는지 기억한다.vgradient 제곱의 이동평균어느 파라미터가 크게 흔들렸는지 기억한다.tupdate 횟수초반에 m, v가 0에서 시작해 작게 잡히는 문제를 보정한다.Adam을 한 문장으로 보면SGD가 매 순간 gradient만 보고 걷는다면, Adam은 최근 방향과 흔들림 크기를 함께 보고 보폭을 조절한다.2. 최종 구현 코드class Adam: def __init__(self, lr=0.001): ..

카테고리 없음 2026.05.29

MNIST Lab 5편 - SGD update 직접 구현하기

MNIST Lab 기본 구현 5편SGD는 가장 단순한 파라미터 갱신 규칙이다. gradient가 손실이 증가하는 방향을 가리킨다면, 우리는 그 반대 방향으로 learning rate만큼 움직인다.1. SGD 공식업데이트 공식은 단순하다. param = param - lr * grad다. 여기서 lr은 한 번에 얼마나 크게 움직일지 정하는 학습률이다.1gradient 계산현재 파라미터를 어느 방향으로 바꾸면 loss가 커지는지 알게 된다.2반대 방향 이동loss를 줄이고 싶으므로 gradient 반대 방향으로 움직인다.3in-place 갱신params 딕셔너리 안의 배열을 직접 수정한다.2. 최종 구현 코드class SGD: def __init__(self, lr=0.01): self.l..

카테고리 없음 2026.05.29