2회차 문풀

2회차 .pdf

# Data definition

x_train = torch.FloatTensor([1], [2], [3]) # 임력 - 공부시간
y_train = torch.FloatTensor([2], [4], [6]) # 출력 - 점수

# hypothesis 정의하기
# Weight 와 bias 를 초기화 한다 - 어떤 예측을 받아도 0으로 예측
W = torchch.zeros(1, requires_grad = True)
b = torchch.zeros(1, requires_grad = True)

# requires_grad = 학습할것을 명시
hypothesis = x_train * W +b

# Compute loss
# 정답이 우리의 예측과 얼마나 가까운지
# 선형 회기의 경우 Mean Squred Error 통해 loss 측정

cost = torch.mean((hypothesis - y_train)**2)

# loss를 통해 모델을 개선
# torch.optim 라이브러리 사용 - SGD 기법
# W, b 학습 - lr - learning rate
optimizer = optim.SGD([W, b], lr=0.01)

optimizer.zero_grad() # gradient 초기화
cost.barward() # gradient 계산
optimizer.step() # gradient descent 시행

------
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])

W = torch.zeros(1, requires_grad = True)
b = torch.zeros(1, requires_grad = True)

optimizer = torch.optim.SGD([W, b], lr=0.01)

nb_epochs = 1000

for epoch in range (1, nb_epochs +1): # 학습반복 
    hypothesis = x_train * W +b
    cost = torch.mean((hypothesis - y_train)**2)
    
    optimizer.zero_grad() 
    cost.backward() 
    optimizer.step()

----

# Simpler Hypothesis Fuchtion
# H(x) = Wx
# no bias

x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])

# H(x) = x가 가장 정확한 모델
# W = 1 이 가장 좋은 숫자
# 학습의 목표는 W를 1로 수렴시키는 것
# W = 1 일때 cost = 0
# 1에서 멀어질수록 cost가 높아진다
# Cost function : MSE 

# cost function 최소화 
# cost - W 그래프의 접선 기울기 값이 음수 - W 크게 해야한다 양수면 작게
# 기울기가 가파를 수록 cost가 크니 w를 크게 바꿔줘야한다
# 접선 기울기 - gardient
# Gradient Descent 

W = torch.zeros(1) # 모델 초기화
lr = 0.1 # learning rate 설정
nb_epochs = 10

for epoch in range (1, nb_epochs +1): # 학습반복 
    hypothesis = x_train * W
    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 개선
    W -= lr * gradient  

# torch.optim 으로도 gradient descent 가능
	
___
# Simpler Hypothesis Fuchtion
# H(x) = Wx
# no bias

x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])

W = torch.zeros(1, requires_grad = True) # 모델 초기화
optimizer = torch.optim.SGD([W], lr=0.15)
nb_epochs = 10

for epoch in range (1, nb_epochs +1): # 학습반복 
    hypothesis = x_train * W
    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 개선
    optimizer.zero_grad() 
    cost.backward() 
    optimizer.step()

# 하나의 정보로부터 추측하는 모델

--
# Multivariate Linear Regression
# 복수의 정보가 존재할떄 하나의 추측 값을 계산
# Hypothesis Fuction - Matrix
# hypothesis = x_train.matmul(W) + b
# 여러개의 x 일떄 (x1, x2, x3)
# cost - 기존 simple 과 동일
# 학습 방식도 동일
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

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]])

# 모델 초기화
W = torch.zeros((3, 1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W, b], lr=1e-5)

nb_epochs = 20
for epoch in range(nb_epochs + 1):
    
    # H(x) 계산
    hypothesis = x_train.matmul(W) + b # or .mm or @

    # cost 계산
    cost = torch.mean((hypothesis - y_train) ** 2)

    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()

    # 100번마다 로그 출력
    print('Epoch {:4d}/{} hypothesis: {} Cost: {:.6f}'.format(
        epoch, nb_epochs, hypothesis.squeeze().detach(), cost.item()
    ))
    
    # cost 점점 작아짐

---
# nn.Module
# W와 b를 대신 해서 써줌
# F.mse_loss 
# 쉽게 다른 loss와 교체 가능
---
# Data in the Real World
# 복잡한 머신러닝 모델을 학습하려면 엄청남 양의 데이터 필요
# Problem - 엄창많은 양의 데이터는 학습을 못할 수도 물리적 한계
# 모든 데이터를 한번에 학습하는 것이 아니라 일부만 사용
# Minibatch Gradient Descent 
# 전체 데이터를 균일하게 나눠서 학습하자 / 토막내기
# 업데이트를 좀 더 빠르게 할 수 있다
# 잘못된 방향으로 학습 할 수 있다
# 거칠게 gradient가 줄어든다

# _len_() - 데이터 셋의 총 데이터 수
# _getitem_() idx 받았을때 상응하는 입출력 데이터 반환

# batch_size =2 각 minibatch 의 크기 주로 2의 제곱수
# shuffle = True # 학습된는 순서를 바꾼다
# enumerate(dataloader)

--

# Logistic Regression
# 문제 정의 : binary classification problem 
# x  = m개*d(차원) - m개의 0과 1로 이루어진 정답을 구할 수 있도록 - binary
# P(x=1) = 1-P(x=0)
# Weight - d*1
# Weight update via Gradinet Descent