비용이 크면 클수록 좋지 않다. (Cost)
독립변수(x) : 현상의 원인, 입력값 (Input Value)
종속변수(Y) : 현상의 결과, 출력값 (Output Value)
변수 x의 값은 독립적으로 변할 수 있는 것에 반해, Y값은 계속해서 x의 값에 의해서, 종속적으로 결정되므로 x를 독립 변수, Y를 종속 변수라고 한다.
선형 회귀는 한 개 이상의 독립 변수 x와 Y의 선형 관계를 모델링한다.
출처 : 위키백과 - 독립변수와 종속변수
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
선형 회귀를 포함한 수많은 머신러닝, 딥러닝의 학습은 결국 비용 함수를 최소화하는 매개 변수인 W와 b를 찾기 위한 작업을 수행한다.
이때 사용되는 알고리즘을 옵티마이저(Optimizer) 또는 최적화 알고리즘이라고 부른다.
그 중 가장 기본적인 옵티마이저 알고리즘은 경사 하강법(Gradient Descent)!
Single Linear Regression
Multi Linear Regression
ax + by = c
y = a'x + b'
h(x) = wx
C(w,b) = yk - wxk - b
w가 공식으로 안나오는 이유 :
cost함수가 이차함수이기 때문에 미분해서 기울기를 0으로 만든다.
지금까지의 수업에서 '최적화된' 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)
결과값이 0 혹은 1로 정해지는 학습데이터
로지스틱 회귀에서의 가설함수는 시그모이드 함수(Sigmoid Function)
시그모이드 함수를 사용하는 이유 :
단순선형회귀분석(독립변수의 갯수가 1개)은 앞에서 언급한 것처럼 목표가 실수값 예측이기 때문에 선형함수 y = wx + b
를 이용하여 예측한다
하지만 로지스틱 회귀분석에서는 종속변수가 0 또는 1이기 때문에 y = wx + b
를 이용해서 예측하는 것은 의미가 없기 때문이다.
출처 : 산업수학 혁신센터
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()))
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/
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>
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>
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')
input_toeic.html
에 접속한다.학습 시작
을 누르면 데이터가 학습되면서 런타임이 다소 소요된다. 그리고 러닝타임이 완료되면 output_toeic.html
으로 이동된다. input
창에 예상 데이터를 입력한다. 정말 오랜만에 듣는 머신러닝 수업이었어서 재밌기도 했고 처음 배우는 내용이 아니라서 그런 지 이해가 잘 되었다. 처음 배우는 입장이었으면 바로 수업끄고 딴 짓하고 있었을듯 하지만 머신러닝을 배운 기간도 짧고 여기서 배운 것으로 취업할 가능성이 희박하기 때문에 나중에 시간될 때 Kaggle같은 걸로 따로 프로젝트라도 해보려고 한다. 애초에 인공지능, 데이터분석, 빅데이터 쪽은 왠만하면 대부분 석사 이상 학위부터 채용한다. 다음 주부터 Node.js를 배우니 정말 집중하고 열심히 해야지😀