[SSAC X 코딩온] (2021.10.15) 인공지능과 머신러닝_02

RyuSW·2021년 10월 15일
0
post-thumbnail

🛅 지도학습


♐ Linear Regression (선형 회귀)


  • 비용이 크면 클수록 좋지 않다. (Cost)

  • 독립변수(x) : 현상의 원인, 입력값 (Input Value)

  • 종속변수(Y) : 현상의 결과, 출력값 (Output Value)

  • 변수 x의 값은 독립적으로 변할 수 있는 것에 반해, Y값은 계속해서 x의 값에 의해서, 종속적으로 결정되므로 x를 독립 변수, Y를 종속 변수라고 한다.

  • 선형 회귀는 한 개 이상의 독립 변수 x와 Y의 선형 관계를 모델링한다.

    출처 : 위키백과 - 독립변수와 종속변수


🔳 Cost 비용함수 : 평균제곱오차 (MSE)

  • n : 데이터 수

  • h(x) = ax + b

  • h(x) = 가설함수 : 단서가 들어왔을 때 예측값을 추론하게 해주는 함수

  • C(a,b) = 비용을 구하는 함수 : 가설함수의 cost가 얼마인 지 알 수 있게 해주는 함수

  • cost 함수의 최솟값을 구하는 것 : 비용이 가장 낮은 가설함수를 구하는 것!


  • 선형회귀에서 h(x) = wx 라고 가정하면 cost함수는 w에 대한 2차함수이다.

  • 선형회귀의 cost함수가 아래로 볼록한 2차 함수이기 때문에 최솟값을 갖는다!


  • 미분(순간변화율 = 미분계수)을 구하면 접선의 기울기가 나온다

  • 최소의 Cost를 잡기 위해서 C'(w) = 0이 되는 w를 찾게 하면 된다!



  • 가중치에 중요도를 반영할 수 있음

  • h(x) = w1x1 + w2x2 + w3x3 + ... + wnxn + b


🔻 경사하강법 (Gradient Descent)


  • 선형 회귀를 포함한 수많은 머신러닝, 딥러닝의 학습은 결국 비용 함수를 최소화하는 매개 변수인 W와 b를 찾기 위한 작업을 수행한다.

  • 이때 사용되는 알고리즘을 옵티마이저(Optimizer) 또는 최적화 알고리즘이라고 부른다.

  • 그 중 가장 기본적인 옵티마이저 알고리즘은 경사 하강법(Gradient Descent)!


  • Single Linear Regression

    • h(x) = wx + b
  • Multi Linear Regression

    • h(x) = w1x1 + w2x2 + ... + wnxn + b
  • ax + by = c

    y = a'x + b'


  • h(x) = wx

    • C(w,b) = yk - wxk - b

    • w가 공식으로 안나오는 이유 :

      • 실제로 AI알고리즘을 적용할 때는 w값을 식으로 한 번에 구할 수가 없기 때문에 경사하강법을 사용하여 조금씩 길을 더듬어가며 최저점을 찾으려고 노력해야 한다!
    • cost함수가 이차함수이기 때문에 미분해서 기울기를 0으로 만든다.


  • 지금까지의 수업에서 '최적화된' w(가중치)를 발견하였다.

    • Single Linear Regression에서 cost함수를 최솟값으로 만드는 w의 값을 찾았다!

  • c(w) = ( log(w) + w^2 ) / w^2 + 3^w

  • x에 a를 넣어 미분계수를 구한 후 그것이 양수가 나오면 x에 기존 x보다 작은 값을 넣어서 미분계수를 구한다. 만약 음수가 x에 기존 x보다 큰 값을 넣어서 미분계수를 구한다.

    • 단, 절댓값이 크면 클 수록 x의 값을 기존값보다 많이 바꾼다.

    • c(w)의 최솟값을 찾아가는 것에 있어서

      • c'(a) > 0인 경우, a = a - kc'(a)를 한 후 for문을 반복한다.

      • c'(a) < 0인 경우, a = a - kc'(a)를 한 후 for문을 반복한다.

      • c'(a) = 0인 경우, 최솟값을 찾은 것이므로 for문을 탈출한다.


  • 수업 요약 :

    • Single Linear Regression의 Cost 함수 c(w)의 최솟값을 구함에 있어서
      (단, h(x) = wx + b에서 b는 무시)

      • a = Random Value

      • for문 충분히 반복 (단, 유한반복 ex) 40000)

        if c'(a) != 0:
            a -= kc'(a) # 단, k는 본인이 정한 임의의 상수
        else:
            for문 탈출
      • w = a일 때, c(w)는 최솟값 c(a)를 가진다.


  • Learning Rate (학습률)

    • 인공지능이 제대로 학습을 하기 위해서는 적당한 LR(학습률)을 정하는 것이 필수!!

    • 너무 큰 LR을 지정하면 최솟값을 영원히 못찾게 된다! cost가 오히려 올라가는 것을 볼 수 있다.

      • 비유하자면, 어둠속에서 코끼리의 꼬리를 찾고 싶은데 더듬으면 더듬을수록 오히려 꼬리로부터 먼 위치에 있는 곳을 더듬게 된다.
    • 너무 작은 LR을 지정하면 최솟값까지 도달하는 데 너무 오랜 시간이 걸린다.

      • 비유하자면, 꼬리쪽으로 손을 계속해서 움직이고 있기는 하나 너무 조금씩 손을 움직이고 있어서 꼬리까지 가는 데 엄청 오래 걸린다.
    • 적당한 LR을 지정하면 cost가 계속 낮아지는 쪽으로 min_w의 값이 조정되는 것을 볼 수 있으며 머지않아 최솟값에 도달하게 된다.

    • min_w = min_w - lr * c'(min_w)



🔻 로지스틱 회귀 (Logistic Regression)


  • 결과값이 0 혹은 1로 정해지는 학습데이터

  • 로지스틱 회귀에서의 가설함수는 시그모이드 함수(Sigmoid Function)

  • 시그모이드 함수를 사용하는 이유 :

    • 단순선형회귀분석(독립변수의 갯수가 1개)은 앞에서 언급한 것처럼 목표가 실수값 예측이기 때문에 선형함수 y = wx + b 를 이용하여 예측한다

    • 하지만 로지스틱 회귀분석에서는 종속변수가 0 또는 1이기 때문에 y = wx + b를 이용해서 예측하는 것은 의미가 없기 때문이다.

    출처 : 산업수학 혁신센터



🧲 Colaboratory에서 머신러닝하기


  • CPU : 컴퓨터의 뇌를 담당

  • GPU : 그래픽카드의 뇌를 담당

    • 그래픽카드 : 이미지를 모니터에 필요한 전자 신호로 변환시켜 주는 장치

  • 행렬연산을 사용하면 복잡하고 여러개의 식으로 표현해야만 하는 연산을 한 번에 처리할 수 있다!

  • 행렬연산이 GPU에서 훨씬 더 빠르게 계산이 가능해서 연립방정식보다 효율성이 좋다.


import torch

x_train = torch.FloatTensor([[30],[60],[90]]) # 1행 3열
y_train = torch.FloatTensor([[700],[750],[800]])
W = torch.zeros(1) # 1차원의 텐서를 만든다.
b = torch.zeros(1)

lr = 0.0002 # lr을 올리면 cost가 증가한다.

epochs = 400000

len_x = len(x_train) # x_train의 갯수

for epoch in range(epochs): # 400000번 반복
  hypothesis = x_train * W + b
  cost = torch.mean((hypothesis -y_train)**2) # 

  gradient_w = torch.sum((W*x_train - y_train +b)*x_train)/ len_x    
  # (W*x_train - y_train +b)*x_train) <- cost함수에 대해 편미분을 실시한다. 그리고 계산의 편의상 2는 제거한다.
  gradient_b = torch.sum((W*x_train - y_train +b))/len_x             
  # sum은 x값 전체를 더하고 평균을 구해서 해당 값으로 최솟값 방향을 정한다. b축에서 경사를 찾기 위해 경사를 구하는 것이다.

  W -= lr * gradient_w
  b -= lr * gradient_b
  
  if epoch % 10000 == 0:
    print('Epoch {:4d}/{} W:{:.6f} b:{:.6f} Cost: {:.6f}'.format(epoch,epochs,W.item() ,b.item() , cost.item()))


📈 Django에서 머신러닝 사용해보기


  1. 가상환경에서 torch를 불러온다. 다음과 같은 명령어 입력(이게 진짜 오래걸리는 작업이다. 또 메모리가 버벅대면 그 땐 피꺼솟)
pip install torch==1.2.0+cpu torchvision==0.4.0+cpu -f https://download.pytorch.org/whl/torch_stable.html

Pytorch 사용법 : https://pytorch.org/get-started/previous-versions/


  1. toeic_input.html을 작성한다.
당신의 기존 학습 데이터를 입력하세요!!

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		당신의 기존 학습 데이터를 입력하세요!!

		<form method="post">
			{% csrf_token %}

			공부일수1 : <input type="text" name="day1">
			성적1 : <input type="text" name="score1">
			
			<br>

			공부일수2 : <input type="text" name="day2">
			성적2 : <input type="text" name="score2">
			
			<br>

			공부일수3 : <input type="text" name="day3">
			성적3 : <input type="text" name="score3">
			
			<button type="submit">학습 시작!</button>
		</form>
	</body>
</html>



  1. toeic_output.html을 작성한다.
인공지능 학습이 완료되었습니다!!

<script>
	var W = {{W}};
	var b = {{b}};
	
	function predict(){
		alert( W * document.getElementById("days").value + b + "점 맞으시겠네요!" );
	}
</script>

<br>
<br>
<br>

얼마나 공부하실 예정이신가요?

<input id="days" type="text"> <button type="button" onclick="predict()">예측</button>



  1. views.py에 머신러닝 데이터를 학습시킬 함수를 작성한다.
def toeic_ai(req):
    if req.method == 'POST':
        x_train = torch.FloatTensor([[int(req.POST.get('day1'))],[int(req.POST.get('day2'))],[int(req.POST.get('day3'))]])
        y_train = torch.FloatTensor([[int(req.POST.get('score1'))],[int(req.POST.get('score2'))],[int(req.POST.get('score3'))]])
        W = torch.zeros(1)
        b = torch.zeros(1)

        lr = 0.0002

        epochs = 200000

        len_x = len(x_train)

        for epoch in range(epochs):
          hypothesis = x_train * W + b
          cost = torch.mean((hypothesis -y_train)**2)

          gradient_w = torch.sum((W*x_train - y_train +b)*x_train)/ len_x
          gradient_b = torch.sum((W*x_train - y_train +b))/len_x

          W -= lr * gradient_w
          b -= lr * gradient_b

        return render( req, 'toeic_output.html', { 'W':W.item(), 'b':b.item() } )
    else:
        return render(req, 'toeic_input.html')



  1. 서버를 켜서 다음과 같이 데이터를 입력해본다.

  • input_toeic.html 에 접속한다.


  • 공부일수와 성적을 입력한다. 이왕이면 선형 회귀 흐름을 유지하게끔


  • 학습 시작을 누르면 데이터가 학습되면서 런타임이 다소 소요된다. 그리고 러닝타임이 완료되면 output_toeic.html으로 이동된다. input창에 예상 데이터를 입력한다.


  • alert창에 다음과 같은 예측점수가 나타나는 것을 확인할 수 있다.



🎨 인공지능 수업 후기


정말 오랜만에 듣는 머신러닝 수업이었어서 재밌기도 했고 처음 배우는 내용이 아니라서 그런 지 이해가 잘 되었다. 처음 배우는 입장이었으면 바로 수업끄고 딴 짓하고 있었을듯 하지만 머신러닝을 배운 기간도 짧고 여기서 배운 것으로 취업할 가능성이 희박하기 때문에 나중에 시간될 때 Kaggle같은 걸로 따로 프로젝트라도 해보려고 한다. 애초에 인공지능, 데이터분석, 빅데이터 쪽은 왠만하면 대부분 석사 이상 학위부터 채용한다. 다음 주부터 Node.js를 배우니 정말 집중하고 열심히 해야지😀

profile
배운 것은 항상 그 때 문서화하자!

0개의 댓글