[WICWIU] 논문 정리

Hα ყҽσɳɠ·2020년 7월 8일
0

WICWIU

목록 보기
1/5
post-thumbnail

C++ 기반 범용 오픈소스 딥러닝 프레임워크 WICWIU

프레임 워크 구조 

▪️ 데이터 표현: Tensor, long array & shape class 
▪️ 신경망 연산 표현: Operator, module class 
▪️ 학습: loss function, optimizer class 
▪️ 신경망 모델 표현: neural network class 

WICWIU Componets 

Tensor class

multi-dimensional Tensor
최대 5차원의 Tensor 저장 가능 
(time, batch, channel, feature map의 row, column) 
host와 device memory의 메모리 동기화

Shape *m_aShape;
// Tensor를 구성하는 Shape 클래스, 텐서의 차원을 정의

LongArray<DTYPE> *m_aLongArray;
// Tensor를 구성하는 LongArray 클래스, data 저장

Device m_Device;
// 장치 사용 구분자, CPU 또는 GPU

int m_idOfDevice;
// GPU 사용 시, 사용하려는 GPU의 번호. CPU의 경우 -1

IsUseTime m_IsUseTime;
// time 축 사용 유무, IsUseTime 참고

enum Device {
    CPU,
    GPU,
};

enum IsUseTime {
    UseTime,
    NoUseTime
};

Long array class

한 번에 할당하기 어려운 긴 배열을 표현하기 위해 정의한 클래스이다.

DTYPE **m_aaHostLongArray;
// 메모리에 올라가 있는 데이터의 주소 값.

int m_CapacityOfLongArray;
///< LongArray의 총 용량.
int m_TimeSize;
///< Tensor의 TimeSize
int m_CapacityPerTime;
///< Time으로 나누어진 data의 Capacity

Device m_Device;
//< 장치 사용 구분자 (CPU or GPU)
int m_idOfDevice;
///< GPU사용 시, 사용하려는 GPU의 번호.

Shape class

▪️ Tensor의 차원 수와 차원의 길이를 표현하기 위한 클래스이다. (rank, length of each dimension)
▪️ 텐서는 내부적으로는 long array class를 이용하여 데이터를 1차원 array의 형태로 저장하고, 외부적으로는 shape class를 이용하여 1-5차원 구조의 인터페이스를 제공한다.


Operator class (저수준 기본 연산) 

▪️ 신경망 구성을 위한 저수준 연산자를 표현하기 위한 추상 클래스 
▪️ 모든 연산자 클래스의 base class이며, data와 gradient vector를 저장하기 위한 tensor 객체와 forward propagation 및 back propagation 함수를 갖는다. 
▪️ 각 연산의 결과 ➡️ Tensor형 멤버 변수에 저장 (저장된 결과는 연결된 다른 operator나 loss function의 피연산자로 사용할 수 있다. 
▪️ 신경망의 각 연산자는 operator 클래스를 상속받은 클래스로 정의된다.
▪️ WICWIU는 Tensorholder, Add, MatMul, ReLU, LReLU, PReLU, Sigmoid, Tanh, Convolution, Max-Pooling, Average-Pooling, Batch- Normalization, Concatenation등 CNN에서 자주 사용되는 연산들을 기본적으로 제공한다.
▪️ 이를 그래프로 연결하면 forward propagation 함수를 이용해 입력 벡터에 대한 출력을 계산할 수 있으며, Back propagation 함수를 통해 자동으로 경사도 벡터를 계산할 수 있다. (편리한 신경망 학습 가능)
▪️ 사용자가 operator class를 상속받아 새로운 연산자 정의 가능

Module class (고수준 복합 연산)

  • 복잡한 신경망 계층을 편리하게 구현하기 위해 설계된 추상 클래스
  • 저수준 연산을 표현하는 Operator만을 이용해 복잡한 신경망 모델을 구성할 경우 많은 수작업 필요
    - 문제점을 극복하기 위해 복수의 operator를 조합해 복잡한 계층이나 모듈을 구현할 수 있도록 설계된 클래스
    - Module class는 복수의 Operator들을 그래프 구조로 조합함으로 정의된다.
    - Module class는 operator를 상속받기 때문에 한 모듈이 다른 모듈을 포함하는 중첩 모듈도 정의할 수 있다.
  • WICWIU의 경우 convolution, batch-normalization, linear(fully-connected layer)등 널리 사용되는 계층을 내장하고 있다.
    - Operator 클래스처럼 사용자가 module 클래스를 상속하여 새로운 module을 정의하는 것도 가능하다.

Loss function class (학습을 위한 손실 함수)

  • 딥러닝 모델의 학습: 손실 함수를 정의한 후 이를 최소화하도록 parameter를 optimize함으로써 수행된다.
  • Loss fuction classs는 WICWIU에서 손실 함수를 표현하기 위한 추상 클래스
    - 모든 손실 함수들은 loss function class를 상속하여 정의된다.
  • WICWIU는 MSE, Cross entropy, hinge loss(max-margin loss)등의 손실 함수를 기본적으로 제공하고 있다.
    +) 사용자가 loss function class를 상속받아 새로운 loss function을 구현하는 것도 가능하다.

Optimizer class (파라미터 최적화 알고리즘)

  • 경사도 벡터를 이용하여 파라미터를 최적화하는 경사 하강법 (+ 파생 알고리즘)을 표현하기 위한 추상 클래스
  • WICWIU의 Operator 및 Module 클래스는 모두 역전파 함수를 내장한다.
  • Loss function 객체에서 역전파 함수를 호출하면 연결된 모든 operator 및 module 객체들의 역전파 함수들을 적절한 순서에 따라 호출함으로써 경사도 벡터를 자동으로 계산한다.
  • WICWIU는 SGD(Stochastic Gradient Descent), Momentum, RMSProp, Adam, Nesterov Accelerated Gradient 등 널리 사용되는 최적화 알고리즘들을 기본 제공한다.
  • Optimizer 클래스 역시 상속이 가능하여, 사용자가 새로운 최적화 방식을 구현할 수 있다.

Neural Network class (신경망 모델)

  • Neural Network 클래스는 신경망 모델을 표현하기 위한 클래스
  • Operator, Module, Loss Function, Optimizer 클래스의 객체들을 조합하여 그림 1과 같은 신경망 모델을 정의한다.
  • 제공 기능

    1) 신경망 모델을 구성하는 모든 객체들을 저장하고 관리
    ▪️ 연산을 표현하는 연산자와 파라미터를 별도의 노드로 분리해서 표현함으로써 학습 과정에 optimizer의 동작을 단순하게 함
    2) Operator와 Module로 구성된 신경망 모델의 계산 그래프를 분석하여 순전파 및 역전파 연산 순서를 결정
    • 신경망을 구성하는 operator 및 module 객체들 간에는 서로 의존성이 존재하기 때문에 적절한 순서에 따라 연산을 수행해야 함
    • WICWIU는 BFS 알고리즘을 이용해 순전파, 역전파 연산을 바르게 수행할 수 있는 연산 순서를 결정함
    3) 학습된 파라미터 값을 binary 파일로 저장하고 불러오는 기능 제공
    4) 모델의 학습을 위한 Train 함수와 검증 및 성능 평가를 위한 test 함수 제공

        


와~우~ 난 바보야 열심히 이해해야지

profile
𝑯𝒐𝒏𝒆𝒔𝒕𝒚 𝑰𝒏𝒕𝒆𝒈𝒓𝒊𝒕𝒚 𝑬𝒙𝒄𝒆𝒍𝒍𝒆𝒏𝒄𝒆

2개의 댓글

comment-user-thumbnail
2020년 12월 7일

멋있어요 ㅠㅠ

답글 달기
comment-user-thumbnail
2021년 4월 15일

멋있어요 ㅠㅠ

답글 달기