본문 바로가기
Theory/Pytorch

[파이토치 트랜스포머 #3] 3장 파이토치 기초 - 2) 가설, 손실함수, 최적화

by 남디윤 2024. 3. 4.

 

 

 

 

가설

  • 가설: 어떤 사실을 설명하거나 증명하기 위한 가정, 두 개 이상의 변수의 관계를 검증 가능한 형태로 기술하여 변수 간의 관계를 예측하는 것을 의미
  • 연구가설, 귀무가설, 대립가설
    • 연구가설: 연구자가 검증하려는 가설. 귀무가설을 부정하는 것으로 설명한 가설을 증명하려는 가설
    • 귀무가설: 통계학에서 처음부터 버릴 것을 예상하는 가설. 변수 간 차이나 관계가 없음을 통계학적 증거를 통해 증명하려는 가설
    • 대립가설: 귀무가설과 반대. 귀무가설이 거짓이라면 대안으로 참이 되는 가설. 통계적 가설 검정 진행

 

머신러닝에서의 가설

  • 머신러닝에서의 가설
    • 통계적 가설 검정. 데이터와 변수 간의 관계가 있는지 확률론적으로 설명
    • 독립 변수와 종속 변수 간의 관계를 가장 잘 근사시키기 위해 사용
  • 단일 가설 Single Hypothesis
    • 입력을 출력에 매핑하고 평가하고 예측하는 데 사용할 수 있는 단일 시스템을 의미
  • 가설 집합 Hypothesis Set
    • 출력에 입력을 매핑하기 위한 가설 공간, 모든 가설을 의미
  • 머신러닝에서 선형 회귀 수식
    • 기존 수식: y=ax+b
    • 머신러닝: H(x)=Wx+b
      • H(x): 가설
      • W: 가중치
      • b: 편향
    • 최적의 가중치와 편향을 찾는 과정
    • 학습이 진행될 때마다 기울기와 편향이 계속 지속적으로 바뀌게 됨
  • 모델: 마지막으로 학습된 결과
  • 예측: 모델을 통해 새로운 입력에 대한 결괏값

 

통계적 가설 검정 사례

  • t-검정 (t-test)
    • 쌍체 t-검정 (paired t-test)
      • 동일한 항목 또는 그룹을 두 번 테스트할 때 사용
    • 비쌍체 t-검정 (unpaired t-test)
      • 등분산성을 만족하는 두 개의 독립적인 그룹 간의 평균을 비교하는 데 사용됨
    • 가설
      • 귀무가설 H0: 두 모집단의 평균 사이에 유의한 차이가 없다.
      • 대립가설 H1: 두 모집단의 평균 사이에 유의한 차이가 있다.
  • 머신러닝의 통계적 가설을 적용한다면 비쌍체 t-검정을 사용해야 함
    • 변수들의 샘플 데이터는 독립항등분포를 따름
    • 머신러닝의 통계적 가설은 독립적인 그룹 간의 평균을 비교하는 비쌍체 t-검정에 적합하다는 것을 알 수 있음
  • 예제: 성별에 따른 키 검정
    • 가설
      • 귀무가설: 남녀 키의 평균이 서로 같다
      • 대립가설: 남녀 키의 평균이 서로 다르다
    • 성별 차이에 대한 유의미성 판단 → 통계량 statistic, 유의 확률 pvalue
      • 통계량이 크고 유의 확률이 작다면, 귀무가설이 참일 확률이 낮음
      • 일반적으로 유의 확률이 0.05보다 작으면 유의하닥 ㅗ간주
      • 유의확률이 0.001보다 작으면 표기로 더 많이 유의하다고 판단

 

손실 함수

  • 손실 함수 Loss Function: 단일 샘플의 실젯값과 예측값의 차이가 발생했을 때, 오차가 얼마인지 계산하는 함수
    • 인공 신경망은 실젯값과 예측값을 통해 계산된 오찻값을 최소화해 정확도를 높이는 방법으로 학습 진행
  • 목적 함수 Objective Function, 비용 함수 Cost Function 으로도 불림
    • 목적 함수: 함수의 결과를 최댓값 또는 최솟값으로 최적화하는 함수
    • 비용 함수: 전체 데이터에 대한 오차를 계산하는 함수
    • 손실 함수 ⊂ 비용 함수 ⊂ 목적 함수
  • 가설이 얼마나 실젯값을 정확하게 표현하는지를 알기 위해서는 계산 방법이 필요함
    • ex. 평균 제곱 오차

 

제곱 오차

  • 제곱 오차 Squared Error, SE
    • 실젯값에서 예측값을 뺀 값의 제곱을 의미
    • 제곱 취하는 이유: 오차의 방향보다는 오차의 크기가 더 중요
    • 절대값을 취하지 않는 이유: 제곱을 적용하면 오차가 작은 값보다 오차가 큰 값을 더 확대시키기 때문에, 오차의 간극을 빠르게 확인 가능

 

오차 제곱합

  • 오차 제곱합 Sum of Squared for Error, SSE
    • 제곱 오차를 모두 더한 값을 의미
    • 제곱 오차는 각 데이터의 오차를 의미 = 가설 또는 모델 자체가 얼마나 정확하게 예측하는지 알 수 없음

 

평균 제곱 오차

  • 평균 제곱 오차 Mean Squared Error, MSE
    • 오차 제곱합에서 평균을 취하는 방법
    • 오차 제곱합의 경우, 데이터가 많아질수록 커지기 때문에, 데이터의 개수만큼 나누어 평균 계산 필요
  • 평균 제곱 오차는 가설의 품질을 측정 가능
  • 오차가 0에 가까울수록 높은 품질
  • 주로 회귀 분석에서 가장 많이 사용되는 손실 함수
  • 평균 제곱근 오차(Root Mean Squared Error, RMSE): 평균 제곱 오차에 루트를 씌워서 사용
    • 루트를 통해 평균 제곱 오차에서 발생한 왜곡을 감소시키면 정밀도 Precision를 표현하기에 적합한 형태

 

교차 엔트로피

  • 교차 엔트로피 Cross-Entropy
    • 이산형 변수의 손실 함수
    • 연속형 변수의 손실 함수: 제곱 오차, 오차 제곱합, 평균 제곱 오차
    • 실젯값의 확률 분포와 예측값의 확률 분포 차이를 계산

 

최적화

  • 최적화 Optimization: 목적 함수의 결괏값을 최적화하는 변수를 찾는 알고리즘을 의미함
    • 머신러닝은 손실 함수를 활용해 최적의 해법이나 변수를 찾는 것이 목표
    • = 손실 함수의 값이 최소가 되는 변수를 찾는다면 새로운 데이터에 대해 더 정교한 예측 가능
    • 수학적) 가중치와 오차의 그래프에서 기울기 Gradient가 0에 가까워질 때 최적의 가중치를 갖음
    • 탐색 지점을 어느 방향으로, 얼마나 이동해야 하는지 알 수 없음 → 최적화 방법 사용

 

경사 하강법

  • 경사 하강법 Gradient Descent: 함수의 기울기가 낮은 곳으로 계속 이동시켜 극값에 도달할 때까지 반복하는 알고리즘
    $$W_0= Initial Value \\
    W_i+1 = W_i-\alpha∇f(W_i)$$

    • 초기값을 설정하고 다음 가중치를 찾음
    • 델타 f(Wi)는 기울기를 의미하는데, 새로운 가중치는 기울기의 부호(양수, 음수)와 관계없이 기울기가 0인 방향으로 학습이 진행됨
    • 알파a를 곱해 가중치 결과를 조정하는데, 이 값은 기울기가 한 번에 이동하는 간격 Step Size를 조정함
  • 가중치 갱신 시, 알파a를 곱해 가중치 결과를 조정

 

학습률

  • 머신러닝에서 알파a 값을 학습률 Learning Rate라고 함
    • 초깃값 W0처럼 알파a값도 임의의 값으로 설정해줌
    • 학습률에 따라 다음 가중치의 변화량이 결정됨 → 최적의 해를 찾기 위한 반복 횟수가 결정됨

 

최적화 문제

  • 초깃값 또는 학습률을 너무 낮거나 높게 잡으면 최적의 가중치를 찾는 데 오랜 시간이 걸리거나, 그래프가 발산하여 아예 값을 찾지 못할 수 있음
  • 기울기가 0이 되는 지점인 극값은
    • 최댓값 Global Maximum, 최솟값 Global Minimum, 극댓값 Local Maximum, 극솟값 Local Minimum으로 구분 가능함
  • 초깃값 또는 학습률을 잘못 설정하면, 최솟값이 아닌, 극솟값에서 가중치가 결정 될 수 있음
    • = 학습률을 너무 낮게 잡으면 극소 지점을 넘지 못해 지역적 최솟값으로 가중치가 결정됨
    • 안장점 Saddle Point이 존재하는 함수에서도 적절한 가중치 찾기 불가능
      • 말의 안장처럼 생긴 그래프를 의미
      • 특정 방향 (아래에서 위로, 위에서 아래로) 에서 바라볼 경우 최댓값(또는 극댓값)이 되지만, 다른 방향에서 보면 최솟값(또는 극솟값)이 되는 지점 
      •   
        위키피디아
  • 학습에 사용하는 데이터의 형태나 가설, 손실 함수에 따라 적합한 최적화 알고리즘 사용
    • ex. 극소 문제와 안장점 문제 등에 강건한 기법 등
  • 최적화 알고리즘은 경사하강법 이외에도 모멘텀 Momentum, Adagrad, Adam 등이 있음

 

 

단순 선형 회귀: 넘파이

  • 데이터셋 생성
import numpy as np

x = np.array(
    [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10],
    [11], [12], [13], [14], [15], [16], [17], [18], [19], [20],
    [21], [22], [23], [24], [25], [26], [27], [28], [29], [30]]
)
y = np.array(
    [[0.94], [1.98], [2.88], [3.92], [3.96], [4.55], [5.64], [6.3], [7.44], [9.1],
    [8.46], [9.5], [10.67], [11.16], [14], [11.83], [14.4], [14.25], [16.2], [16.32],
    [17.46], [19.8], [18], [21.34], [22], [22.5], [24.57], [26.04], [21.6], [28.8]]
)

 

  • 하이퍼 파라미터 초깃값 선언
    • weight : 가중치
    • bias: 편향
    • learning_rate: 학습률
weight = 0.0
bias = 0.0
learning_rate = 0.005

 

 

  • 에폭 설정
for epoch in range(10000):
...
  • 에폭 epoch:
    • 모델 연산을 전체 데이터 세트가 1회 통과하는 것을 의미 (인공 신경망에서 순전파 Forward Propagation와 역전파 Back Propagation 과정)
    • 각 에폭은 모델이 데이터를 학습하고 가중치를 갱신하는 단계를 나타내며, 여러 에폭을 반복해 모델을 학습
    • 순전파: 입력 데이터를 기반으로 신경망을 따라 입력층부터 출력층까지 차례대로 변수를 계산하고 추론한 결과를 의미
    • 역전파: 예측값과 실젯값의 오차가 최소화되도록 모델 가중치를 수정하는 것을 의미
    • 에폭이 너무 적을 경우, 학습이 제대로 되지 않는 과소적합 Underfitting이 발생, 에폭이 너무 많을 경우 과대적합 Overfitting이 발생

 

  • 배치 Batch
    • 예제에서는 x와 y 변수 쌍으로 이루어진 행 데이터를 나눠서 계산하지 않고 전체 데이터를 한 번에 연산 = 배치
    • 배치란, 가설이나 모델의 가중치를 갱신할 때 사용하는 데이터의 크기를 의미
  • 초깃값에 따른 학습 결과
    • 초깃값의 설정은 학습에 큰 영향

 

단순 선형 회귀: 파이토치

  • 넘파이가 아닌파이토치 기능으로 단순 선형 회귀 구현
  • 프레임워크 및 데이터 생성
import torch
from torch import optim

x=torch.FloatTensor(
    [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10],
    [11], [12], [13], [14], [15], [16], [17], [18], [19], [20],
    [21], [22], [23], [24], [25], [26], [27], [28], [29], [30]]
)

y = torch.FloatTensor(
    [[0.94], [1.98], [2.88], [3.92], [3.96], [4.55], [5.64], [6.3], [7.44], [9.1],
    [8.46], [9.5], [10.67], [11.16], [14], [11.83], [14.4], [14.25], [16.2], [16.32],
    [17.46], [19.8], [18], [21.34], [22], [22.5], [24.57], [26.04], [21.6], [28.8]]
)
  • torch.optim: 최적화 함수가 포함된 모듈

 

  • 하이퍼파라미터 초기화
weight=torch.zeros(1, requires_grad=True)
bias=torch.zeros(1, requires_grad=True)
learning_rate=0.001
  • torch.zeros:
    • 0의 값을 갖는 텐서 생성, 텐서의 크기는 1로 설정
    • requires_grad: 모든 텐서에 대한 연산을 추적, 역전파 메서드를 호출해 기울기를 계산하고 저장
    • 파이토치에서 지원하는 자동 미분 Autograd 기능의 일부

 

  • 최적화 선언
optimizer=optim.SGD([weight, bias], lr=learning_rate)

 

  • 파이토치는 학습 반복 구문 밖에서 최적화 방식 설정
  • 확률적 경사 하강법 Stochastic Gradient Descent SGD
    • 모든 데이터에 대해 연산을 진행하지 않고, 일부 데이터만 계산하여 빠르게 최적화된 값을 찾는 방식
    • 미니 배치의 형태로 전체 데이터를 N등분하여 학습을 진행
  • 기본 클래스
    • 최적화하려는 변수 (params) 와 학습률(lr)
    • 변수: 역전파 과정을 통해 기울기(변화도)를 갱신하려는 텐서 변수를 입력
    • 학습률: 0보다 큰 값을 할당

 

  • 가중치와 편향 갱신
optimizer.zero_grad()
cost.backward()
optimizer.step()

# 보통 이 순서로 값을 할당함
  • optimizer.zero_grad() 메서드
    • optimizer 변수에 포함시킨 매개변수들의 기울기를 0으로 초기화
    • 텐서의 기울기는 grad 속성에 누적해서 더해지기 때문에 0으로 초기화 필요
    • 기울기가 weight=x 형태가 아닌 weight+=x의 구조로 저장되기 때문에 기울기를 0으로 초기화해 중복 연산 방지
  • cost.backward() 메서드
    • 역전파 수행
    • optimizer 변수에 포함시킨 매개변수들의 기울기가 새로 계산됨
    • 가중치와 편향에 대한 기울기가 계산됨
  • optimizer.step() 메서드
    • 결과를 최적화 함수에 반영
    • 학습률의 값을 반영한 확률적 경사 하강법 연산이 적용됨

 

  • 신경망 패키지
    • torch.nn에 포함됨
    • 네트워크(Net)를 정의하거나 자동 미분, 계층 등을 정의할 수 있는 모듈 포함
    • 신경망을 생성하고 학습시키는 과정을 빠르고 간편하게 구현할 수 있는 기능 제공
    • 선형 변환 클래스
      • y=Wx+b 형태의 선형 변환을 입력 데이터에 적용
      • 입력 데이터 차원 크기 in_features
      • 출력 데이터 차원 크기 out_features
      • 편향 설정 bias: 계층에 편향 값 포함 여부 설정 (거짓 값 할당 시, 해당 인스턴스에는 편향 포함x)
      • 자료형 dtype, 장치 device: 텐서 매개변수와 동일 의미

 

  • 모델 선언
model = nn.Linear(1, 1)
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.001)

 

 

  • 순방향 연산
for epoch in range(10000):
    output = model(x)
    cost = criterion(output, y)
  • 입력은 output 변수에 할당
  • 목표에는 y 변수를 할당

 

  • 학습 결과 출력: 모델 매개변수 (model.parameters())를 출력. model 변수에서 계산 중인 가중치와 편향 확인 가능