Pytorch Tutorials

https://tutorials.pytorch.kr/

 

파이토치(PyTorch) 한국어 튜토리얼에 오신 것을 환영합니다!

파이토치(PyTorch) 한국어 튜토리얼에 오신 것을 환영합니다. 파이토치 한국 사용자 모임은 한국어를 사용하시는 많은 분들께 PyTorch를 소개하고 함께 배우며 성장하는 것을 목표로 하고 있습니다.

tutorials.pytorch.kr

 

 

 

Pytorch_Brief Tutorials

 

0. Why PyTorch?

🤔 Tensorflow:
∙Google에서 개발
∙딥러닝전용하드웨어인 TPU를 갖고 있어 GPU에서 상대적으로 자유로움

🤔 Pytorch:
∙facebook의 주도하에 개발, 
∙Nvidia의 cuda GPU에 더욱 최적화
∙Python First, 깔끔한 코드, numpy와의 호환성, Autograd, Dynamic Graph 등의 장점

 

 

1. Tensor

pytorch의 tensor는 numpy의 배열인 ndarray와 같은 개념으로
pytorch에서 연산을 수행하기 위한 가장 기본적인 객체이다. (앞으로의 모든 연산은 이 tensor 객체를 통해서 진행)

ex) numpy와 pytorch는 굉장히 비슷한 방식의 코딩스타일을 갖는다.
(자료형의 경우에도 torch.uint8과 같이 표기가 가능)
import numpy as np
x = np.array([[1,2], [3,4]])

import torch
x = torch.Tensor([[1,2], [3,4]])

cf) torch.Tensor는 default로 float32를 갖는다.

 

 

2. Autograd

Autograd는 자동으로 미분 및 역전파를 수행하는 기능이다.
즉, 대부분의 tensor간의 연산을 크게 신경 쓸 필요 없이 역전파알고리즘 수행 명령어를 호출할 수 있다.

이때, tensor간의 연산을 수행할 때마다 동적으로 computational graph를 생성하며,
연산의 결과물이 어떤 tensor로부터 어떤 연산을 통해 왔는지 또한 추적한다.
→ 결과적으로 최종 스칼라값에 역전파를 통한 미분을 수행 시, 각 tensor는 자식노드에 해당하는 tensor와 연산을 자동으로 찾아 역전파알고리즘을 계속 수행할 수 있게한다.


🤔 기존 keras 및 tensorflow와 다른점??
keras tensorflow 미리 정의한 연산들을 컴파일을 통해 고정, 정해진 입력에 맞춰 tensor를 순전파 시켜야 한다.

반면, Pytorch 정해진 연산이 없고 모델은 배워야 하는 parameter tensor만 미리 알고있다
즉, 가중치들이 어떠한 연산을 통해 학습 or 연산에 관여하는지 알 수 없고, 연산이 수행된 직 후 알 수 있다.

기울기를 구할 필요가 없는 연산의 경우, 다음과 같은 with 문법을 사용해 연산을 수행할 수 있는데, 이는 prediction과 inference등을 수행할 때 유용하며, 기울기를 구하기 위한 computational graph 생성 등의 사전작업을 생략하여 연산속도 및 메모리 사용측면에서도 큰 이점이 존재한다.
with torch.no_grad():
	z = (x+y) + torch.Tensor(2,2)​

 

 

3.  nn.Module

nn.Module 클래스는 사용자가 그 위에서 필요한 모델 구조를 구현할 수 있게 해준다.
nn.Module을 상속한 사용자클래스는 다시 내부에 nn.Module을 상속한 클래스객체를 선언 및 변수로 사용할 수 있다.

ex) Feed Forward 구현
import torch
import torch.nn as nn

def linear(x, W, b):
	return torch.mm(W, x) + b

class MyLinear(nn.Module):
	def __init__(self, input_size, output_size):
    	super().__init__()
        	self.W = torch.FloatTensor(input_size, output_size)
            self.b = torch.FloatTensor(output_size)
   
   	def forward(self, x):
    	y = torch.mm(self.W, x) + self.b
        return y
        
        
        
x = torch.Tensor(16, 10)
linear = MyLinear(10, 5)
y = linear(x)​
x ∈ R16×10
W ∈ R 10×5
b ∈ R5

>>> print([p.size() for p in linear.parameters()])
>>> [ ]​
다만, 현재 parameter(W, b)의 경우, [ ]로 학습가능한 파라미터가 없다고 출력된다.
따라서 Parameter 클래스를 사용해 tensor를 감싸야 한다.

import torch
import torch.nn as nn

def linear(x, W, b):
	return torch.mm(W, x) + b

class MyLinear(nn.Module):
	def __init__(self, input_size, output_size):
    	super().__init__()
        	self.W = nn.Parameter(torch.FloatTensor(input_size, output_size), requires_grad=True)
            self.b = nn.Parameter(torch.FloatTensor(output_size), requires_grad=True)
   
   	def forward(self, x):
    	y = torch.mm(self.W, x) + self.b
        return y
        
        
        
x = torch.Tensor(16, 10)
linear = MyLinear(10, 5)
y = linear(x)​​

위의 경우, 출력값으로 [torch.Size([10, 5]), torch.Size([5])] 가 출력된다.

 

 

4.  train()과 eval()

Backpropagation Algorithm의 경우, backward()함수를 이용해 진행가능하며, 이때 loss함수를 앞에 붙이는 형태로 표현한다.
loss.backward()​



train과 eval함수는 모델에 대한 training time과 inference time의 모드를 쉽게 전환할 수 있는 방법이다.
nn.Module을 상속받아 구현∙생성된 객체는 기본적으로 train모드로 이를 eval()을 사용해 추론모드로 바꿀 수 있다.
이는 Dropout, Batch Norm 같은 학습시와 추론 시 서로 다른 forward()동작을 하는 모듈들에도 올바르게 동작할 수 있다.
다만, 추론이 끝나면 다시 train()을 선언 해 원래의 train모드로 돌아가줘야 한다.

 

 

5.  GPU 사용하기

cuda() 함수
① 원하는 tensor객체를 GPU메모리에 복사하거나 
② nn.Module의 하위클래스를 GPU메모리로 이동시킬 수 있다.
x = torch.cuda.FloatTensor(16, 10)

linear = MyLinear(10, 5)
linear.cuda()

y = linear(x)​


cpu() 함수
다시 PC의 메모리로 복사하거나 이동시킬 수 있다.

to() 함수
tensor 또는 모듈을 원하는 device로 보낼 수 있다.

 

 

 

 

6.  Pytorch에서 DNN을 수행하는 과정 요약 및 예시

 nn.Module 클래스를 상속받아 forward함수를 통해 모델구조 선언
 해당 클래스 객체 생성
 Optimizer 생성, 생성한 모델의 parameter를 최적화대상으로 등록
 Data로 mini-batch를 구성, 순전파 연산그래프 생성
 손실함수를 통해 최종결과값, 손실값 계산
 손실에 대해서 backward() 호출
  → 이를통해 연산그래프 상의 tensor들의 gradient가 채워짐
 ③의 optimizer에서 step()을 호출, 1 step 수행
 ④로 돌아가 반복

 

 

 

 

 

 

 

7.  Pytorch 실습

[Linear Regression 분석]

📌 조건

∙ 임의로 tensor를 생성, 근사하고자하는 정답함수(wx+b)에 넣어 정답(y)을 구함

∙ 신경망 통과한 y_hat과의 차이를 구함(이때, 오류함수는 MSE Loss function을 사용)

∙ SGD를 이용해 optimization 진행

 

 

❗️ 1개의 Linear Layer를 갖는 MyModel이라는 모듈 선언

import random
import torch
import torch.nn as nn

class MyModel(nn.Module):
	def __init__(self, input_size, output_size):
    	super(MyModel, self).__init__()
        self.linear = nn.Linear(input_size, output_size)
        
    def forward(self, x):
    	y = self.linear(x)
        return y

 

 

 

❗️ Wx + b가 3x1 + x2 - 2x3에 근사한다 가정하자.

def ground_truth(x):
	return 3*x[:,0] + x[:,1] - 2*x[:,2]

 

 

 

❗️ Hyper-Parameter 설정

batch_size = 1
epoch = 1000
iter = 10000

model = Mymodel(3, 1)
optim = torch.optim.SGD(model.parameters(), lr=0.0001, momentum=0.1)

 

 

 

❗️ Model과 tensor를 입력받아 순전파 후, 역전파알고리즘을 수행해 경사하강법 1 step을 진행

def train(model, x, y, optim):
	# 모듈의 모든 파라미터의 기울기 초기화
    optim.zero_grad()
    
    # Feed-Forward
    y_hat = model(x)
    
    # MSE Loss
    loss = ((y-y_hat)**2).sum() / x.size(0)
    
    # BP Algorithm
    loss.backward()
    
    # GD 1 step
    optim.step()
    
    return loss.data

 

 

 

 

❗️ Train & Inference time

for epoch in range(epoch):
	# train 설정
	avg_loss = 0
    
    for i in range(iter):
    	x = torch.rand(batch_size, 3)
        y = ground_truth(x.data)
        
        loss = train(model, x, y, optim)
        
        avg_loss += loss
        avg_loss = avg_loss / iter
        
        
        
    # valid 설정
    x_val = torch.FloatTensor([[.3, .2, .1]])
    y_val = ground_truth(x_val.data)
    
    
    
    # inference 
    model.eval()
    y_hat = model(x_val)
    model.train()
    
    print(avg_loss, y_val.data[0], y_hat.data[0, 0])
    
    
    # finish
    if avg_loss < .001:
    	break

 

'Gain Study' 카테고리의 다른 글

[Gain Study]. inference time, Mobilenet, 배포  (0) 2023.08.19

다루는 내용

∙ 모델 training 및 inference의 성능에 영향을 미치는 요인

∙ 성능향상을 위한 다양한 방법

배포를 위한 클라우드 플랫폼(AWS, GCP)

다양한 모바일 플랫폼을 이용한 배포(Jetwon TX2, Android, iOS)

 

 


RAM과 같은 메모리 제약이 있는 mobile device들에서 결과모델(resultant model)의 사용은 문제가 될 수 있는데,

computing time이 증가할수록 infra cost가 증가한다.

 

특히, inference time은 동영상과 같은 application에서 매우 중요한데,

모델의 복잡성을 낮추기는 쉬우나 이는 정확도 또한 같이 떨어지게 되는 결과를 초래할 가능성이 높다.

 

따라서, 복잡성을 낮추지만 정확도를 심각하게 떨어뜨리지 않으면서 성능을 향상 혹은 유지시키는 방법이 중요하다.

이에 대한 대표적인 예시로 모델 양자화(Model Quantization)에 대해 설명하겠다.

 


🤔 Model Quantization (모델 양자화)

1. Quantization ?
물리학에서 양자화(Quantization)란, 연속적으로 보이는 양을 자연수라는 셀 수 있는 양으로 재해석하는 것
정보이론에서 양자화란, Analog(연속적)→Digital(이산적)인 값으로 바꾸어 근사하는 과정을 의미한다.
2. Model Quantization ?
딥러닝 모델에서의 가중치값은 float32(32bits 부동소수점)값을 갖는다.
이때, 가중치가 8bit로 양자화 된다면, 정확도는 덜 떨어지게 되는데, 배포 시 이 성능하락을 눈치채지 못할 수 있다.
(즉, 결과값에서 가중치의 정밀도는 성능에 미치는 영향이 적음을 의미)

위의 내용을 고려해본다면, 딥러닝에서 모델크기가 결정적일 때, 추론속도를 유의미하게 줄일 수 있다.
(가중치는 8bit로 저장, inference연산 시 float32로 수행)
또한 layer에 따라 모든 구성요소의 양자화 크기를 달리해 동작할 수 있다.(32bits, 16bits, 8bits)
3. 장점
Image에서 기본으로 갖는 Noise들을 줄여 robust한 특성을 갖게 할 수 있다.
inference연산 시 중복정보를 제거할 수 있다.

 

 


MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications (2017)

 

MobileNet은 객체검출, 얼굴속성, 미세분류, 표식인식 등과 같은 다양한 application program에 유용한 모델이다.

MobileNet은 기본적인 convolution kernel을 깊이방향(depth-wise)과 포인트방향(point-wise) convolution으로 대체하여 모델의 크기와 연산량을 줄인다.

 

 

모델 선택에 영향을 주는 매개변수
곱셈과 덧셈의 개수: 정확도와 다중덧셈사이의 절충값은 아래와 같다.

② 모델의 매개변수개수: 정확도와 매개변수의 수는 trade-off관계로 아래와 같다.

 

 

 


배포(Deploy)


클라우드에서 모델 배포하기

여러 application program에서 사용할 모델들은 cloud를 통해 배포하는데, 이를 위해 주요 cloud 서비스에 대해 알아보자.

 

AWS (Amazon Web Services)

AWS는 tensorflow기반 모델의 개발 및 배포를 지원한다.
https://aws.amazon.com/ko/ 에서 AWS 가입후 AMI(Amazon Machine Images)중 하나를 선택한다.
AMI는 필수 SW가 모두 설치된 컴퓨터의 이미지이기에 패키지 설치에 대한 걱정X

AWS는 딥러닝모델을 쉽게 훈련하고 배포하도록 DLAMI를 제공하는데, 여기서 여러 옵션을 선택할 수 있다.
source activate tensorflow_p36

 

위의 코드는 CUDA8에서 python3과 keras2로 tensorflow를 활성화 하는 코드이다.

이제 가상머신(VM)을 아래의 단계에 걸쳐 시작할 수 있다.

1. aws.amazon.com으로 이동 후 Amazon계정으로 로그인.
2. 로그인 페이지에서 Launch a virtual machine을 선택.
3. 선택후 나오는 윈도우에서 Get Started를 클릭, EC2 Instance를 선택.
4. EC2 Instance의 이름을 지정. (ex. tensorflow)
5. OS type을 지정. (ex. ubuntu, windows, ...)
6. Instance type을 선택 (인스턴스 타입은 다양한 RAM크기와 CPU 구성방법을 의미; t2.micro 선택추천)
7. 로그인에 사용되는 개인정보 PEM파일 생성.
8. 일정시간이 지나 인스턴스생성 완료상태가 표시되면 Proceed to EC2 console버튼을 클릭.
9. 이제 인스턴스가 생성되었으므로 Connect버튼을 클릭.
10. 인스턴스를 가상시스템의 명령프롬프트에 연결, 이때 이전단계에서 다운받은 PEM파일이 필요. 

11. 작업이 끝나면 Action ▶️ Instance State ▶️ Terminate를 클릭해 인스턴스를 완료, 시작.

 

 

 

 

GCP (Google Cloud Platform)
GCP는 AWS와 비슷하게 간단한 가상머신을 사용해 모델을 아래의 단계를 거쳐 training할 수 있다.

1. https://cloud.google.com/ 을 사용해 gmail로 플랫폼에 로그인
2. GO TO CONSOLE 버튼을 클릭해 콘솔로 이동
3. 오른쪽 상단메뉴()에서 Compute Engine ▶️ VM Instance를 클릭해 VM생성페이지로 이동
4. CREATE INSTANCE 버튼을 클릭해 필요 인스턴스를 생성
5. 이후 설정메뉴를 사용해 인스턴스유형을 선택할 수 있다.
  (Machine Type은 필요한 RAM과 CPU를 의미하며 사용자가 정의할 수 있고, 빠른 훈련을 위해 GPU를 선택할 수도 있다.)
6. Instance가 생성되면, 인스턴스에 대한 SSH🔽을 클릭, Open in browser window 옵션을 선택한다.
이를통해 브라우저로 콘솔을 열 수 있고 셸을 통해 tensorflow를 설치하고 모델훈련 및 배포가 가능하다.


GCP에서는 tensorflow를 사용하는 동안 사용자에게 도움이 되는 클라우드 머신러닝엔진이 있다.
훈련 및 배포 인프라 구축을 위해 GCP의 3가지 구성요소를 사용할 수 있다.
① 이미지 전처리를 위한 Cloud DataFlow
② 모델 훈련 및 배포를 위한 Cloud Machine Learning Engine
③ traindata, code, 결과를 저장하는 Google Cloud Storage

 

 


장치에서 모델 배포하기

장치에 배포를 한다는 것은 장치에 딥러닝 모델이 존재하고 장치에서 추론이 이뤄질 수 있음을 시사한다.

이제, 다양한 모바일 플랫폼에 배포하는 방법을 알아보자.

 

Jetson TX2
NVIDIA에서 공급하는 내장장치로 가볍고 소형이어서 드론 등에 적합하다.
또한, tensorflow를 위한 runtime인 TensorRT가 사전에 설치되어 있고 
tensorflow설치 전, Jetson과 flash를 설치하고 Ubuntu, CUDA, cuDNN을 설치할 수 있다.

https://github.com/jetsonhacks/installTensorFlowTX2 를 복사하고 명령프롬프트에서 아래 명령을 수행, Jetson TX2에 tensorflow를 설치한다.

1. 필수구성요소 설치
./installPrerequisites.sh


2. 아래 코드를 사용해 tensorflow를 복제
./cloneTensorFlow.sh


3. 아래 코드를 사용해 필요환경변수 설정
./setTensorFlowEV.sh


4. 아래 코드를 사용해 tensorflow를 build
./buildTensorFlow.sh


5. 아래 코드를 사용해 package를 wheel파일로 처리
./packageTensorFlow.sh


6. 아래 코드를 사용해 tensorflow를 설치
pip install $ HOME / tensorflow-1.0.1-cp27-cp27mu-linux_aarch64.whl

 

 

 

Android
모든 안드로이드앱에서 tensorflow를 사용할 수 있다.
build세부정보: https://www.tensorflow.org/lite/android/lite_build?hl=en
안드로이드에 대한 공식예제: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android

안드로이드 기기에서 tensorflow를 구현하는 단계는 안드로이드 프로그래밍경험이 있다 가정할 때, 아래와 같다.
1. tensorflow모델을 .pb파일로 내보낸다.
2. .so.jar 바이너리 파일을 build한다.
3. 라이브러리를 불러올 수 있도록 gradle 파일을 편집한다.
4. 안드로이드 앱을 불러와 실행한다.

 

 

 

iOS
애플은 CoreML 프레임워크를 사용해 iPhone Application program에서 사용하는 머신러닝을 통합하여 application program에 직접 통합가능한 표준모델목록을 제공한다.

tensorflow를 사용해 맞춤식 딥러닝모델을 훈련, 이를 아이폰에서 사용할 수 있으며 custom모델을 배치하기 위해 tensorflow를 CoreML 프레임워크 모델로 변환해야 한다.
구글이 TF→CoreML에 대해 릴리즈한 내용: https://github.com/tf-coreml/tf-coreml

TFcoreML은 아래 코드를 사용해 설치할 수 있다
pip install -U tfcoreml


또한, 아래 코드를 사용해 모델을 내보내서 아이폰에서 예측하기 위해 사용할 수 있다.
import tfcoreml as tf_converter

tf_converter.convert(tf_model_path='tf_model_path.pb',
					 mlmodel_path='mlmodel_path.mlmodel',
                     output_feature_names=['softmax:0'].
                     input_name_shape_dict={'input:0' : [1, 227, 227, 3]}
					)

 

 

 

 

'Gain Study' 카테고리의 다른 글

[Gain Study]. Hello, Pytorch!  (0) 2023.08.22

1.4 소거법과 A = LU

핵심: rank 1인 행렬의 관점에서 소거법을 살펴보는 것.
즉, 기존 행렬인 A는 rank = 1인 행렬들의 합으로 볼 수 있다.

ex.

 

 

1.4 .1 소거법을 이용한 Ax = b의 풀이

R3공간에서 세 평면이 만나는 것을 시각화하는 것은 쉽지 않다.
Rn공간에서 초평면(hyperplane) n개가 한 점에서 만남을 시각화 하는 것도 쉽지 않다.

But! 열벡터의 일차결합은 훨씬 쉽다!!

 - 행렬 A에서는 반드시 3 or n개의 일차독립인 벡터가 있어야 한다.
 - 이 열들은 반드시 R3의 동일한 평면 or Rn의 동일한 초평면에 있지 않아야 한다.
이를 아래와 같은 문장으로 해석가능하다.
일차독립인 열  Ax = 0의 유일해는 영벡터 x = 0이다.

즉, 일차독립모든 열에 0을 곱해야하는 경우열들의 결합이 0벡터가 됨을 의미한다.

if, 해가 유일: 열벡터의 일차결합이 b가 되는 유일한 결합을 소거법으로 Ax = b의 해를 구할 수 있다.




이때, 소거법은 열 하나하나에 순서대로 적용상삼각행렬 U를 찾을 때까지 계속 진행한다.

1행은 변하지 않는다.
이후 1행에 수를 곱해 A의 2, 3, 4행에서 곱한 결과를 뺀다.

다만, 곱셈과 덧셈을 분리하는 이런류의 계산은 높은 계산량을 요구한다.
따라서 이를 위한 해결책이 바로 A = LU이다.

 

 

 

1.4 .2  A = LU 분해

소거법은 행렬 A를 A = LU라는 L(하삼각행렬)과 U(상삼각행렬)의 곱으로 분해하는 것이다.

 

 

 

1.4 .3  Ax = b의 해법

Ax = b의 해를 구하려면 이 방정식 양변에 동일한 변환을 가해야 한다.

직접적인 방법: b를 열에 추가한 행렬 [A  b]를 다루는 것
A에 수행하는 소거법(AL⁻¹ = U)의 단계를 b에도 똑같이 적용한다.
 - [A  b] = [LU  b]에서 시작해 소거법을 적용하면
 - [U  L¹b] = [U  c] 즉, Ux = c를 얻는다.

 Ax = b는 Lc = b와 Ux = c로 나누어 진다.
소거법으로 c를 얻은 후 대입법으로 x를 구한다.
즉, x = U¹c = U¹L¹b = A¹b

 

 

 

 

1.4 .4 행 교환(치환)

모든 n×n 가역행렬(invertible matrix) A는 PA = LU를 만족한다.
이때, P는 치환행렬이다.


Ex.

 

 

cf. Cholesky's Decomposition  (for. symmetric matrix)

  1. A가 대칭행렬 이다.
  2. 행렬식의 값이 Positive 이다

    위의 조건에 대해 LU분해의 결과, 아래와 같다.

 

 

1.3 The Four Fundamental Subspaces

모든 m×n 행렬 A에서 4개의 부분공간은 다음과 같다.
 - 2개의 Rm 부분공간
 - 2개의 Rn 부분공간

Ex) 


[Counting Law]
r개의 독립인 일차방정식으로 이뤄진 Ax = 0에는
일차독립인 해가 n - r개 존재한다.
(일차독립은 Ax = 0의 해가 단 하나만 존재함을 의미)

 

😶Graph

위 그래프는 5개의 edge와 4개의 vertex를 갖는다.

영공간 N(A) : 영공간을 찾기위해 5개의 방정식에서 b=0으로 두고 계산했을 때, 4개의 미지수 x1, x2, x3, x4는 모두 같은 값 c를 갖는다. 따라서 모든 벡터 x = (c,c,c,c)는 Ax = 0의 해가 된다.
이 영공간은 R4에서 직선으로 
 - 특수해 x = (1,1,1,1)은 영공간 N(A)의 기저(basis)이고 rank = 1(∵직선)이다.



열공간 C(A) : r  = 4 - 1 = 3개의 일차독립인 열이 존재한다.

아래 3개의 열은 A의 열공간의 기저(basis of column space)이다.

A의 1, 2, 3열은 일차독립(linearly independent)이며 
4열은 다른 3열의 일차결합(linear combination)이다.




행공간 C(AT) : column과 마찬가지로 rank = 3이지만, 처음 3개의 행은 일차독립이 아니다.(∵3행 = 2행 - 1행)
처음으로 3개의 일차독립이 되는 행은 1, 2, 4행이다.
 - 1, 2, 4행들은 행공간의 기저이다.



좌영공간 N(AT) : ATy = 0의 해를 구해보자.
행의 일차결합은 0이며 이미 3행이 2행에서 1행을 뺀 것을 알고 있기에 하나의 해는 y = (1, -1, 1, 0, 0)이다.
또 하나의 y는 y = (0, 0, -1, 1, -1)로 이 해는 ATy = 0의 일차독립인 해이다.
따라서 좌영공간 N(AT)의 차원은 m - r = 5 - 3 = 2이다.
따라서 이 2개의 y는 좌영공간의 기저(basis of left nullspace)이다.



▶ A의 행공간 C(A)의 차원: r = 3
▶ A의 열공간 C(AT)의 차원: r = 3
▶ A의 영공간 N(A)의 차원: n - r = 1
▶ AT의 영공간 N(AT)의 차원: m - r = 2


 

 

 

1.3.1  AB와 A + B의 rank

행렬을 곱할 때, rank가 증가할 수 있는데 이는 column space와 row space에서 확인할 수 있다.
또한, rank가 감소하지 않는 특별한 상황도 존재하며 이를 통해 AB의 rank를 알 수 있다.


rank의 주요명제
4. mxr행렬 A, rxn행렬 B의 rank가 모두 r이라면, AB의 rank도 r이라는 의미.


명제 1. : AB의 열공간과 행공간에 관한 내용
C(AB)는 C(A)에 포함
된다.
C((AB)T)는 C(BT)에 포함된다.
 - 1.1절에서 언급했듯, rank(행) = rank(열)이다.
 - 즉, 행 또는 열을 이용한다면 행렬곱셈인 AB는 rank를 증가시킬 수 없다!



명제 2. : A + B의 각 열은 A의 열과 B의 열의 합이다.
rank(A + B) ≤ rank(A) + rank(B)
는 항상 참이다.
  - 이는 C(A)와 C(B)의 기저의 결합을 의미한다.

rank(A + B) = rank(A) + rank(B) 는 항상 참이 아니다.
  - 이 명제는 A = B = I 일 때, 거짓이다.



명제 3. : A와 ATA에 모두 n개의 열이 있다.
두 행렬은 모두 영공간이 같다. 따라서 두 행렬에서 n - r의 값은 같고 rank는 모두 r이 된다.
 - 또한 rank(AT) ≤ rank(ATA) = rank(A)이다.

 

Ex). ATA와 A의 영공간이 같음을 보여라.

 

 

 

1.2 행렬 곱셈 AB

내적(행과 열의 곱셈)은 AB = C의 각 성분 계산을 위해 필요

ex) A의 2행 , B의 3열간의 곱셈의 합은 C의 c₂₃의 값이다.
※ 선형대수학 제 1정리
· row rank = column rank
· r개의 일차독립 열(column)  ↔  r개의 일차독립 행(row)

 

 

1.2.1  AB = (rank 1인 행렬의 합)

AB = A열과 B행의 곱셈이라 하자.

cf) AB = (m×n)(n×p) , 총 mnp의 곱셈 연산수
cf-1) 행×열: mp번의 내적, 매번 n번의 곱셈
cf-2) 열×행: n번의 외적, 매번 mp번의 곱셈

 

 

1.2.2  열과 행의 곱셈에 대한 이해

Data Science에서 외적을 이용한 행렬곱셈이 필수인 이유는?
 - 간단히 말해, 특정 행렬에서 "어떤 중요부분을 찾으려"하기 위해.

행렬 A, B에 대해 
 - B의 행의 일차결합을 얻고 싶을 때: AB
 - B의 열의 일차결합을 얻고 싶을 때: BA

즉, AB의 열은 A의 열의 일차결합
이고 행은 B의 행의 일차결합이다.
- 따라서 AB의 열공간은 A의 열공간에 포함된다.


응용선형대수학에서 가장 중요한 주제는 A를 CR로 분해하는 것이다.
그리고 A = CR에서 cₖrₖ를 살펴보고자 할 때, 중요.

 

5개의 중요한 행렬 분해
1. A = LU
 - L은 하삼각행렬, U는 상삼각행렬이다.

2. A = QR
 - 그람-슈미트(Gram-Schmidt)를 통해 열 a1, ..., an을 직교화(orthogonalizing)하여 얻는다.
 - R은 상삼각 행렬이며 이때, Q에 정규직교인 열이 있다.(QTQ = I)

3. S = QΛQT
 - 대칭행렬(Symmetric matrix) S = ST의 고윳값 λ1, ... , λn에서 얻는다.
 - 이때, Λ는대각성분의 고윳값(eigen value) 
 - Q의 열은 정규직교인 고유벡터(eigen vector) , QT = Q⁻¹

4. A =
XΛ
X⁻¹
 - 대각화(diagonalization)는 행렬에 일차독립인 고유벡터가 n개일 때, 가능
 - Λ의 대각성분은 고윳값이며, X의 열은 A의 고유벡터이다.

5. A = U∑VT
 - 임의의 A행렬의 특잇값분해(Singular Vector Decomposition; SVD)이다.
 - 의 성분에는 특잇값 σ1, ... ,  σr이 있다.
 - U와 V에는 정규직교인 특이벡터(singular vector)가 존재.

 

Ex. S = QΛQT

Q⁻¹ = QT이므로 SQ = QΛ의 양변에 QT를 곱하면 S = QΛQT = 대칭행렬을 얻는다.

각 고윳값 λ와 고유벡터 q는 rank=1인 행렬인 λ q qT를 만든다.

 

- rank = 1인 행렬 : S = (QΛ)QT = (λ₁ q₁) qT + ... + (λn qn) qnT
- 모두 대칭 :  qiqiT의 전치행렬은 qiqiT이다.

 

 

 

스펙트럼 정리 (spectrum theorem)  S = (QΛ)QT

모든 대칭행렬 S는 n개의 실수인 고윳값과 n개의 정규직교인 고유벡터를 갖는다.

S = ST일 때, S의 고윳값은 실수이다.

 

cf. 증명에서 조심해야할 부분: 고윳값 λi가 반복될 때

  - 다항식이 중근을 갖거나 (λ - λj)M 형태로 인수분해된다.

  - 이 경우, M개의 일차독립인 고유벡터를 찾아야 한다.

  - 이때 행렬 S - λjI의 rank = n - M이다. (단, S = ST일 때 가능)

 

cf-2. 마찬가지로 A = U∑VT또한 대각행렬 에서 특잇값 σ가 M번 반복될 때, 주의

 - 즉, Av = σu를 만족하는 Singular Vector v와 u쌍이 M개 존재해야함을 의미.

1. space

😶 vector space
 - linear space라고도 불리며 이 공간안에 정의된 원소를 벡터(vector)라 부른다.
 - vector space는 집합 V의 원소에 대해 정의되는 덧셈, 실수배연산이 만족될 때 V를 벡터공간(선형공간)이라 하며 V의 원소를 벡터라 부른다.

😶 subspace
 - 벡터공간의 부분집합이 벡터공간구조를 가질 때, 그 부분집합을 부분공간이라 부른다.

😶 Euclidean space
 - vector space Rn에 대해 벡터의 크기 norm을 정의한 공간
 - 이 공간에서는 유클리드 기하가 성립하며 이 정의를 이용해 두 점 사이의 거리나 선분의 길이를 구할 수 있다.

😶 (standard) inner product
 - v·w 또는 <v, w>로 표현한다.
 - v·w = v1w1 + v2w2 + ... + vnwn = vTw = wTv로 표현된다.

 

1.1 행렬 A의 열을 이용한 곱셈  Ax

Ax = x₁a₁ + x₂a₂로 표현가능하다.
 - 즉, Ax는 행렬 A의 열의 일차결합으로 이는 행렬 A의 column space로 이어진다.
 - 이때, x₁과 x₂는 실수이며, 이 벡터공간은 임의의 벡터 x에 대해 모든 Ax를 포함한다.

cf. a₁, a₂, a₃은 서로 독립(independent)이다.
즉, (x₁ , x₂)가 Ax = b의 해라면, b = (b₁ , b₂ , b₃)은 행렬 A의 column space C(A)의 원소이다.

또한, n×n 가역행렬에 대해 Ax = b의 유일 해는 x = A⁻¹b이며,
이때 가역행렬의 열의 일차결합 즉, column space는 Rⁿ과 같다.

 

1.1.1 행렬 A의  독립인 열과 랭크

행렬 A의 기저(basis)를 찾을 수 있고, A를 두 행렬의 곱셈 C × R로 분해할 수 있을 때
최종목표: 행렬 A에서 행렬 C를 바로 찾는 것

A의 n개 열로 찾을 수 있는 행렬 C (이때, 가능한 많은 C의 열이 일차독립이어야 한다.)
이때, subspace의 basis는 일차독립인 벡터로 이루어지며

※ 랭크 정리
 - 일차 독립인 열과 일차독립인 행의 개수는 같다.

즉, rank = 일차독립인 열의 최대 개수 = 일차독립인 행의 최대 개수

A = CR로 표현될 때, 이때 행렬크기는 (m × n) = (m × r) (r × n)이다.
즉, 행렬 A의 계수(rank)는 행공간과 열공간의 차원을 뜻한다.

 

Ex.

 

 

 

Ex.

🧐 목차

1장 Highlights of Linear Algebra
1.1 행렬 A의 열을 이용한 곱셈 Ax
1.2 행렬 곱셈 AB
1.3 네 가지 기본 부분공간 (4 Fundamential Subspaces)
1.4 소거법과 A=LU
1.5 직교행렬과 부분공간
1.6 고윳값과 고유벡터
1.7 대칭인 양의 정부호 행렬 (Symmetric Positive Definite Matrices)
1.8 특잇값 분해(SVD)에서 특잇값과 특이벡터
1.9 주성분과 최적의 낮은 랭크 행렬
1.10 레일리(Rayleigh) 몫과 일반화된 고윳값
1.11 벡터, 함수, 행렬의 Norm
1.12 행렬과 텐서의 분해 : 양과 희소 (Positive & Sparse)


2장 Computations with Large Matrices
2.1 수치선형대수학
2.2 네 가지 최소제곱
2.3 열공간의 세 가지 기저
2.4 임의화 선형대수학


3장 Low Rank and Compressed Sensing
3.1 A의 변화에 따른 A^{-1}의 변화
3.2 고윳값 인터레이싱과 낮은 랭크 신호
3.3 급격히 감소하는 특잇값
3.4 l²+l¹에 대한 분해 알고리즘
3.5 압축 센싱과 행렬완성


4장 Special Matrices
4.1 푸리에 변환 : 이산과 연속성
4.2 이동행렬과 순환행렬
4.3 크로네커 곱 AⓧB
4.4 크로네커 합을 통한 사인과 코사인 변환
4.5 퇴플리츠 행렬과 이동 불변 필터
4.6 그래프와 라플라시안 그리고 키르히호프의 법칙
4.7 스펙트럼 방법과 K-평균을 이용한 군집화
4.8 랭크 1 행렬완성
4.9 직교 프로크루스테스 문제
4.10 거리행렬


5장 Probability and Statistics
5.1 평균, 분산, 확률
5.2 확률분포
5.3 모멘트생성함수, 누적생성함수, 통계 부등식
5.4 공분산행렬과 결합확률
5.5 다변량 정규분포와 가중최소제곱
5.6 마르코프 연쇄


6장 Optimization
6.1 최솟값 문제 : 볼록성과 뉴턴 방법
6.2 라그랑주 승수와 비용 도함수
6.3 선형 계획법, 게임이론, 쌍대성
6.4 최솟값으로 향하는 경사하강
6.5 확률적 경사하강과 ADAM


7장 Learning from Data
7.1 심층 신경망의 구조
7.2 합성곱 신경망
7.3 오차역전파와 연쇄법칙
7.4 초매개변수 : 숙명적 결정
7.5 머신러닝 세계

 

 

 

 

 

 

🧐 Purpose

😶 이 책의 목표
1. Data Science의 주요 방법론과 아이디어를 정리
2. 1.을 어떻게 선형대수학으로 표현할 지 학습
3. 1.을 어떻게 설명할 지 학습

 

🧐 Basic for Machine Learning

😶 ML & DL
머신러닝에서 선형대수학, 확률통계, 최적화는 마치 대들보와 같다.
본 책은 train data를 올바르게 분류, 처음보는 data까지 분류하는 "learning function"구성이 목표
보통 이런 learning function 구성을 하는 방식 중 요즘 가장 많이 사용되는 것이 바로 "Deep Learning"이다.


😶 Linear & Nonlinear Activation
- Linear의 가장 큰 예시 중 Affine function의 경우, 빠르게 학습이 가능하지만 그 자체로는 너무 단순하다는 단점이 있다.
즉, 선형성이란 매우 제한이 큰 조건이다.

- Nonlinear는 입력벡터 v의 성분을 제곱(norm2)하는 형태로 나타난다.


😶 Neural Network & F(v)의 구조
딥러닝 구성 함수 F(v) = L(R(L(R(...(Lv)))))의  형태이다.
 - 이때, F는 함수 R과 Affine함수인 Lv = Av + b 간의 합성함수이다.
 - AbF의 가중치로 행렬로 표현되며, train data로 학습된다.
이때, train data의 특성을 뽑기위해 가중치를 계산, 이때 가중치는 행렬성분이며 미분적분학의 "편미분"을 이용해 현재 가중치를 향상시키는 방향을 제시한다.

 - 층이 많아질수록 F(v)의 정확도가 올라간다.


cf. stochastic(=random)이라는 표현은 성공이 확실성이 아닌 확률에 좌우됨을 의미한다.
즉, 큰 수의 법칙은 큰 함수의 법칙으로 확장되며 만약 모델구조가 잘 설계되고 parameter가 잘 계산된다면 성공할 확률이 높음을 대변할 수 있다.

 

선형대수 응용 시, 가장 기본적이고 중요한 개념이 되는 5가지 문제

1. Ax = b (만족하는 x값 구하기)
2. Ax = λx (만족하는 x와 λ값 구하기)
 - x와 λ값을
 안다면, 단순 선형문제로 변하기에 어떤 선형문제라도 풀 수 있게 된다.

3. Av = σu (만족하는 v, u, σ값 구하기)
 - SVD는 가장 간단한 표현의 σuvT를 찾으며, Data Science는 SVD에서 선형대수학과 연결된다.
 - 이때, σuvT를 찾는 것은 PCA의 목적이 된다.

4. argmin( ||Ax||² / ||x||² )
5. Factor A (A를 열과 행의 곱으로 분해하기)
 - 최소제곱(least squares)에서 최적의 x̂을 구하고,
 - PCA에서 주성분인 v₁을 계산하는것은 fitting의 대수적 문제이다.

cf. column space, null space, Eigen vector, SVD, Least Squares, Fourier transform, LASSO(in 통계학)

+ Recent posts