728x90
반응형

👉이전글 에서 Regression에 대해 살펴봤습니다.

이번 글에서 살펴볼 Logistic Regression 모델은 True/False 2가지 범주 중 하나의 값을 예측하여 출력하는 이진분류의 가장 기본이 되는 모델입니다.
이번 글은 모두를 위한 딥러닝 강의를 수강한 후 작성하는 글입니다.

Linear Regression

Linear Regression은 아래 사진과 같은 HypothesisCost Function을 갖습니다.

  • Hypothesis : 입출력의 관계를 나타내는 함수(가설), 해당 함수는 학습데이터 기반의 모델학습 과정을 거쳐 확정됩니다.
  • Cost Function : 예측(가설)을 통한 출력 값과 실제 값의 차이를 나타내는 함수, Cost Function은 아래 사진에서 나타내는 것처럼 2차 함수 형태의 표를 갖습니다. 해당 Cost Function의 값이 최소가 되는 W를 찾는 것이 모델 학습의 목표입니다.

Linear Regression 모델을 통해 HypohesisCost Function이 어떻게 구성되는지 쉽게 알 수 있었습니다.

Logistic Regression

Linear Regression의 맹점

Logistic Regression모델은 이진분류에 강점을 가지고 있는 모델입니다.
이진분류(Binary Classification)의 경우에 Linear Regression을 사용한다고 가정해보겠습니다.

위 사진은 공부한 시간에 따른 시험 pass/fail 여부를 예측하는 모델의 Hypothesis를 나타낸 표입니다.
해당 예시를 Linear Regression모델에 적용하여 특정 y값 이상이 되면 pass로 판단할 수 있도록 구성할 수도 있습니다.

하지만 Linear Regression 모델은 맹점이 있습니다.
입력 학습데이터의 편차가 클 경우, 모델 학습이 잘 안될 가능성이 있습니다.
위 예시에서 만약 학습시간이 50으로 큰 값이 들어온다면, 해당 Hypothesis는 기존 기울기보다 우측으로 크게 치우쳐진 표를 그리는 함수가 될 것입니다.
이렇게 되면 낮은 x(hour)값이 입력되어 pass가 나와야하는 상황에서도 fail이 나올 수 있게 됩니다.

이러한 Linear Regression의 맹점을 보완한 모델이 Logistic Regression입니다.

Logistic Regression Hypothesis

Linear Regression의 맹점을 보완하기 위해 학습데이터의 y값은 아무리 큰 x값이 입력되어도 일정 수준(0 or 1)으로 유지가 되어야 합니다.
그래서 아래 사진의 sigmoid함수를 적용하였습니다.

sigmoid함수는 양의 무한대로 갈 수록 1로 수렴하고, 음의 무한대로 갈 수록 0으로 수렴하는 특징을 가지고 있습니다.
즉, 아무리 편차가 큰 입력 값이 들어와도 출력 값은 일정 수준(0 or 1)으로 유지할 수 있게 되는 것이죠.
이러한 sigmoid함수를 적용하여 Hypothesis를 구성하면 아래 사진과 같이 표현할 수 있습니다.

위 사진처럼 sigmoid함수의 x값에 Linear RegressionHypothesis를 넣으면
Logistic RegressionHypothesis가 구성됩니다.

이를 통해 Logistic Regression모델을 통해 데이터를 학습시키면 보다 정확한 True/False 값을 기대할 수 있게됩니다.

Logistic Regression Cost Function

Logistic RegressionHypothesis를 정했으니, 이제 Cost Function을 정해야 합니다.

Logistic RegressionHypothesis를 그대로 활용하여 Cost Function을 정한다면,
위 사진에서 보는 것처럼 최소의 Cost를 가지는 W를 찾는데 문제가 발생합니다.

모델 학습과정은 Cost Function그래프에서 왼쪽에서든 오른쪽에서든 기울기를 따라 서서히 내려오면서 최소의 Cost를 가지는 W값을 찾는 과정입니다.
위 사진 속 Linear Regression의 그래프에서 보이는 것처럼 그래프는 매끈하게 구성되어 있기 때문에 최솟값을 찾기 쉽습니다.
하지만 오른쪽 Logistic RegressionCost Function그래프는 울퉁불퉁하게 구성되어 있어서 그래프의 기울기만 따라 내려오는 것만으로는 최솟값을 찾기 힘듭니다. (중간의 울퉁불퉁한 곡선에 걸쳐질 확률이 높습니다.)

이를 방지하기 위해 Logistic RegressionCost Function은 새롭게 구성되어야 합니다.


Linear RegressionCost Function처럼 매끄러운 형태의 그래프를 구성하기 위해
Logistic RegressionCost Function에서는 log함수가 사용됩니다. 해당 log함수는 Logistic Regression Hypothesis 자연대수e와 상극인 함수이기 때문입니다.

이를 통해 위 두번째 사진처럼 그래프를 구성할 수 있습니다.
그리고 해당 log함수는 2차 함수처럼 최솟값을 가지는 그래프가 아닌 한쪽으로 편향된 형태를 가지는 그래프이기 때문에,
실제값이 0이냐 1이냐에 따라 함수 구성을 달리하여 Cost Function을 구성하였습니다.
이를 통해 보다 정확한 Cost를 구할 수 있습니다.

예를들어 실제값이 1인 경우에 예측값이 0이 나올경우 Cost는 무한대로 수렴하고,
실제값이 0인 경우에 예측값이 0이 나올경우 Cost는 0으로 수렴하기 때문에 보다 정확한 학습이 이뤄지게 됩니다.
그리고 이러한 Cost Function은 아래 사진처럼 통합하여 표현될 수 있습니다.

Logistic Regression in Tensorflow

Logistic Regression모델은 아래와 같은 Tensorflow코드를 통해 구현될 수 있습니다.
(해당 Tensorflow 버전은 1.0이므로 2.0버전과는 호환이 안될 수 있습니다.)

x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]]
y_data = [[0], [0], [0], [1], [1], [1]]

# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 2])
Y = tf.placeholder(tf.float32, shape=[None, 2])

W = tf.Variable(tf.random_normal([2, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

# Hypothesis using sigmoid: tf.div(1., 1. + tf.exp(tf.matmul(X, W)))
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)

# cost/loss function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)

# Accuracy computation
# True if hypothesis > 0.5 else False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

# Launch graph
with tf.Session() as sess:
    # Initialize TensorFlow variables
    sess.run(tf.global_variables_initializer())

    for step in range(10001):
        cost_val, _ = sess.run([cost, train], feed_dict={X: x_data, Y: y_data})
        if step % 200 == 0:
            print(step, cost_val)

    # Accuracy report
    h, c, a = sess.run([hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ", h, "\nCorrect (Y): ", c, "\nAccuracy: ", a)
반응형

'개발 > AI' 카테고리의 다른 글

[AI] Softmax Regression  (0) 2023.10.01
[NLP] Embedding  (0) 2023.09.23
[AI] Regression  (0) 2023.01.22
[AI] Machine Learning (머신러닝) - 개념  (0) 2023.01.18
[AI] 서론  (2) 2023.01.18
728x90
반응형

1. Regression 이란?

: 학습데이터를 기반으로 넓은 범위의 데이터 중 하나를 추정하는 방식이다. 머신러닝의 Supervised-learning 유형 중 하나이다.

위 예시는 Predicting exam score 문제이고 Regression의 대표적인 예시이다.
그리고 테이블의 데이터는 학습데이터이고, 그 중 y컬럼의 데이터는 x컬럼 데이터에 대한 추정치로 출력되는 label데이터이다.

2. Linear Regression

: 입력데이터에 따라 출력데이터가 선형적으로 출력되는 Regression

null

공부한시간에 비례하여 시험성적이 높게 나오는 Predicting exam score 예시처럼
인풋값에 따라 어느정도 규칙성을 가지고 선형적으로 변하는 학습데이터 training-sets을 갖는다.
그리고 training-sets를 인풋값 x, 출력값 y로 설정하여 Hypothesis를 사진 속 H(x)와 같이 추정할 수 있다.

인풋값에 따라 출력값을 최대한 유사하게 추정하려면, 주어진 training-sets에 따른 정확한 Hypothesis가 정해져야 한다.

3. Cost function

null

cost functiontraining-setsHypothesis의 유사도를 측정하기 위해 활용되는 함수이다.
(H(x) : Hypothesis에 대한 출력값, y : 실제 출력값)
해당 함수를 통해 주어진 training-sets에 대한 정확한 Hypothesis를 구할 수 있다.

계산 방법은 위 사진처럼 임의의 Hypothesis를 정해놓고, 각 training-sets과의 차이를 계산하면 된다.
그리고 계산된 차이가 가장 적은 Hypothesis가 최적의 Hypothesis가 되는 원리이다.

이 때, 각 training-sets에 대해 계산된 차이는 음수가 되면 안된다.
이를 방지하기 위해 각 training-sets에 대해 계산된 차이를 제곱하여 차곡차곡 더한다.

null

위 사진은 임의의 Hypothesis에 대한 cost를 구하기 위한 수식을 나타낸다.
그리고 training-sets 데이터이 갯수가 3개라고 가정하였다.
각 데이터에 대해 계산된 차이를 제곱하고 더하여 데이터의 갯수인 3만큼 나누면 cost가 구해진다.

null

결론적으로 cost function은 위 사진의 수식처럼 W, b에 대한 수식처럼 나타낼 수 있다.
그리고 위 수식대로 계산된 cost값 중 최소 cost값을 찾는 과정이 Linear Regression에서의 학습이다.

이어서

TensorFlow에서의 Linear Regression구현에 대해 알아볼 것이다.
그리고 이전에 TensorFlow활용법에 대해 간단하게 살펴볼 것이다.

반응형

'개발 > AI' 카테고리의 다른 글

[AI] Softmax Regression  (0) 2023.10.01
[NLP] Embedding  (0) 2023.09.23
[AI] Logistic Regression  (0) 2023.09.10
[AI] Machine Learning (머신러닝) - 개념  (0) 2023.01.18
[AI] 서론  (2) 2023.01.18

+ Recent posts