본문 바로가기

AI.ML

[AI/ML스터디] 2주차- 03. 파이토치기초(~퍼셉트론)

03장. 파이토치 기초

데이터세트와 데이터로더

데이터 세트

  • 데이터의 집합
  • 입력값과 결괏값에 대한 정보 제공, 일련의 데이터 묶음제공

ex) 데이터베이스의 테이블 과 같은 형태로 구성
데이터를 변형하고 매핑하는 코드를 학습과정에 반영하면,
모듈화, 재사용성, 가독성 을 떨어뜨리는 원인
→ 이러한 현상 방지하기 위해 데이터 세트와 데이터 로더를 사용
 
 

*데이터세트(Dataset) : 학습에 필요한 데이터를 정제, 정답을 저장하는 기능 제공

 
선형 변환 함수, 오차 함수처럼 클래스 형태로 제공,
초기화 메서드(init), 호출 메서드(getitem), 길이 반환 메서드(len) 를 재정의하여 활용

초기화 메서드(__init__)

입력된 데이터의 전처리 과정을 수행하는 메서드,
새로운 인스턴스 생성될 때 학습에 사용될 데이터 선언, 학습에 필요한 형태로 변형하는 과정을 진행

호출 메서드(__getitem__)

학습을 진행 할 때 사용되는 하나의 행을 불러오는 과정
입력된 색인(index)에 해당되는 데이터 샘플을 불러오고 반환,
초기화 메서드에서 변형, 개선 된 데이터 가져오며, 데이터 샘플과 정답을 반환

길이 반환 메서드(__len__)

학습에 사용된 전체 데이터세트의 개수를 반환,
몇 개의 데이터로 학습이 진행되는지 확인 가능
 
 
 

*데이터로더: 데이터세트에 저장된 데이터를 어떠한 방식으로 불러와 활용할지 정의

 
배치크기(batch_size)/데이터순서변경(shuffle)/데이터 로드 프로세스 수(num_workers)
배치크기: 학습에 사용하는 데이터 많 → 모든데이터를 메모리에 올릴 수 없을 때 데이터를 나누는 역할
ex) 1,000개의 sample, batch_size=100할당 10번의 배치 완료 → 1번의 에폭 진행 완료
데이터순서변경: 데이터 간의 관계가 아닌 순서로 학습되는 것을 방지, 데이터 샘플과 정답의 매핑 관계는 변경되지 않으며, 행의 순서를 변경
데이터 로드 프로세스 수 : 데이터 불러올 때 프로세스의 개수
학습을 제외한 코드에서 데이터를 불러오는데 시간이 가장 오래 소요 → 최소화 : 데이터로드에 필요한 프로세스의 수를 늘림

다중선형회귀

텐서데이터세트(TensorDataset)는 기본 데이터세트(Dataset)클래스를 상속받아 재정의된 클래스

모델/데이터세트 분리

파이토치의 모델은 인공신경망 모듈을 활용해 구현
*모델: 데이터에 대한 연산 수행,계층 정의, 순방향 연산 수행
클래스 구조를 활용해 복잡한 구조의 인공신경망을 모듈화해 빠르게 구축 및 관리하기 쉬운 상태로 만듬
모델 구현 —> 모듈(Module)클래스 사용
새로운 모델 클래스 생성 → 모듈 클래스 상속받아 임의의 서브 클래스(Sub Class) 생성
이 클래스는 다른 모듈 클래스 포함 가능, 트리구조로 중첩

모듈 클래스

초기화 메서드와 순방형 메서드를 재정의해 활용

  • 초기화 메서드: 신경망에 사용될 계층 초기화
  • 순방향 메서드: 모델이 어떤 구조를 갖게 될 지 정의

비선형 회귀

데이터세트 분리

전체 데이터세트 =(훈련데이터, 테스트데이터, 검증용 데이터)

  • 훈련용 데이터: 모델을 학습하는데 사용하는 데이터세트
  • 검증용 데이터: 학습이 완료된 모델을 검증 하기 위해 사용되는 데이터 세트
  • 테스트 데이터: 검증용 데이터를 통해 결정된 성능이 가장 우수한 모델을 최종 테스트 하기 위한 목적으로 사용되는 데이터 세트이다.

*무작위 분리함수 : **분리길이(lengths)**만큼 데이터세트서브셋을 생성
분할길이 매개변수 [300,100,50] 서브셋 3개, 순서대로 300,100,50개의 데이터를 가지는 데이터세트가 생성됨
*생성자: 서브셋에 포함될 무작위 데이터들의 난수 생성 시드

  • torch.manual_seed(int)함수 사용 → 무작위성 결정

모델 저장 및 불러오기

모델학습은 오랜시간 소요, 학습결과 저장하고 불러와 활용해야 함
파이토치의 모델은 직렬화와 역직렬화를 통해 객체 저장 불러올 수 있음
모델 저장 : Python 피클(Pickle) 을 통해 파이썬 객체구조를 바이너리 프로토콜로 직렬화한다.
.pt, .pth
*모델 저장함수 : 학습결과를 저장하려는 모델 인스턴스와 학습결과 파일이 생성될 경로를 설정

모델 상태 저장 및 불러오기

*모델상태: 모델에서 학습이 가능한 매개변수를 순서가 있는 딕셔너리 형식으로 변환
load_state_dict 메서드 활용

체크포인트 저장 및 불러오기

*체크포인트: 학습과정의 특정 지점마다 저장하는 것을 의미
데이터 개수 많, 깊은 구조의 모델 학습 → 오랜 시간 소요, 과부하,학습 비정상 마무리 발생
⇒ 일정 에폭마다 학습된 결과를 저장해 나중에 이어서 학습하도록
에폭 ,모델 상태, 최적화 상태 필수로 포함(epoch, model.state_dict,optimizer.state_dict)

활성화함수

인공신경망에서 사용되는 은닉층을 활성화하기 위한 함수
활성화란? : 인공신경망의 뉴런의 출력값을 선형에서 비선형으로 변환하는 것

  • 네트워크가 데이터의 복잡한 패턴을 기반으로 학습하고 결정을 내릴 수 있게 제어 , 가중치로 편향으로 이루어진 노드를 선형 →비선형으로 갱신하는 역할
  • 직관적으로 네트워크에 포함된 노드는 출력값에 동일한 영향X, 노드마다 전달돼야 하는 정보량이 다름
  • 비선형 구조를 가져, 역전파 과정에서 미분값을 통해 학습을 진행
  • 선형 구조라면, 미분과정에서 항상 상수가 나오므로, 학습을 진행하기 어렵
  • 즉, 입력을 정규화하는 과정

이진분류

규착에 따라 입력된 값을 두 그룹으로 분류하는 작업을 의미, ex)참/거짓, A그룹/B그룹
관측치: 0~1 범위, 데이터를 0또는 1로 분류하기 위해 임곗값을 0.5로 설정,
Y가 0.5보다 작은값은 거짓/ 0.5보다 큰 값은 참

시그모이드 함수

S자형 곡선모양, 반환값은 0~1또는 -1~1의 범위
계수가 0에 가까워질수록 완만한 경사, 0에서 멀어질 수록 급격한 경사
시그모이드함수 - 로지스틱 회귀사용
출력값 0.5보다 낮으면 거짓
출력값 0.5보다 높으면 참
값 에따라 급격히 변하지 않는다는 장점
출력값이 0~1로 제한 ⇒ 기울기 폭주 문제가 발생하지 X ,대신 기울기 소실 문제 발생
신경망은 기울기를 이용해 최적화된 값을 찾아감, 계층이 많아지면 값이 0에 수렴하여 성능이 떨어짐(은닉층에서 사용X,주로 출력층에 사용)

이진교차 엔트로피

로그함수를 활용해, 오차 함수 구현
Y가 0일때와 1일때 적용하는 함수식이 다름
MSE의 경우, 명확하게 불일치하는 경우에도 높은 손실값 반환하지 X
로그함수는 로그진수가 0에 가까워질수록, 발산하는 특성
⇒ 로그함수의 경우 불일치하는 비중이 높을수록 높은 손실 값 반환

비선형 활성화함수

네트워크에 비선형성을 적용하기 위해 인공신경망에서 사용하는 함수
단순한 선형 조합이 아닌 형태로 출력을 생성하는 함수 의미
ex) 사람의 나이와 키의 관계

  • 입출력 간의 관계를 학습하고 더 정확한 예측을 진행

계단함수

이진 활성화 함수, 퍼셉트론 에서 최초로 사용한 활성화 함수

  • 임곗값을 넘으면 0을 출력, 넘지 못하면 1출력
  • 딥러닝 모델에서는 사용되지 않음(불연속점, 역전파과정에서 극단적으로 변경)

임곗값 함수

출력이 0,1인 이진분류 작업을 위해 신경망에서 사용되는 함수

  • 함수에 대한 기울기 계산 X, 네트워크최적화하기 어려워 사용되지 않는 함수임

시그모이드 함수

모든 입력값을 0과 1사이의 값으로 매칭

  • 이진 분류 신경망의 출력 계층의 활성화 함수로 사용
  • 단순한 형태의 미분 식
  • 입력값에 따라 출력값이 급격하게 변하지 않음
  • 기울기 폭주 현상 방지 but 기울기 소실 문제 존재

*기울기 소실 문제 : 역전파(Backpropagation) 과정에서 출력층에서 멀어질수록 Gradient 값이 매우 작아지는 현상

하이퍼볼릭탄젠트 함수

시그모이드와 유사한 형태지만, 출력값의 중심이 0

  • 출력값이 -1~1의 범위, 음수값 반환 가능
  • 출력값의 범위가 더 넓고 다양한 형태로 활성화 할 수 있기에 기울기 소실 비교적 적음
  • x>4보다 큰 경우 마찬가지로 출력값이 1에 수렴하므로, 기울기 소실 문제 발생

ReLU함수(렐루)

0보다 작거나 같으면 0 반환
크면 선형 함수에 값을 대입

  • 선형 함수에 대입하므로, 입력값이 양수라면 출력값이 제한되지 않아 기울기 소실이 발생하지 않음
  • 수식 또한 매우 간단해, 순전파 역전파 연산이 매우 빠름
  • 입력값이 음수이면, 항상 0을 반환하므로 가중치나 편향이 갱신 되지 않을 수 있음
  • 가중치의 합이 음수 → 해당 노드는 더 이상 값을 갱신하지 않아 죽은 뉴런

LeakyReLU함수(리키렐루)

음수기울기를 제어, 죽은 뉴런 현상 방지하기 위해 사용

  • 양수일 경우 리키와 동일, 음수인 경우 작은값이라도 출력시켜 기울기 갱신
  • 작은 값을 출력시키면, 더 넓은 범위의 패턴을 학습할 수 있어 네트워크의 성능을 향상시키는데 도움

PReLU함수(P렐루)

리키렐루 함수와 형태는 동일, 음수 기울기 값을 고정값이 아닌 갱신 되는 값으로 간주

  • 음수 기울기는 지속해서 값이 변경됨
  • 값이 지속해서 갱신되는 매개변수이므로, 학습데이터세트의 영향을 받음

ELU함수

지수함수 사용하여 부드러운 곡선형태

  • 음의 기울기에서 비선형 구조를 가짐, 입력값이 0 인 경우에도 출력값이 급격하게 변하지 않아, 경사하강법의 수렴 속도가 비교적 빠름

소프트맥스 함수

  • 차원벡터에서 특정 출력값이 k번째 클래스에 속할 확률을 계산
  • 은닉층에서 사용하지 않고, 출력층에서 사용됨
  • 네트워크 출력을 가능한 클래승 대한 확률분포로 매핑

순전파와 역전파

순전파: 순방향 전달, 주어지면 신경망의 출력을 계산하는 프로세스
입력데이터를 기반으로 신경망을 따라
입력층부터 출력층까지 차례대로 변수를 계산하고 추론한 결과를 전달

  • 네트워크에 입력값을 전달해 순전파 연산을 진행
  • 계층마다 가중치와 편향으로 계산된 값이 활성화 함수에 전달
  • 활성화 함수에서 출력값이 계산, 이 값을 손실함수에 실젯값과 함께 오차를 계산

역전파: 순전파와 반대 방향으로 연산 진행
학습괒어에서 네트워크의 가중치와 편향은 예측된 출력값과 실제 출력값 사이의 오류를 최소화하기 위해 조정

  • 연쇄법칙 활용

퍼셉트론

  • 인공신경망의 한 종류, 신경세포가 신호를 전달하는 구조와 유사한 방식으로 구현
  • 입력값을 토대로 특정 연산을 진행할때 임곗값보다 크면 전달, 작으면 전달하지 않음
  • TLU 형태 기반으로 계단 함수를 적용해 결과 반환
  • 입력값과 노드의 가중치를 곱한 값을 모두 더했을때 임곗값보다 크면 1출력, 작으면 0출력

단층퍼셉트론

하나의 계층을 갖는 모델, 입력을 통해 데이터가 전달
학습과정
-입력값은 각각의 가중치와 함께 노트에 전달
-전달된 입력값과 가중치를 곱한 값이 활성화 함수에 전달
-활성화 함수에서 출력값이 계산
-이값은 손실함수에 실젯값과 함께 연산해 가중치를 변경함
한계
AND,OR,NAND 게이트와 갖은 구조를 갖는 모델을 쉽게 구현
XOR게이트처럼 하나의 기울기로 표현하기 어려운 구조에서 단층 퍼셉트론 적용어려움

다층퍼셉트론

단층퍼셉트론을 여러개 쌓아 은닉층을 생성
은닉층이 하나 이상인 퍼셉트론 구조를 의미, 은닉층을 2개이상: 심층신경망, 은닉층이 늘어날 수록 복잡한 문제 해결가능
학습과정

  1. 입력층부터 출력층까지 순전파 진행
  2. 출력값과 실젯값으로 오차 계산
  3. 오차를 퍼셉트론의 역방향으로 보내면서 입력된 노드의 기여도 측정
  • 손실함수를 편미븐해 기울기 계산
  • 연쇄 법칙을 통해 기울기 계산

4. 입력층에 도달할 때까지 노드의 기여도 측정
5. 모든 가중치에 최적화 알고리즘 수행