본문 바로가기
TIL _Today I Learned/2024.09

[DAY 37] 딥러닝 프레임워크

by gamdong2 2024. 9. 3.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.09.03

📕 학습 목록

  • 딥러닝 개요
  • TensorFlow
  • Keras

 

📗 기억할 내용

1. 딥러닝 개요

1) 딥러닝이란?
 

① 정의

  • 딥러닝은 인공지능(AI)과 머신러닝(ML)의 하위 분야로, 인공 신경망을 사용해 데이터를 학습하는 기술
  • 많은 양의 데이터 → 복잡한 패턴 인식 → 예측 or 결정을 내림

② 특성

  • 인공 신경망
    • 인간의 뇌 신경망에서 영감을 받아 개발된 구조
    • 수많은 노드(뉴런)와 이를 연결하는 가중치(웨이트)로 이루어짐
    • 각 노드는 입력 데이터를 받아들여 가공한 후 다른 노드로 전달하는 역할
  • 다층 신경망
    • 딥러닝의 딥(Deep) : 신경망의 깊이, 즉 레이어(layer)의 수를 의미
    • 여러개의 은닉층(hidden layers)을 가짐; 더 복잡한 데이터 패턴을 학습할 수 있음
    • 다층 신경망 구조 덕분에 이미지 인식, 음성 인식, 자연어 처리(NLM) 등 다양한 분야에서 높은 성능

2) 학습 방법
 

① 지도 학습(Supervised Learning) 주로 사용!

  • 입력 데이터 & 그에 대응하는 정답(라벨)을  사용하여 모델을 학습시킴
  • '모델이 주어진 입력에 대해 예측한 출력 - 실제 정답' 간의 차이를 계산 → 이를 기반으로 모델의 가중치 조절
  • 예시
- 이미지 분류 : 고양이와 개의 사진에 '고양이' 또는 '개'라는 라벨이 붙어 있는 데이터셋을 사용해, 새로운 사진이 주어졌을 때 고양이인지 개인지 분류하는 모델을 학습시킴
- 자연어 처리 : 텍스트 문장을 입력으로 하고, 그에 대한 감정(긍정/부정)을 라벨로 하는 데이터셋을 사용해 감정 분석 모델을 학습시킴
  • 핵심 요소 
- 손실 함수(Loss Function) : 모델의 예측과 실제 정답의 차이를 수치화한 함수. 손실 함수를 최소화하는 방향으로 모델이 학습됨
- 역전파(Backpropagation) : 손실 함수의 기울기를 계산해 신경망의 가중치를 업데이트하는 알고리즘

 
② 비지도 학습(Unsupervised Learning)

  • 정답(라벨) 없이 데이터의 구조나 패턴을 학습하는 방법
  • 예시
- 군집화(Clustering) : 고객 데이터를 바탕으로 비슷한 특성을 가진 고객들을 그룹화하는 작업 (ex : 고객을 구매 습관에 따라 여러 그룹으로 나눔)
- 차원 축소: 고차원 데이터를 저차원으로 변환해 데이터 시각화를 용이하게 하거나, 노이즈를 줄여 모델의 성능을 향상시키는 작업 (ex : PCA)

 
③ 강화 학습(Reinforcement Learning)

  • 에이전트(Agent)가 환경과 상호작용하면서 주어진 목표를 달성하기 위해 행동을 학습하는 방법
  • 에이전트는 매 순간의 행동에 대한 보상(Reward)을 받음; 보상을 최대화하는 방향으로 학습함
  • 예시
- 게임 AI : 게임 내에서 에이전트가 최적의 전략을 학습해 높은 점수를 얻도록 훈련 (ex : 체스나 바둑 같은 보드게임에서 최고의 수를 두기 위해 학습)
- 로봇 공학: 로봇이 주어진 환경에서 장애물을 피하면서 목표 지점에 도달하도록 학습

 

3) 머신러닝 vs 딥러닝

  머신러닝 딥러닝
개념 데이터를 통해 모델을 학습시키는 전반적인 기술 인공 신경망을 사용해 데이터를 학습하는 기술
모델 구조 간단한 모델 구조 (선형 회귀, 의사결정 나무 등) 복잡한 다층 신경망 (Deep Neural Networks)
주요 패키지 Scikit-learn, XGBoost, LightGBM, CatBoost TensorFlow, Keras, PyTorch
학습 과정 특징 엔지니어링이 중요, 모델 정의 후 학습 신경망 구조 설계가 중요, 대규모 연산
데이터 요구 소규모 데이터에서도 작동 가능 대규모 데이터가 필요
특징 엔지니어링 데이터 이해와 특징 엔지니어링이 중요 특징 추출을 신경망이 자동으로 처리
학습 시간 상대적으로 짧음 긴 학습 시간, GPU 사용 필요
하드웨어 요구 CPU로 충분히 학습 가능 고성능 GPU 필요
적용 분야 구조화된 데이터, 간단한 문제 비정형 데이터 (이미지, 음성, 텍스트), 복잡한 문제
해석 가능성 비교적 해석이 쉬움 모델이 복잡해 해석이 어려울 수 있음
학습 방식 지도 학습, 비지도 학습, 준지도 학습, 강화 학습 주로 지도 학습, 자기 지도 학습, 강화 학습

 
4) 딥러닝의 xAI 구현은 어렵다

  • 딥러닝에서 xAI(Explainable AI)를 구현하는 것은 머신러닝 모델에 비해 어려움 (불가능한 건 아님)
  •  그 구조가 매우 복잡하고, 수많은 계층(layer)과 매게 변수(parameter)로 이루어져 있어 모델의 예측이 어떻게 이루어지는지를 이해∙설명하기 어려움

5) 머신러닝 vs 딥러닝 중 무엇을 선택할까

 통계모델
(Statistical Model)
머신러닝
(Machine Learning)
딥러닝
(Deep Learning)
데이터 규모 및 복잡성소규모 데이터에 적합, 단순한 관계 분석소규모에서 중규모 데이터에 적합대규모 및 비정형 데이터에 적합
문제의 성격단순하고 선형적인 문제 (예: 회귀 분석)단순하고 해석 가능한 문제 (예: 금융 예측 등)복잡하고 비선형적인 문제 (예: 이미지 인식, NLP 등)
연산 자원매우 적은 연산 자원 필요 (CPU로 충분)적은 연산 자원 필요 (CPU로도 충분)많은 연산 자원 필요 (GPU 또는 TPU 필요)
개발 시간과 복잡성구현이 간단하고 개발 시간이 짧음구현이 비교적 간단하고 개발 시간이 짧음설계와 구현이 복잡하고 개발 시간이 길 수 있음
해석 가능성 및 투명성매우 높음 (결과 설명이 쉬움)모델이 비교적 해석 가능하고 결과 설명이 쉬움모델이 블랙박스 형태로, 결과 설명이 어려움
성능 요구기본적인 성능이 중요한 경우 적합기본적인 성능이 중요한 경우 적합최고의 성능이 필요할 때 적합
특징 엔지니어링도메인 지식이 중요, 수동으로 피처 생성도메인 지식과 특징 엔지니어링이 중요특징 추출을 자동으로 수행, 특징 엔지니어링의 필요성 낮음
실시간 응답 및 경량화실시간 응답이 필요한 시스템에 매우 적합실시간 응답이 필요한 시스템에 적합실시간 응답이 어려울 수 있으며, 모델 경량화 필요할 수 있음
과적합 위낮음 (모델이 단순해 과적합 위험이 적음)중간 (복잡한 모델일수록 과적합 위험이 있음)높음 (매우 복잡한 모델로 인해 과적합 위험이 큼)
적용 사례경제학, 사회과학, 의료 연구 등금융, 의료, 소셜 미디어 분석, 추천 시스템 등이미지 인식, 음성 인식, 자율주행, 자연어 처리 등

 

6) 그 외 개념

① 딥러닝 작업에서의 하드웨어 선택 & 가상환경 설정

  CPU (Central Processing Unit) GPU (Graphics Processing Unit)
정의- 범용적인 계산 장치로, 모든 종류의 연산(정수, 실수, 논리 연산 등)을 수행할 수 있음
- 신뢰도가 매우 높음
- 주로 그래픽 처리와 병렬 연산에 특화된 장치로, 부동소수점 연산이 빠름
- 딥러닝 작업에서 고속 처리에 유리함
사용 사례우주과학, 원자로 컨트롤 등 정밀한 계산이 필요한 컴퓨팅 작업에 주로 사용그래픽 작업, 딥러닝, 자연어 처리(NLP) 등 대규모 데이터와 병렬 처리가 요구되는 작업에서 주로 사용
특징정밀하고 신뢰도 높은 연산이 가능하지만, 대규모 데이터 처리 속도는 상대적으로 느림병렬 연산을 통해 대규모 데이터 처리 속도가 빠르지만, CPU에 비해 신뢰도가 다소 낮을 수 있음
딥러닝에서의 선택기본적으로 안정적이고 범용적인 작업을 수행하지만, 대규모 딥러닝 모델 학습 시 시간이 오래 걸릴 수 있음- 딥러닝 모델 학습 속도를 크게 향상시킬 수 있으므로, GPU를 사용하는 것이 일반적임
- GPU 버전의 라이브러리 설치 필요
가상환경의
장점
가상환경을 사용하면 각 프로젝트마다 별도의 환경을 설정할 수 있어, 라이브러리 충돌을 방지하고 필요한 버전만 설치하여 효율적인 개발 환경을 유지할 수 있음GPU 환경에서도 가상환경을 사용하여 라이브러리 간의 충돌을 방지하고, 필요에 따라 CPU와 GPU 간 쉽게 전환 가능

 
② RGB와 색상 표현

  • RGB 색상:
    • 256단계의 RGB 빛의 삼원색(0~255)은 2⁸, 즉 8비트로 표현
    • True Color: RGB 각 채널의 모든 조합은 총 16,777,216개(2 ⁸ * 2 ⁸ * 2 ⁸ )의 색상을 표현할 수 있음. 이를 'True Color'라고 부름
  • HDR vs SDR
    • HDR (High Dynamic Range): 인간의 시각은 True Color보다 더 넓은 범위의 색상을 인식할 수 있음. HDR은 더 넓은 명암 범위와 색상 범위를 표현하여 더욱 현실적인 이미지를 제공
    • SDR (Standard Dynamic Range): 표준 다이나믹 레인지로, 일반적인 디스플레이에서 사용되는 명암 및 색상 범위
  • 모니터 색상 표현:
    • 흰색: R, G, B 각각 255의 값을 가지며, 모든 채널이 최대로 밝아짐
    • 검은색: R, G, B 각각 0의 값을 가지며, 모든 채널이 어두워짐

③ 이미지 차원과 복잡도

  • 컬러 이미지: 가로 5픽셀, 세로 5픽셀의 RGB 컬러 이미지의 경우 3차원 (5, 5, 3) 배열로 표현. 여기서 '차원'은 이미지 데이터의 복잡도를 나타냄
    • ex: 5x5 픽셀의 RGB 이미지 → 3차원 배열 (5, 5, 3)
  • 흑백 이미지 (Gray Scale):
    • 정의: 흑백 이미지는 밝기(명도)를 0~255 사이의 값으로 표현. 이때, 각 픽셀은 단일 값으로 표현되므로 2차원 배열로 표현됨
    • ex: 5x5 픽셀의 흑백 이미지 → 2차원 배열 (5, 5, 1)

④ 학습 모델의 종류

  • 일반적인 학습모델: 대규모 데이터셋을 기반으로 학습하여 높은 성능을 보이는 모델
  • Few-Shot 학습모델: 적은 양의 데이터로도 높은 성능을 발휘할 수 있는 모델
  • Zero-Shot 학습모델: 학습되지 않은 클래스에 대해서도 예측이 가능한 모델. 주로 문맥이나 의미를 이해하는 자연어 처리에서 사용

⑤ 기타 용어

  • reCAPTCHA: 웹사이트에서 사람과 봇을 구분하기 위해 사용되는 기술. 딥러닝을 이용해 패턴을 인식하고 이상 여부를 판단할 수 있음
  • 이상 패턴 탐지: 딥러닝을 활용하여 데이터에서 정상적인 패턴과 다른 이상 패턴을 탐지할 수 있음. 이는 금융 사기 탐지, 네트워크 보안 등에서 활용
  • NLP (Natural Language Processing, 자연어 처리): 컴퓨터가 인간의 언어를 이해하고 처리할 수 있도록 하는 기술
  • LLM (Large Language Model, 대규모 언어 모델): LLM은 언어 데이터를 학습하여 인간처럼 문장을 이해하고 생성하는 모델. 라틴어 기반 언어권에서는 상대적으로 유리하지만, 중국어와 같이 복잡한 문자 체계에서는 학습이 더 어려움. 이는 각 글자를 개별적으로 학습해야 하기 때문

2. TensorFlow / Keras

① 특징

  TensorFlow Keras
정의 - 구글에서 개발한 오픈소스 머신러닝 및 딥러닝 프레임워크
- 수치 계산과 신경망 모델을 쉽게 구축하고 학습시키기 위한 도구
- 고수준의 신경망 API
- TensorFlow 위에서 동작하며 신경망 모델을 빠르고 쉽게 구축할 수 있도록 도와줌
플랫폼
지원
- 데스크탑, 서버, 모바일, 클라우드 등 다양한 환경에서 실행 가능
- GPU, TPU를 통한 고속 연산 지원
TensorFlow, Theano, Microsoft Cognitive Toolkit 등 다양한 백엔드 엔진을 지원 (현재는 주로 TensorFlow 위에서 동작)
API 수준 - 고수준 API(Keras)와 저수준 API를 모두 제공
- 고급 사용자와 연구자에게 적합한 유연한 모델 정의 가능
- 고수준 API로, 사용자가 신경망 모델을 쉽게 정의하고 실험할 수 있도록 설계됨
- 초보자와 빠른 프로토타입 제작에 적합
자동 미분 자동 미분(Automatic Differentiation) 기능을 제공하여 복잡한 신경망의 역전파 알고리즘을 자동으로 처리 TensorFlow의 백엔드를 사용해 자동 미분을 지원하며, 복잡한 수식을 신경 쓸 필요 없이 신경망을 설계 가능
확장성과 유연성 - 대규모 모델과 데이터셋 처리 가능, 분산 학습 지원
- 다양한 커스터마이징과 맞춤형 레이어, 손실 함수 구현 가능
사용이 매우 간단하지만, 매우 복잡하거나 맞춤형 작업에서는 TensorFlow에 비해 유연성이 낮을 수 있음
커뮤니티와 생태계 - 광범위한 커뮤니티와 다양한 관련 라이브러리, 도구 제공
- 모델 구축, 학습, 배포 과정 지원
TensorFlow와 긴밀히 통합되어 있으며, 초보자부터 전문가까지 다양한 사용자가 접근하기 쉬움
시각화
도구
TensorBoard를 통해 학습 과정, 모델 성능, 손실 함수 변화를 시각화하고 모니터링할 수 있음 - TensorFlow와 연계되어 TensorBoard를 통해 시각화 가능 - 간단한 사용으로 빠른 피드백 제공
모델 배포 TensorFlow Serving, TensorFlow Lite, TensorFlow.js 등을 통해 다양한 환경에서 모델 배포 가능 TensorFlow와 통합된 배포 도구들을 사용하여 Keras 모델을 다양한 환경에 쉽게 배포 가능
사용
용이성
초보자에게는 다소 복잡할 수 있으나, 강력하고 유연한 기능 제공 사용하기 매우 쉽고 직관적이며, 간단한 모델 정의와 빠른 프로토타입 제작에 최적화되어 있음

 *Keras는 본래 독립적인 프레임워크로 시작하였으나, 이후 TensorFlow의 핵심 부분으로 통합됨(현재 Keras는 TensorFlow의 기본 딥러닝 API로, TensorFlow 안에 포함됨. Keras의 다양한 기능/유연성을 유지하면서도, TensorFlow의 강력한 성능과 기능을 그대로 활용할 수 있게 됨)
* 신경망 API : 신경망(인공 신경망)을 구축하고 학습시키기 위한 프로그래밍 인터페이스. Keras는 신경망 API 중 하나로, 신경망을 직접 코딩하지 않고도 다양한 딥러닝 모델을 쉽게 만들 수 있도록 도움

② 워크플로우(모델 구축 및 학습)

단계TensorFlowKeras
1. 모델 정의- 어떤 형태의 모델을 구현할 것인지 결정
- 고수준 API(ex: Sequential)와 저수준 API(ex: Functional API)를 사용하여 복잡한 모델도 설계 가능
- Keras에서 모델을 정의하는 방식은 매우 직관적이고 간단함
- 주로 Sequential 모델 또는 Functional API를 사용하여 모델을 정의
2. 입력층 설정input_shape를 사용해 입력 데이터의 형태를 지정하고, Flatten() 레이어를 사용해 입력 데이터를 필요한 형식으로 변환- Keras에서도 동일하게 input_shape와 Flatten()을 사용하여 입력 데이터를 처리
- 사용자 친화적인 API 덕분에 코드가 간결해짐
3. 출력층 설정- 문제 유형에 따라 출력층의 뉴런 수와 활성화 함수를 설정
- ex : 이진 분류는 sigmoid, 다중 클래스 분류는 softmax 사용
- Keras는 직관적인 인터페이스로 동일한 설정을 쉽게 적용할 수 있음
- 활성화 함수와 뉴런 수를 간단하게 지정할 수 있음
4. 은닉층 설정- 데이터의 차원과 정보를 변형하기 위해 은닉층을 설계
- 주로 Dense 레이어를 사용하여 복잡한 연산을 수행
- Keras에서 은닉층 설정은 매우 쉽고, 코드가 직관적이며 간결함
- Dense 레이어를 사용하여 여러 은닉층을 손쉽게 추가 가능
5. 모델 컴파일- 모델 학습에 필요한 최적화 함수(ex: Adam), 손실 함수(ex: categorical_crossentropy), 평가 지표(ex: accuracy) 등을 설정- Keras에서는 compile 메서드를 사용하여 동일한 설정을 빠르게 적용 가능
- 사용자에게 친숙한 API 덕분에 효율적인 작업이 가능함
6. 예측- 학습된 모델로 새로운 데이터에 대한 예측을 수행
- model.predict()를 사용해 예측값을 얻음
Keras에서도 동일하게 model.predict() 메서드를 사용해 예측값을 쉽게 얻을 수 있음
7. 검증- 모델의 성능을 검증 데이터셋을 통해 평가
- model.evaluate()를 사용하여 손실과 정확도를 확인함
Keras는 간단하고 직관적인 evaluate 메서드를 사용해 검증 데이터를 통해 모델의 성능을 확인할 수 있음

 
 

📘 실습 코드

  • TensorFlow 실습
# 목표 : TensorFlow 사용하여 MNIST 손글씨 이미지 데이터셋 불러옴 -> 신경망 모델 정의 & 학습시키기

import tensorflow as tf

# MNIST 데이터셋 로드 : 데이터셋을 불러와 훈련 데이터와 테스트 데이터로 분리
mnist = tf.keras.datasets.mnist
temp = mnist.load_data()
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 데이터셋의 형태 확인
train_shape = X_train[0].shape
test_shape = X_test[0].shape
print(train_shape)
print(test_shape)

# 데이터 샘플 출력 (MNIST 이미지 확인)
X_train[0]  # grayscale 이미지

X_train[0].min()  # 8비트 회색조 이미지, 28*28px 크기; 데이터 차원 784 (28x28)
X_test.shape  # 총 데이터 7만개, 6:1 비율로 train-test split
set(y_train)  # 0~9 총 10개 클래스

# 학습에 참여하는 X dataset을 minmax scaling : 255로 나눠버리기 (이미지의 경우)
print((X_train / 255).min())
print((X_train / 255).max())
X_train = X_train / 255
X_test = X_test / 255

# 신경망 모델 정의 : 간단한 신경망 모델을 구성하며, 입력층, 은닉층, 출력층을 포함

# 모델 학습; 시퀀셜 모델 생성
model = tf.keras.models.Sequential(
    [
        tf.keras.layers.Flatten(
            input_shape=(28, 28)
        ),  # 입력층 : 맨 위 레이어  # Flatten() : 데이터를 1차원으로 가로로 쭉 펼쳐줌
        tf.keras.layers.Dense(
            128, activation="relu"
        ),  # Dense : 입력층 - 출력층 을 연결하는 레이어; input_shape / output_shape 설정x  # 여기서 형태 조절함으로써 데이터 가중치를 조절?  # relu = 활성함수
        tf.keras.layers.Dropout(
            0.2
        ),  # Dropout : 모델이 학습할 때마다 일부 노드(20%)를 랜덤하게 꺼버림. 꺼진 노드는 학습이 안됨(딥러닝 모델의 과적합 방지. 딥러닝에서 모델학습보다 과적합이 더 쉽게 발생함)
        tf.keras.layers.Dense(
            10, activation="softmax"
        ),  # 출력층 : 맨 아래 레이어  # 10 : 몇개 레이블로 분류할것인가?
    ]
)

# 모델 컴파일 : 모델 학습에 필요한 손실 함수, 최적화 알고리즘, 평가 지표를 설정
model.compile(
    optimizer="adam",
    loss="sparse_categorical_crossentropy",  # 오차계산을 어떻게 할 것인가
    metrics=["accuracy"],
)

predictions = model(X_train[2:3])
predictions.numpy()  # numpy 배열로 변경

tf.nn.softmax(predictions).numpy()

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss_fn(y_train[2:3], predictions).numpy()

# 모델 학습 : 정의된 모델을 사용하여 훈련 데이터를 학습
model.fit(X_train, y_train, epochs=10)  # epoch : 모든 데이터셋을 한 번 학습하는 단위 # epoch를 나누면 batch 여러개

# 모델 평가 : 테스트 데이터를 사용하여 모델의 성능을 평가
model.evaluate(X_test, y_test)

# 예측 결과 확인 : 일부 훈련 데이터에 대해 모델의 예측 결과를 확인
model.predict(X_train[18:20])  # 18~20번 샘플의 예측값 확인

 

📙 내일 일정

  • '딥러닝 모델의 최적화 및 평가' 학습
  • 비용함수, 경사하강법, 퍼셉트론 이해