[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 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 중 하나로, 신경망을 직접 코딩하지 않고도 다양한 딥러닝 모델을 쉽게 만들 수 있도록 도움
② 워크플로우(모델 구축 및 학습)
단계 | TensorFlow | Keras |
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번 샘플의 예측값 확인
📙 내일 일정
- '딥러닝 모델의 최적화 및 평가' 학습
- 비용함수, 경사하강법, 퍼셉트론 이해
'TIL _Today I Learned > 2024.09' 카테고리의 다른 글
[DAY 41] Deep Learning 실습 (0) | 2024.09.09 |
---|---|
[DAY 40] Deep Learning 실습 (0) | 2024.09.06 |
[DAY 39] Deep Learning 실습 (0) | 2024.09.05 |
[DAY 38] 딥러닝 모델의 최적화 및 평가 (0) | 2024.09.04 |
[DAY 36] Machine Learning 실습 (0) | 2024.09.02 |