tensorflow.js 기본개념 익히기 -연산그래프-

1. 연산 그래프

 

텐서플로우와 같은 최신 프레임워크를 사용하여 머신러닝 모델을 구축할 때 일반적으로 사용하는 구성 요소

 

보통 최신 프레임워크에서는 데이터를 tensor로 표현

 

tensor는 임의 차원의 배열을 나타내는 데이터 구조

 

파이썬의 numpy에서 사용하는, 이미지나 오디오 등 다양한 데이터를 나타낼때 데이터가 구조화 되었는지 여부와 상관없이 ndarray를 주로 사용하는데 이와 비슷하다

 

tensorflow를 포함한 최신 머신러닝 프레임워크는 머신러닝 모델이라는 것이 곧 tensor의 연산 그래프라는 사실을 보여준다.

 

연산그래프는 tensor의 조작이나 변환에 사용되는 체인으로 정의

 

2. 시각화

 

연산 그래프는 tensorflow를 포함한 최신 머신러닝 프레임워크의 핵심이고, 모든 종류의 수학적 구조를 기술적으로 구성할 수 있게 만들어주는 강력하고 유연한 구조

 

 

 

위 다이어그램은 간단한 분류 신경망을 나타내는 연산 그래프의 예시이다.

 

연산 그래프는 데이터의 흐름을 보여준다

 

사각형 노드는 입력, 출력, 중간노드에서 사용되는 tensor

 

tensor를 변환하는 것은 타원형 노드로 표시하며, 텐서의 형상(shape)이나 값의 변경 및 제어 흐름(control flow)을 포함

 

이러한 시각화 표현은

 

어떤 프로그래밍 언어로 코드를 작성하든 모든 데이터 흐름을 구성하여 나타낼 수 있음을 의미

 

 

3. 자동미분

 

머신러닝 모델중에서도 딥러닝 모델은 특히 미분 함수로 구한 값의 오차율로 파라미터를 최적화한다.

 

그러나 모든 함수의 미분 함수를 도출할 수는 없는 법이다.

 

이는 모든 머신러닝 모델에 대해 각 파라미터의 오차율을 계산하는 실질적인 방법이 없음을 의미

 

이 문제를 해결하기 위한 알고리즘이 역전파(backpropagation)

 

역전파 방법은 그래프의 각 연산 노드에서 최적화된 값을 구할 수 있게 해주는 알고리즘이다.

 

이 알고리즘은 다음 단계를 구현한다

 

1) 지도학습 방법으로 모델의 예측 결과와 목표값 간의 오차율 계산

 

2) 예측 결과가 기여하는 정도에 비례하도록 오차율 전파. 각 연산 노드에 적용

 

3) 전파된 오차율을 기반으로 모델 파라미터를 갱신

 

2)에서 역전파 알고리즘은 전체 모델의 미분함수를 모르는 상태에서 오차율을 계산한다.

 

각 연산 노드의 미분 함수만 알면 된다.

 

예를 들어 로그를 구하는 연산 노드가 있다고 가정해보자.

 

$$f(x) = log(x)$$

 

이 함수의 미분은 다음과 같다.

 

$$\frac{df}{dx} = \frac{1}{x}$$

 

로그 연산 노드를 사용하면, 값이 어떻게 계산되는지 간단하게 나타낼 수 있다.

 

함수 결과를 계산하는데 사용된 경로는 정방향 경로(forward path)

 

노드의 미분값을 계산하는데 사용된 경로를 역방향 경로(backward path)

 

정방향 경로는 들어온 입력값이 포함된 목표값을 예측하는데 사용

 

연산의 출력값은 최종 예측 결과를 생성하기 위해 다음 노드로 전달

 

반면 오차율을 기반으로 모델을 학습시키기 위해 필요한 것이 역방향 경로이다.

 

각 연산 노드에서 최적화해야 하는 값은 역방향 경로로 전파된 오차율을 사용하여 계산

 

전체 모델에 대응하는 미분 함수를 알 필요 없이, 단지 각 연산 노드의 미분 함수를 사용하여 계산한 오차율을 전달하면 된다.

 

 

이와 같은 그래프 구조로 역전파를 수행할 수 있다.

 

정방향과 역방향 경로를 가진 연산 노드를 결합할 수 있다는 것은 곧 학습이 되는 머신러닝 모델을 생성할 수 있다는 것을 의미한다.

 

정방향과 역방향 경로로 구성된 다양한 종류의 연산 노드가 있다면, 이들을 사용하여 새로운 종류의 모델을 구현해 기존에 가진 데이터로 손쉽게 실험해볼 수 있다.

 

 

 

위 그림을 보면 예측된 결과와 목표값 간의 차이를 사용해 계산한 오차는 각 층으로 전파된다.

 

전파된 오차는 각 층에서 정의된 미분값과 곱한다

 

전파되어야 하는 각 오차($\Delta y_{n}$)는 미분 함수와 층의 구조에 따라 결정

 

각 층은 자신의 상위 층에서 전달된 오차가 있어야만, 오차를 계산할 수 있다.

 

각 층은, 오차를 전달해주는 상위 층에만 의존적이다.

 

층의 각 연산자는 상위 층에서 전달된 오차와 자체적으로 가진 값을 알기만 하면 된다.

 

이러한 점은 구현을 매우 쉽게 만들어준다

 

예를 들어 matmul 연산은 전파된 오차 $\Delta y_{2}$만 있으면, W와 b의 갱신된 값을 계산할 수 있다.

 

여기서 $\alpha$, $\beta$는 forward path로 계산해 나온 출력값으로 사용하여 얻은 계수?? 이건 뭔소리여

 

 

각 연산자는 연산 그래프에서 이웃한 연산자와 서로 독립

 

연산자에 전달된 오차만 신경쓰면 되기 때문이다.

function log_<T extends Tensor>(x: T|TensorLike): T{
    
    const $x = convertToTensor(x, 'x', 'log');
    
    //dy: 상위 연산자로부터 계산된 오차
    const grad = (dy:T, saved: Tensor[]) => {
        
        const [$x] = saved;
        
        return {$x: () => dy.div($x.toFloat()) as T};
    
    };
    
    //ENGINE: 대상 플랫폼의 실제 백엔드 구현부(예: WebGL)
    
    return ENGINE.runKernel((backend, save) => {
        
        const res = backend.log($x);
        
        save([$x]);
        
        return res;
    }, {$x}, grad);

 

위에서 정의한 grad가 로그 연산자의 오차를 계산하는 함수

 

모든 저수준 연산자에 전파된다

 

정방향 경로(backend.log($x))와 역방향 경로 (grad)는 구현해야 하지만,

 

상위 및 하위 층에서 어떤 연산자를 사용하고 있는지는 알 필요 없다.

 

dy로 받기만 하면 되니까?

 

이와 같은 방법으로 마치, 레고 블록처럼 사전 정의된 연산자를 결합하는 것만으로 머신러닝 모델을 구축할 수 있는 유연성이 생긴다

 

 

4. 즉시 실행

 

대부분의 경우 연산 그래프를 구성할 때는 즉시 실행(eager execution) 환경을 사용할 수 있다

 

이는 그래프를 직관적으로 설계하는 것을 가능하게 한다.

 

즉시 실행 환경을 사용하게 되면 연산간의 의존 관계가 더 명확해진다.

 

 

tensorflow.js는 프로그래머들이 모델의 최적화는 신경쓰지 않고 다양한 모델을 사용해볼 수 있도록 기존의 연산들을 조합하여 연산 그래프를 구성하게 하는 것을 가능하게 한다??

 

안써보면 모르겠다

 

모델이 연산 그래프로 구성이 된다는거

 

 

 

'프로그래밍 > Tensorflow.js' 카테고리의 다른 글

tensorflow.js 익히기 -cors error, cdn사용-  (0) 2023.01.07
TAGS.

Comments