[CS224N] Lecture 4 : Back Propagation and Computation Graphs

duduuman·2021년 11월 8일
0

CS224N Review

목록 보기
1/1
post-thumbnail

1. Matrix gradients for Neural Net

(1) Derivative wrt a weight matrix

Neural Network 과정

  • FeedForward : input vector가 weight matrix와 곱해져서, output vector를 생성한다.
  • BackPropagation : output vector를 weight matrix 에 대해 미분. FeedForward 과정을 통해 나온 predict 값과 실제 값을 통해, error signal vector를 만들고, Chain Rule을 이용해 가중치를 업데이트한다.

  • Chain rule: 연쇄법칙으로 합성함수의 미분법을 의미한다. Neural Network에서는 이러한 합성함수의 미분법인 chain rule을 이용하여 최종 scalar 값을 weight로 미분해가며 가중치를 업데이트 하는 방식으로 학습이 진행된다.

  • Weight matrix의 미분은 함수의 연쇄법칙으로 이뤄져 있다.
    위 그림은 지난 시간에 배운 NER 모델이며 input을 받아 hidden layer을 거쳐 하나의 스칼라 값이 나오게 한다. 스칼라 값 s을 weight로 미분을 하고자 할때 이것 또한 합성함수의 미분 형식을 그대로 따른다.

(2) Deriving gradients : Tips

  • Tip 1 : 변수를 잘 정의하고 차원을 계속 숙지한다. (각 성분에 대해 미분을 할때 weight matrix의 차원을 잘 숙지해야 계산이 어렵지 않음)
  • Tip 2 : 연쇄 법칙을 잘 알고 사용한다.
  • Tip 3 : 마지막 𝑠𝑜𝑓𝑡𝑚𝑎𝑥 값에 대해 𝑐𝑜𝑟𝑟𝑒𝑐𝑡 𝑐𝑙𝑎𝑠𝑠 / 𝑖𝑛𝑐𝑜𝑟𝑟𝑒𝑐𝑡 𝑐𝑙𝑎𝑠𝑠를 따로따로 미분해준다.
  • Tip 4 : 행렬 미분 방법이 헷갈린다면 성분 별 부분 미분을 연습할 것.
  • Tip 5 : 𝑆ℎ𝑎𝑝𝑒 𝐶𝑜𝑛𝑣𝑒𝑛𝑡𝑖𝑜𝑛을 이용하자. 𝐻𝑖𝑑𝑑𝑒𝑛 𝑙𝑎𝑦𝑒𝑟에 도착하는 에러 메세지 𝛿는 그 은닉층의 차원과 같다.

Backpropagation 과정에서 미분 계산 시, 도움이 되는 팁은 위와 같다.

(3) Deriving gradients wrt words for window model

NLP에서 Word들에 대해서는 어떻게 미분이 적용되는가?

각각의 word들은 고유의 vector 값을 가지며 이 벡터들을 window 단위로 넘겨준다.
위 그림에서 예시로 5개의 단어가 있고 각 단어는 d차원의 벡터가 된다. 따라서 5xd 차원의 word window vector이며 window 단위로 Neural Network의 FeedForward, Backpropagation 과정을 거쳐 수행할 task에 맞춰 가중치를 업데이트 하며 각 단어 벡터들이 업데이트 된다.
이 과정을 Downstream Task라 한다.

(4) A pitfall when retraining word vectors

word vector Retraining 단점

특정 task를 위해 word vector를 학습시키고 노드의 가중치와 워드 벡터를 업데이트 시키는 과정은 항상 좋은 것은 아니다.

예로 들어 TV, telly, television 와 같은 비슷한 의미의 단어들을 워드 임베딩을 한다면 vector space 상의 세 단어는 가깝게 위치한다.
하지만 만약 훈련집합에 TV, telly가 있고 검증집합에 television이 있을 때, retraining하면 TV와 telly는 가중치를 업데이트하며 위치가 변한다.

그러나 television은 가중치가 업데이트 되지 못하고 다른 의미를 지닌 단어로 분류가 된다.
각각의 단어는 그래디언트를 받아 업데이트가 된다.
훈련집합에 있는 단어는 업데이트했기 때문에 결정경계면이 바뀌었지만 검증집합에 있는 단어는 결정경계면에 의해서 제대로 분류가 되지 않음을 확인할 수 있다.

대부분의 경우 Pre-trained된 모델을 사용하자!

  • Pre-trained 모델
    사전에 학습된 모델로 방대한 데이터 셋에 이미 학습이 되어있는 모델.(Word2Vec, Glove 등.)
    훈련 데이터 셋 포함의 유무와 관계없이 단어 간의 일정 수준 유사 관계가 형성. But, 데이터의 양이 100만개 이상이라면, 처음부터 학습시켜도 괜찮음.

  • Retraining word vector (Fine Tuning)
    Pretrained된 모델을 기반으로 목적 task에 맞게 변형하고 모델 전체를 업데이트 하여 학습을 업데이트 하는 방법.

  • Training dataset이 적은 경우 (< 10만 개 )
    Pre-trained word vector 사용
  • Training dataset이 많은 경우 (> 100만 개)
    word vector 학습 권장 (fine-tuning 하기)

2. Computation Graphs and Backpropagation

(1) Computation Graph이란?

"계산 그래프"를 의미한다. 그래프는 여러개의 노드와 그 노드를 잇는 선으로 표현이 된다.

(2) Forward propagation

  • Forward Propagation
    계산 그래프의 왼쪽부터 차례대로 연산을 해서 결과값을 얻는 과정

  • Backpropagation
    Forward Propagation을 통해 얻어진 결과와 실제값을 비교해 계산된 오차를 미분하며 가중치를 업데이트 및 학습.

  • Backpropagation 과정에서 중요한 요소
    (1) Local Gradient 
    (2) Downstream Gradient

Downstream Gradient = Local Gradient * Upstream Gradient


하나의 input과 하나의 output으로 이루어진 single node 그래프.
Back propagation 과정을 위해 진행 과정에서 Upstream gradient와 Downstream gradient의 순서로 미분값을 계산해야 한다.

  1. Local gradient는 Forward Propagation 수행 시의 output을 input으로 미분한다.
  2. 그 다음 Downstream gradient는 Local gradient에 Upstream gradient을 곱하여 도출한다.

결론적으로 Chain Rule을 이용한 것과 같은 결과이다.

더 많은 Input이 있을 경우의 Back Propagation은 동일하게 Upstream gradient에 각각의 Input에 대한 Local gradient를 계산해 곱해주어 Back Propagation을 수행한다.

Backpropagation Gradient Flow

주요 연산에 대한 분해 과정은 아래와 같다. 대표적으로 곱셈, 덧셈, Max 연산에 대해 gradient가 어떻게 흐르는지 알아본다.

1. 곱셈 연산

  • 곱셈 : input값 서로 변경 후 upstream gradient과 곱해서 보낸다.

2. Max 연산

  • Max : 더 큰 input값으로 upstream gradient 보낸다.

3. 덧셈 연산

  • 덧셈 : upstream gradient를 보낸다.

따라서 결과는 위와 같다.

(3) Efficiency: compute all gradients at once

back propagation을 수행할 때 효율적으로 미분값을 얻는 방법

한번에 모든 변수의 미분을 계산하기 (Chain rule 이용)
각 노드의 미분 계산 값을 잘 저장해두었다가 원하는 계산 값을 계산하고자 할 때 chain rule에 값을 대입하며 빠르게 계산 수행하기.

(4) Computation Graph

big O() complexity

  • Compuation Graph.
    검정색 화살표는 순전파가 진행되는 과정이고
    보라색 화살표는 순전파를 통해 나온 최종 값을 바탕으로 오류를 전파하며 거꾸로 값을 업데이트 해가는 역전파과정이다.

  • big O() complexity
    순전파의 계산량은 각각의 Input들이 노드를 타고 연산을 거치며 최종 Scalar값까지 관여한다.
    역전파의 계산량은 Scalar 값으로 부터 순전파시 거쳐 지나갔던 노드를 지나며 Gradient를 구하게 됩니다. Local Gradient나 계산 방법 등의 연산을 잘 저장해두었다가 필요시에 활용하면 추가적인 연산이 필요가 없게된다.

따라서 순전파와 역전파의 시간복잡도는 동일하다.

(5) Gradient checking : Numeric Gradient

Gradient가 잘 계산되었는지에 대한 확인은 중요하다.
Gradient를 계산하는 방법에는 2가지가 존재한다.

  • Analytic Gradient(해석적 방법) : 이 강의의 주된 내용인 계산 그래프를 통한 연산시 활용되는 Chain Rule을 이용하여 Gradient를 계산하는 방식이다.
  • Numerical Gradient(수치적 방법) : 미분의 공식을 이용해 쉽게 Gradient 계산을 하는 방법이다. h에 아주 작은 값을 대입하여 순간 기울기를 구하는 방법이며 아주 일반적으로 Gradient를 잘 계산했는지 확인하는 방법이다.

Neural Network 과정에서는 Numerical Gradient 방법으로 연산을 진행하지 않는다. 쉽게 미분 값을 계산할 수 있지만 적용할 때 마다 𝑓를 계속해서 계산을 해주어야 해서 연산량이 매우 많다는 단점이 존재한다.
특정 weight 에 대한 Gradient가 잘 계산 되었는가를 확인하기 위한 용도로만 Numeric Gradient Check 방식을 활용한다.

3. Tips and Tricks for Neural Networks

(1) Regularization


손실함수만을 이용한 모델 학습은 training error는 줄어들지만 test error는 증가하는 Overfitting 발생한다.

  • 특정 Parameter를 크게 만들어주며 에러를 줄이는 것을 방지하기 위해 모델에 penalty 추가한다.
  • 손실함수에 θ를 증가시키는 규제항을 추가하며 Overfitting 방지.
  • 주로 R2 규제항을 많이 사용하며 feature들이 많을수록 효과적이다.
    일반화에 적합한 특성을 갖게 만드는 것이다.

(2) Vectorization

  • 반복문 사용보다 벡터와 행렬 연산 사용이 학습 시간의 효율성이 더 높다.

    word vector를 개별적으로 반복해서 실행하는 것 보다 한 개의 matrix 연산 사용이 학습 시간 감소에 도움이 된다. 이 과정을 vectorization 이라 부른다.

(3) Non-Linearities

  • ReLU는 딥러닝에서 제일 먼저 고려해야하는 비선형 함수이다.
    가장 간단하며서 좋은 성능을 낸다.
  • Leaky ReLU, Parametric ReLU 등 ReLU를 보완하고자 변형된 ReLU 함수들이 제안된다.

(4) Parameter Initialization

Neural net 학습 전 가중치를 초기화하는 과정이다. 학습 전 가중치를 초기화하여 Gradient Vanishing 이나 Gradient Exploding 현상을 방지한다.

  • parameter의 초기값은 Small Random Value이어야 한다.
    Hidden Layer와 Output의 Bias term은 0으로 초기값을 준다.
    다른 모든 Weight들은 Uniform distribution에서 임의로 sampling한다.
  • Xavier Initialization 방법도 자주 사용한다.
    previous layer size와 next layer size에 맞게 weight의 분산을 조절해주는 방식.

(5) Optimizers

적절한 Optimizer를 사용하여 최적 값을 찾아갑니다.

  • 보통 SGD를 사용해도 최적화 잘 된다. 하지만 더 좋은 값을 기대한다면 learning-rate를 튜닝하는 것이 필요하다.
  • 복잡한 신경망에서는 "Adaptive" Optimizers가 성능이 좋다.
  • "Adaptive" Optimizer는 상대적으로 업데이트 양을 계산하며 step size, parameter를 조절해가는 방식이다.
    (ex) Adagrad, RMSprop, Adam, SparseAdam...

(6) Learning Rates

학습시킬 때 적절한 learning rate를 설정하는 것이 중요하다.

  • 0.001 정도의 Learning Rate를 일반적으로 쓴다.
  • Learning Rate가 너무 크면 모델이 발산하고 너무 작으면 업데이트 양이 작아 학습이 느려진다.
  • 학습이 진행될수록 learning rate를 감소시키는 방법이 좋다.
  • Learning Rate Scheduling을 통해 상황에 따라 변환시키며 학습 진행한다.

0개의 댓글