파이토치 딥러닝 마스터_6장

코넬·2023년 4월 5일
0

ComputerVision_Pytorch

목록 보기
6/10
post-thumbnail

신경망을 활용한 데이터 적합

6장에서는...

  • 선형 모델과 비교하여 비선형 활성 함수의 차이점을 알아보고,
  • 파이토치의 nn 모듈을 다루는 방법과
  • 신경망을 활용한 선형 적합 문제 풀이 방법을 제시한다.

🫀 인공 신경망 & 뉴런

인공 신경망은 복잡한 함수에 근사하기 위한 수학적 접근 - 여기서 더 깊은 단계가 뉴런(neuron) 인데, 뉴런은 단순히 입력에 대한 선형 변환과 활성 함수라 부르는 고정된 비선형 함수를 적용하는 역할을 한다.

 o=f(wx+b)\displaystyle\ o \displaystyle \displaystyle= f(w*x +b)

수학적 기본식으로는 다음과 같다.

f는 활성화 함수, x 는 입력, w 는 가중치 혹은 비율 인자, b는 편향값 혹은 오프셋이라고 부른다.

일반적으로 x나 o는 단순 스칼라값 혹은 벡터이며, 비슷하게 w는 단일 스칼라 혹은 행렬, b 는 스칼라나 벡터이다. 여.기.서 ! 벡터인 경우에는 입력 및 가중치와 차원이 일치해야한다. 벡터의 경우, 여러 차원으로 가중치와 편향값을 가진 여러개의 뉴런을 나타내므로, 이런 표현식을 뉴련 계층(layer) 이라고 한다.

오차 함수

전까지 살펴봤던 선형 모델과의 다른 차이점 중 하나는, 오차 함수의 모양인데, 선형 모델과 오차를 제곱한 손실 함수는 볼록 함수 형태의 오차 곡선을 가지고 있기 때문에, 최솟값이 분명하게 하나로 정의되는 특징을 가지고 있다. 다른 메소드를 사용한다고 하더라도 오차 함수를 최소화시키는 파라미터를 자동으로 확실히 찾을 수 있다. (추정)

하지만, 신경망은 동일한 오차 제곱 손실 함수를 사용한다 하더라도 볼록 함수의 오차 곡선의 모양이 이와는 다르다. 즉,

우리가 근사 하려는 각 파라미터는 정해진 답이 없다.
대신 모든 뉴런이 협력하여 유용한 출력을 만들기 위한 파라미터 획득을 목표로 한다.
신경망의 오차 함수가 볼록 형태가 아닌 이유는 위의 식에서 봤듯 활성화 함수 때문이다. 매우 다양한 함수에 근사할 수 있는 뉴런의 앙상블 능력은 각 뉴런이 내포하는 선형 그리고 비선형적 조합 때문이다.

활성 함수의 역할

  • 모델 내부에서 출력 함수가 값마다 다른 기울기를 가지도록 만들어주는데, 선형 함수로만은 불가능하기 때문에 신경망은 여러 출력에 대해 각 다른 기울기의 특성을 합성하여 다른 임의의 함수들에 대해 근사할 수 있다.
  • 신경망의 마지막 계층은 이전의 선형 연산 출력을 주어진 범위로 모으는 역할을 한다.

활성 함수에서 진행해야하는 과정 중 하나는, 출력 범위 제한 이다. 이는 출력값을 제한하면 되는데, 0이하는 무조건 0으로 하고 10 이상은 무조건 10으로 두면 된다.

사용하는 모듈 : torch.nn.Hardtanh & torch.nn.Sigmoid

이 밖에 다양한 비선형 활성화 함수는 이 문서 내용을 확인하면 좋겠다 !

최적의 활성화 함수 고르기

활성화 함수를 알맞게 고르려면 활성화 함수의 특징에 대해 알고있어야한다.

  • 비선형이다. 활성 함수 없이 (w * x + b)를 반복하여 적용하면 동일한 형태의 함수가 된다. 활성 함수의 비선형성이 전체 신경망이 더 복잡한 함수로 근사하도록 해주는 역할을 한다.
  • 미분 가능하다. 기울기 계산이 가능하여 업데이트가 가능하다.
  • 최소한 하나의 민감한 구간을 가지며, 입력에서 중요 범위가 변경되면 일치하는 출력 영역에서도 중요한 변화가 발생한다.
  • 대부분 둔감 & 포화된 구간을 가지며, 이 구간에서는 입력의 변화가 출력에 거의 영향을 주지 않는다.
  • (둘중 하나 가짐) 입력이 음의 무한대로 갈 때 만나거나 가까워지는 지점이 존재
  • 비슷하게 양의 무한대로 갈 때에도 고점이 존재한다.

🌰 파이토치 nn 모듈

파이토치에는 torch.nn 이라는 신경망 전용 서브모듈이 존재한다. 이 모듈 안에는, 모든 신경망 아키텍처를 만들 수 있는 빌딩 블럭이 존재한다.

선형 모듈

forward 대신 __call__ 메소드를 사용하여 nn.선형함수들을 변수화하여 사용할 수 있다. 여기서 인자를 가지고 nn.Module 인스턴스를 호출하면 동일한 인자로 forward를 호출한다. forward 메소드는 순방향 연산을 수행하는 반면, __call__ 은 forward 를 호출하기 전후에 몇가지 중요한 작업을 수행한다. 그래서 forward 를 직접 호출 한다.

linear_model = nn.Linear(1, 1)
optimizer = optim.SGD(line

nn.Linear 생성자는 세 개의 인자를 받는다. 입력 피처의 수와 출력 피처의 수, 선형 모델이 편향값을 포함하는지 여부이다.

배치 입력

B가 배치의 크기이고 Nin 이 입력 피처의 크기라면 크기가 B Nin 인 입력 텐서를 만들고, 모델로 실행한다. B C H W 텐서로 최종적으로 표기할 수 있겠다.

배치를 최적화하는 이유는 무엇일까?
배치를 수행하는 이유가 연산량을 충분히 크게 만들어 준비한 자원을 최대한 활용하기 위함이다. 여러 입력을 묶어 하나를 배치로 한번 실행하게되면, 다른 유닛도 계산에 사용되고 여러개의 입력을 처리하는데 걸리는 시간이 하나의 입력을 처리하는데 걸리는 시간과 동일하게된다.

모델을 직접 파이토치 클래스 로 구현해보자 !

model = nn.Sequential(
   nn.Linear(2, 1), # input_dim = 2, output_dim = 1
   nn.Sigmoid() # 출력은 시그모이드 함수를 거친다
)
class BinaryClassifier(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(2, 1)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        return self.sigmoid(self.linear(x))

클래스(class) 형태의 모델은 nn.Module 을 상속받으며, init()에서 모델의 구조와 동적을 정의하는 생성자를 정의한다.

이는 파이썬에서 객체가 갖는 속성값을 초기화하는 역할로, 객체가 생성될 때 자동으호 호출된다. super() 함수 를 부르면 여기서 만든 클래스는 nn.Module 클래스의 속성 들을 가지고 초기화 된다. foward() 함수는 모델이 학습데이터를 입력받아서 forward 연산을 진행시키는 함수이다. 이 forward() 함수 는 model 객체를 데이터와 함께 호출하면 자동으로 실행된다.

예를 들어 model이란 이름의 객체를 생성 후, model(입력 데이터)와 같은 형식으로 객체를 호출하면 자동으로 forward 연산이 수행된다.

출처 : 파이토치 딥러닝 마스터

profile
어서오세요.

0개의 댓글