모두의 딥러닝 5장 logistic regression

YJCho·2024년 1월 9일

모두의 딥러닝

목록 보기
1/8
post-thumbnail

로지스틱 회귀?
시그모이드 함수
오차 공식을 위한 로그 함수
실습 코드
퍼셉트론

📌로지스틱 회귀?

logistic regression

이전 3장, 4장에서는 정보 사이의 관계를 좌표로 나타내었을 때 직선의 형태를 보였다. 그래서 선형 회귀를 사용하기에 적절했었다.

하지만 나올 수 있는 결과가 2가지만 존재한다면?🤔

위의 사진과 같이 결과가 2개만 (0 또는 1) 존재하는 경우, 1과 0 사이의 값이 없기에 점들의 특성을 정확하게 담아내려면 직선이 아니라 S자 형태의 선을 그어야 한다.


📖시그모이드 함수

sigmoid function : S자로 그려지는 함수

y=11+e(ax+b)y=\frac{1}{1+e^{-(ax+b)}}

aa경사도를 나타낸다

bb좌우 이동을 나타낸다

aa와 오차와의 관계

aa 값이 커진다고 해서 오차가 없어지지는 않는다

bb와 오차와의 관계

bb 값이 너무 크거나 작으면 오차가 이차 함수 그래프와 유사하게 나타난다


📌오차 공식을 위한 로그 함수

선형 회귀와 마찬가지로 결국 aabb를 구하는 것이 중요하다
시그모이드 함수에서 aabb경사 하강법으로 구한다

시그모이드 함수에서 yy 값의 범위는 0과 1 사이이기 때문에 아래와 같은 결론을 도출할 수 있다.

실제 값이 0, 예측 값이 1 → 오차가 커진다
실제 값이 1, 예측 값이 0 → 오차가 커진다

이와 같은 관계를 공식으로 만들어주는 것이 바로 log\log 함수다

실제 값이 0일 때 : log(1h)\log{(1-h)}
실제 값이 1일 때 : log(h)-\log{(h)}

ydatalogh+(1ydata)log(1h)-y_{data} \log{h}+(1-y_{data})\log{(1-h)}

실제 값 = ydatay_{data}라면
ydata=1y_{data}=1, 앞 항만 남는다
ydata=0y_{data}=0, 뒷 항만 남는다


💻실습

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#데이터 준비
data=[[2,0], [4,0], [6,0], [8,1], [10,1], [12,1], [14,1]]

x_data = [i[0] for i in data]
y_data = [i[1] for i in data]

#그래프로 나타내기
plt.scatter(x_data, y_data, c='green')
plt.xlim(0,15)
plt.ylim(-.1, 1.1)

#기울기 a와 절편 b의 값 초기화
a=0; b=0

#학습률
lr=0.05

#epochs
epochs=2001

#시그모이드 함수 정의
def sigmoid(x): #x : ax+b
  return 1/(1+np.e** (-x))

#경사하강법 실행
for i in range(epochs):
  for x_data, y_data in data:
    #a에 관한 편미분, 앞서 정의한 sigmoid 함수 사용
    a_diff = x_data * (sigmoid (a*x_data + b) - y_data)
    #b에 관한 편미분
    b_diff = sigmoid(a * x_data + b) - y_data
    #a와 b를 업데이트
    a = a - lr * a_diff
    b = b - lr * b_diff

    if i % 1000 == 0:
      print("epoch=%d, 기울기=%.04f, 절편=%.04f"%(i , a, b))

#앞서 구한 기울기와 절편을 이용해 그래프 그리기
plt.scatter(x_data, y_data, c='green')
plt.xlim(0,15)
plt.ylim(-.1, 1.1)
x_range = (np.arange(0, 15, 0.1)) #그래프로 나타낼 x 값의 범위 정하기
plt.plot(np.arange(0, 15, 0.1), np.array([sigmoid( a * x + b) for x in x_range]))
plt.show()

만약 여기서 3개 이상의 입력 값을 다루어야 한다면
sigmoid 함수가 아닌 softmax라는 함수를 사용해야 한다. (12장)


📌퍼셉트론

perceptron : 1957년 코넬 항공 연구소의 프랑크 로젠블라트가 고안하고 발표한 내용

이 퍼셉트론이 인공 신경망, 오차 역전파 등의 발전을 거쳐서 지금의 deeplearning이 되었다.

profile
호로록

0개의 댓글