본문 바로가기
배우는 과정/Pytorch

Pytorch 데이터 적합 요약

by c급선임 2024. 7. 21.
반응형

활성층과 은닉층

활성층은 활성함수를 사용하는 계층을 뜻하고 은닉층은 입력층과 출력층 사이에 계층연계로 입출력값이 들어가고 나가는 부분을 뜻하는 구조적인 단어임. 어차피 계층마다 활성함수가 들어가므로 의미상 큰 차이는 없지만 활성층은 계층 하나마다 지칭할 수 있지만 은닉층은 중간 계층들의 전체를 의미하는 것 같음

또한 활성층이라는 단어는 잘 사용하지 않음 

 

입력값과 계층

일단 크게 설명하면, 밑에 설명한 뉴런들은 파라미터 하나로 인해 입출력이 이루어지는 신경 하나이고, 이것들이 각 계층마다 다발을 이루며 포진하고 있다.

먼저 입력값이 단일값 또는 백터값일때이다. 단일값이면 별 상관 없지만 온도 문제처럼 다수의 입력값이 필요한 백터 값일 경우는 뉴런 내부에서도 파라미터가 입력 수만큼 복제되어서 하나의 뉴런이 다수 입력을 받아들여야 한다. 중요한 것은 다양한 입력값에 뉴런이 알아서 반응하여 파라미터를 복제하여 이 파라미터는 모두 같으므로, 입력 백터가 모두 1로 통일되어 있으면 동일한 값 다수가 출력될 것이다. 따라서 입력 백터의 크기에 따라 뉴런이 파라미터를 알아서 복제한다.

 

두번째는 입력값과 상관 없이 사용자가 학습 품질을 높이기 위해 계층하나당 다수의 뉴런을 배치시킬때이다. 이런 경우 Linear() 모듈이 사용되는데, Linear(1, 13)의 경우 계층 하나에 뉴런을 13개 만드는 것이고 이 뉴런들을 각기 다른 파라미터를 가지고 시작한다. 따라서 학습에서의 복잡도와 다양화가 이루어 진다. 

 

따라서 입력값이 백터형이고 Linear로 인한 계층 하나에 다수의 뉴런을 생성한다면, 계층하나당 w는 행렬을 이룰 것이고, 입력값인 x는 백터를 이룰 것이다. w가 행렬인 이유는 다수 입력으로 인해 복제까지 되었는데 다수의 뉴련의 다양한 파라미터중 w값을 대표하는 것이므로 2차원을 이룰 수 밖에 없다.

쉽게 설명하면 계층 하나에 4개의 뉴런을 배치하고 입력백터 요소가 3개라면

뉴런 1의 w 파라미터 3개 : 1, 1, 1

뉴런 2의 w 파라미터 3개 : 2, 2, 2

뉴런 3의 w 파라미터 3개 : 3, 3, 3

뉴런 4의 w 파라미터 3개 : 4, 4, 4

따라서 w는 행렬을 이룬다. 예시는 1,2,3,4 이지만 2, 8, 1, 3 같이 랜덤할 것 이다.

 

마지막으로 이렇게 다수화와 복잡화가 이루어진 파라미터들이 입력에서 최종 출력까지 순회하면서 각 계층, 각 뉴런별로 모든 파라미터들이 갱신되며 심지어 단일 뉴런에서 입력수로 인해 복제된 파라미터들도 각각 다른 입력값들로 인해 다르게 갱신이 된다. 최종 딥러닝 모델은 이런 수많고 각각 다르게 갱신된 파라미터들의 집합체가 되는 것이다. 

 

 

활성 함수의 위치

기본적으로 뉴런이라는 기본 단위(값이 모델에 들어가고 출력되는)에 활성함수가 적용됨 o = f(w*x + b) 형태인데 f가 활성함수이므로 모든 입력과 출력 사이에 활성 함수가 들어감.

밑에서 설명하겠지만 활성 함수는 출력 값에 대한 한도를 극한 개념으로 제한해서 이상치를 강제적으로 순화 시키고 중요한 부분은 민감도를 높혀서 정확한 학습에 도움을 줌. 이렇게 출력값에 영향을 주므로 손실 함수값에도 영향을 주고, 활성함수는 이 손실함수의 모양을 바꾼다. 따라서 반드시 손실 함수가 최소값일때가 정답이라는 것을 의미하지 않게 되고 단일의 파라미터만 찾아가지 않음 

 

 

활성 함수 특성

활성 함수의 그래프 모양을 보면 알수 있듯 x값이 0근처에서는 굉장히 민감하고 너무 낮거나 높은 영역에서는 x값을 아무리 더해봐야 y값이 둔감하다. 따라서 이상치에 대해서는 굉장히 변동 영역을 둔감하게 하여 전체 통계에 영향을 주지 않도록 해주고 민감한 영역에서는 최대한 반영시킨다.

이것도 학습 기법에서의 옵티마이져처럼 다양한 활성 함수가 있고 상황에 맞게 전략적으로 선정해야 한다.

 

파이토치 nn 모듈

딥러닝등을 할때 유용한 도구라고 할 수 있음. 밑에서 손쉬운 사용 사례를 볼 수 있다.

배치 최적화

t_u 등의 여러 요소가 들어있는 입력값을 tensor화 한 후 차원을 하나더 할당해주어 한꺼번에 잘 계산되도록 틀을 바꿔주는 방법임. 일반 리스트를 tensor 처리하는 이유가 이 배치 처리를 하기 위함이다.

 

nn.Sequential 컨테이너

nn 모듈의 컨테이너를 이용해서 이러한 입력층, 은닉층, 출력층을 간단하게 만들어 줄 수 있음.

또한 다수의 계층이 필요한 경우는 아래와 같이 여러개의 층을 추가해주면 되고 각 층은 다른 활성함수를 적용할 수 있다.

import torch
import torch.nn as nn

# 예시로 nn.Linear(1, 13), nn.Tanh(), nn.Linear(13, 1) 세 개의 계층을 사용하는 경우
model = nn.Sequential(
    nn.Linear(1, 13),  # 첫 번째 계층: 입력 크기 1, 출력 크기 13
    nn.Tanh(),         # 두 번째 계층: Tanh 활성화 함수
    nn.Linear(13, 1)   # 세 번째 계층: 입력 크기 13, 출력 크기 1
)

# 만약 더 많은 계층을 추가하려면, 예를 들어 은닉층을 더 추가하고 싶다면:
model = nn.Sequential(
    nn.Linear(1, 13),  # 첫 번째 계층: 입력 크기 1, 출력 크기 13
    nn.Tanh(),         # 두 번째 계층: Tanh 활성화 함수
    nn.Linear(13, 20), # 세 번째 계층: 입력 크기 13, 출력 크기 20 (예시)
    nn.ReLU(),         # 네 번째 계층: ReLU 활성화 함수 (예시)
    nn.Linear(20, 10), # 다섯 번째 계층: 입력 크기 20, 출력 크기 10 (예시)
    nn.Sigmoid()       # 여섯 번째 계층: Sigmoid 활성화 함수 (예시)
    nn.Linear(10, 1)   # 일곱 번째 계층: 입력 크기 10, 출력 크기 1 (예시)
)

# 이와 같이 nn.Sequential에 계속해서 계층을 추가해나갈 수 있습니다.
반응형

댓글