타이타닉 캐글 데이터셋으로 케라스 창시자에게 배우는 딥러닝 챕터3, 4번 예제로 딥러을 진행 해보다가 결국 값이 나오기는 했지만, '기본 개념을 자세하게 모르고 진행 하는 것은 큰 의미가 없다'는 생각에 돌아와 기본 개념을 이해해야겠다는 생각으로 정리를 해보았습니다.
Gradient
- 텐서연산의 도함수 f'(x)를 그레이디언트(Gradient) 라고 부르는데, 수학적 연산이다. 모델 가중치를 여러 방향으로 이동했을 때 손실이 얼마나 변하는지 알 수 있으며, 손실이 감소하는 방향으로 가중치를 이동 시킬 수 있다.
- 한 번에 하나씩이 아니라 한번의 업데이트로 전체 가중치를 동시에 업데이트 시킨다는 특징이 있다.
- 시작 단계에서는 작은 난수로채워져있음. W와 b가 난수일 때, relu(dot(W, input) + b )는 의미없는 난수 표현이지만 점진적으로 피드백 신호에 기초하여 가중치가 점진적으로 조정됨.
이 점진적인 조정(훈련)이 머신러닝 학습의 핵심!
활성화 함수:
- 이전 층(layer)의 결과값을 변환하여 다른 층의 뉴런으로 신호를 전달하는 역할
- 활성 함수를 사용하면 입력값에 대한 출력값이 비선형적으로 만든다. 신경망에서는 활성화 함수로 비선형 함수만을 사용하는데 선형 함수를 사용하면 신경망의 층을 깊게 쌓는 것에 의미가 없어지기 때문
- 따라서, 은닉층(hidden layer)의 개수를 늘리거나 Unit(node)를 늘린다고 해서 비선형 문제를 해결할 수 없다.
- 함수 종류: 시그모이드(Sigmoid) , 하이퍼블릭 탄젠트(TanH), 렐루(ReLU : Rectified Linear Unit), SoftMax 등
- 옵티마이저(Optimizer)는 말그대로 '최적화' 시켜주는 역할을 맡는다.
- 처음 데이터가 input되고, 계산을 시작합니다. 계산이 완료되면 loss 함수를 통해 결과값과 정답(Target Label)을 비교하여 가중치를 계산해 업데이트를 진행합니다. 이 과정에서 옵티마이저의 딥러닝의 가장 중요한 핵심인 경사하강법을 사용하여 딥러닝을 진행합니다. 학습률과 Gradient, 즉 도함수(미분)를 이용하여 기울기 값이 낮아지는 방향을 찾는 방법으로 최적화를 진행합니다.
옵티마이저는 다음과 같은 방법으로 학습률(Learning rate)을 사용합니다.
- Gradient 계산: 현재 모델의 파라미터 값에서 손실 함수의 기울기(gradient)를 계산합니다.
- Gradient Descent: 계산된 기울기와 학습률을 이용하여 파라미터 값을 업데이트합니다. 일반적으로 기울기가 클수록, 학습률이 클수록 파라미터 값은 더 크게 변화합니다.
- 학습률 스케줄링 (Optional): 학습 과정 중에 학습률을 조절하는 방법입니다. 예를 들어, 학습 초기에는 큰 학습률을 사용하여 빠르게 학습하고, 학습 후반에는 작은 학습률을 사용하여 안정적으로 수렴하도록 합니다.
다양한 옵티마이저 종류
다양한 옵티마이저들이 존재하며, 각각 학습률을 조절하고 적용하는 방식이 다릅니다. 몇 가지 대표적인 옵티마이저를 소개합니다.
- SGD (Stochastic Gradient Descent): 가장 기본적인 옵티마이저로, 학습률을 고정값으로 사용합니다.
- Momentum: 이전 업데이트 방향을 고려하여 현재 업데이트 방향을 결정합니다. 이를 통해 학습 속도를 높이고 지역 최솟값에 빠지는 문제를 완화합니다.
- Adagrad: 파라미터별로 학습률을 다르게 적용합니다. 자주 업데이트되는 파라미터는 학습률을 낮추고, 드물게 업데이트되는 파라미터는 학습률을 높입니다.
- RMSprop: Adagrad의 단점을 개선하여 학습률이 너무 빠르게 감소하는 문제를 해결합니다.
- Adam: Momentum과 RMSprop의 장점을 결합한 옵티마이저로, 현재 가장 널리 사용되는 옵티마이저 중 하나입니다.
코드로 보는 딥러닝 (케라스 창시자에게 배우는 딥러닝 예제 4.1)
# 데이터 준비
x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = y_train[:1000]
partial_y_train = y_train[1000:]
모델 정의 및 훈련
# Dense layer에 활성화 함수와 함께 세 층으로 쌓기. 노드 수는 64, 64, 46개.
model = keras.Sequential([
layers.Dense(64, activation='relu'),
layers.Dense(64, activation='relu'),
layers.Dense(46, activation='softmax')
])
# 컴파일을 통해 옵티마이저, 손실함수, 메트릭 정의
model.compile(optimizer="rmsprop",
loss="categorical_crossentropy",
metrics=["accuracy"])
# 모델 훈련
history = model.fit(partial_x_train,
partial_y_train,
epochs=20,
batch_size=512,
validation_data=(x_val, y_val))
# loss율과 정확도 확인
results = model.evaluate(x_train, y_train)
results
텐서플로우와 케라스 덕분해 딥러닝이 참 쉬워진 세상이라 신기하고 감사하게도 이렇게 앉아서 딥러닝을 배웁니다🥹
※ 파라미터 개수 구하는 방법 (feat. layer 갯수, 출력 뉴런 (unit) 갯수)
layer1. (입력 뉴런의 수 10000 * 출력 뉴런의 수 64) + 출력 뉴런의 수 64 = 640,064
layer2. (입력 뉴런의 수 64 * 출력 뉴런의 수64) + 출력 뉴런의 수 64 = 4,160
layer3. (입력 뉴런의 수 64 * 출력 뉴런의 수 46) + 출력 뉴런의 수 46 = 2,990
model.summary()
사실... 모델 정의(어떤 문제냐 !) 와 데이터 셋 분석(Exploratory Data Analysis) 가 중요하지만 개념을 정리해보았습니다.
정리하고 보니 조금은 더 구체적이고 전체적인 그림이 그려지는 것 같네요.
'배움 기록' 카테고리의 다른 글
처음으로 돌아가기 (1) | 2024.06.18 |
---|---|
[데이터 분석] 원 핫 인코딩 (1) | 2024.06.15 |
아이펠 취업 특강을 듣고 내용 정리 (0) | 2024.05.31 |
마크다운 정리 (0) | 2024.05.14 |
[리눅스] 우분투 리눅스 명령어(Command Line) 정리 (0) | 2024.05.13 |