가설
- 가설: 어떤 사실을 설명하거나 증명하기 위한 가정, 두 개 이상의 변수의 관계를 검증 가능한 형태로 기술하여 변수 간의 관계를 예측하는 것을 의미
- 연구가설, 귀무가설, 대립가설
- 연구가설: 연구자가 검증하려는 가설. 귀무가설을 부정하는 것으로 설명한 가설을 증명하려는 가설
- 귀무가설: 통계학에서 처음부터 버릴 것을 예상하는 가설. 변수 간 차이나 관계가 없음을 통계학적 증거를 통해 증명하려는 가설
- 대립가설: 귀무가설과 반대. 귀무가설이 거짓이라면 대안으로 참이 되는 가설. 통계적 가설 검정 진행
머신러닝에서의 가설
- 머신러닝에서의 가설
- 통계적 가설 검정. 데이터와 변수 간의 관계가 있는지 확률론적으로 설명
- 독립 변수와 종속 변수 간의 관계를 가장 잘 근사시키기 위해 사용
- 단일 가설 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-검정 (paired t-test)
- 머신러닝의 통계적 가설을 적용한다면 비쌍체 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 변수에서 계산 중인 가중치와 편향 확인 가능
'Theory > Pytorch' 카테고리의 다른 글
[파이토치 트랜스포머 #6] 3장 파이토치 기초 - 5) 활성화 함수 (1) | 2024.03.17 |
---|---|
[파이토치 트랜스포머 #5] 3장 파이토치 기초 - 4) 모델/데이터세트 분리, 모델 저장 및 불러오기 (0) | 2024.03.06 |
[파이토치 트랜스포머 #4] 3장 파이토치 기초 - 3) 데이터세트와 데이터로더 (0) | 2024.03.06 |
[파이토치 트랜스포머 #2] 3장 파이토치 기초 - 1) 텐서 (1) | 2024.02.24 |
[파이토치 트랜스포머 #1] 1장 인공지능과 방법론 (1) | 2024.02.24 |