본문 바로가기

코딩/Deep Learning

[파이썬/Pytorch] 딥러닝 - Logistic Regression 이해를 위한 정리

반응형

 

  최근 위키독스의 'PyTorch로 시작하는 딥 러닝 입문'이라는 책을 통해 딥러닝 공부를 하고 있다. 블로그 포스팅을 하는 이유는 딥러닝 내용을 전체적으로 정리하기 보단 책에서 설명이 부족하거나 이해가 잘 안되는 부분을 내 나름대로 다시 정리해보는 것이다. 앞으로 딥러닝을 공부면서 내가 실험을 한 내용이나, 정리한 메모를 업로드 할 예정이다.

 

 

1. Logistic Regression(로지스틱 회귀)

 

 

  로지스틱 회귀는 어떤 데이터 x에 대해 이진분류(True or False)하는 딥러닝 모델이다. 선형회귀에서는 입력과 결과에 대한 예측 모델을 1차 방정식으로 모델링하지만, 로지스틱 회귀의 경우 Sigmoid 함수를 통해 모델링 한다. 시그모이드 함수는 아래 이미지와 같은 형태를 가지고 있는데 실제 딥러닝으로 값을 예측할 땐 y가 특정 값 이상일 때 True, 아니면 False와 같은 형태로 반환한다.

 

  결국, 로지스틱 회귀는 시그모이드 함수를 통해 모델링하고 선형 회귀와 동일하게 시그모이드 함수 수식의 가중치 w와 편향 b를 찾는 것이다. 시그모이드 함수는 가중치 w가 +일수록 경사도가 커지며, 편향 b가 +일수록 왼쪽으로 이동한다. 자세한 내용은 구글링을 하거나 아래 하단의 참고링크를 참고해보면 좋을 것 같다. 

 

  지금까지의 내용을 정리해보면 아래와 같다.

 

 

Logistics Regression 설명1 -  도식화

 

Logistics Regression 설명2 - 가중치 w,b 찾기

 

 

 

2. Logistics Regression(로지스틱 회귀)에서 가중치 w와 b 찾기

 

 

  선형 회귀에서는 실제값과 일차방정식(예측값)에 대한 오차를 MSE(평균 제곱 함수)를 통해 Cost Function을 정의한다. 선형 회귀의 Cost Function은 이차 함수이기 때문에 접선의 기울기 = 0인 지점을 찾으면 쉽게 손실 비용이 최소가 되는 w와 b를 구할 수 있었다. 하지만, 로지스틱 회귀에서는 선형 회귀와 같은 방법을 사용할 수 없다. 왜냐하면, 아래의 이미지를 참고해보자.

 

 

시그모이드 함수를 Cost Function화 했을 때

 

  시그모이드 함수를 선형회귀와 같은 방법으로 Cost Function 그래프를 그려보면 위와 같이 접선의 기울기가 0인 지점이 많아진다. 경사하강법 알고리즘 상에서는 어떤 부분이 cost가 최소가 되는 부분인지 알 수가 없다. cost가 높은 지점을 cost가 최소가 되는 부분이라고 인식할 수 있는 것이다. 따라서, 로지스틱 회귀에서는 cost function을 로그 함수로 모델링하여 사용한다.

 

 

로지스틱 회귀의 Cost Function(손실 함수)에 대한 모델링

 

 

  수식에 대한 설명은 자세하게 하진 않겠지만 아래 경우를 생각해서 로그 함수로 모델링한 것으로 이해하면 된다. 

 

실제값 예측값 Cost 설명 로그함수
0 0 0 cost 최소 -log(1-H(x))
0 1 1 cost 최대
1 0 1 cost 최대 -log H(x)
1 1 0 cost 최소

 

반응형

 

3. 파이썬 코드 테스트

 

 

  해당 코드는 위키독스-'PyTorch로 시작하는 딥 러닝 입문'에 나오는 자료를 바탕으로 작성한 것임을 밝혀둔다. 전체 파이썬 코드는 위키독스 책자에 있으므로 훈련 data를 어떻게 설정했고 어떤 결과가 나왔는지 일부 결과에 대한 부분만 기록한다.

 

 

1) 훈련 data(x,y) 설정

 

 

  책자와 다르게 입력차원이 1차원(, 출력차원이 1차원인 부분에 대해서 테스트해보고자 했다. 입력값인 x_data에서 중간 3,4를 비워두고 실제 알고리즘을 실행했을 때 어떤 결과가 나오는지 확인해보고자 했다.

 

<코드>

x_data = [[1], [2], [5], [7], [8], [9]]
y_data = [[0], [0], [1], [1], [1], [1]]
x_train = torch.FloatTensor(x_data)
y_train = torch.FloatTensor(y_data)

print(x_train.shape)
print(y_train.shape)

 

<결과>

torch.Size([6, 1])
torch.Size([6, 1])

 

 

2) nn 모듈로 시그모이드 모델 설정

 

 

<코드>

model = nn.Sequential(
   nn.Linear(1, 1), # 입력차원 = 1, 출력차원 = 1
   nn.Sigmoid() # 출력은 시그모이드 함수를 거친다
)

print("학습 전 가중치 w :", list(model.parameters())[0])
print("학습 전 가중치 b :", list(model.parameters())[1])
# optimizer 설정(경사하강법 설정, 학습률은 = 1)
optimizer = optim.SGD(model.parameters(), lr=1)

 

<결과>

학습 전 가중치 w : Parameter containing:
tensor([[0.5153]], requires_grad=True)
학습 전 가중치 b : Parameter containing:
tensor([-0.4414], requires_grad=True)

 

 학습전 가중치w와 b는 아직 딥 러닝 학습 전의 data이다.

 

 

 

3) epoch 설정 

 

  실제 프로그램을 실행해보니 입력 데이터가 단순해서 그런지 학습이 10번도 안되었는데, 정확도가 100% 수준의 결과가 나왔다. 따라서, epoch는 100회로 설정했다

 

 

<코드>

nb_epochs = 100

 

 

4) 학습과정 및 학습 된 모델에 test data 입력해보기

 

 

<결과>

Epoch    0/100 Cost: 0.325700 Accuracy 66.67%
Epoch   10/100 Cost: 0.193809 Accuracy 100.00%
Epoch   20/100 Cost: 0.137442 Accuracy 100.00%
Epoch   30/100 Cost: 0.106644 Accuracy 100.00%
Epoch   40/100 Cost: 0.087379 Accuracy 100.00%
Epoch   50/100 Cost: 0.074188 Accuracy 100.00%
Epoch   60/100 Cost: 0.064575 Accuracy 100.00%
Epoch   70/100 Cost: 0.057243 Accuracy 100.00%
Epoch   80/100 Cost: 0.051459 Accuracy 100.00%
Epoch   90/100 Cost: 0.046772 Accuracy 100.00%
Epoch  100/100 Cost: 0.042893 Accuracy 100.00%

학습 후 가중치 w : Parameter containing:
tensor([[1.5061]], requires_grad=True)
학습 후 가중치 b : Parameter containing:
tensor([-4.8282], requires_grad=True)

 

 

  학습과정 결과에서 보면 알겠지만 epoch가 10이상부터 정확도 100%이상의 결과가 나오는 것을 확인할 수 있었다. 위 100회 학습 후, 가중치 w와 b는 각각 1.5061, -4.8282이다. 

 

  학습 된 모델에 아래와 같이 임의의 데이터 4개를 넣어서 결과를 출력해보았다.

 

 

<코드>

test_x = torch.FloatTensor([[2],[3],[5],[10]]) #임의의 1차원 입력 data 4개
predic_y = model(test_x) #학습된 모델에 테스트데이터 넣어보기
print(predic_y) #결과 출력
result = predic_y >= torch.FloatTensor([0.5]) #결과가 0.5이상인경우 True 아니면 Fasle 이진분류
print(result)

 

<결과>

tensor([[0.1399],
        [0.4231],
        [0.9372],
        [1.0000]], grad_fn=<SigmoidBackward>)
tensor([[False],
        [False],
        [ True],
        [ True]])

 


참고링크1 : '위키독스 - PyTorch로 시작하는 딥 러닝 입문' - 로지스틱 회귀 : https://wikidocs.net/57805

 

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

참고링크2 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=wndrlf2003&logNo=221015569107 

 

Logistic Regression(로지스틱 회귀) Cost function와 Gradient decent algorithm(경사하강법)

> Logistic Regression(로지스틱 회귀) Cost function와 Gradient decent algorithm(경사하강법) └...

blog.naver.com

 

728x90