머신러닝 & 딥러닝

딥러닝(DL) 개념 및 구조 & 코드 정리

수진97 2025. 11. 5. 01:10

안녕하세요~!

오늘 포스팅은 딥러닝에 대해 간략히 정리해 보겠습니다.

최적의 모델이란, 오차가 가장 적은 모델을 의미하는데요.

최적의 파라미터인 최적의 가중치(Weight)를 찾는 과정을 '딥러닝을 통해 모델을 학습시킨다'라고 표현합니다.

아래 설명에서 좀 더 자세히 살펴보겠습니다!

 

1. CRISP-DM 프로세스

출처 : https://bestlucky0506.tistory.com/12

 

1. 비즈니스 문제 이해

- 비즈니스 문제에 대해 정의

- 데이터 분석 방향과 목표를 설정

- 초기 가설 수립

- x(요인) ----> y(결과)

(여기서 x, y는 모두 정보 즉, 데이터에 해당)

(x = Feature = 요인 / y = Target = Label) => 실무에서는 보통 이와 같이 부르니 기억하자!

 

 

2. 데이터 이해

- 원본 식별(내부 / 외부) => 초기 가설에서 도출된 데이터의 근원을 확인하고 취득하는 과정(수집, 구입 등)

- 데이터 분석을 위한 구조(2차원) 만들기

- 데이터 분석 EDA & CDA
(단변량, 이변량 분석 : 산점도 그래프, P-검정 등)

=> 이변량 분석의 경우, 2개 변수 간의 이 가설(x -> y)이 진짜인지 검증

 

 

3. 데이터 전처리

- 모델링을 위한 데이터 구조 만들기

- 결측치(NaN값) 제거 => 비즈니스 관점에서 따져보고 신중하게 삭제해야 함!!(주의)

- 모든 값은 숫자로(가변수화)

- 숫자 범위 일치(스케일링)  => 딥러닝에서는 빠른 최적화를 위해 스케일링 필수

 

 

 

4. 모델링

- 모델 만들고 검증 진행

  

 

5. 평가 및 배포

- 기술적 관점(오차가 얼마나 줄었는지?)과 비즈니스 관점(수익이 늘었는지?)에서 평가 진행

- 결론적으로 해당 모델을 통해 비즈니스 문제가 해결되었는지 점검 필수

 

 

 

 

2. 딥러닝 개념 - 가중치 조정

- 딥러닝은 조금씩 weight를 조정하며 오차가 줄어드는지 확인

- 지정 epoch 수만큼 학습하거나 더 이상 오차가 줄어들지 않을 때까지 학습시킴.

- 오차의 경우 손실함수(loss function)로 계산

 

* '학습한다'의 의미

- 데이터 안에 담겨 있는 패턴을 찾음.

- 패턴 = 가중치 = 파라미터

 

=> 결론적으로 오차를 최소화하는 파라미터(가중치) 값을 찾는다는 의미

 

출처 : https://wikidocs.net/36033

* 학습 절차

1) 가중치에 값 할당

-  초깃값의 경우에는 랜덤으로 지정됨. 

 

 

2) 예측 결과를 뽑음.

- 모델을 수학식으로 생각해 볼 수 있는데, 이 수학식을 계산하여 예측 결과를 도출하는 과정

 

 

3) 오차 계산 (실제값 - 예측값)

- mse(평균 제곱 오차), binary_crossentropy(이진분류), categorical_crossentropy(다중분류) 등 모델에 맞는 손실 함수 적용

- 손실 함수는 실제값과 예측값의 차이를 수치화해 주는 함수

 

 

4) 오차를 줄이는 방향으로 가중치 조정

- Optimizer가 가중치를 조정(경사하강법, Adam 등)

- learning_rate(학습 조정 비율) : 업데이트할 비율 / 기울기에 곱해지는 조정 비율 (걸음걸이의 '보폭'을 조정함)

 

 

5) 다시 1)로 올라가 반복

 

 

 

3. 딥러닝 구조 & 순전파 / 역전파 개념

- 순전파는 입력층에서 출력층으로 향하면서 가중치를 업데이트하는 방식

- 반대로 역전 파는 출력층에서 Error(MSE)로부터 역으로 입력층 방향으로 올라가며 계산하면서 가중치를 업데이트

 

- Input은 Layer(X) => 입력되는 x의 분석단위

- Layer 안에 노드(= 뉴런 = 하나의 정보) 들로 구성됨

- Input -> Hidden Layer.... -> Output Layer -> Output (순전파 방향) <--->역전 파는 반대

 

 

 

4. 딥러닝 코드

1) Input(shape = ( , ))

- 입력층

- 분석 단위에 대한 shape

- 하나의 행이 예측단위임. 즉, 하나의 행이 몇 개의 칼럼(feature)으로 이루어져 있는지 세면 됨.

- 1차원 : (feature 수, )

- 2차원 : (rows, columns)

 

 

 

2) Output : Dense( )

- 예측 결과가 1개 변수

- 출력층 

 

 

 

3) 컴파일 Compile

- 선언된 모델에 몇 가지 설정 후 컴퓨터가 이해할 수 있는 형태로 변환

 

* optimizer 지정(learning_rate) 

- 오차 최소화하도록 가중치 업데이트 해주는 역할

- 가장 성능이 좋은 옵티마이저인 Adam을 주로 사용

=> GD(경사하강법)로부터 발전한 것이 Adam

 

* metrics 평가 지표

 

* loss 오차 함수(=목적함수)  --> 오차 최소화의 목적

- 회귀 : MSE

- 분류 : binary_crossentropy, sparse_categorical_crossentropy , categorical_crossentropy

 

* learning_rate(학습률 조정)

- 가중치를 얼마나 조절할지

 

값이 너무 작으면 가중치가 조금만 조정되어 최솟값에 도달하지 못할 수 있음.

값이 매우 크면 가중치가 너무 크게 조정되어 오차가 들쑥날쑥하게 됨.

 

 

 

 

4) 학습 fit 

* epochs (학습 반복 횟수)

- 지정한 에폭 수만큼 주어진 train set을 반복 학습

=> 반복학습 하면서 최적의 가중치를 찾아나감

=> 가장 최적의 에폭 수 찾아나갈 수 있음.

 

* validation_split = 0.2

- train 데이터에서 20% 검증 set으로 분리

 

* batch_size = 32(기본값)

- 배치 단위로 학습하며 가중치 업데이트 (배치 한 덩어리씩 학습 후 가중치 업데이트 ---> 다시 한 덩어리 학습 후 업데이트.....)

- 전체 train 데이터를 적절히 batch_size만큼 나누어 학습 진행

 

* .history

- 학습을 수행하는 과정 중에 가중치가 업데이트되면서 계산된 오차 기록들

- 이 history들을 차트로 그리면 학습 곡선이 됨.

 

 

 

5) 학습 곡선

- 모델이 잘 학습되었는지 학습 경향을 파악하기 위한 그래프

- 정답은 아니지만, 바람직하게 학습했는지 판단할 수 있는 도구 중 하나

 

 

각 에폭마다 train error(loss)와 val error(val_loss)가 어떻게 줄어들고 있는지 확인 가능

바람직한 학습 곡선은 초기 에폭에서는 오차가 크게 줄고, 오차 하락 폭이 점점 꺾이면서 완만해지는 형태

출처 : https://modulabs.co.kr/blog/loss-versus-accuracy

 

 

 

 

6) Hidden Layer (은닉층)

- 은닉층에서의 Activation(활성) 함수는 보통 'relu' 사용

 

* 활성화 함수

- 현재 레이어(각 노드)의 결괏값을 다음 레이어에 어떻게 전달할지 결정 / 변환해 주는 함수

- 히든 레이어를 아무리 추가해도 => y = ax + b 형태의 선형회귀임.

(선형회귀의 경우 어디를 잘라도 다 같은 기울기)

 

 

- 선형 모델 ------> 비선형 모델로 변환해 주기 위해 활성화 함수 사용(은닉층)

 

- 출력층에서는 활성화 함수를 통해 결괏값을 다른 값으로 변환해 줌.

ex. 이진분류에서 출력층 활성화 함수 sigmoid

sigmoid를 통해 0~1 사이 확률 값 변환 후, np.where(pred >= 0.5, 1, 0)를 사용하여 1 OR 0으로 값 도출

 

 

ex2. 다중분류에서 출력층 활성화 함수는 softmax

다중분류에서 출력층의 노드 수 = 다중분류 class 수

 

각 class 별 예측 결과 확률값 모두 더하면 합이 1이 됨.

class 개수 n개 중 누가 1인지 찾음. => 실제 값이 1인 클래스와 예측 값 서로 비교

 

각 클래스 중 가장 확률값이 큰 값의 인덱스로 변환 : np.argmax(axis=1)

 

 

pred = model.predict(x_val)

pred1 = pred.argmax(axis=1)

 

 

 

 

* y값에 대한 전처리

 

<1> 정수 인코딩

손실함수 : sparse_categorical_crossentropy

 

 

<2> One-hot Encoding

손실함수 :  categorical_crossentropy

(정수 인코딩 후 ---> 원-핫 인코딩까지 진행)