선형회귀 : 두 변수의 사이의 관계를 선형 관계로 직선으로 모델링 하는 기법.
여러 데이터 set을 이용해서 y= Wx * b( W= weight, b=Bias의 꼴로 나타낼 수 있도록 데이터를 학습함. 이 함수를 Hypothesis Function을 의미하고, 인공 신경망을 의미함.
Data Set: Train 와 Test data set 두개로 나뉨
TrainData:torch.FloatTensor()
함수를 활용해서 , x,y 변수를 넣어줌
Cost Function: 이것을 나타내는 함수를 손실함수(Compute Loss)라고 부르며, Measn Squared Error( MSE ) 방식을 정의를 내림. 평균을 계산할 때,torch.mean()
이라는 함수를 통해서, 변수의 갯수와 덧셈 연산없이 값을 대입해 함수를 간단하게 만들 수 있음.
학습시: 학습시 torch.optim
이라는 라이브러리를 사용함.
zero_grad()
로 각 gradient를 초기화 해주고, back_ward
로 계산을 해줌. 마지막으로 step()
함수를 통해서 개선 시켜줌.
# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])
# 모델 초기화
W = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W, b], lr=0.01)
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
# H(x) 계산
hypothesis = x_train * W + b
# cost 계산
cost = torch.mean((hypothesis - y_train) ** 2)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
# 100번마다 로그 출력
if epoch % 100 == 0:
print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
epoch, nb_epochs, W.item(), b.item(), cost.item()
))
Gradient : 경사하강법이라고 불리며, 경사가 가장 가파른 곳을 찾아서 한걸음씩 내려가는 방법
보다 빨리 손실함수를 최소화 하는 방식으로 최적화 시킬 수 있음. 더 적은 Epoch수로 원하는 결과를 도출 해낼 수 있음.
# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])
# 모델 초기화
W = torch.zeros(1)
# learning rate 설정
lr = 0.1
nb_epochs = 10
for epoch in range(nb_epochs + 1):
# H(x) 계산
hypothesis = x_train * W
# cost gradient 계산
cost = torch.mean((hypothesis - y_train) ** 2)
gradient = torch.sum((W * x_train - y_train) * x_train)
print('Epoch {:4d}/{} W: {:.3f}, Cost: {:.6f}'.format(
epoch, nb_epochs, W.item(), cost.item()
))
# cost gradient로 H(x) 개선
W -= lr * gradient
다중 선형 회귀 : 여러 독립 변수와 하나의 종속 변수 사이에 선형관계를 모델링 하는 기법.
복순의 정보가 있을 때, 어떻게 하나의 추측값을 계산할 수 있을지에 대한 해결방안임.
y = w1 x1 + w2 x2 + w3* x3 +b (w1,w2,w3: Weight, b: bias)
w의 갯수는 3,4, ... n개 가 될 수 있으며, 이러한 식을 Hypthesis Function라 부르며, 이 문제를 학습시킬 인공신경망이기도 하다.
Matmul: 앞서 언급했던 것과 같이, 무수하게 변수가 많아 질 수 잇기에 행렬곱으로 문제를 해결할 수 있고, 이 전 강의에서 배운 matmul()
함수를 통해서 긴 hypothesis함수식을 줄여줄 수 있다.
nn.Module: torch.nn이라는 라이브러리에 존재하며, nn.module을 torch 라이브러리에서 불러와 클래스를 상속해서 모델을 생성, 입력된 파라미터를 통해서, 해당 차원만큼의 매트릭스를 만들어줌. 이 모듈을 이용하면, hypothesis식을 세울때 , gradient계산등을 코드상 간략하게 나타내 줄 수 있음.
F.mes_loss: torch.nn.functional에서 제공하는 cost를 계산해주는 함수며, 쉽게 다른 loss와 교체 가능함. 디버깅에 용이
# 데이터
x_train = torch.FloatTensor([[73, 80, 75],
[93, 88, 93],
[89, 91, 90],
[96, 98, 100],
[73, 66, 70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
# 모델 초기화
model = MultivariateLinearRegressionModel()
# optimizer 설정
#optimizer = optim.SGD(model.parameters(), lr=1e-5)
optimizer = optim.SGD([W, b], lr=1e-5)
nb_epochs = 20
for epoch in range(nb_epochs+1):
# H(x) 계산
prediction = model(x_train)
# cost 계산
cost = F.mse_loss(prediction, y_train)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
# 20번마다 로그 출력
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, cost.item()
))
len()
함수를 통해 데이터 셋의 총 데이터 수, getitem()
함수를 통해 그 인ㄴ덱스에 해당하는 데이터를 반환함.