Model Architecture (모델 구성) (1)

5단 분석법

순서
분석
단어
내용
1
일반 명사
Model
모형, 모델
Architecture
양식, 구성
Model Architecture
모델의 양식, 구성
2
고유 명사
Model Architecture
인공 신경망에서 각 레이어의 구성, 연결 방식, 활성화 함수, 입력 및 출력 형태 등 전체 모델의 구조
3
사용 이유
Model Architecture
특정 문제를 해결하기 위해 신경망의 구조를 최적화하여 정확도와 효율성을 높이고, 데이터의 특성에 맞는 최적의 모델을 설계하기 위해서
4
사용 방법
Model Architecture
1. 라이브러리 임포트 2. 모델 생성 3. 레이어 추가 4. 모델 컴파일 5. 모델 훈련 6. 모델 평가
5
다른 기술과의 비교
Model Architecture
-

정의

일반 명사

Model
모형, 모델
Architecture
양식, 구성
Model Architecture
모델의 양식, 구성
Model은 모형, 모델을 뜻하는 단어입니다.
Architecture는 양식, 구성을 말합니다.
두 단어의 뜻을 미루어 보면, Model Architecture는 모델의 양식, 구성이라고 생각해 볼 수 있습니다.
고유 명사를 알아볼까요?

고유 명사

Model
여러 개의 층(layer)과 뉴런(neuron), 그리고 이들 사이의 연결을 나타내는 가중치(weights)와 편향(biases)으로 구성된 집합체이다. 즉 신경망입니다.
Architecture
소프트웨어 시스템의 구조
Model Architecture
신경망에서 각 레이어의 구성, 연결 방식, 활성화 함수, 입력 및 출력 형태 등 전체 모델의 구조
Model Architecture는 신경망에서 각 레이어의 구성, 연결 방식, 활성화 함수, 입력 및 출력 형태 등 전체 모델의 구조입니다.
특히 딥러닝 모델에서 다양한 레이어가 어떻게 결합하어 데이터를 처리하고 결과를 도출하는지 정의하는 중요한 개념입니다.
예를 들어, CNN(합성곱 신경망), RNN(순환 신경망), 트랜스포머 등 다양한 모델 아키텍처가 존재하며, 각기 다른 문제를 해결하기 위해 설계됩니다.
딥러닝에서 모델은 기본적으로 학습 과정을 통해 찾아낸 최적 weight들의 집합입니다.
여기에서 이 모델을 사용하려면 우리가 지금까지 배웠던 활성화 함수, 손실 함수 등을 추가적으로 사용하게 되는 것입니다.
모델은 ‘기본적으로 학습 과정을 통해 찾아낸 최적 weight들의 집합’이라고 정의하는게 맞지 않을까요?
코드만 보면 적합한 설명입니다. 코드를 보면 모델에는 기울기와 가중치만 저장하기 때문입니다. 모델에 신경망 모두 저장하지 않고, 학습된 파라미터(기울기와 가중치)만 저장하는 이유는 모델의 구조는 코드로 명확히 정의되어 있으므로, 저장할 필요가 없습니다. 모델을 다시 불러올 때 이 구조를 그대로 재현할 수 있습니다.
따라서, 모델의 파일에는 학습된 가중치와 편향만 저장하고, 모델의 구조는 코드나 별도의 메타데이터로 관리합니다.
그동안 모델을 학습하면서 이런 출력내용을 많이 보셨을 겁니다.
이것이 어떤 뜻인지를 한 번 알아보겠습니다.
딥러닝의 목적은 “복잡한 데이터에서 높은 수준의 특징을 자동으로 학습해 weight를 조정하는 것” 입니다.
그러면, Feed-Forward(순전파) 과정을 통해 나온 결과를 정답과 비교하고, 다시 Backpropagation(역전파) 과정을 거쳐 weight를 조정하는 과정이 자동으로 이루어져야한다는 뜻입니다.
위 이미지에서 각각의 Epoch 마다 해당 과정이 반복되고 있는 것입니다.
그림에서 15 / 15 는 무슨 의미인가요?
“15/15"는 각 에포크(epoch)에서 총 배치(batch) 수를 의미합니다. 배치(batch)는 데이터셋을 일정한 크기로 나누어 한 번에 학습하는 데이터의 묶음을 말합니다
"15/15"에서 첫 번째 숫자 15는 현재 배치의 번호를 나타내고, 두 번째 숫자 15는 총 배치 수를 나타냅니다.
따라서 "15/15"는 해당 에포크의 15번째 배치, 즉 마지막 배치를 처리 중임을 의미합니다.
이 경우, 전체 데이터셋을 64개씩 나누어 총 15번의 배치로 나누어 학습하고 있다는 의미입니다.
복잡한 데이터란 무엇인가요?
복잡한 데이터는 단순하지 않고 다차원적이며, 다양한 패턴과 변형을 포함하는 데이터를 의미합니다. 이러한 데이터는 규칙적이지 않거나, 고차원적이거나, 다양한 형태의 변화를 포함하는 경우가 많습니다. 예를 들어:
이미지 데이터: 다양한 물체, 배경, 조명 조건, 각도, 스케일 등이 포함되어 복잡합니다.
음성 데이터: 다양한 발음, 억양, 배경 소음 등이 포함되어 복잡합니다.
자연어 텍스트 데이터: 문법, 어휘, 문맥, 의미 등의 복잡한 구조가 있습니다.
시계열 데이터: 시간에 따라 변화하는 패턴과 노이즈가 포함되어 복잡합니다.
복잡한 데이터는 단순한 규칙이나 선형 모델로는 설명하거나 예측하기 어려운 데이터를 의미합니다.
높은 수준의 특징은 무엇인가요?
높은 수준의 특징(high-level features)은 데이터에서 추출된 추상적이고 의미 있는 패턴을 의미합니다. 이는 원시 데이터의 저수준 특징(low-level features)을 기반으로 더 복잡하고 의미 있는 정보를 나타냅니다. 예를 들어:
이미지 데이터에서:
저수준 특징: 엣지, 코너, 텍스처 등의 기본적인 시각적 요소.
중간 수준 특징: 간단한 형태나 패턴, 예를 들어 원, 사각형, 스트라이프 등.
고수준 특징: 물체, 사람 얼굴, 특정 동작 등 추상적이고 의미 있는 요소.
음성 데이터에서:
저수준 특징: 주파수 성분, 음색 등 기본적인 음향 특징.
중간 수준 특징: 음절, 단어 등.
고수준 특징: 문장, 발화 의도, 감정 등.
텍스트 데이터에서:
저수준 특징: 단어, 구문 등 기본적인 언어 단위.
중간 수준 특징: 문장 구조, 문법 패턴 등.
고수준 특징: 문맥적 의미, 주제, 감정 등.

각 에포크에서 학습하는 과정

위 예시에서는 Training Data가 1,000개 있고 Validation Data은 학습 데이터의 10%이니 100개이지만, 설명을 위해 ‘Training Data가 3개 있고 Validation Data가 존재한다고 가정’하고 설명하겠습니다.
위의 그림에서 각 그래프가 무엇을 하는지 설명해보도록 하겠습니다.
딥러닝의 근본적인 동작 방식은 입력 데이터(Input)를 받아 모델이 예측한 출력값(Output)이 실제 정답 데이터에 최대한 가깝도록 학습하는 것입니다. 이를 위해 모델은 비선형 함수로 구성된 신경망을 통해 입력과 출력을 매핑합니다.
위 이미지는 경사 하강법을 통해 손실 함수(Loss Function)를 최소화하는 과정을 보여줍니다. 경사 하강법은 모델의 예측값이 실제값과의 오차를 줄이기 위해, 손실 함수의 기울기를 따라 가중치(Weights)를 업데이트하는 방법입니다.
이때, 학습률(Learning Rate)은 하이퍼파라미터 중 하나로, 경사 하강법에서 가중치를 업데이트하는 크기를 조절합니다. 학습률은 하이퍼파라미터로 설정할 수 있으며, 적절한 학습률을 선택하는 것이 중요합니다. 학습률이 너무 크면 최적의 손실 값을 찾지 못하고, 너무 작으면 학습이 너무 오래 걸리거나 지역 최적점에 빠질 수 있습니다.
Hyperparameter는 추후에 배울 개념입니다!
Training Data가 3개 있고 Validation Data가 존재한다고 가정하면, 각 Epoch마다 다음과 같은 과정을 거치게 됩니다.
1.
Training Data마다 각각 다른 비선형 그래프가 그려질 것이고,학습률(Learning Rate)을 조정하여 학습을 진행하면서 최적의 손실(Loss) 값을 찾습니다.
2.
모든 Training Data에 대한 학습이 완료되면, 모델의 성능을 검증하기 위해 Validation Data를 사용합니다. 이 검증 절차에서는 모델이 학습한 내용을 바탕으로 Validation Data에 대한 예측을 수행합니다. 그런 다음, 실제 Validation Data의 레이블(정답)과 모델의 예측 값을 비교하여 Loss 값과 정확도(accuracy)를 계산합니다. (Validation Data가 없는 경우 이 단계는 생략됩니다)
3.
Epoch 1에 대한 학습과 검증 결과로 Loss 값과 정확도 값이 출력됩니다. 그리고 학습된 모델이 저장됩니다.
위 사진의 Epoch 한 번을 돌 때 위와 같은 과정을 거치게 됩니다.
만약 5 Epoch, Training Data 3개, Validation Data가 존재한다고 가정한다면, 아래와 같은 과정을 거치게 됩니다.
1.
Epoch를 한 번 돌 때마다 모델이 하나씩 생성됩니다.
2.
Epoch을 모두 다 돈 뒤, Test Data를 사용해서 테스트를 진행합니다.
a.
이 과정은 Epoch를 통해 만들어진 모델을 모두 테스트해야하기 때문에 Epoch 수만큼 반복합니다.
3.
2번의 테스트 과정에서 가장 성능이 좋은 모델이 최종 모델로 선택됩니다.
위와 같은 과정을 통해 모델의 학습이 이루어지게 됩니다.
손실과 정확도가 좋고 나쁜 기준은 무엇인가요?

손실(Loss):

손실 값(Loss Value): 손실 값은 0에 가까울수록 좋습니다. 그러나 손실 값이 낮다고 무조건 좋은 것은 아닙니다. 과적합(overfitting)일 경우, 손실 값이 낮아도 테스트 데이터에서의 성능이 떨어질 수 있습니다.
기준: 구체적인 값은 사용하는 데이터와 문제의 유형에 따라 다르지만, 대부분의 경우 손실 값이 0.1 이하로 떨어지면 좋은 성능을 보이는 경우가 많습니다.

정확도(Accuracy):

정확도(Accuracy): 정확도는 0%에서 100% 사이의 값을 가지며, 높을수록 좋습니다.
기준: 일반적으로 90% 이상이면 매우 좋은 성능을 나타내며, 80% 이상이면 대부분의 실용적인 애플리케이션에 적합합니다. 그러나, 문제의 난이도와 데이터의 특성에 따라 달라질 수 있습니다. 예를 들어, 이미지 분류에서 95% 이상의 정확도가 요구될 수 있지만, 일부 복잡한 문제에서는 70-80%의 정확도도 충분히 유의미할 수 있습니다.

상황별 차이:

이진 분류(Binary Classification): 정확도가 90% 이상이면 좋은 성능으로 간주될 수 있습니다.
다중 클래스 분류(Multi-Class Classification): 정확도가 80% 이상이면 좋은 성능으로 볼 수 있습니다. 하지만 클래스 수가 많아질수록 요구되는 정확도 기준이 낮아질 수 있습니다.
회귀(Regression): 손실 값을 주로 사용하며, 손실 값이 낮을수록 좋습니다. 일반적으로 손실 값이 0.1 이하이면 좋은 성능을 나타냅니다.

평가 시 고려사항:

데이터 셋: 훈련 데이터와 테스트 데이터의 분포가 비슷한지 확인해야 합니다.
과적합 여부: 과적합을 방지하기 위해 검증 데이터를 사용해 평가하고, 정규화 기법(dropout, regularization 등)을 사용합니다.
하이퍼파라미터 튜닝: 학습률, 배치 크기, 에포크 수 등을 적절히 조정하여 최적의 성능을 찾습니다.

사용 이유

Model Architecture
특정 문제를 해결하기 위해 신경망의 구조를 최적화하여 정확도와 효율성을 높이고, 데이터의 특성에 맞는 최적의 모델을 설계하기 위해서
이유
내용
성능 최적화
적절한 모델 아키텍처를 선택하면 모델의 학습 능력과 예측 성능을 극대화할 수 있습니다.
효율성 향상
복잡한 계산을 효율적으로 처리할 수 있는 구조를 설계함으로써 훈련 시간과 자원 소모를 줄일 수 있습니다.
일반화 능력
다양한 데이터셋에 대해 좋은 성능을 보이는 모델을 설계할 수 있습니다.
문제 특화
특정 문제나 데이터셋에 최적화된 모델을 설계함으로써 더 높은 정확도를 달성할 수 있습니다.

사용 방법

Model Architecture
1. 라이브러리 임포트 2. 모델 생성 3. 레이어 추가 4. 모델 컴파일 5. 모델 훈련 6. 모델 평가

TensorFlow (Keras)

PyTorch

미니퀘스트

1번 미니퀘스트 - MNIST 손글씨 숫자 인식을 위한 모델 아키텍처 설계

MNIST 손글씨 숫자 데이터셋을 사용하여 간단한 CNN 모델을 설계하고 학습시킨 후, 모델의 성능을 평가해보세요.

문제 설명

1.
라이브러리 임포트
2.
데이터셋 로드 및 전처리
3.
모델 생성
4.
레이어 추가
5.
모델 컴파일
6.
모델 훈련
7.
모델 평가

코드

# 1. 라이브러리 임포트 from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense from tensorflow.keras.utils import to_categorical import numpy as np # 2. 데이터셋 로드 및 전처리 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 데이터셋의 형태를 (28, 28, 1)로 변경 x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0 x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0 # 원-핫 인코딩 num_classes = 10 y_train = to_categorical(y_train, num_classes) y_test = to_categorical(y_test, num_classes) # 3. 모델 생성 model = Sequential() # 4. 레이어 추가 model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(num_classes, activation='softmax')) # 5. 모델 컴파일 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 6. 모델 훈련 model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.1) # 7. 모델 평가 loss, accuracy = model.evaluate(x_test, y_test) print(f"Test loss: {loss}") print(f"Test accuracy: {accuracy}")
Python
복사

결과 (예시)

Text loss: 0.0349
Test accuracy: 0.9892

결과 설명

MNIST 데이터셋은 일반적으로 간단한 모델로도 높은 정확도를 얻을 수 있는 데이터셋입니다
따라서 98.92%의 높은 정확도를 얻을 수 있었습니다.
낮은 손실 값은 모델이 예측을 매우 잘하고 있음을 나타냅니다.

코드 설명

2번 미니퀘스트 - CIFAR-10 이미지 분류 모델 설계

CIFAR-10 데이터셋을 사용하여 CNN 모델을 설계하고 학습시킨 후, 모델의 성능을 평가해 보세요.

문제 설명

1.
라이브러리 임포트
2.
데이터셋 로드 및 전처리
3.
모델 생성
4.
레이어 추가
5.
모델 컴파일
6.
모델 훈련
7.
모델 평가

코드

# 1. 라이브러리 임포트 from tensorflow.keras.datasets import cifar10 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense from tensorflow.keras.utils import to_categorical import numpy as np # 2. 데이터셋 로드 및 전처리 (x_train, y_train), (x_test, y_test) = cifar10.load_data() # 데이터셋의 형태를 (32, 32, 3)로 유지 x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 # 원-핫 인코딩 num_classes = 10 y_train = to_categorical(y_train, num_classes) y_test = to_categorical(y_test, num_classes) # 3. 모델 생성 model = Sequential() # 4. 레이어 추가 model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(128, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(256, activation='relu')) model.add(Dense(num_classes, activation='softmax')) # 5. 모델 컴파일 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 6. 모델 훈련 model.fit(x_train, y_train, epochs=20, batch_size=64, validation_split=0.1) # 7. 모델 평가 loss, accuracy = model.evaluate(x_test, y_test) print(f"Test loss: {loss}") print(f"Test accuracy: {accuracy}")
Python
복사

결과

Test loss: 1.3449
Test accuracy: 0.7062

설명

CIFAR-10 데이터셋은 MNIST보다 더 복잡하기 때문에 더 많은 데이터와 더 깊은 모델이 필요합니다.
따라서 70.62%의 정확도는 CIFAR-10 데이터셋을 처리하기에 모델이 충분히 복잡하지 않음을 나타낼 수 있습니다.
이 모델은 CIFAR-10 데이터셋의 복잡한 패턴을 완전히 학습하지 못한 것으로 보입니다.
비교적 높은 손실 값은 모델이 예측에서 많은 오류를 범하고 있음을 나타냅니다.
이는 모델이 CIFAR-10 데이터셋의 다양성과 복잡성을 충분히 학습하지 못했음을 의미합니다.

코드 설명

미니퀘스트 답안지

알아 두면 좋은 정보

딥러닝 구조 전반적 이미지

ⓒ 2024 startupcode. 모든 권리 보유. 무단 복제 금지.