728x90
오늘은
- ADSP 공부
- Linear Regression 강의 + 실습 코드 작성
을 했다.
ADSP
ADSP는 Part 1 데이터의 이해 문제 틀린 부분 반복 숙달을 진행함.
해당 부분은 정리하기에는 너무 많아 책에 저장하기로~
빅데이터나 데이터에 관한 것들을 이론적으로 알아가는 시간이어서 좋았다.
네이버 부스트캠프의 인공지능 기초 다지기
에서 5. 딥러닝 핵심기초 Machine Learning & PyTorch Basic
부분 중, 5. Logistic Regression 부분까지 강의를 들었다.
이 강의에서 헷갈리는 부분이 많아 다 듣고 진행하기로 했던 실습코드 작성을 바로 진행함.
1. 선형 회귀 코드
# full training code
# 1차원 --> 1차원으로 아웃풋
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])
W = torch.zeros(1, requires_grad=True) # requires_grad: 학습할 것이라고 명시
b = torch.zeros(1, requires_grad=True)
optimizer = optim.SGD([W, b], lr=0.07)
nb_epochs = 1000
print("epoch : {:5d}, cost : {:10s}, weight : {:10f}, bias : {:10f}".format(0, '', W[0], b[0]))
for epoch in range(1, nb_epochs + 1):
# 가설 설정. hypothesis
hypothesis = x_train * W + b
# compute loss
cost = torch.mean((hypothesis - y_train) ** 2)
# gradient descent
optimizer.zero_grad() # 이전의 옵티마이저의 영향을 받지 않기 위해 gradient를 초기화시킨다.
cost.backward() # backward()로 gradient 계산
optimizer.step() # step으로 개선
if epoch == 1 or epoch % 100 == 0:
print("epoch : {:5d}, cost : {:10f}, weight : {:10f}, bias : {:10f}".format(epoch, cost, W[0], b[0]))
차근차근 작성하면서 이 메소드, 함수가 어떤 의미인지 차근차근 알아가는 시간이었다.
- train시, weight를 선언할 때, trquires_grad가 필요하다는 것.
- optimizer를 선언하는 법
- hypothesis
- loss를 계산하는 것
- torch를 활용해 gradient descent 과정을 진행하는 것
등 모르는 지식 + 알고 있는 지식이어도 다시 한 번 곱씹어 보는 좋은 시간이었다.
2. torch.optim을 사용하지 않는 코드
optim을 사용하지 않는 코드를 다시 작성하면서 학습을 수식적으로 진행해보았다.
# gradient Descent
x_train = torch.FloatTensor([[1],[2],[3]])
y_train = torch.FloatTensor([[1],[2],[3]])
W = torch.zeros(1) # 랜덤 값으로 넣기
lr = 0.1 # learning rate
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 = 2 * torch.mean((W * x_train - y_train) * x_train) # TODO. mean이 맞음
print('Epoch {:4d}/{} W: {:.3f}, Cost: {:.6f}'.format(epoch, nb_epochs, W.item(), cost.item()))
# cost gradient로 H(x) 개선
W -= lr * gradient
gradient를 계산하는 과정에서 기존 수식과 다른 부분을 고쳐서 진행했더니, optim을 사용했을 때의 변화와 똑같이 나타났다.
3. optim을 사용한 코드
다시 optim을 사용한 코드로 2.번을 채워 넣으면서 optim이 gradient descent에서 어떻게 작용하는지 확인해보고 주석으로 복습을 진행함.
# gradient Descent
x_train = torch.FloatTensor([[1],[2],[3]])
y_train = torch.FloatTensor([[1],[2],[3]])
# W = torch.zeros(1) # 랜덤 값으로 넣기
W = torch.zeros(1, requires_grad=True)
lr = 0.1 # learning rate
optimizer = optim.SGD([W], lr=lr)
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 = 2 * torch.mean((W * x_train - y_train) * x_train)
optimizer.zero_grad() # gradient 초기화
cost.backward() # 역전파, gradient update
optimizer.step() # weight update
print('Epoch {:4d}/{} W: {:.3f}, Cost: {:.6f}'.format(epoch, nb_epochs, W.item(), cost.item()))
# cost gradient로 H(x) 개선
# W -= lr * gradient
728x90
'진행중' 카테고리의 다른 글
[TIL] 2023-02-27 (0) | 2023.02.27 |
---|---|
[TIL]2023-02-21 (0) | 2023.02.21 |
[TIL] 2023-02-20 (0) | 2023.02.20 |
[TIL] 2023-02-16 (0) | 2023.02.16 |
[취업하자] 산업분석 따라하기 - 취린이 튜토리얼 (0) | 2021.08.29 |