1. SageMaker 개요

  고성능의 저장장치, 급성장한 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 : 사용자가 선택한 알고리즘에 맞는 하이퍼파라미터에 대한 튜닝을 할 수 있다.

9) SageMaker dashboard - Inference

- Compilation jobs, Marketplace model packages, Models, Endpoint configurations, Endpoints, Batch transform jobs, Shadow tests

  •  ML 모델을 쉽게 배포하여 모든 사용 사례에 대해 최고의 가격 대비 성능으로 예측을 수행할 수 있다. 모든 ML 추론 요구 사항을 충족하는 데 도움이 되는 광범위한 ML 인프라 및 모델 배포 옵션을 제공한다.

10) SageMaker dashboard - Edge Manager

- Get started, Edge packaging jobs, Edge device fleets, Edge devices

  • 에지 장치에 대한 모델 관리를 제공하므로 기계 학습 모델을 최적화, 보호, 모니터링 및 유지할 수 있다.

11) Augmented AI

- Human review workflows, Worker task templates, Human review workforces

  • 인적 검토 시스템을 구축하거나 검토자를 관리하는 것에 대한 부담을 줄여주고 모든 개발자에게 ML 예측에 대한 인적 검토를 제공하는 서비스

12) AWS Marketplace

- Model packages, Algorithms, AWS Data Exchange, All products

  • SageMaker는 AWS Marketplace와 통합되어 개발자가 본인의 사전 학습된 모델을 이용하는 다른 사용자에게 비용을 청구할 수 있다

 

3. SageMaker 실습

1)  Notbook Instance 생성

  • Name : demo-notebook-1
  • instance type : ml.t2.medium
  • IAM role 생성

- Jupyter lab 접근

from sklearn import linear_model
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x = np.array([0.1,0.4,0.7,1.2,1.3,1.7,2.2,2.8,3.0,4.0,4.3,4.4,4.9]).reshape(-1,1)
y = np.array([0.5,0.9,1.1,1.5,1.5,2.0,2.2,2.8,2.7,3.0,3.5,3.7,3.9]).reshape(-1,1)
reg = linear_model.LinearRegression()
reg.fit(x,y)
reg.coef_ # theta 1 : array([[0.67129519]])
reg.intercept_ # theta 0 : array([0.65306531])

plt.figure(figsize=(10,8))
plt.title('$L_1$ and $L_2$ Regression', fontsize =15)
plt.xlabel('X', fontsize = 15)
plt.ylabel('Y', fontsize = 15)
plt.plot(x,y,'ko',label="data")

# sklearn은 xp, reg.predict(xp)의 xp를 기입하지 않아도 실행된다.
plt.plot(xp, reg.predict(xp), 'r', linewidth = 2, label = "regression")
plt.legend(fontsize = 15)
plt.axis('equal')
plt.xlim([0,5])
plt.grid(alpha=0.3)
plt.show()

 

2) studio

<s3 버킷 생성>

  • kaggle에서 다운로드
  • 데이터 업로드
  • input : csv
  • out 폴서 생성

 

<studio 생성>

- 도메인 생성

  • 이름 입력
  • vpc 설정

 

- studio

  • role 설정
  • 접속
  • automl선택

 

- new autopilot 생성

  • 이름
  • s3 버킷 입력
  • dataset file name : train.csv 넣기
  • target : label 
  • 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" 또한 보유하고 있기 때문에 상호간 연계 또 기대해 볼만 하다.

 

 

5. 클라우드와 MSA 환경에서의 AI Insight

Hidden Technical Debt in Machine Learning Systems

https://proceedings.neurips.cc/paper/2015/file/86df7dcfd896fcaf2674f757a2463eba-Paper.pdf

 

- 실제 AI에서의 코딩과 모델링이 시행되는 기간 및 범위는 굉장이 작다.

  • 기업들이 모델링보다 데이터의 자체의 퀄리티가 중요하다고 판단하고 있다. 아래 그래프를 보면 단순 데이터 부족 문제가 존재하지만 데이터 품질도 적절하지 않아 AI를 채택하지 못하는 회사가 그 중 18%나 된다.
  • 현실은 위와 같은 시스템을 가지고 있기 때문에 ML 기반 파이프라인과 인프라가 중요해졌고 MLOps의 중요성을 보여준다.

- 다수의 회사가 위와 같은 솔루션을 채택하지 못하는 문제를 겪고 있다

 

https://www.oreilly.com/radar/ai-adoption-in-the-enterprise-2021/ https://www.oreilly.com/radar/ai-adoption-in-the-enterprise-2022/

19% : 숙련된 사람이 부족하거나 필요한 역할을 고용하는 데 어려움
18% : 데이터 부족 또는 데이터 품질 문제
17% : 적절한 비즈니스 사용 사례 식별의 어려움
14% : 기업 문화는 아직 AI의 필요성을 인식하고 있지 않음
  • 데이터사이언티스트는 MSA 쿠버네티스 환경에서 최적의 머신러닝 딥러닝 학습을 해야하는 상황에 직면해 연구와 프로덕션을 같이 진행할 수 밖에 없다.
  • kubeflow와 같은 쿠버네티스 환경 머신러닝 파이프라인 솔루션이 존재하지만 데이터사이언티스트가 쿠버네티스 환경까지 이해해야하는 어려움이 아직 존재하고 지속적인 통합, 지속적인 배포, 지속적인 학습을 수행해야하는 DevOps와 AI에 대한 역량이 필요하기 때문이다.
  • 이로인해 숙련된 사람이 적고 적절한 비즈니스 사례를 찾기 어려운 상태이다.
  • kubeflow 이상의 편의성을 제공하고 데이터사이언티스트가 쿠버네티스를 이해하지 못하더라도 쉽게 파이프라인을 구축할 수 있는 오픈소스가 출시된다면 수요가 급증할 수 있다

 

< 컨퍼런스 참고 내용 >

<딥러닝 적용 시 문제였던 점>
1. 데이터가 정제화되지 않은 문제
     => data centric ai

2. 복잡도 증가
     => MLOps기반 ml플랫폼 활용

3. 지도학습은 다량의 이미지 데이터 필요
     => 지도학습 외 저비용 학습 기법 사용

4. 반복적인 재학습이 필요하다는 문제
     => 점진적 학습을 위한 ml 플랫폼 경험 축적 및 운영 커스터마이징

5. 데이터 접근 제한성
=> 현장 데이터 기반 end to end vision ai 응용 개발
728x90

1. 딥러닝 기초

1) 딥러닝 기초

  • 딥러닝은 생각보다 우리 생활에 가깝고 밀접한 이론으로부터 시작된다. 이전에 확률론적 관점의 머신러닝과 최적화 관점의 머신러닝을 알아보았지만 이보다 더 쉽게 예시로써 딥러닝에 접근할 수 있다.
  • 우선 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을 반복

 

728x90

7. Linear Regression


<Linear Regression 참고>

  • ŷ과 실제 output인 y^(i)의 차에 합 또는 평균 낸 값을 최소로 내는 ω를 찾는 것

1) 선형회귀

- 최소자승법 이용

<실습>

실습 1 : Linear Regression 실습

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x = np.array([0.1,0.4,0.7,1.2,1.3,1.7,2.2,2.8,3.0,4.0,4.3,4.4,4.9]).reshape(-1,1)
y = np.array([0.5,0.9,1.1,1.5,1.5,2.0,2.2,2.8,2.7,3.0,3.5,3.7,3.9]).reshape(-1,1)
plt.figure(figsize=(10,8))
plt.plot(x,y,'ko')
plt.title('Data',fontsize =15)
plt.xlabel('X',fontsize=15)
plt.ylabel('Y',fontsize=15)
plt.axis('equal')
plt.grid(alpha=0.3)
plt.xlim([0,5])
plt.show()

- 세타 구하기

import numpy as np
m = x.shape[0]
A = np.hstack([np.ones([m,1]),x])
A = np.hstack([x**0,x])
A = np.asmatrix(A)
theta = (A.T*A).I*A.T*A
print(A)


[[1.  0.1]
 [1.  0.4]
 [1.  0.7]
 [1.  1.2]
 [1.  1.3]
 [1.  1.7]
 [1.  2.2]
 [1.  2.8]
 [1.  3. ]
 [1.  4. ]
 [1.  4.3]
 [1.  4.4]
 [1.  4.9]]

- 직선 combine

plt.figure(figsize=(10,8))
plt.title('Regression',fontsize =15)
plt.xlabel('X',fontsize=15)
plt.ylabel('Y',fontsize=15)
plt.plot(x,y,'ko',label="data")

xp = np.arange(0,5,0.01).reshape(-1,1)
yp = theta[0,0]+theta[1,0]*xp
plt.plot(xp,reg.predict(xp), 'r',linewidth=2,label="regression")
plt.legend(fontsize =15)
plt.axis('equal')
plt.grid(alpha=0.3)
plt.xlim([0,5])
plt.show()

 

실습 2 : CVXPY를 이용한 최적화 솔루션

import cvxpy as cvx
theta1 = cvx.Variable([2,1])
obj = cvx.Minimize(cvx.norm(A*theta1 - y,1))  # theta 1
prob = cvx.Problem(obj,[])
result = prob.solve()
print('theta1:\n', theta1.value)

theta2 = cvx.Variable([2,1])
obj = cvx.Minimize(cvx.norm(A*theta2 - y, 2)) # theta 2
prob = cvx.Problem(obj,[])
result = prob.solve()
print('theta2:\n', theta2.value)



theta1:
 [[0.6258404 ]
 [0.68539899]]
theta2:
 [[0.65306531]
 [0.67129519]]

 

- 그래프 생성

plt.figure(figsize=(10,8))
plt.title('$L_1$ and $L_2$ Regression', fontsize =15)
plt.xlabel('X', fontsize = 15)
plt.ylabel('Y', fontsize = 15)
plt.plot(x,y,'ko',label="data")

xp = np.arange(0,5,0.01).reshape(-1,1)
yp1 = theta1.value[0,0] + theta1.value[1,0]*xp
yp2 = theta2.value[0,0] + theta2.value[1,0]*xp

plt.plot(xp,yp1, 'b', linewidth =2, label = '$L_1$')
plt.plot(xp,yp2, 'r', linewidth =2, label = '$L_2$')
plt.legend(fontsize = 15)
plt.axis('equal')
plt.xlim([0,5])
plt.grid(alpha=0.3)
plt.show()

- L1과 L2의 outliers에 대한 차이는 분명하다

from sklearn import linear_model
import numpy as np
import matplotlib.pyplot as plt
import cvxpy as cvx
%matplotlib inline
x = np.array([0.1,0.4,0.7,1.2,1.3,1.7,2.2,2.8,3.0,4.0,4.3,4.4,4.9]).reshape(-1,1)
y = np.array([0.5,0.9,1.1,1.5,1.5,2.0,2.2,2.8,2.7,3.0,3.5,3.7,3.9]).reshape(-1,1)
x = np.vstack([x,np.array([0.5,3.8]).reshape(-1,1)])
y = np.vstack([y,np.array([3.9,0.3]).reshape(-1,1)])
A = np.hstack([x**0, x])
A = np.asmatrix(A)

theta1 = cvx.Variable([2,1])
obj1 = cvx.Minimize(cvx.norm(A*theta1 - y, 1))
prob1 = cvx.Problem(obj1).solve()

theta2 = cvx.Variable([2,1])
obj2 = cvx.Minimize(cvx.norm(A*theta2 - y, 2))
prob2 = cvx.Problem(obj2).solve()

plt.figure(figsize = (10,8))
plt.plot(x,y,'ko',label='data')
plt.title('$L_1$ and $L_2$ Regression w/ Outliers', fontsize = 15)
plt.xlabel('X', fontsize = 15)
plt.ylabel('Y', fontsize = 15)

xp = np.arange(0,5,0.01).reshape(-1,1)
yp1 = theta1.value[0,0] + theta1.value[1,0]*xp
yp2 = theta2.value[0,0] + theta2.value[1,0]*xp

plt.plot(xp,yp1,'b', linewidth=2,label = '$L_1$')
plt.plot(xp,yp2,'r', linewidth=2,label = '$L_2$')
plt.axis('scaled')
plt.xlim([0,5])
plt.legend(fontsize = 15, loc = 5)
plt.grid(alpha = 0.3)
plt.show()

 

실습 3 : CVXPY를 이용한 최적화 솔루션 => 위와 동일 결과

from sklearn import linear_model
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x = np.array([0.1,0.4,0.7,1.2,1.3,1.7,2.2,2.8,3.0,4.0,4.3,4.4,4.9]).reshape(-1,1)
y = np.array([0.5,0.9,1.1,1.5,1.5,2.0,2.2,2.8,2.7,3.0,3.5,3.7,3.9]).reshape(-1,1)
reg = linear_model.LinearRegression()
reg.fit(x,y)
reg.coef_ # theta 1 : array([[0.67129519]])  계수
reg.intercept_ # theta 0 : array([0.65306531])   바이어스
plt.figure(figsize=(10,8))
plt.title('$L_1$ and $L_2$ Regression', fontsize =15)
plt.xlabel('X', fontsize = 15)
plt.ylabel('Y', fontsize = 15)
plt.plot(x,y,'ko',label="data")

# sklearn은 xp, reg.predict(xp)의 xp를 기입하지 않아도 실행된다.
plt.plot(xp, reg.predict(xp), 'r', linewidth = 2, label = "regression")
plt.legend(fontsize = 15)
plt.axis('equal')
plt.xlim([0,5])
plt.grid(alpha=0.3)
plt.show()

 

2) 다중 선형 회귀

<1> Linear Regression : multivariate data

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D

n = 200
x1 = np.random.randn(n,1)
x2 = np.random.randn(n,1)
noise = 0.5*np.random.randn(n,1);
y = 2+1*x1+3*x2 + noise

fig = plt.figure(figsize = (10,8))
ax = fig.add_subplot(1,1,1,projection = '3d')
ax.set_title('Generated Data', fontsize = 15)
ax.set_xlabel('$x_1$', fontsize = 15)
ax.set_ylabel('$x_2$', fontsize = 15)
ax.set_zlabel('Y', fontsize = 15)
ax.scatter(x1,x2,y,marker = '.', label = 'Data')
ax.view_init(30,0)
plt.legend(fontsize=15)
plt.show()

A = np.hstack([x1**0,x1,x2])
A = np.asmatrix(A) # basis function
theta = (A.T*A).I*A.T*y
x1, x2 = np.meshgrid(np.arange(np.min(x1), np.max(x1),0.5),
                     np.arange(np.min(x2), np.max(x2),0.5))
YP = theta[0,0] + theta[1,0]*x1 + theta[2,0]*x2

fig = plt.figure(figsize = (10,8))
ax = fig.add_subplot(1,1,1,projection = '3d')
ax.set_title('Regression', fontsize = 15)
ax.set_xlabel('$x_1$', fontsize = 15)
ax.set_ylabel('$x_2$', fontsize = 15)
ax.set_zlabel('Y', fontsize = 15)
ax.scatter(x1, x2, y, marker = '.', label = 'Data')
ax.plot_wireframe(x1,x2,YP,color = 'k', alpha = 0.3, label = 'Regression Plane')
plt.legend(fontsize = 15)
plt.show()

 

 

 

<2> Nonlinear Regression : multivariate data

 

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()

mu = 100
x_reconst = cvx.Variable([n,1])
obj = cvx.Minimize(cvx.sum_squares(x_reconst - x_cor) + mu *cvx.sum_squares(D*x_reconst))
prob = cvx.Problem(obj).solve()

plt.figure(figsize = (10,4))
plt.plot(t, x_cor, '-', linewidth=1, alpha=0.3, label='corrupted')
plt.plot(t, x_reconst.value, 'r', linewidth =2, label = 'reconstructed')
plt.title('$\mu = {}$'.format(mu), fontsize = 15)
plt.legend(fontsize = 12)
plt.show()

 

- 일부 그래프에선 L2 norm을 사용하면 노이즈를 복원하기 어렵다. 노이즈가 아닌부분도 노이즈로 인식하기 때문이다.

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)
plt.figure(figsize = (10,12))
beta = [0.5,2,4]
for i in range(len(beta)):
  x_reconst = cvx.Variable([n,1])
  obj = cvx.Minimize(cvx.norm(x_reconst[1:n] - x_reconst[0:n-1],2))
  const = [cvx.norm(x_reconst - x_cor, 2) <= beta[i]]
  prob = cvx.Problem(obj,const).solve()
  plt.subplot(len(beta), 1, i+1)
  plt.plot(t,x_cor, linewidth =1, alpha =0.3)
  plt.plot(t, x_reconst.value, 'r', linewidth =2)
  plt.ylabel(r'$\beta = {}$'.format(beta[i]), fontsize = 15)
plt.show()

(왼) L2 (오) L1

plt.figure(figsize = (10,12))
gammas = [0,2,7]
for i in range(len(gammas)):
  x_reconst = cvx.Variable([n,1])
  obj = cvx.Minimize(cvx.norm(x_reconst - x_cor, 2) + gammas[i]*cvx.norm(D*x_reconst, 2))
  '''
  제약조건 L2norm
  beta = 0.8
  obj = cvx.Minimize(cvx.norm(D*x_reconst, 2))
  const = [cvx.norm(x_reconst - x_cor, 2) <= beta]
  plt.figure(figsize = (10,4))
  '''
  prob = cvx.Problem(obj).solve()
  plt.subplot(3,1,i+1)
  plt.plot(t,x_cor, '-', linewidth = 1, alpha = 0.3)
  plt.plot(t,x_reconst.value, 'r', linewidth = 2)
  plt.ylabel('$ \gamma = {}$'.format(gammas[i]), fontsize = 15)
plt.show()

- Signal with Sharp Transition + Noise

  • 대부분 smoothing하지만 일부분이 급격하게 달라지는 그래프에 대한 처리
  • L2보다 L1이 처리를 더 잘하는 것으로 확인할 수 있다.
# Signal with sharp Transition * Noise
n = 200
t = np.arange(n).reshape(-1,1)
exact = np.vstack([np.ones([50,1]), -np.ones([50,1]), np.ones([50,1]), -np.ones([50,1])])
x = exact + 0.5*np.sin((2*np.pi/n)*t)
x_cor = x + 0.1*np.random.randn(n,1)
plt.figure(figsize = (10,8))
plt.subplot(2,1,1)
plt.plot(t,x)
plt.ylim([-2.0, 2.0])
plt.ylabel('signal', fontsize = 15)
plt.subplot(2,1,2)
plt.plot(t, x_cor, linewidth = 1)
plt.ylabel('corrupted signal', fontsize = 15)
plt.xlabel('x', fontsize = 15)
plt.show()

(왼) L2, (오) L1

- 사진 smoothing

import cv2
imbw = cv2.imread('사진경로',0)
row = 150
col = 150
resized_imbw = cv2.resize(imbw,(row,col))
plt.figure(figsize = (8,8))
plt.imshow(resized_imbw, 'gray')
plt.axis('off')
plt.show()

n = row*col
imbws = resized_imbw.reshape(-1,1)
beta = 1500
x = cvx.Variable([n,1])
obj = cvx.Minimize(cvx.norm(x[1:n] - x[0:n-1],1))
const = [cvx.norm(x - imbws, 2) <= beta]
prob = cvx.Problem(obj, const).solve()
imbwr = x.value.reshape(row,col)
plt.figure(figsize = (8,8))
plt.imshow(imbwr, 'gray')
plt.axis('off')
plt.show()

- 예시 결과

 

< 추가 실습 >

- Python

https://kyudon.tistory.com/279

 

- R

728x90

6. 추가적인 수학적 개념

1) Activation Function

<sign 함수>

  • sign 함수는 -1 or 1 부호측정을 위해 사용한다.

<sigmoid 함수>

- sigmoid 수식

<sigmoid vs softmax>

- sigmoid

  • 분류에서 binary-classifcation으로 사용된다.
  • 확률의 총합이 0은 아니고 활성화 함수로 사용한다.

- softmax

  • 분류에서 multi-classification으로 사용되고 확률의 총합이 출력층에서 사용된다.

<ReLU 함수>

  • 양수만 출력하기에 출력이 느리고 0만 출력하는 축은 ReLU발생

<leaky ReLU 함수>

  • x가 음수일 때 입력값의 1/10 출력
  • x<0에서 미분이 0이 아님

<PReLU 함수>

  • x<0에서 기울기를 학습

<Maxout 함수>

  • i=1,...,k (k: 선형구간 계수)

<Swish 함수>

 

2) 삼각함수

 -
-

 

3) 등차수열, 등비수열

 

4) 초등함수 미분

 

5) 합성함수의 미분 (Chain rule)

- 변수가 1개

- 변수가 여러 개

- 곱의 법칙

 

6) 확률분포

A,B가 독립사건일 때

- 결합확률

- 조건부확률

- 기댓값 : 나올 것이라고 예상하는 값

- 공분산 : 두 변수의 상관관계를 나타냄

  • 양의 관계 : 한 쪽이 증가하면 다른 쪽도 증가
  • 음의 관계 : 한 쪽이 증가하면 다른 쪽은 감소

- 상관계수 (correlation coefficient) : 단위가 없는 무차원의 수

  • 공분산을 각각의 표준편차로 나누어 단위로 없애버린 값
  • 절대 값 : 상관관계의 정도, 0에 가까우면 상관관계가 약함

7) 최대 가능도 추정 (얻은 관측 결과를 통해 추정) => 과거의 데이터로 미래 예측

  • 파라미터 θ에 대한 가능도함수 L(θ)를 최대화하는 θ를 구하는 것

EX) 주사위를 던졌을 때 1이 나올 확률 (주사위를 100번 던졌을 때 |0| 20번 나온 상황

  • 미분해서 0이 나오는 값 찾기

* 가능도 함수를 최대로하는 θ는 "로그가능도 함수"에 대해 다음을 만족 (고차원 방정식 => 1차방정식)

8) 선형 회귀

- 추정하고 싶은 변수 : 목적변수 (objective), 종속변수 (dependent)

- 추정하는데 필요한 변수 : 설명변수 (explanatory), 독립변수 (independent)

- 질적 데이터

  • 명목척도 : 분류나 구별
  • 서열척도 : 대소가 의미

- 양적 데이터

  • 동간척도 : 간격에 의미
  • 비율척도 : 비례에도 의미

<정규화로 과대학습 줄이기>

  • 정규화 : 모델이 복잡해질수록 일종의 패널티를 줘 과학습을 억제한다. 목적함수에 L1, L1norm을 더하고 목적함수를 최소화하는 가중치 set을 구하면 과적합이 억제된다.
<모델 성능 평가 지표>
MSE : 작을수록 좋음
R^2 : 1에 가까울수록 좋음

이미지 인식에서 입력 데이터의 갯수 : 이미지 사이즈 X 채널 수

- 튜닝 : 학습데이터로 학습된 모델을 테스트 데이터로 검증

- 검증용 데이터 셋을 만드는 방법

  • 홀드아웃 교차 검증법 : 하나의 데이터 셋을 학습 데이터로 바꾸기
  • k-분할 교차 검증법 : 데이터 셋을 k개로 분할, k번에 걸쳐 학습데이터, 테스트 데이터의 조합을 바꿔쓰는 것

9) 자연어처리

1. 자연어의 덩어리를 단어수준으로 잘게 쪼갠다
2. 쪼개진 요소들 간에 연결관계를 식별한 다음 (구문) : 어디까지가 명사구, 동사구인지 파악
3. 말의 의미나 특징을 찾아낸다
-> 수학적인 개념으로 표현 가능해야한다. 이때 사용하는 것이 벡터 => 벡터 공간 분석

- N-gram 분석 : 문장에서 한 글자씩 뒤로 가면서 k개의 단위로 끊는다.

  • 속도가 빠르지만 데이터 양이 너무 많아지고 의도와 다른 단어가 나올 수 있다.
  • 스톱워드 : 문장의 특징과 관련없는 단어들 이라는 뜻이다.

10) Bag-of-words (Bow) 벡터 : 해당 단어의 출현 횟수를 요소로 만든 벡터

11) 특징어

  • 어떤 기준에 대해 공통적이거나 특징을 잘 들어내는 주목해야할 단어
  • ex) 과학의 '법칙', 인물의 '사상'

- TF-IDF : 특징어 찾기

  • TF-IDF : TF*IDF
  • TF : 특정 단어의 출현횟수를 모든 단어의 출현횟수로 나눈 값 => 어떤 문어에서 특정 단어가 자주 나온다면 특징어가 될 확률이 높다
  • IDF : 특정 단어를 포함한 문장 갯수로 전체 문장 개수를 나누고 로그를 사용한다.

12) 로지스틱 함수

- 이때의 목적함수

 

- 교차엔트로피 오차함수

- 과학습을 피하기 위해 L2 정규화 적용

 

=> 이러한 도구를 이용하고 여러개의 이진 클래스 분류기로 이루어진 다중클래스 판별기 이용

 

<혼동행렬>

  예측
실제   거짓
TP FN
거짓 FP TN

 

- Persision 정밀도

- Recall 재현율

- F값

 

728x90

5. 최적화와 볼록 최적화


<최적화 모델 참고>

  • 최적화 문제를 풀 땐 모델링을 하고 최적화의 해를 풀어야한다.

- 수학적 표준 모델

- 등가변환


1) 최적화 표준모델

  • 이번 장은 최적화된 표준모델에 대해 알아보고 최적의 해를 구하는 과정에 대해 설명한다.
  • 기본요소 : 목적함수, 변수, 제약조건

<최적화의 종류>

  • (제약조건이 있는 것 vs 없는 것) + 볼록 최적화

 

2) 볼록 최적화 (Convex Optimization)

  • 볼록 함수 : convex function
  • 볼록 셋 : convex set

 

- 두 점 사이의 선형 보간

  • 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.]]

 

728x90

4. 최소자승법

1) 최소자승법 : skinny는 일반적으로 해가 없기 때문에 근사값을 찾기 위해 min ||E||^2를 찾아야한다.

AX ≠ B 이지만 AX-B ≠ 0 이므로 0에 가장 가까운 X값을 구하는 것이 Machine Leaning의 근본이다.

- 서로 같지 않지만 서로를 가장 근사하게 하는 x1과 x2를 구한다.

  • 일반적으로 B는 방향을 알 수 없기 때문에 X축 투영을 하면 E값이 최소화 된다.

 

2) 직교투영

  • ω와 Y와 방향이 같기 때문에 위와 같이 표현가능하다.

  • X와 Y가 얼마나 유사한지 X와 Y가 같다면 1, 각이 커질수록 분자가 작아진다

=> 코사인 유사도

 

 

 

 

- Projection of B onto a subspace U of span of A1 and A2

되게하는 X^*를 찾는다.


암기 중요!


<최소자승법 증명>

 

<실습>

실습 1

import cvxpy as cvx
import numpy as np
f = np.array([[3],[3/2]])
lb = np.array([[-1],[0]])
ub = np.array([[2],[3]])
x = cvx.Variable(shape=(2,1))
obj = cvx.Minimize(-f.T*x)
constraints = [lb <= x, x <= ub]
prob = cvx.Problem(obj, constraints)
result = prob.solve()
print(x.value)
print(result)


[[1.99999999]
 [2.99999999]]
-10.499999966365493

 

 

실습 2

 

f = np.array([[3],[4]])
H = np.array([[1/2,0],[0,0]])
A = np.array([[-1,-3],[2,5],[3,4]])
b = np.array([[-15],[100],[80]])
lb = np.array([[0],[0]])
x = cvx.Variable(shape=(2,1))
obj = cvx.Minimize(cvx.quad_form(x,H) + f.T*x)
constraints = [A*x <= b, lb <= x]
prob = cvx.Problem(obj, constraints)
result = prob.solve()
print(x.value)


[[-1.15591357e-25]
 [ 5.00000000e+00]]

 

728x90

3. 다원 일차 연립 방정식

1) Well-Determined Linear Systems

  • unknown = constraint
  • 해가 존재한다.

2) Under-determined Linear Systems

  • unknown > constraint
  • 해가 무수히 많다.

3) Over-determined Linear Systems => Machine Learning

  • unknown < constraint
  • 해가 없다.

  • 머신러닝은 Over-determined 된 Linear Systems에서 사용된다.

<실습>

실습 1

import numpy as np
theta = 30/180*np.pi
R = np.matrix([[np.cos(theta), -np.sin(theta)],
               [np.sin(theta), np.cos(theta)]])
x = np.matrix([[1],[0]])
y = R*x
print(y)


[[0.8660254]
 [0.5      ]]

 

실습 2

P = np.matrix([[1,0],
               [0,0]])
x = np.matrix([[1],
               [1]])
y = P*x
print(y)
D,V = np.linalg.eig(P)
print(D)
print(V)


[[1]
 [0]]
[1. 0.]
[[1. 0.]
 [0. 1.]]

 

실습 3

X = np.matrix([[1],[1]])
Y = np.matrix([[2],[0]])
X.T*Y
Y.T*Y
omega = (X.T*Y)/(Y.T*Y)
omega = float(omega)
W = omega*Y
print(W)


[[1.]
 [0.]]

 

실습 4

A = np.matrix([[1,0],[0,1],[0,0]])
B = np.matrix([[1],[1],[1]])
X = (A.T*A).I*A.T*B
print(X)
Bstar = A*X
print(Bstar)


[[1.]
 [1.]]
[[1.]
 [1.]
 [0.]]
728x90

2. 고유치와 고유벡터

1) EigenVector and EigenValue

  • EigenVector : 행렬 A에 해당하는 선형변환을 찾고 선형변환의 전후 Vector의 방향이 변하지 않는 것, 해당 상수배 값을 EigenValue라고 한다.
  • 벡터 v는 EigenVector라 부르고 그 해당하는 λ는 EigenValue라 부른다.

  • λ * 벡터v : stretched vector
  • A * 벡터v : transformed vector (rotate + stretch), A를 통해 변환을 해도 방향이 변하지 않는 것을 찾는 것
  • 크기의 변화보다 방향의 변화가 중요!!



역행렬 존재하지 않으면

det(A-λI)=0 성립 => determinant(행렬식)

 

- Projection을 이용한 EigenValue, EigenVector 구하기

 

X축으로 Projection을 하면

이므로

 

 

- Projection으로 구하기

 

- Projection onto the Plane

 

728x90

+ Recent posts