티스토리 뷰
본 내용은 Do it! 정직하게 코딩하며 배우는 딥러닝 입문(이지스퍼블리싱) - 박해선 저자님의 책을 읽고 공부를 목적으로 작성한 글입니다.
코드는 https://github.com/on1ystar/Do-it-DL 에 Google Colab 파일(jupyter notebook)로 업데이트 될 예정입니다.
선형 회귀란
선형 = 직선 그래프(1차 함수)
$$y = ax + b$$
a = 기울기(slope)
b = 절편(inrercept)
여기서 기울기와 절편은 머신러닝에서 규칙이라 칭한다.
회귀 분석 = 관찰된 연속형 변수들에 대해 두 변수 사이의 모형을 구한뒤 적합도를 측정해 내는 분석 방법
따라서 선형회귀는 절편과 기울기(규칙)를 찾는 것이다.
만약 다음과 같은 입력과 타깃이 있다.
input_data = [3, 4, 5] target = [25, 32, 39]
이를 좌표평면에 나타내면 다음과 같다.
import matplotlib.pyplot as plt import numpy as np plt.scatter(input_data, target) plt.show()
선형 회귀는 위의 점들을 잘 나타낼 수 있는 직선 그래프(1차 함수) 모델을 기울기와 절편을 이용해 찾는 방법이다.
예를 들어 기울기 6과 절편 4를 가진 그래프를 그려보면 다음과 같다.
x = [x for x in range(10)]
y = [x*6+4 for x in range(10)]
plt.scatter(input_data, target)
plt.plot(x, y)
plt.show()
코드를 작성하면서 이 그래프는 입력과 타깃을 지나지 않는 그래프라는 것을 알겠지만, 선형 회귀를 이용해 문제를 푸는 매커니즘을 이해하기 위함이다.
시각화된 그래프를 보면 기울기와 절편의 크기를 더 키워야 할 것 같다.
따라서 다음과 같이 기울기를 7로, 절편을 5로 수정한다.
x = [x for x in range(10)]
y = [x*7+5 for x in range(10)]
plt.scatter(input_data, target)
plt.plot(x, y)
plt.show()
위의 결과로 기울기는 더 이상 수정할 필요가 없을 것 같고, 절편만 다시 좀 낮춰주면 될 것 같다.
절편을 1 낮춘 4로 다시 수정하면,
x = [x for x in range(10)]
y = [x*7+4 for x in range(10)]
plt.scatter(input_data, target)
plt.plot(x, y)
plt.show()
입력과 타깃을 잘 나타내는 직선 그래프를 찾았다.
이 1차 함수가 선형 회귀로 만든 최적의 모델이다.
이제 이 모델을 이용해 새로운 입력에 대한 예측을 할 수 있게 된다.
사이킷런의 당뇨병 환자 데이터
이 당뇨병 환자 데이터는 data 속성에 422x10 크기의 2차원 배열과, target 속성에 422x1 크기의 1차원 배열을 가지고 있다.
422개의 행 = 422개의 샘플(sample) 10개의 열 = 10개의 특성(feature) = 특징 = 속성 = 독립 변수(independent variable) = 설명 변수(explanatory variable)
샘플 예시
각 샘플(입력 데이터)에 대응하는 타깃 데이터의 값을 보고 규칙을 찾아 모델로 나타내면 된다.
실전에서는 이러한 데이터를 준비할 때 해당 분야의 전문가에게 도움을 받는 것이 좋으며 많은 공을 들여야 한다.
각 샘플의 3번 째 특성에 대한 타깃 데이터 산점도
대략 입력과 타깃이 정비례 관계인 것을 확인할 수 있다.
위에서 추가 적으로 알 수 있는 점은 2차원 이상의 배열에서는 파이썬의 리스트보다 numpy 배열이 슬라이싱 방법에 있어서 훨씬 편리하다는 점이다.
위의 방식으로 리스트를 슬라이싱하면 에러가 발생하므로 외부 리스트를 이터레이션 해야 한다.
훈련 데이터 준비
03-2 경사 하강법(Gradient descent)
경사 하강법이란
1개의 특성을 나타내는 2차원 평면상의 데이터 규칙을 나타내기 위해서는 1차원 그래프인 직선(선형) 그래프가 필요했다.
만약 n개의 특성을 나타내는 n+1차원 평면상의 데이터 규칙을 나타내기 위해서는 초평면(hyperplane)인 n차원 그래프가 필요하다. 하지만 3차원을 넘어가는 그래프는 상상하기도 힘들기 때문에, 보통 2~3차원 그래프들을 이용해 특성을 나타내고, 직관을 얻는다.
낮은 차원에서 얻은 직관은 높은 차원으로 확장될 수 있기 때문이다.
경사 하강법은 모델이 데이터를 잘 표현할 수 있도록 기울기를 사용하여 모델을 조금씩 조정하는 최적화 알고리즘이다.
이 경사 하강법은 많은 양의 데이터에 사용하기 좋은 알고리즘이다.
회귀 문제를 푸는 다른 알고리즘
ex) 정규 방정식, 결정 트리, 서포트 벡터 머신
용어 정리
기울기a=가중치w=계수θ
y=타깃 데이터(실제 데이터)
y^=예측값(모델이 새로운 입력 값을 받아 예측한 값)
예측값으로 올바른 모델 찾기 (변화율 이용)
1. 무작위로 w와 b 초기화
2. 훈련 데이터에서 무작위로 선택한 샘플 데이터로 y-hat 얻기
3. 타깃과 예측 데이터 비교하기
4. 타깃에 더 가까워 지도록 w 값(또는 b 값) 조절해 예측값 바꾸기
가장 중요한 부분인데, w와 b를 증가시키거나 감소시켜 y_hat이 증가하는지, 감소하는지를 알아야 한다. 예를 들어 다음과 같이 w를 0.1만큼 증가시켜보고 예측값 y_hat의 변화량을 확인해 본다.
위의 결과를 통해 w가 증가하면 y_hat이 증가한다는 사실을 알았다.
이제 w의 증가량(변화량)에 의한 y_hat의 증가량(변화량)을 계산해 본다.
이 값은 훈련 데이터의 입력 샘플 값인 x[0]의 값이 된다. 즉, 훈련 데이터 x[0]에 대한 w의 변화율은 x[0]이라는 말이다.
이를 직관적으로 이해해보면, 거꾸로 w를 변수로 생각했을 때 곱해지는 가중치는 x[0]가 되기 때문이다.
좀 더 수학적으로는 위의 수식을 풀어 써보면 알 수 있다.
이를 통해 아까 예시처럼 y_hat이 y보다 작아 y_hat을 증가시켜야 하는 경우, 변화율이 양수면 w를 증가, 음수면 w를 감소시키면 된다.
이때 w에 w_rate(변화율)를 더해주면 w_rate가 양수인 경우 w가 증가하고, 음수인 경우에는 w가 감소해, 결과적으로 y_hat이 증가한다.
절편 b를 업데이트 하는 방법 역시 변화율을 이용하는데, 절편은 직관적으로 변화율이 1인 것을 알 수 있다. 따라서 변화시키고 싶은 만큼 더하거나 빼주면 된다.
5. 모든 샘플을 처리할 때까지 위를 반복
오차 역전파(backpropagation)로 가중치와 절편 업데이트
y-hat과 y의 차이를 이용하여 w와 b를 업데이트하는 방법으로 오차가 연이어 전파되는 모습으로 수행된다.
이 방법은 y-hat과 y의 차이가 클 경우나 ,y-hat이 y보다 더 커져서 y-hat을 감소시켜야 할 경우에 유용하다.
핵심은 w에 변화율을 단지 더하는 것이 아닌, y-y_hat인 오차의 양을 변화율에 곱한 뒤 더하는 방법으로 업데이트하는 것이다.
1. 오차의 변화율을 곱하여 가중치 업데이트
2. 두 번째 샘플을 이용해 w와 b 업데이트
3. 전체 샘플을 반복
이 결과가 입력 x와 타깃 y로 이루어진 훈련 데이터 세트에 대한 모델의 w와 b 값이다.
4. 그래프 그려보기
5. 에포크(epoch) 반복하기
전체 훈련 데이터를 모두 이용하여 한 단위의 작업을 진행하는 것을 에포크라 부르고, 일반적으로 수십에서 수천 번의 에포크를 반복한다.
100번의 에포크를 수행한 모델이 사용했을 때 그래프가 데이터를 좀 더 잘 나타내고 있다.
결과 모델
6. 모델로 예측해보기
이처럼 오차 역전파를 이용하면 예측값과 타깃값과의 오차가 w와 b에 반영될 수 있고, 오차의 부호에 따라 w와 b가 커지거나 작아지도록 업데이트 할 수 있다.
'머신러닝&딥러닝 공부' 카테고리의 다른 글
[딥러닝 입문] 손실 함수와 경사 하강법, 선형 회귀 뉴런 구현 (0) | 2020.01.06 |
---|---|
[딥러닝 입문] 인공지능, 머신러닝, 딥러닝이란 ? (1) | 2019.12.25 |
- Total
- Today
- Yesterday
- 지옥에서 온 git
- 쉽게 배우는 운영체제
- 스프링 컨테이너
- jsp
- 파이썬 for Beginner 연습문제
- Computer_Networking_A_Top-Down_Approach
- git branch
- git
- 프로그래머스
- 생활코딩 javascript
- Do it! 정직하게 코딩하며 배우는 딥러닝 입문
- 파이썬 for Beginner 솔루션
- JPA
- Thymeleaf
- 쉘 코드
- 패킷 스위칭
- Spring Boot
- 방명록 프로젝트
- 스프링 mvc
- 스프링 테스트
- 김영환
- spring mvc
- git merge
- Python Cookbook
- Gradle
- 스프링
- Spring Data JPA
- Spring
- 선형 회귀
- 운영체제 반효경
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |