
Likelihood: 우리말로 하면 가능도 또는 우도이며, 확률의 반대 개념
최대 가능도 추정(Maximum Likelihood Estimation, MLE):
각 관측값 X에 대한 총 가능도(=모든 가능도의 곱)가 최대가 되게 하는 확률분포(강의에서는 확률분포 함수의 parameter)를 찾는 것
이때, 임의의 확률분포를 가정해야 함
최대가 되는 Local Maximum을 찾기 위해선 Gradient ascent를 수행하고,
최소가 되는 Local Minimum을 찾기 위해선 Gradient descent를 수행함
그러나 MLE는 그 데이터를 가장 잘 설명하는 확률 분포 함수를 찾다 보니
Overfitting이 숙명적으로 따르게 됨
분포가 비슷하도록 훈련 set과 테스트 set을 나눠서
실제 훈련 후, 해당 훈련이 얼마나 잘 학습되었는지 검증함.


이외에도 Overfitting을 방지하는 방법
Regularization의 방법
데이터 전처리를 통해 데이터를 미리 학습하기 쉽도록 바꿔 줌
여기에서는 Standardization(정규분포화)를 사용함

mu = x_train.mean(dim=0) # 평균
sigma = x_train.std(dim=0) # 표준편차
norm_x_train = (x_train - mu) / sigma
class MultivariateLinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(3, 1)
def forward(self, x):
return self.linear(x)
def train_with_regularization(model, optimizer, x_train, y_train):
nb_epochs = 20
for epoch in range(nb_epochs):
# H(x) 계산
prediction = model(x_train)
# cost 계산
cost = F.mse_loss(prediction, y_train)
# l2 norm 계산
l2_reg = 0
for param in model.parameters():
l2_reg += torch.norm(param)
cost += l2_reg
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch + 1, nb_epochs, cost.item()
))
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]])
mu = x_train.mean(dim=0) # 평균
sigma = x_train.std(dim=0) # 표준편차
norm_x_train = (x_train - mu) / sigma
model = MultivariateLinearRegressionModel()
optimizer = optim.SGD(model.parameters(), lr=0.1)
train_with_regularization(model, optimizer, norm_x_train, y_train)
근데 아직 L2 norm에 대해서 잘 모르기도 하고... test 함수가 제대로 작동하지 않는다... ㅎㅎ
일단 test 관련해서도 코드를 아래에 적음
x_test = torch.FloatTensor([[75, 82, 59], [100, 88, 97], [79, 65, 80]])
y_test = torch.LongTensor([[144], [186], [160]]) # 임의로 한번 넣어 봄
def test(model, optimizer, x_test, y_test):
prediction = model(x_test)
predicted_classes = prediction.max(1)[1]
correct_count = (predicted_classes == y_test).sum().item()
cost = F.cross_entropy(prediction, torch.FloatTensor(y_test))
print('Accuracy: {}% Cost: {:.6f}'.format(
correct_count / len(y_test) * 100, cost.item()
))