고성능의 저장장치, 급성장한 IT인프라, 방대한 소비자 데이터가 수 십 년간 쌓이면서 빅데이터가 형성되었고 데이터분석 및 시각화와 AI기술이 몇 년간 급성장하고 있다. 특히 머신러닝 기술은 기본적으로 빅데이터를 재료로 삼아 기계가 인간처럼 자연스럽게 판단하는 기술이기에 고성능 컴퓨팅 기술과 장비는 물론이고 데이터 정제화와 모델링 기술이 중요해졌다. 하지만 데이터는 밀리초마다 예측 불가능하게 쏟아져 레거시 시스템 구축에 대한 비용예측이 어렵고 데이터 분석가 및 사이언티스트의 인력은 한정적이기 때문에 제한된 기업과 사용자만이 머신러닝, 딥러닝 기술을 이용한 서비스 배포를 할 수 있었다.
그렇기에 예측불가능한 데이터를 감당해 낼 수있는 탄력적으로 운용 가능한 고성능 컴퓨팅 기술이 필요했고 모델링 훈련 배포를 정확하고 간편한 과정과 비용절감 및 효율성을 높여줄 클라우드 기술이 필요했다. 이러한 현상에 긍정적인 효과를 넣어줄 서비스가 바로 SageMaker이다. SageMaker는 데이터 사이언티스트와 비즈니스 분석가를 위해 머신러닝 모델 구축 및 훈련 배포를 담당하는완전관리형서비스이다. 클라우드 인프라로 전환을 하는 시점인 현재 ML 솔루션에 도전할 수 있는 발판을 만들어주고 있는 AWS서비스이다.
- 클라우드 AI 개발자 서비스에 대한 Magic Quadrant
클라우드 기반 AI 개발자 서비스에 관해 Gartner는 SageMaker에 대해 AWS의 AI 운영 및 생산 확장성이 뛰어나다고 평가했고 자연어 처리 분석을 담당하는 AWS Comprehend, 시계열 예측 서비스인 AWS Forecast, 챗봇 서비스인 AWS Lex, 이미지와 비디오에 대한 딥러닝을 담당하는 AWS Rekognition와 같은 AI 서비스와 함께 2022년 "Ability to Execute" 부문에서 1등을 한 모습을 확인할 수 있다.
2. SageMaker 구성요소
1) Getting started
- Studio, Studio Lab
studio는 ide를 통해 기계학습을 할 수있고 사용한 만큼 비용을 지불해야한다. 사용 시엔 SageMaker 도메인을 생성해서 사용해야한다.
studio lab은 JupyterLab IDE를 기반으로 동작하며 무료로 사용할 수 있다.
- Canvas, RStudio
Canvas도 Studio와 마찬가지로 도메인을 우선 생성해야하며 2개월 간 무료로 사용할 수 있다.
RStudio도 Studio와 마찬가지로 도메인을 우선 생성해야하며 R과 Python에 대한 워크로드를 제공한다.
2)Domains
SageMaker 도메인은 연결된 Amazon Elastic File System(Amazon EFS) 볼륨으로 구성된다.
3) SageMaker dashboard
Images는 Studio 도메인과 동일한 리전에 있는 Amazon ECR의 이미지 경로를 입력한 후 이미지를 만든다
Lifecycle configurations는 jupyter server app, kernel gateway app를 선택하고 스크립트를 통해 수명주기를 관리한다.
Search는 속성, 운영자, 값으로 설정해 결과를 도출한다.
4) SageMaker dashboard - Governace
Model dashboard : SageMaker 콘솔에서 액세스할 수 있는 중앙 집중식 포털로 계정의 모든 모델을 보고 검색하고 탐색할 수 있다.
Model cards : ML 모델에 대한 중요한 세부 정보를 한 곳에서 문서화
5) SageMaker dashboard - Ground Truth
- Labeling jobs, datasets, Labeling workforces
Image Classification과 Bounding box, semantic segmentation 등과 같은 label을 선택해 데이터셋에 적용
레이블링하는 서버리스 환경
s3를 통해 레이블링이 필요한 데이터 설정
private, public 설정을 할 수 있다.
6) SageMaker dashboard - Notebook
- Nodebook instances, Git repositories
Jupyter lab을 생성시킬 수 있고 관리할 수 있는 Git repository를 연결할 수 있다.
7) SageMaker dashboard - Processing
Processing jobs : 데이터를 분석하고 기계 학습 모델을 평가하는 솔루션, 실험 단계 동안과 코드가 프로덕션에 배포된 후 Amazon SageMaker Processing API를 사용하여 성능을 평가할 수 있다.
8) SageMaker dashboard - Training
- Algorithms
XGBoost : Gradient Boosting 알고리즘을 분산환경에서도 실행할 수 있도록 구현해놓은 라이브러리
Linear Learner : 선형회귀
KNN : 최근접 이웃 지도 학습 알고리즘
Factorization Machines : 분류 및 회귀 작업 모두에 사용할 수 있는 범용 지도 학습 알고리즘
Object2Vec : 모델의 교육과 추론의 기반이 되는 비슷한 단어, 문구, 문장이 있는 애플리케이션에서 사용되는 새로운 지도 학습 알고리즘
Image Classification : 이미지 분류
Object Detection : 디지털 이미지와 비디오로 특정한 계열의 시맨틱 객체 인스턴스를 감지
Semantic Segmentation : 동일한 개체 클래스에 속하는 이미지 부분을 함께 클러스터링하는 작업
k-means : 주어진 데이터를 k개의 클러스터로 묶는 알고리즘
DeepAR : Amazon Sagemaker에서 제공하는 forecasting 알고리즘
Blazing Text : 감정 분석, 기계 번역 등과 같은 많은 다운스트림 자연어 처리 작업에 유용
MxNet : 신경망을 훈련시키고 디플로이하기 위해 사용되는 오픈 소스 딥 러닝 소프트웨어 프레임워크
NTM : NTM은 문서의 말뭉치를 통계적 분포를 기준으로 한 단어 그룹이 포함된 주제로 구성하는 데 사용되는 비지도 학습 알고리즘
LDA : 주어진 문서에 대하여 각 문서에 어떤 주제들이 존재하는지를 서술하는 대한 확률적 토픽 모델 기법 중 하나
PCA : 차원축소
Random Cut Forest : RF는 증분식 업데이트가 어렵지만 RCF는 증분식 업데이트가 가능하도록 설계된 알고리즘
IP Insights : IP 주소를 기반으로 비정상적인 동작과 사용 패턴을 탐지하는 비지도 학습 알고리즘
- Training jobs : 모델, 하이퍼파라미터, 입력데이터, 출력데이터 등에 대한 설정을 할 수 있다.
- Hyperparameter tuning jobs : 사용자가 선택한 알고리즘에 맞는 하이퍼파라미터에 대한 튜닝을 할 수 있다.
s3 bucket name : output버킷 이름 (방금 생성한 s3 버킷) => output 폴더
machine learning problem : multiclass classification
objective metric : accuracy
4. MLOps 및 Data Pipeline 실습 공부
DevOps, Solution Architect, MLOps 등에 대한 역량을 키우기 위해선 Data Pipeline을 최적의 조건으로 따지는 것도 좋지만 가트너를 기반으로해서 시장성이 좋은 여러가지 서비스와 툴을 최대한 사용하여 해결해 보는 것도 좋은 공부가 될 것이다.
처음엔 가벼운 데이터 셋으로 시도해보고 그림에 기입하지 않았지만 AWS Redshift, AWS Glue 등 다양한 솔루션을 추가해 심화 학습을 진행할 수 있다.
특히 데이터 시각화를 담당하는 Tableau는 최근 Gartner의 Business intelligence Platforms 부문에서 Microsoft 다음으로 좋은 성적을 거뒀고 salesforce가 협업툴인 "Slack" 또한 보유하고 있기 때문에 상호간 연계 또 기대해 볼만 하다.
딥러닝은 생각보다 우리 생활에 가깝고 밀접한 이론으로부터 시작된다. 이전에 확률론적 관점의 머신러닝과 최적화 관점의 머신러닝을 알아보았지만 이보다 더 쉽게 예시로써 딥러닝에 접근할 수 있다.
우선 AI 딥러닝은 기계가 사람처럼 행동해야한다는 부분이 가장 중요하다. 그리고 사람처럼 행동해야한다는 것은 기계가 사람의 행동처럼 일을 수행하기 위해 예측을 해야한다는 것이다. 이 처럼 미래에 대한 예측을 하는 것이 머신러닝, 딥러닝의 근본이 된다.
머신러닝에는 지도학습과 비지도학습, 강화학습 등의 학습종류가 존재한다. 지도학습은 사전에 답이 있는 데이터를 이용해서 앞으로의 답을 예측하는 학습기법이고 비지도학습은 결과 데이터가 없기 때문에 특정 알고리즘을 이용하여 컴퓨터가 스스로 분류하는 기법이다. 마지막으로 강화학습은 말그대로 컴퓨터가 스스로 배워가며 정확도를 높혀가는 학습기법이라고 할 수 있다.
블로그의 딥러닝 파트는 지도학습부터 진행이된다. 지도학습은 supervised learning이라고 불리며 정답데이터가 존재하는 학습기법이다. 즉, 지도학습기법을 설명하기 위해선 사전에 데이터가 존재하는 예시를 들어야한다.
우선 앞으로의 성적에 대한 예측 시나리오를 예시로 들어보려고 한다.
- 아래 표는 1학기 중간고사와 1학기 기말고사의 데이터이다.
1학기 중간고사
1학기 기말고사
예측 (중간*w1 + 기말*w2)+b
학생1
60
90
81+3 = 84
학생2
60
50
53+3 = 56
1학기 중간고사와 기말고사를 이용해 2학기 중간고사 성적을 예측하기 위해선 일반적으론 더하고 1/n을 해서 평균을 구해 학생1은 75점, 학생2는 55점으로 보는 것이 일반적이다.
하지만 우리는 가중치 w라는 값을 각각의 데이터에 곱해 변수를 줄 것이다. 왜냐하면 중간고사와 기말고사 중 당장 이후 시험에 영향을 조금 더 줄 것같은 데이터는 기말고사라 생각이 들기 때문이다.
이처럼 가중치 w는 데이터의 중요도를 판가름하여 조금 더 현실적인 예측을 하는 역할을 하고 이와같이 설정하면 된다. 그리고 또 현실적인 학습결과를 위해 bias라고하는 값을 더해줄 수도 있다.
여기서 w1은 0.3, w2는 0.7로 설정해 계산했다.
w와 b는 예측결과에 영향을 주고 지도학습은 이 가중치 w와 bias b를 학습해 최적의 값을 구하고 앞으로의 값을 예측하는 기법이 된다.
- 2학기 중간고사 결과 이후
1학기 중간고사
1학기 기말고사
실제 2학기 중간고사
예측
오차
오차^2
학생1
60
90
70
84
-14
196
학생2
60
50
60
56
4
16
해당 표는 실제 2학기 중간고사 결과이며 예측했던 결과와의 오차를 나타낸 표이다.
우리는 이제 오차^2 값을 평균내서 평균제곱오차를 구하고 해당 오차를 줄여 예측값이 실제값과 최대한 일치하도록 목표를 잡으면 된다. 이때 사용되는 것이 loss function이다.
loss function 확률
딥러닝에선 이러한 결과를 이용해 w와 b를 구하게 된다.
< Loss Function >
예측값과 실제값을 통해 오차를 구하고 마이너스 값을 없애기 위해 평균 제곱을 하는 아래와 같은 형태를 가진다.
E(w,b)가 최소값을 갖도록 (w,b)를 구하는 것이 선형회귀의 최종 목표가 된다.
< Hidden Layer >
- 딥러닝은 위와 같이 단순 w1과 w2를 이용해 최적의 가중치와 편향을 구하지 않고 여러 개의 히든레이어를 통해 여러 번 학습시켜 결과를 도출한다.
위 그림에서 보이는 히든레이어는 예측 정확도를 올려주고 각각의 값을 적절하게 계산해 예측결과를 도출시키는 역할을 한다.
하지만 히든레이어는 있거나 없거나 비슷한 결과를 도출하기 때문에 Activation Function으로 비선형적인 예측을 가능하도록 해줘야한다.
<Activation Function>
Activation Function은 각 Hidden Layer마다 다음과 같이 비선형적인 변칙을 줘 다음 레이어에 넘겨준다.
- Activation Function 종류
sigmoid
Hyperbolic tangent
Rectified Linear Units
https://makshay.com/neural-network-basics-the-perceptron해당식은 아래의 식과 같다
하지만 단순히 Hidden Layer와 Activation Function을 통해 w와 b를 구하지 않고 경사하강법 알고리즘을 통해 E(w,b)가 최소값을 갖도록 한다.
2) 경사하강법
1. 임의의 값 선정 2. 임의의 값에서 기울기 계산 3. (임의의 값) - (기울기) * (Learning rate) 4. 기울기가 0에 가까워질 때까지 1~3 반복
E(w,b)가 최소값을 갖도록하는 (w,b)를 구하기 위한 솔루션은 경사하강법이다.
(1) w값을 랜덤으로 선정
(2) w값을 바탕으로 총손실 E를 계산함
(3) 경사하강으로 새로운 w값 업데이트(2), (3) 반복 후 loss가 줄어들지 않을때까지 계산을 반복한다.
현재 w1값에서의 접선의 (learning rate * 기울기)를 w1에서 뺀다.
learning rate는 정말 최소 loss인지 검증하기 위해 곱해줘야한다.
- 문제점 : 고정된 learning rate를 주면 안되기 때문에 learning rate optimizer를 사용한다.
<경사하강법의 한계 해결방법 : learning rate optimizer>
Momentum : 가속도 유지
AdaGrad : 자주변하는 w는 작게, 자주변하면 크게 설정하는 것
RMSProp : AdaGrad와 같은데 제곱하는 것
AdaDelta : AdaGrad인데 a가 너무 작아져서 학습 안되는 것을 방지
Adam : RMSProp + Momentu
< Classification인 경우 손실함수 cross-entropy >
논리적으로 결과 값이 0 또는 1로 나뉘기 때문에 연속된 값을 갖는 선형회귀와 다른 값을 다른 함수로 가져야 한다.
(1) 데이터를 입력 x와 정답 t로 분리
(2) w,b에 랜덤 값
(3) 활성화 함수, 손실함수 정의
(4) 학습율 α
(5) w,b업데이트 반복
- linear regression
- classification
하지만 이와 같은 수식으로 최적의 가중치를 갖게되고 히든레이어를 많이 활용하더라도 비슷한 결과를 도출해내게 된다. 이를 해결하기위해 앞서 언급했던 비선형적인 예측이 가능한 Activation Function이 필요한 것이다.
3) 경사하강법 종류와 경사하강법의 한계
이번엔 경사하강법의 종류를 알아보려고 한다.
그리고 앞서 언급했던 learning rate이 어떻게 탄생했는지 알아보자.
< Batch Gradient Descent = Gradient Descent >
Gradient를 계산하기 위해선 모든 Training 데이터를 합산해야한다. 이를 Batch training이라고 부르고 만약 큰 데이터셋을 가지고 있다면 Batch Training은 비효율적이다.
< Stochastic Gradient Descent (SGD) >
매 반복마다 전체 데이터를 batch로 가져와서 기울기를 계산하는 것이 아니라 w를 업데이트 함에 있어서 randomly하게 한 개만 사용한다.
- 수학적 정의
- 단점
랜덤하기 때문에 선택된 하나가 전체를 대변할 수 없다. => 하지만 변화가 심하더라도 전체적인 경향성은 내려가는 방향이다.
비등방성 (anisotropy) 함수 => 즉, 방향에 따라 성질과 기울기가 달라지는 함수는 탐색경로가 비효율적이다.
< Minibatch Gradient Descent >
SGD는 매우 noisy하기 때문에 전체 데이터셋보다 작은 s개를 선택해서 학습한다.
선택한 s가 많아질수록 noise가 줄어든다.
s는 hyper-parameter
<경사하강법의 한계>
α가 크면 오버피팅, 작으면 여러번 반복해야하는 문제가 있다.
α를 어떻게 설정해야 하는가에 대한 문제가 존재한다.
- 시간적 문제
isotropy : 등방성
반복의 문제, Gradually decay the learning rate to redue the fluctuations
- 공간적 문제
기울기에 대한 크기를 고려하지 않고 같은 α를 곱하면 문제가 생긴다.
α = 1.0e-2이고 등방성이면 좋은 결과
α = 4.0e-2이면 점점 발산하기 시작한다.
- 시간적 공간적 문제를 Adaptive 하게 해결
시간적 문제 해결 : G_t, i_i를 제곱합하니 시간이 지날 수록 값이 커지기 때문에 θ_t+1,i는 작아진다.
공간적 문제 해결 : 자주 바뀌는 occurring feature는 작게 업데이트, 자주 안 바뀌는 infrequent feature는 크게 업데이트
시간과 공간 사이의 밸런스를 맞추며 업데이트하는 방법이고 앞서 언급했던 경사하강법의 한계를 해결해주는 learning rate이 여기서 탄생하게 된다.
- Adaptive Learning Rate Methods
Momentum : 가속도 유지
AdaGrad : 자주변하는 w는 작게, 자주변하면 크게 설정하는 것
RMSProp : AdaGrad와 같은데 제곱하는 것
AdaDelta : AdaGrad인데 α가 너무 작아져서 학습 안되는 것을 방지
Adam : RMSProp + Momentu
< 추가내용 >
가중치의 초기 값은 xavier와 He 초기값이 효과적이다.
xavier 초기값 : 초기값의 표준편차가 1/√n이 되도록 설정 -> 활성화 함수가 선형인 것이 전재 (sigmoid, tanh)
He 초기값 : 앞 계층의 노드가 n개일 때 표준편차가 √(2/n)인 정규분포를 사용 (ReLU), 활성화 값 그래프 분포가 넓어진다.
+ 또 다른 최적화 알고리즘 : Bisection Method
1. 임의의 두 개의 값을 설정 2. 두 값의 y를 비교 3. y가 큰 점을 두 점의 가운데 점으로 바꿈 4. 임의의 두 값의 차이가 작아질 때까지 1~3을 반복
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
n = 100
x = -5 + 15*np.random.rand(n,1)
noise = 10*np.random.randn(n,1)
y = 10 + 1*x+2*x**2+noise
A = np.hstack([x**0, x, x**2])
A = np.asmatrix(A)
theta = (A.T*A).I*A.T*y
print('theta:\n', theta)
xp = np.linspace(np.min(x), np.max(x))
yp = theta[0,0] + theta[1,0]*xp + theta[2,0]*xp **2
plt.figure(figsize = (10,8))
plt.plot(x,y,'o',markersize = 4, label='actual')
plt.plot(xp,yp,'r',linewidth=2, label='estimated')
plt.title('Nonlinear regression', fontsize = 15)
plt.xlabel('X', fontsize = 15)
plt.ylabel('Y', fontsize = 15)
plt.xlim([np.min(x),np.max(x)])
plt.grid(alpha = 0.3)
plt.legend(fontsize = 15)
plt.show()
theta:
[[9.31695129]
[1.13434779]
[2.04402726]]
<3> Polynomial functions
Function Approximation 관점 : target에 가장 근사하게 접근하는 관점
선형 조합으로 대상 함수를 근사화
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
d = 6
xp = np.arange(-1,1,0.01).reshape(-1,1)
polybasis = np.hstack([xp**i for i in range(d)])
plt.figure(figsize = (10,8))
for i in range(d):
plt.plot(xp, polybasis[:,i], label='$x^{}$'.format(i))
plt.title('Polynomial basis', fontsize = 15)
plt.xlabel('X', fontsize = 15)
plt.ylabel('Y', fontsize = 15)
plt.axis([-1,1,-1.1,1.1])
plt.legend(fontsize= 15)
plt.grid(alpha = 0.3)
plt.show()
- Regression + Polynomial basis
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
n = 100
x = -5 + 15*np.random.rand(n,1)
noise = 10*np.random.randn(n,1)
y = 10 + 1*x+2*x**2+noise
xp = np.arange(np.min(x), np.max(x), 0.01).reshape(-1,1)
d = 3
polybasis = np.hstack([xp**i for i in range(d)])
polybasis = np.asmatrix(polybasis)
A = np.hstack([x**i for i in range(d)])
A = np.asmatrix(A)
theta = (A.T*A).I*A.T*y
yp = polybasis*theta
plt.figure(figsize = (10,8))
plt.plot(x,y,'o',label = 'Data')
plt.plot(xp,yp, label='Polynomial')
plt.title('Regression with Polynomial basis', fontsize = 15)
plt.xlabel('X', fontsize = 15)
plt.ylabel('Y', fontsize = 15)
plt.grid(alpha = 0.3)
plt.legend(fontsize= 15)
plt.show()
<4> RBF functions
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
d = 9
u = np.linspace(-1,1,d)
sigma = 0.2
xp = np.arange(-1,1,0.01).reshape(-1,1)
rbfbasis = np.hstack([np.exp(-(xp-u[i])**2/(2*sigma**2)) for i in range(d)])
plt.figure(figsize = (10,8))
for i in range(d):
plt.plot(xp, rbfbasis[:,i], label='$\mu = ()$'.format(u[i]))
plt.title('RBF basis', fontsize = 15)
plt.xlabel('X', fontsize = 15)
plt.ylabel('Y', fontsize = 15)
plt.axis([-1,1,-0.1,1.1])
plt.legend(loc = 'lower right', fontsize= 15)
plt.grid(alpha = 0.3)
plt.show()
- Regression + RBF basis
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
n = 100
x = -5 + 15*np.random.rand(n,1)
noise = 10*np.random.randn(n,1)
y = 10 + 1*x+2*x**2+noise
xp = np.arange(np.min(x), np.max(x), 0.01).reshape(-1,1)
d = 9
u = np.linspace(np.min(x), np.max(x))
sigma = 10
rbfbasis = np.hstack([np.exp(-(xp-u[i])**2/(2*sigma**2)) for i in range(d)])
rbfbasis = np.asmatrix(rbfbasis)
A = np.hstack([np.exp(-(x-u[i])**2/(2*sigma**2)) for i in range(d)])
A = np.asmatrix(A)
theta = (A.T*A).I*A.T*y
yp = rbfbasis*theta
plt.figure(figsize = (10,8))
plt.plot(x,y,'o', label = 'Data')
plt.plot(xp, yp, label = 'RBF')
plt.title('Regression with RBF basis', fontsize = 15)
plt.xlabel('X', fontsize = 15)
plt.ylabel('Y', fontsize = 15)
plt.legend(fontsize= 15)
plt.grid(alpha = 0.3)
plt.show()
3) 과적합
<1> Nonlinear Regression
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
n = 10
x = np.linspace(-4.5,4.5,10).reshape(-1,1)
y = np.array([0.9819,0.7973,1.9737,0.1838,1.3180,-0.8361,-0.6591,-2.4701,-2.8122,-6.2512]).reshape(-1,1)
d = [1,3,5,9]
RSS = []
plt.figure(figsize = (12,10))
plt.suptitle('Nonlinear Regression', fontsize = 15)
A = np.hstack([x**0, x])
A = np.asmatrix(A)
theta = (A.T*A).I*A.T*y
for k in range(4):
xp = np.arange(-4.5,4.5,0.01).reshape(-1,1)
yp = theta[0,0] + theta[1,0]*xp
A = np.hstack([x**i for i in range(d[k]+1)])
polybasis = np.hstack([xp**i for i in range(d[k]+1)])
A = np.asmatrix(A)
polybasis = np.asmatrix(polybasis)
theta = (A.T*A).I*A.T*y
yp = polybasis*theta
RSS.append(np.linalg.norm(y-A*theta, 2 )**2)
plt.subplot(2,2,k+1)
plt.plot(x,y,'o')
plt.plot(xp,yp)
plt.axis([-5,5,-12,6])
plt.title('degree = {}'.format(d[k]))
plt.grid(alpha=0.3)
plt.show()
- RSS(Loss) : Residual Sum of Squares
에러를 제곱한 형태를 뜻한다.
모델의 복잡도 complexity가 커지면 RSS가 줄어든다.
위 식이 항상 best는 아니다.
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
n = 10
x = np.linspace(-4.5,4.5,10).reshape(-1,1)
y = np.array([0.9819,0.7973,1.9737,0.1838,1.3180,-0.8361,-0.6591,-2.4701,-2.8122,-6.2512]).reshape(-1,1)
d = [1,3,5,9]
RSS = []
plt.figure(figsize = (12,10))
plt.suptitle('Nonlinear Regression', fontsize = 15)
A = np.hstack([x**0, x])
A = np.asmatrix(A)
theta = (A.T*A).I*A.T*y
for k in range(4):
xp = np.arange(-4.5,4.5,0.01).reshape(-1,1)
yp = theta[0,0] + theta[1,0]*xp
A = np.hstack([x**i for i in range(d[k]+1)])
polybasis = np.hstack([xp**i for i in range(d[k]+1)])
A = np.asmatrix(A)
polybasis = np.asmatrix(polybasis)
theta = (A.T*A).I*A.T*y
yp = polybasis*theta
RSS.append(np.linalg.norm(y-A*theta, 2 )**2)
plt.figure(figsize = (10,8))
plt.stem(d,RSS, label = 'RSS')
plt.title('Residual Sum of Squares', fontsize = 15)
plt.xlabel('degree',fontsize = 15)
plt.ylabel('RSS', fontsize = 15)
plt.legend(fontsize = 15)
plt.grid(alpha = 0.3)
plt.show()
<Rich Representation>
문제점 : input data에선 에러가 작지만 근처에선 에러가 크고 training data에선 에러가 작지만, 학습 시 사용하지 않았던 testing data에선 에러가 크다.
- RBF Function Overfitting
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
n = 10
x = np.linspace(-4.5,4.5,10).reshape(-1,1)
y = np.array([0.9819,0.7973,1.9737,0.1838,1.3180,-0.8361,-0.6591,-2.4701,-2.8122,-6.2512]).reshape(-1,1)
xp = np.arange(-4.5,4.5,0.01).reshape(-1,1)
d = [2,4,6,10]
plt.figure(figsize = (12,10))
sigma = 5
for k in range(4):
u = np.linspace(-4.5,4.5,d[k])
A = np.hstack([np.exp(-(x - u[i])**2/(2*sigma**2)) for i in range(d[k])])
rbfbasis = np.hstack([np.exp(-(xp-u[i])**2/(2*sigma**2)) for i in range(d[k])])
A = np.asmatrix(A)
rbfbasis = np.asmatrix(rbfbasis)
theta = (A.T*A).I*A.T*y
yp = rbfbasis*theta
plt.subplot(2,2,k+1)
plt.plot(x,y,'o')
plt.plot(xp,yp)
plt.axis([-5,5,-12,6])
plt.title('num RBFs = {}'.format(d[k]), fontsize = 10)
plt.grid(alpha = 0.3)
plt.suptitle('Nonlinear Regression with RBF Functions', fontsize = 15)
plt.show()
정규화 (릿지, 라쏘)를 이용한 과적합 문제를 해결할 수 있다.
4) 정규화
training data를 최소화하는게 아니라 generalization 에러를 최소화 해야한다.
(1) 의도적으로 표현을 못하게 한다. (Polynomial은 차수를 줄이고, RBF는 개수를 줄임) or band width를 크게
(2)
에서 파라미터를 강제로 갖게 만든다 => Regularization (정규화)
import cvxpy as cvx
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-4.5,4.5,10).reshape(-1,1)
y = np.array([0.9819, 0.7973, 1.9737,0.1838,1.3180, -0.8361, -0.6591, -2.4701, -2.8122, -6.2512]).reshape(-1,1)
xp = np.arange(-4.5,4.5,0.01).reshape(-1,1)
d = 10
u = np.linspace(-4.5,4.5,d)
sigma = 1
rbfbasis = np.hstack([np.exp(-(xp-u[i])**2/(2*sigma**2)) for i in range(d)])
A = np.hstack([np.exp(-(x-u[i])**2/(2*sigma**2)) for i in range(d)])
rbfbasis = np.asmatrix(rbfbasis)
A = np.asmatrix(A)
lamb = 0.1
theta = cvx.Variable([d,1])
obj = cvx.Minimize(cvx.sum_squares(A*theta - y) + lamb * cvx.sum_squares(theta))
prob = cvx.Problem(obj, []).solve()
yp = rbfbasis*theta.value
plt.figure(figsize = (10,8))
plt.plot(x,y,'o',label = 'Data')
plt.plot(xp,yp,label = 'Overfitted')
plt.title('(Overfitted) Regression, fontsize = 15')
plt.xlabel('X', fontsize = 15)
plt.ylabel('Y', fontsize = 15)
plt.axis([-5,5,-12,6])
plt.legend(fontsize = 15)
plt.grid(alpha = 0.3)
plt.show()
<Ridge vs Lasso>
- Ridge
0이 없다
bi를 10개 다 써야한다.
세타 값을 작게 만든다.
- Lasso
Feature selecting 사용가능
Sparsity
많은 변수가 0의 값을 가진다. bi를 4개 쓰고 세타 값을 0으로 만든다.
import cvxpy as cvx
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-4.5,4.5,10).reshape(-1,1)
y = np.array([0.9819, 0.7973, 1.9737,0.1838,1.3180, -0.8361, -0.6591, -2.4701, -2.8122, -6.2512]).reshape(-1,1)
xp = np.arange(-4.5,4.5,0.01).reshape(-1,1)
d = 10
u = np.linspace(-4.5,4.5,d)
sigma = 1
rbfbasis = np.hstack([np.exp(-(xp-u[i])**2/(2*sigma**2)) for i in range(d)])
A = np.hstack([np.exp(-(x-u[i])**2/(2*sigma**2)) for i in range(d)])
rbfbasis = np.asmatrix(rbfbasis)
A = np.asmatrix(A)
lamb = 0.1
theta = cvx.Variable([d,1])
obj = cvx.Minimize(cvx.sum_squares(A*theta - y) + lamb * cvx.sum_squares(theta))
prob = cvx.Problem(obj, []).solve()
yp = rbfbasis*theta.value
plt.figure(figsize = (10,8))
plt.title(r'Ridge: magnitude of $\theta$', fontsize = 15)
plt.xlabel(r'$\theta$', fontsize = 15)
plt.ylabel('magnitude', fontsize = 15)
plt.stem(np.linspace(1,10,10).reshape(-1,1), theta.value)
plt.xlim([0.5,10.5])
plt.ylim([-5,5])
plt.grid(alpha = 0.3)
plt.show()
5) Regression 예시
<De-noising signal : 노이즈 줄이기>
시그널은 노이즈에 비해 빠르게 변화하지 않고 이웃한 신호들의 크기는 유사하다
min{ how much x deviates from Xcor + Penalize rapid changes of X}
위의 식의 컬럼 전체 inner product
mu : 첫 번째 텀과 두 번째 텀의 상대적 weight x의 smoothness를 컨트롤한다.
- 실습을 위한 노이즈 그래프 생성
import numpy as np
import matplotlib.pyplot as plt
import cvxpy as cvx
%matplotlib inline
n = 200
t = np.arange(n).reshape(-1,1)
x = 0.5 * np.sin((2*np.pi/n)*t)*(np.sin(0.01*t))
x_cor = x + 0.05*np.random.randn(n,1)
plt.figure(figsize = (10,8))
plt.subplot(2,1,1)
plt.plot(t,x,'-',linewidth = 2)
plt.axis([0,n,-0.6,0.6])
plt.xticks([])
plt.title('original signal', fontsize = 15)
plt.ylabel('$x_{original}$', fontsize = 15)
plt.subplot(2,1,2)
plt.plot(t, x_cor, '-', linewidth = 1)
plt.axis([0,n,-0.6,0.6])
plt.title('corrupted signal', fontsize = 15)
plt.xlabel('n', fontsize = 15)
plt.ylabel('$x_{corrupted}$', fontsize = 15)
plt.show()
- smoothing과 mu의 상관관계
import numpy as np
import matplotlib.pyplot as plt
import cvxpy as cvx
n = 200
t = np.arange(n).reshape(-1,1)
x = 0.5 * np.sin((2*np.pi/n)*t)*(np.sin(0.01*t))
x_cor = x+0.05 * np.random.randn(n,1)
mu = [0,10,100]
D = np.zeros([n-1,n])
D[:,0:n-1] = D[:,0:n-1] - np.eye(n-1)
D[:,1:n] = D[:,1:n] + np.eye(n-1)
for i in range(len(mu)):
A = np.vstack([np.eye(n), np.sqrt(mu[i])*D])
b = np.vstack([x_cor, np.zeros([n-1,1])])
A = np.asmatrix(A)
b = np.asmatrix(b)
x_reconst = (A.T*A).I*A.T*b
plt.subplot(3,1,i+1)
plt.plot(t,x_cor,'-',linewidth=1,alpha=0.3)
plt.plot(t,x_reconst, 'r', linewidth =2)
plt.ylabel('$\mu = {}$'.format(mu[i]), fontsize = 15)
plt.show()
convex optimization 장점 : local solution을 global solution으로 다가가는 방식이기에 최적화 문제에 중요한 솔루션이다! 대부분의 머신러닝 문제는 convex optimizer로 해결이 가능하다
해결과정 예시 : Machine Learning Problem => convex optimizer 인 경우=> CVXPY => approximate solution
<convex Function>
아래 파란 동그라미가 위의 파란 동그라미보다 항상 작은 형태의 볼록 형태 그래프여야 convex Function을 만족한다
<convex set, non-convex set>
non-convex 해결법 : 여러번 반복
****<최적화 문제 풀 때 중요한 부분>****
f의 기울기가 0이 되도록 하는 x^*를 찾는 것이 중요하다!
n차원 벡터일 때 각각의 차원에 대해 편미분을 해 모든 축 방향으로의 기울기를 계산한다.
따로 constained optimization이 없을 때 이와 같은 식이 만족한다.
<Gradient> => Gradient를 이용한 볼록최적화 문제 해결 법
Gradient 문제 1
<1> affine Function
<2> quadratic Function
<3> g(x) = ||Ax+b||^2
Gradient 문제 2
<Gradient로 미분해서 최적 해 찾기>
<이차계획법>
3) 경사하강법
4) 이차형식, 이차계획법
다차항을 표현하는 기법은 이와같이 나타낼 수 있다.
<실습>
실습 1
import numpy as np
import cvxpy as cvx
a = np.array([[0],[1]])
b = np.array([[4],[2]])
Aeq = np.array([0,1])
beq = np.array(0)
x = cvx.Variable(shape = (2,1))
mu = 1
obj = cvx.Minimize(cvx.norm(a-x,2)+mu*cvx.norm(b-x,2))
constraints = [Aeq*x == beq]
prob = cvx.Problem(obj, constraints)
result = prob.solve()
print(x.value)
[[1.33325114e+00]
[5.33304239e-12]]
실습 2
H = np.matrix([[2,0],[0,2]])
g = -np.matrix([[6],[6]])
x = np.zeros((2,1))
alpha = 0.2
for i in range(100):
df = H*x + g
x = x - alpha*df
print(x)
[[3.]
[3.]]