나의개발일지(TIL)

TIL 13일차 - 딥러닝

development-1 2024. 10. 22. 20:43

 

 

 

인공 신경망 (ANN)

 

어제 파이토치를 설치만 하고 오늘부터 실습을 시작했는데, 

파이토치가 정상적으로 실행이 되지 않는 문제가 발생했다.

그래픽카드가 지원하는 cuda를 설치하지 않아서 pytorch와 호환문제로 진행이 되지않았다고 생각하고,

cuda toolkit과 cuDNN도 설치를 진행해보았지만, 해결되지 않았다.

이후 해결 방법은 프롬포트에서 conda list를 통해  설치된 cuda 버전을 확인하고 uninstall 

 

이후 pytorch에서 제공하는 설치코드로 설치를 진행했는데 cuda가 아니라 cpu에 맞춰놓고 작업을 진행했다.

그래도 진행되지 않아서 쥬피터 노트북에서 torch를 직접 설치 진행하였고 이후 코드가 정상적으로 작동하였다.

 

pytorch의 기원이 되는 torch를 직접 설치 해줬고 이후 진행되는걸 확인할수있는데, 

그래픽카드를 통해 작업을 진행하는게 아니라 cpu를 통해서 진행하는걸까 ? 그러면 좀더 처리속도가 느리지 않을까

생각해보지만 과제부분도 그렇고 감기때문에 2일 결석을 해버려서 팀원들 보다 진도가 느리기에 일단 진행하였다.

 

ANN의 기본 구성 요소

 

ANN의 동작 방식

순전파는 입력->출력으로 뉴런을 활성화 하면서 최종 출력 값을 계산하고,

역전파는 손실 함수의 기울기를 출력->입력층 방향으로 계산하고 가중치를 업데이트한다.

 

 

 

 

간단한 인공 신경망 모델 구현 

 

import torch - 핵심 라이브러리

import torch.nn as nn - 뉴럴 네트워크 신경망 구축에 필요한 기능이 포함

import torch.optim as optim - 최적화 부분

import torchvision - 이미지를 처리해주는 라이브러리

import torchvision.transforms as transforms - 전처리를 위한 라이브러리

 

 

# 데이터셋 전처리

 

transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))])

 

transform =여러 변환을 순차적으로 전환 시켜 준다.

ToTensor(). = 이미지를 pytorch에서 사용하는 기본 자료 구조로 바꿔주는 부분

Normalize((0.5,), (0.5,))= 이미지를 정규화 해준다.(현재는 평균을 0.5 표준편차를 0.5로 바꿔주고있다.)

 

 

 

# MNIST 데이터셋 로드

 

trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)

 

 root= 경로 지정
 train= test인지 확인
download= 다운로드를 할지 말지 결정
transform= 데이터를 전처리하고 받을지 아닐지 결정

batch_size = 큰 데이터셋을 여러개로 나누는 방법

                     ( 10000의 데이터를 한번에 학습하는 것보다 100개로 나누어 학습하면, 속도나 학습능력이 상승한다)
                                                                             

이후 딥러닝 모델을 만들게 되는데 nn.Module을 상속 받는 클래스로 만들어준다.

nn.Linear = ANN 모델을 만드는 함수. (28*28 , 128) 28*28개(mnist 데이터의 크기)의 데이터를 받아

128개로 은닉층으로 연결시키고 이후 은닉층에서는 128개의 데이터를 받아 64개로 출력층으로 전달하며,

출력층에서는 64개의 데이터를 받아 10개의 퍼셉트론으로 출력한다.

 

이후 모델을 학습시키는데 모델평가를 학습 전에 넣어서 어느정도의 성능을 가지고 있는지 확인한다 현재는 14.46%

이후 학습을 진행하면 loss가 점점 줄어드는걸 확인할수있고

학습이 종료된 이후 모델평가를 진행하였을때의 성능이 97.35%로 개선된걸 확인할수있다.

 

 

합성곱 신경망 (CNN)

  • CNN은 합성곱 층 , 플링 층 , 완전 연결 층으로 구성된다.
  • CNN은 시각정보를 모델링 ANN은 신경망을 모델링 
  • ANN은 신경망을 모델링했기에 추론을 잘하고 , CNN은 시각정보라 이미지에 대한 처리에 효율이 높다.

 

 

합성곱 연상의원리와 필터의 역할

  • 합성곱 연산은 입력 이미지에 필터를 적용하여 특징 맵을 생성하는 과정이다. 
  • 필터는 작은 크기의 행렬로 , 이미지의 국소적인 패턴을 학습한다.

 

1. 합성 곱 연산

  • 필터를 이미지의 각 위치에 슬라이딩하며 , 필터와 이미지의 해당 부분간의 점곱을 계산한다.
  • 계산된 값은 특징 맵의 해당 위치에 저장된다.

 

2. 필터의 역할

  • 필터는 이미지의 edge ,corner , texture 등 다양한 국소적인 패턴을 학습한다.
  • 여러 개의 필터를 사용하여 다양한 특징 맵을 생성할수있다.

풀링 레이어, 플래튼

 

풀링 레이어의 필요성과 종류

 

풀링 층은 특징 맵의 크기를 줄이고, 중요한 특징을 추출하는 역할을 한다.

풀링층은 주로 Max pooling과 average pooling이 사용된다.

 

1. Max pooling

  • 필터 크기 내에서 최대 값을 선택한다.
  • 중요한 특징을 강조하고, 불필요한 정보를 제거한다.

2. 플래튼 레이어

  • 플래튼 층은 2차원 특징 맵을 1차원 벡터로 변환하는 역할을 한다
  • 완전 연결층에 입력으로 사용하기 위해 필요하다

 

 

 

 

 

 

 

 

순환 신경망 (RNN)

 

RNN의 기본구조

  • 순환 신경망은 시계열 데이터나 순차적인 데이터를 처리하기 위해 설계된 신경망이다.
  • RNN은 이전 시간 단계의 정보를 현재 시간 단계로 전달해 , 시퀀스 데이터의 패턴을 학습할수있다.

 

 

RNN의 동작원리

 

순환구조

  • RNN은 입력 데이터와 이전 시간 단계의 은닉 상태를 입력으로 받아 , 현재 시간 단계의 은닉상태를 출력한다.
  • 은닉 상태는 시퀀스의 정보를 저장하고 , 다음 시간 단계로 전달된다.

 

동작원리

  • RNN은 시퀀스의 각 시간 단계에서 동일한 가중치를 공유하여 , 시퀀스의 패턴을 학습한다.
  • 순전파와 역전파를 통해 가중치를 학습한다.

LSTM 및 GRU

 

RNN은 장기 의존성 문제를 겪을수 있다. 이를 해결하기위해 LSTM과 GRU가 개발 되었다.

 

LSTM

  • LSTM은 셀 상태와 게이트 구조를 도입, 장기 의존성을 효과적으로 학습가능하다.
  • LSTM은 입력 게이트 , 출력 게이트 , 망각 게이트를 사용하여 정보를 조절한다.

GRU

  • GRU는 LSTM의 변형으로, 셀 상태 대신 은닉 상태만을 사용하여 구조를 단순화 한다.
  • GRU는 업데이트 게이트와 리셋 게이트를 사용하여 정보를 조절한다.

차이점

  • LSTM은 셀 상태와 은닉상태를 모두 사용하며 , 더 복잡한 게이트 구조를 가진다
  • GRU는 은닉 상태만을 사용하며, 더 간단한 게이트 구조를 가진다. 따라서 계산 비용이 적고 학습이 빠르다.

 

RNN을 이용한 시계열 데이터 처리 방법

 

RNN은 시계열 데이터나 순차적인 데이터를 처리하는데 적합하다. 예를 들어 주식가격예측, 날씨 예측 등이 있다.

 

1. 데이터 전처리

  • 시계열 데이터를 적절한 형태로 변환하고 , 정규화한다.
  • 입력 시퀀스와 출력 시퀀스를 정의한다.

2.모델구축

  • RNN,LSTM,GRU 등의 모델을 정의한다.
  • 입력 크기 , 은닉 상태 크기, 출력 크기 등을 설정한다.

3.모델 학습

  • 손실함수와 최적화 알고리즘을 정의한다.
  • 순전파와 역전파를 통해 모델을 학습시킨다.

4.모델 평가

  • 테스트 데이터를 사용하여 모델의 성능을 평가한다.

 

sine 함수를 만들어주는 과정이며, 이 데이터셋을 tensor로 변환하는데

기울기를 계산하는 자료 구조이기때문에 사용하지 않으면 기울기를 계산할수없다.

RNN과 출력 레이어를 만드는 과정이며,

nn.RNN을 사용하여 인풋사이즈와 히든사이즈 첫번째 매치인지만 결정해주면된다.

그 이후 초기 은닉 상태를 만들어주어야하며 , 0값이나 특정 초기화 데이터를 하나 넣어줘야하기때문이다.

 

 

 

어텐션 메커니즘

 

Attention 메커니즘이란?

  • 시퀀스 데이터에서 중요한 부분에 더 많은 가중치를 할당하여 정보를 효율적으로 처리하는 기법.
  • 주로 자연어 처리와 시계열 데이터에서 사용되며, 기계 번역, 요약, 질의응답 시스템등 다양한 분야에서 성능 발휘

동작방식

1. 개요

  • 입력 시퀀스의 각 요소에 대해 중요도를 계산하여 가중치를 부여한다.
  • 이를 통해 중요한 정보에 집중하고, 불필요한 정보를 무시할수 있다.
  • 주로 세가지 주요 구성요소로 이루어진다. Query, Key , Value.

2.Attention 스코어 계산

  • Query와 Key간의 유사도를 측정하여 중요도를 계산한다.
  • 이 유사도는 내적 등을 사용하여 계산할수 있다.

3.Softmax를 통한 가중치 계산

  • 계산된 Attention 스코어는 Softmax 함수를 통해 확률 분포로 변환된다.
  • 이를 통해 가중치의 합이 1이 되로록 한다.

4.Softmax를 통한 가중치 계산

  • Softmax를 통해 얻어진 가중치를 Value에 곱하여 최종 Attention을 출력 계산한다.

Self-Attention과 Multi-Head Attention

 

Self Attention

  • 시퀀스 내의 각 요소가 서로를 참조하는 메커니즘이다. 입력시퀀스의 모든 요소가 Query,Key,Value로 사용된다.
  • 이를 통해 각 요소가 시퀀스 내 다른 요소들과의 관계를 학습할수있다.
  • 예를 들어 , 문장 내에서 단어 간의 관계를 학습하여 번역이나 요약에 활용할수 있다.

Multi -Head Attention

  • 여러 개의 self-attention을 병렬로 수행하는 메커니즘이다.
  • 각 헤드는 서로 다른 부분의 정보를 학습하며, 이를 통해 모델이 다양한 관점에서 데이터를 처리할수있다.

 

자연어 처리 (NLP) 모델

 

워드 임베딩과 시퀀스 모델링

 

워드 임베딩 기법

  • 워드 임베딩은 단어를 고정된 크기의 벡터로 변환하는 기법으로 , 단어간의 의미적 유사성을 반영한다.
  • 대표적인 워드 임베딩 기법으로는 Word2Vec 과 GloVe가 있다.

 

 

Word2Vec

  • 단어를 벡터로 변환하는 두가지 모델을 제공한다
  • CBOW : 주변 단어로 중심 단어를 예측한다.
  • Skip-gram : 중심 단어로 주변 단어를 예측한다.

GloVe

  • GloVe는 단어-단어 공기행렬을 사용 , 단어 벡터를 학습한다
  • 전역적인 통계 정보를 활용하여 단어 간의 의미적 유사성을 반영한다

 

시퀀스 모델링

 

시퀀스 모델링의 기본 개념

  • 수차적인 데이터를 처리하고 예측하는 모델링 기법.
  • 주로 RNN,LSTM,GRU와 같은 순환 신경망을 사용한다.

입력 시퀀스

  • 시퀀스 모델링에서는 입력 데이터가 순차적인 형태로 제공된다.
  • 예를 들어, 텍스트 데이터는 단어의 시퀀스로 표현된다.

은닉상태

  • 순환 신경망은 이전 시간 단계의 은닉 상태를 현재 시간 단계로 전달하여, 시퀀스의 패턴을 학습한다.

출력시퀀스

  • 시퀀스 모델링의 출력은 입력 시퀀스와 동일한 길이의 시퀀스일수도 있고, 단일 값일수도 있다.

 

Transformer와 BERT

 

Transformer의 구조와 원리

  • 순차적인 데이터를 병렬로 처리할수 있는 모델로 , 자연어 처리에서 뛰어난 성능을 보인다.
  • 인코더- 디코더 구조로 구성된다.

 

인코더

  • 입력 시퀀스를 처리하여 인코딩된 표현을 생성한다.
  • 각 인코더 층은 셀프 어텐션과 피드포워드 신경망으로 구성된다.

디코더

  • 인코딩된 표현을 바탕으로 출력 시퀀스를 생성한다
  • 각 디코더 층은 셀프 어텐션, 인코더-디코더 어텐션, 피드포워드 신경망으로 구성된다.

 

 

BERT란?

  • tranformer 인코더를 기반으로 한 사전 학습된 언어 모델이다.
  • 양방향으로 문맥을 이해할수 있어, 다양한 자연어 처리 작업에서 뒤어난 성능을 보인다.

사전학습

  • 대규모 텍스크 코퍼스를 사용하여 사전 학습한다.
  • 마스킹 언어 모델과 다음 문장 예측 작업을 통해 학습된다. 

파인튜닝

  • 사전학습된 BERT모델을 특정 작업에 맞게 파인튜닝한다.
  • 텍스트 분류, 질의 응답 , 텍스트 생성등 다양한 자연어 처리 작업에 적용 할 수 있다.

 

ResNet - 이미지처리 모델

  • ResNet은 깊은 신경망을 학습하기 위해 개발된 모델로 ,
    잔차 학습개념을 도입하여 매우 깊은 네트워크에서도 효율적인 학습이 가능하도록 한다.
  • 딥러닝 모델이 너무 깊어 질때 발생하는 기울기 소실 문제를 해결한다.

ResNet의 기본 개념

 

1. 깊은 신경망의 문제

  • 깊은 신경망은 더 많은 계층을 쌓아 복잡한 패턴을 학습할수 있지만, 너무 깊어지면 학습이 어려워진다.
  • 주로 기울기 소실이나 기울기 폭발 같은 현상때문에 발생한다.
  • 이는 모델이 더이상 깊어지지 못하고 성능이 저하되는 결과를 초래한다.

 

2. 잔차 학습

  • ResNet은 이러한 문제를 해결하기 위해 잔차 학습을 도입한다.
  • 잔차 학습은 각 층의 출력이 바로 다음 층의 입력으로 전달되지 않고 , 이전 층의 입력을 더해줌으로써 학습을 돕는다.

ResNet의 주요 특징

 

기울기 소실 문제 해결

  • 잔차 학습을 통해 깊은 네트워크에서도 기울기 소실 문제를 해결한다.
  • 입력을 출력에 더해줌으로써 신호가 더욱 쉽게 전달되어 학습이 원할하게 이루어진다..

간단한 블록 구조

  • 간단한 블록 구조를 사용하여 네트워크를 쉽게 확장할수있다.

높은 성능

  • 이미지 분류 , 객체 검출 등 다양한 컴퓨터 비전 작업에서 높은 성능을 발휘한다.
  • 깊은 네트워크에서도 안정적으로 학습할수 있어, 복잡한 패턴을 잘 학습한다.

 

오토인코더

오토인코더란?

  • 오토인코더는 입력 데이터를 압축하고, 다시 복원하는 과정을 통해 데이터를 효율적으로 표현하는 비지도 학습 모델.
  • 주로 차원 축소 , 잡음 제거 , 생성 모델 등 다양한 분야에서 활용한다.

동작원리

 

인코더

  • 인코더는 입력 데이터를 저차원으로 표현으로 변환하는 역할을 한다.
  • 인코더의 목적은 중요한 특징을 추출하고, 입력 데이터를 압축하는 것이다.

디코더

  • 디코더는 인코더에 의해 생성된 저차원 표현을 다시 원래의 고차원 데이터로 복원하는 역할.
  • 디코더의 목적은 입력 데이터를 최대한 원본과 가깝게 복원하는 것.

잠재 공간

  • 잠재 공간은 인코더에 의해 생성된 저차원 표현 공간.
  • 이 공간에서는 입력데이터의 중요한 특장만을 포함하며, 디코더는 이를 이용해 원래 데이터를 복원.

 

기본 오토인코더의 구조

 

 

변형된 오토인코더

  • 딥 오토인코더 : 더 깊은 인코더와 디코더 구조를 가지며, 복잡한 데이터 표현을 학습.
  • 변분 오토인코더 : 확률적 잠재 공간을 사용하여 데이터의 분포를 학습함.
  • 희소 오토인코더 : 잠재 공간의 표현을 희소하게 유지하여 중요한 특징만을 학습
  • 잡음 제거 오토인코더 : 입력 데이터에 잡음을 추가하고, 이를 제거하는 학습을 통해 데이터 복원 능력을 향상시킴

 

생성형 모델

 

GAN이란 ?

  • 두개의 신경망 , 즉 생성자(Generator)와 판별자(Discriminator)로 구성되어 있다.
  • 생성자는 가짜 데이터를 생성하고, 판별자는 이 데이터가 진짜인지 가짜인지 판별하며, 서로 경쟁하여 동시 학습한다.

동작 원리

 

생성자

  • 랜덤 노이즈 벡터를 입력으로 받아서 이를 통해 가짜 데이터를 생성한다.
  • 생성된 데이터는 판별자에게 전달되어 진짜 데이터처럼 보이도록 학습한다.

판별자

  • 진짜 데이터와 생성된 가짜 데이터를 입력으로 받아서 이를 구분하는 역할을 한다
  • 판별자는 진짜 데이터를 1로 , 가짜 데이터를 0으로 분류하도록 학습한다.

경쟁 과정

  • 생성자는 판별자를 속이기 위해 점점 더 진짜 같은 데이터를 생성하려고 노력하게된다.
  • 판별자는 생성자가 만든 가짜 데이터를 더 잘 구분하려고 노력하게 된다.
  • 이 과정에서 두 네트워크는 서로 경쟁하며 동시에 발전하게 된다.

 

VAE

 

VAE란 ?

  • 인코더와 디코더로 구성된 오토 인코더의 변형이다.
  • 인코더는 입력 데이터를 잠재 공간으로 매핑하고, 디코더는 이 잠재 공간에서 데이터를 다시 원래 공간으로 복원한다.
  • 잠재 공간을 확률 분포로 모델링하여, 새로운 데이터를 생성 할 수 있는 능력을 갖추게 된다.
  • 응용하게 되면 이미지 생성, 데이터 압축 , 노이즈 제거 등이 가능하다

 

 

전이 학습

 

전이 학습이란?

  • 이미 학습된 모델의 지식을 새로운 문제에 적용하는 방법
  • 특히 데이터가 부족한 사황에서 유용하며, 모델 학습 시간을 단축하고 성능을 향상 시킬수있다.

 

전이학습의 필요성

  • 데이터 부족 : 새로운 문제에 대한 데이터가 충분하지 않을 때, 전이학습을 통해 기존 모델의 지식을 활용할수 있다.
  • 학습 시간 단축 : 사전 학습된 모델 사용시 , 처음부터 학습하는것보다 빠르게 학습할수있다.
  • 성능 향상 : 사전 학습된 모델은 대규모 데이터셋에서 학습되었기 때문에, 통상 더 나은 성능을 보인다.

전이학습의 원리

  • 특징 추출기 : 사전 학습된 모델의 초기 층을 고정하고 , 새로운 데이터에 맞게 마지막 층만 재학습 한다.
  • 미세 조정 : 사전 학습된 모델 전체를 새로운 데이터에 맞게 재학습한다.

전이학습을 적용한 모델 구축 과정

 

1. 사전 학습된 모델 로드

  • PyTorch에서 제공하는 사전 학습된 모델을 로드한다.
  • ResNet, VGG, Inception 등의 모델을 사용 할 수 있다.

2. 모델 수정

  • 사전 학습된 모델의 마지막 층을 새로운 문제에 맞게 수정한다.
  • 예를 들어, 이미지 분류 문제에서 클래스 수를 변경한다.

3. 모델 학습

  • 수정된 모델을 새로운 데이터에 맞게 학습 시킨다.
  • 특징 추출기 방식이나 미세 조정 방식을 사용 할 수 있다.

 

과적합 방지 기법

 

정규화와 드롭아웃

 

정규화

  • 정규화는 입력 데이터의 분포를 일정한 범위로 조정하여, 모델의 학습을 안정화 하고 성능을 향상시키는 기법이다.

  • 배치 정규화 : 각 미니배치의 평균과 분산을 사용하여 정규화 한다. 이는 학습 속도와 과적합을 방지하는데 도움된다.
  • 레이어 정규화 : 각 레이어의 뉴런 출력을 정규화한다.

드롭아웃

  • 드롭아웃은 학습 과정에서 무작위로 뉴런을 비활성화하여, 모델의 과적합을 방지하는 기법.
  • 드롭아웃은 학습시에만 적용되며, 평가 시에는 모든 뉴런을 활성화 한다.

조기 종료 기법

  • 조기 종료는 검증 데이터의 성능이 더 이상 향상되지 않을때 학습을 중단하며, 과적합을 방지하는 기법.
  • 조기 종료는 학습 과정에서 검증 손실이 일정 에포크 동안 감소하지 않으면 학습을 중단한다.

데이터 증강 기법

  • 데이터 증강은 원본 데이터를 변형하여 새로운 데이터를 생성함으로써, 데이터셋을 확장하고
    모델의 일반화 성능을 향상시키는 기법.
  • 데이터 증강 기법에는 회전, 이동, 크기 조절 , 색상 변환 등이 있다.

하이퍼파라미터 튜닝

하이퍼파라미터란?

  • 하이퍼파라미터는 모델 학습 과정에서 사용자가 설정해야 하는 값으로, 모델의 성능에 큰 영향을 미친다.

학습률

  • 학습률은 모델의 가중치를 업데이트하는 속도를 결정한다.
  • 너무 크면 학습이 불안정해지고, 너무 작으면 학습이 느려진다.
  • 일반적으로  0.1 , 0.01 , 0.001 등의 값을 시도해 볼수 있다.

배치크기

  • 배치 크기는 한번의 업데이트에 사용되는 데이터 샘플의 수를 결정한다.
  • 큰 배치 크기는 학습 속도를 높이지만, 메모리 사용량이 증가한다.
  • 일반적으로 32, 64 , 128 등의 값을 시도해 볼수 있다.

에포크 수

  • 에포크 수는 전체 데이터셋을 몇번 반복하여 학습할지를 결정한다.
  • 너무 적으면 과소적합이 발생하고, 너무 많으면 과적합이 발생 할수 있다.
  • 조기 종료 기법을 사용하여 적절한 에포크 수를 결정할수 있다.

모멘텀

  • 모멘텀은 이전 기울기를 현재 기울기에 반영하여, 학습 속도를 높이고 진동을 줄인다.
  • 일반적으로 0.9 , 0.99 등의 값을 시도해 볼수 있다.

가중치 초기화

  • 가중치 초기화는 모델의 가중치를 초기화하는 방법을 결정한다.
  • 일반적으로 Xavier 초기화 , HE 초기화 등을 사용한다.

 

 

하이퍼파라미터 자동 튜닝 기법

 

Grid Search

  • 하이퍼파라미터의 모든 조합을 시도하여 최적의 값을 찾는다.
  • 계산 비용이 많이 들지만 , 모든 조합을 탐색할수있다.

Random Search

  • 하이퍼파라미터 공간에서 무작위로 값을 선택하여 최적의 값을 찾는다.
  • Grid Search보다 계산 비용이 적고, 더 넓은 하이퍼파라미터 공간을 탐색 할수 있다.

Bayesian Optimization

  • 베이지안 최적화는 이전 평가 결과를 바탕으로, 다음 평가할 하이퍼파라미터를 선택한다.
  • 계산 비용이 적고, 효율적으로 최적의 값을 찾을수 있다.

 

모델 평가와 검증 및 Pytorch 문법 정리

 

교차검증이란 ?

  • 교차검증은 모델의 일반화 성능을 평가하기 위해 데이터를 여러 번 나누어 학습과 검증을 반복하는 방법.
  • 교차 검증은 모델이 과적합 되지 않고, 새로운 데이터에 대해 잘 일반화되는지 평가하는데 유용하다.

 

교차검증의 필요성

  • 과적합 방지 : 교차 검증은 모델이 특정 데이터셋에 과적합되지 않도록 도와준다.
  • 일반화 성능 평가 : 교차 검증은 모델의 일반화 성능을 더 정확하게 평가 할수있다.
  • 데이터 효율성 : 교차 검증은 데이터를 최대한 활용하여 모델을 평가 할수있다.

K-Fold 교차 검증의 원리

  • 데이터를 k개의 폴드로 나눈다.
  • 각 폴드가 한번씩 검증 데이터로 사용되며, 나머지 K-1개의 폴드는 학습 데이터로 사용된다.
  • K번의 학습과 검증을 반복하여, 각 폴드에 대한 검증 결과를 평균하여 모델의 성능을 평가한다.

적용 방법

  • 데이터를 K개의 폴드로 나누고, 각 폴드에 대해 학습과 검증을 수행한다.
  • 각 폴드에 대한 검증 결과를 저장하고, 최종적으로 평균하여 모델의 성능을 평가한다.

PyTorch의 주요 API 정리 

1. 모델 구축 및 학습

 

기본모델 구축

 

 

import torch.nn as nn 

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.layer1 = nn.Linear(10, 20)

    def forward(self, x):
        x = self.layer1(x)
        return x

 

 

torch.nn.Module은 모든 신경망 모델의 기본 클래스이며,  모델구축시 상속 받는 걸로 시작한다.

__init__에서 구조를 만들고 forward를 통해 데이터가 어떻게 흘러갈지 정하게 된다.

 

손실함수

 

loss_fn = nn.CrossEntropyLoss()

loss_fn = nn.MSELoss()

 

nn.CrossEntropyLoss() : 분류 문제에 주로 사용됨.

nn.MSELoss() : 회귀 문제에 주로 사용됨.

 

torch에서는 nn.모듈에서 손실함수를 기본적으로 제공한다.

 

최적화 알고리즘

 

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

 

torch.optim.SGD : 확률적 경사 하강법 최적화 알고리즘.

torch.optim.Adam: Adam 최적화 알고리즘.

 

파라미터를 lr 의 값을 사용해서 최적화 한다.

 

 

 

데이터셋 및 데이터 로더

 

from torch.utils.data import Dataset

class MyDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        return self.data[idx], self.targets[idx]

torch.untils.data.Dataset : 사용자 정의 데이터셋을 만들기 위한 기본 클래스

학습에 사용할수 없는 형태의 데이터는 사용할수 있는 형태로 바꿔야하는데,

pytorch에서는 몇가지 기본 클래스를 제공한다.

from torch.utils.data import DataLoader

dataset = MyDataset(data, targets)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

torch.untils.data.DAtaLoader :  미니 배치 학습을 위한 데이터 로더.

 

from torchvision import transforms

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

 

torchvision.transforms : 이미지 데이터 변환을 위한 유틸리티.

 

 

모델 기법별 API

 

합성곱 신경망 (CNN)

 

conv_layer = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1)

 

torch.nn.Conv2d :2D 합성곱 레이어

 

순환신경망 (RNN)

 


rnn_layer = nn.RNN(input_size=10, hidden_size=20, num_layers=2, batch_first=True)

 

torch.nn.RNN : 기본 순환 신경망 레이어

 

lstm_layer = nn.LSTM(input_size=10, hidden_size=20, num_layers=2, batch_first=True)

 

torch.nn.LSTM : LSTM 레이어

 

gru_layer = nn.GRU(input_size=10, hidden_size=20, num_layers=2, batch_first=True)

 

torch.nn.GRU : GRU 레이어

 

트랜스포머

 

transformer_model = nn.Transformer(nhead=8, num_encoder_layers=6)

 

torch.nn.Transformer : 트랜스포머 모델.

 

encoder_layer = nn.TransformerEncoderLayer(d_model=512, nhead=8)

 

torch.nn.TransformerEncoderLayer :  트랜스포머 인코더 레이어

 

저장 및 로드

 

torch.save(model.state_dict(), 'model.pth')       #모델 저장

model.load_state_dict(torch.load('model.pth'))        #모델 로드
model.eval()

 

 

 

 

 

 

 

오늘의 회고-

이렇게 딥러닝 강의 까지 완료 했다.

과제 때문에 하루만에 너무 많은 강의를 듣다 보니, 솔직히 9시간 넘어가면서 부터는

하이퍼파라미터를 들으면서도 내가 지금 무슨 강의를 듣고있었지? 하면서

듣고 있는 강의의 대주제도 기억을 못하는 상황까지도 나왔다.

하루에 적게는 12시간 길면 18시간까지도 무언가를 공부한다는게 참으로 어렵구나.

과제 내용을 보니 딥러닝까지 사용하지 않고 머신러닝 기법만으로도 진행할수있는 수준처럼 보였다.

팀 프로젝트인 만큼 팀원들에게 폐끼치 말자. 모르는거 이해 안되는거 일단 넘어가고,

과제 진행후 다시 복습하는 시간을 가지자.

이번주에 금요일까지 과제를 끝내면 다음주는 과제없이 오롯이 원하는 공부를 할수 있으니

다음주에 머신러닝 딥러닝 부분을 이해하자.

지금은 한걸음 뒤쳐지는거 같지만 이 한걸음이 나중엔 열걸음 스무걸음 벌어진다.