PyTorch, TensorFlow 등 프레임워크의 도움으로 더 이상 밑바닥부터 딥러닝을 구현하지 않아도 된다.

현재는 반복적인 작업을 누군가 미리 만들어 놓은 프레임워크를 사용하기 때문이다.

그럼, 프레임워크가 무엇인지. 딥러닝 프레임워크들에는 무엇이 있는지 더 알아보자.


1. 프레임워크란?

 프로그램을 다룸에 있어 공통적으로 사용되는 기능들을 표준화된 소스코드로 만들어 놓고 사용할 수 있도록 제공하는 것

 

2. 딥러닝 프레임워크의 종류와 특징 

  • 대표적으로 Google에서 개발된 TensorFlowMeta(구 Facebook)에서 개발된 PyTorch 가 있다.
  • 두 프레임워크의 가장 큰 차이점은 Define and Run 과 Define by Run 에 있다.
  • Keras는 TensorFlow 2.0이 나오면서 TensorFlow와 합쳐졌다.

2020.12.09 기준

 

3. Define and Run vs Define by Run

Computational Graph(연산의 과정을 그래프로 표현한 것)를 언제 생성하느냐에 따라 구분한 것

  • Define and Run : 그래프를 먼저 정의 -> 실행시점에 데이터 feed
  • Define by Run : 실행을 하면서 그래프를 생성하는 방식(Dynamic Computational Graph, DCG)

Computational Graph

 

 

4. Why PyTorch ?

  • Define by Run 의 장점 -> 즉시 확인 가능 -> pythonic code
  • GPU support (Multi-GPU)
  • 자동미분을 지원하여 DL 연산을 지원

DL 프레임워크로 PyTorch가 적절한 것 같아

앞으로 PyTorch를 좀 더 공부해볼 계획이다.

'✍🏻Language & FrameWork > Pytorch' 카테고리의 다른 글

[PyTorch] PyTorch Operations  (2) 2024.01.10

이제 본격적으로 연합학습을 공부하기 전, 자주 나오는 용어들을 정리하고자 한다.

공부를 시작하는 초기 단계라서 이해하기 어려운 내용 + 논문 출처는 나중에 다시 추가할 예정

헷갈리는 개념이라 이번 기회에 이해가 잘 되도록 정리해야겠다.

틀린 부분이 있다면 댓글로 알려주세요. 감사히 생각하겠습니다.


Non-IID 란?

 우선, 연합학습은 모델을 학습하는 여러가지 방법 중 하나의 방법으로 연합학습에 참여하는 각 클라이언트들은 자신의 로컬 데이터를 서버에 전송하지 않고, 자신의 로컬 영역에서 로컬 데이터를 기반으로 모델을 학습한다. 일반적인 경우, 학습의 대상이 되는 데이터들은 클라이언트마다 다른 것이 자명하고 이것을 Non-IID(Independent and Identically Distributed) Data 라고 한다.

 IID는 확률 및 통계의 용어로서 확률변수 집합이 서로 독립적이고, 동일한 확률분포를 가질 때를 의미한다.

즉, Non-IID라는 것은 반대로 분산된 각 클라이언트가 가지고 있는 데이터가 서로 매우 다른 성격이고, 불균형한 확률분포를 가진다는 것을 의미한다. 연합학습에서는 서로 이질적인(Heterogeneous) 데이터를 학습하기 위한 가정을 가지고 수행된다.

 

Non-IID 이해를 위한 간단한 예시

그림 출처 : https://www.researchgate.net/publication/344017123_Wireless_for_Machine_Learning?_tp=eyJjb250ZXh0Ijp7ImZpcnN0UGFnZSI6Il9kaXJlY3QiLCJwYWdlIjoiX2RpcmVjdCJ9fQ

 

 위의 사진은  AI를 공부하는 모두가 아는 MNIST의 손글씨 Dataset이다.

 왼쪽의 각 클라이언트들의 dataset은 정확한 숫자의 모양은 달라도 확률변수 집합이 서로 독립적이고, 숫자 0~9를1개씩 가지는 동일한 확률 분포를 가진다.  ->  IID dataset

 반대로 오른쪽의 각 클라이언트들의 dataset은 확률변수 집합이 비독립/독립 적일지는 몰라도, 숫자 0~9를 균등하게 가지지 않는 불균형한 확률분포를 가진다.   ->  Non-IID dataset

 

문제점 및 과제

 대부분의 경우 각 클라이언트의 데이터는 Non-IID 할 것이다. 만일 Non-IID Dataset으로 모델을 학습하게 되면 모델 정확도도 낮아지고, 균일하지 않고 많기만한 Data에 Network cost도 높아질 것이다.

 이를 해결하기 위해 학습에 참여하는 클라이언트 선택하는 방법,  데이터셋 증류(Dataset distillation) 등 다양한 방법들이 연구되고 있다.

coefficient_matrix = [[2, 2, 1], [2, -1, 2], [1, -1, 2]]
constant_vector = [9, 6, 5]

위와 같이 Matrix와 Vector를 List 형식으로 표현할 수 있을 것이다.

하지만 다음과 같은 문제가 발생한다.

 

  • 다양한 Matrix 계산을 어떻게 만들 것 인가?
  • 굉장히 큰 Matrix 를 표현하는 방법
  • 처리 속도 문제 - 파이썬은 Interpreter 언어

적절한 패키지를 사용하자


Numpy

  • Numerical Python
  • 파이썬의 고성능 과학 계산용 패키지
  • Matirx와 Vector와 같은 Array 연산의 사실상 파이썬의 표준

 

Numpy 특징

  • 일반 List에 비해 빠르고, 메모리 효율적
  • 반복문 없이 데이터 배열에 대한 처리를 지원함
  • 선형대수와 관련된 다양한 기능을 제공함
  • C, C++, Fortran 등의 언어와 통합 가능

Numpy 와 Python 데이터를 저장하는 차이

 

1. Array 생성

  • numpy는 np.array 함수를 활용하여 배열을 생성 -> ndarray
  • numpy는 하나의 데이터 type만 배열에 넣을 수 있음
  • List와 가장 큰 차이점으로 Dynamic typing not supported
  • C의 Array를 사용하여 배열을 생성함
import numpy as np

test_array = np.array([1, 4, 5, 8], float)    # 데이터 타입 지정
print(test_array)
print(type(test_array[3]))

[1. 4. 5. 8.]

numpy.float64

 

2. Array Shape

  • shape : numpy array의 dimension 구성을 반환함
  • dtype : numpy array의 데이터 type을 반환함
  • ndim : numer of dimension
  • size : data의 개수
import numpy as np

test_array = np.array([1,4,5,"8"], float)  #Sring Type의 데이터를 입력해도
print(test_array)
print(type(test_array[3]))  # Float Type으로 자동 형변환 실시
print(test_array.dtype)     # Array(배열) 전체의 데이터 Type을 반환함
print(test_array.shape)     # Array(배열) 의 shape을 반환함

print(np.array(test_array, int).ndim)    # numer of dimension
print(np.array(test_array, int).size)    # 총 data의 개수

[1. 4. 5. 8.]
<class 'numpy.float64'>
float64
(4,)     <-  Tuple 타입

1

4

Array 표현 예

1차원
2차원
3차원

 

 

2-1. Array reshape & flatten

  • Array의 shape의 크기를 변경함 (size는 같지만, dimension이 달라짐)

import numpy as np

test_matrix = [[1,2,3,4], [1,2,5,8]]
print(np.array(test_matrix).shape)
print(np.array(test_matrix).reshape(2,2,2))
print(np.array(test_matrix).reshape(-1,2).shape)  # -1 : size를 기반으로 row 개수 선정
print(np.array(test_matrix).flatten())  # 3차원 -> 1차원, 2차원 -> 1차원

(2,4)

[[[1 2],
  [3 4]],

 [[1 2],
  [5 8]]]

(4,2)

[1 2 3 4 1 2 5 8]

 

3. Indexing

  • List와 달리 이차원 배열에서 [0,0] 과 같은 표기법을 제공
  • Matrix 일경우 앞은 row, 뒤는 column을 의미함
a = np.array([[1, 2, 3], [4.5, 5, 6]], int)
print(a)
print(a[0,0])   # Two dimensional array representation #1
print(a[0][0])  # Two dimensional array representation #2

a[0,0] = 12  # Matrix 0,0에 12 할당
print(a)
a[0][0] = 5  # Matrix 0,0에 5 할당
print(a)

[[1 2 3]
 [4 5 6]]
1
1
[[12  2  3]
 [ 4  5  6]]
[[5 2 3]
 [4 5 6]]

 

 

4. Slicing

  • List와 달리 행과 열 부분을 나눠서 slicing이 가능함
  • Matrix의 부분 집합을 추출할 때 반복문 없이 할 수 있어 유용함
a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], int)
a[:,2:]  # Row = 전체, Col = 2 이상
a[1,1:3] # Row = 1, Col = 1~2
a[1:3]   # Row = 1~2

 

 

 

 

 

Creation function, Operation functions, array opeartions, comparsions, Boolean index, fancy index, numpy data i/o

등 나머지는 Numpy - 2 에서 계속