작성자 : 세종대학교 응용통계학과 조준혁
chain rule은 연쇄법칙으로 합성함수의 미분법을 의미합니다.
Neural Network에서는 이러한 합성함수의 미분법인 chain rule을 이용하여 최종 scalar 값을 weight로 미분해가며 가중치를 업데이트 하는 방식으로 학습이 진행됩니다.
지금까지 앞서 x와 W의 선형결합으로 이루어진 matrix에 대한 미분값을 살펴보았는데, Word들에 대해서는 어떻게 미분이 적용될지 알아보겠습니다.
NLP는 말 그대로 "언어"를 입력받아 특정 task를 수행하게 됩니다. 이때 각각의 word들은 고유의 vector 값을 가지게 되는데, 이 벡터들을 결합한 행렬 전체를 task를 수행하기 위한 input으로 넘겨주는것이 아닌 window 단위로 넘겨주게 됩니다. 위에서 제시된 예시는 5개의 단어가 있고 각 단어는 d차원의 벡터입니다. 따라서 5xd 차원의 word window vector이며 window 단위로 가중치를 업데이트 하며 각 단어 벡터들이 task에 도움이 되는 방향으로 업데이트를 진행합니다.
하지만 위와 같은 방법으로 특정 task를 위해 word vector를 학습시키고 노드의 가중치와 워드 벡터를 업데이트 시키는 것이 항상 좋은 결과를 야기하는 것은 아닙니다.
다음의 예시를 살펴보겠습니다.
TV, telly, television 는 기본적인 의미가 같기 때문에 glove 등을 통해 워드 임베딩을 한다면 vector space 상의 세 단어는 매우 가깝게 위치할 것입니다.
하지만 만약 학습시키고자 하는 데이터셋에 TV, telly가 있고 television은 없다고 가정해보겠습니다.
학습 데이터를 이용해 모델을 학습시킨다면 TV와 telly는 모델의 목적(ex. movie review sentiment classification)에 맞게 가중치를 업데이트하며 움직이게 됩니다.
하지만 television의 경우에는 어떻게 될까요?
TV와 telly와 비슷한 의미를 지님에도 학습 데이터 셋에 포함되지 않는다는 이유로 가중치가 업데이트 되지 못해 모델로 하여금 다른 의미를 지닌 단어로 분류되게 됩니다.
지난 강의에서 소개되었던 Word2Vec, Glove 모두 Pre-trained 모델입니다.
Pre-trained 모델의 경우 이미 방대한 양의 데이터에 대해 학습을 마친 상태이므로, 위와 같이 TV, telly, television과 같이 비슷한 단어의 경우 훈련 데이터 셋 포함 유무에 관계없이 일정 수준의 유사 관계가 형성이 됩니다.
하지만 데이터의 양이 100만개 이상이라면(거의 불가능), 랜덤 워드 벡터로부터 시작해서 모델을 학습시켜도 괜찮습니다.
Computation Graph이란 "계산 그래프"를 의미합니다. 계산 그래프란 말 그대로 계산 과정을 그래프로 나타낸 것입니다. 그래프는 여러개의 node와 그 노드를 잇는 선(edge)로 표현이 됩니다.
위의 수식을 얻기위해 계산 그래프의 왼쪽부터 차례대로 연산을 해나가 결괏값을 얻는 것을 Forward Propagation이라고 합니다.
Neural Network는 Forward Propagation을 통해 얻어진 결과와 실제값을 비교해 계산된 오차를 미분하며 가중치를 업데이트하는 방식으로 학습이 진행됩니다.
이해를 돕기위해 먼저 하나의 input과 하나의 output으로 이루어진 계산 그래프를 생각해보겠습니다.
Back propagation의 진행 방향을 생각해볼 때 Upstream gradient와 Downstream gradient의 순서로 미분값을 계산하게 됩니다.
하지만 Downstream gradient를 수행할 때 s는 z로 이루어지지 않아 적절히 미분을 수행할 수 없습니다.
이를 해결하기 위해 Forward Propagation 수행 시의 output을 input으로 미분한 Local gradient를 이용해 Downstream gradient를 계산할 수 있게 됩니다.
결론적으로는 Chain Rule을 이용한 것과 같은 결과입니다.
조금 더 일반화를 하기 위해 더 많은 Input이 있을 경우에는 어떻게 Back Propagation을 살펴보겠습니다.
간단히 말하면 위에서 소개해드린 방법을 여러번 수행한다고 생각하시면 됩니다.
동일하게 Upstream gradient에 각각의 Input에 대한 Local gradient를 계산해 곱해주어 각 Input에 대한 미분을 수행하며 Back Propagation을 수행합니다.
다음은 계산 그래프를 통해 back propagation을 수행할 때 효율적으로 미분값을 얻는 방법을 소개하겠습니다.
방법은 간단합니다.
미분을 계산할 때 한번에 다 계산을 하라는 것입니다.
각 노드의 미분 계산 값을 잘 가지고 있다가 원하는 값을 계산하고자 할 때 간단히 chain rule을 설계해 값을 대입하며 빠르게 값을 얻을 수 있을것 입니다.
(값을 저장해 추후에 local gradient 등을 다시 계산하지 않는다.)
Compuation Graph의 일반적인 모습입니다.
위의 검정색 화살표 색깔로 Forward Propagation(순전파)가 진행되고 순전파가 진행된 최종 값을 바탕으로 보라색 선 방향으로 오류를 전파하며 값을 업데이트 해가는 Back propagation(역전파) 과정을 보여줍니다.
순전파의 계산량을 생각해보면 각각의 Input들이 노드를 타고 연산을 거치며 최종 Scalar값까지 관여하게 됩니다.
역전파의 경우도 마찬가지로 Scalar 값으로 부터 순전파시 거쳐 지나갔던 노드를 지나며 Gradient를 구하게 됩니다. 이때, 앞선 3-3) efficiency 부분처럼 Local Gradient 등의 연산을 잘 저장해두었다가 필요시에 활용하게 되므로 추가적인 연산이 필요가 없게됩니다.
따라서, 순전파와 역전파의 시간복잡도는 동일하게 됩니다.
Pytorch나 Tensorflow 등의 딥러닝 프레임워크가 잘 발달되기 이전 딥러닝 초기의 데이터 과학자들은 Neural Network의 학습을 위해 직접 손으로 Gradient를 계산하며 Weight를 업데이트 하는 방식으로 학습을 진행했습니다.
정확한 Gradient 계산은 성공적인 네트워크 학습의 핵심이었으며 Gradient를 잘 계산했는지 여부를 엄격하게 체크했다고 합니다.
Gradient를 계산하는 방법에는 2가지가 존재합니다.
1번의 Analytic Gradient 방법은 이 강의의 주된 내용인 계산 그래프를 통한 연산시 활용되는 Chain Rule을 이용하여 Gradient를 계산하는 방식입니다.
Numerical Gradient 방식에 대해 소개해드리겠습니다.
수치적인 방법은 해당 파라미터의 미분을 구하기 위해 미분의 공식을 이용해 계산을 하는 방법입니다.
다른 강의이지만 CS231N(2017) 강의에서 제시된 예시를 살펴보겠습니다.
현재 위와 같은 Weight를 가지고 계산된 Loss가 주어졌습니다.
첫번째 Weight에 대해서 굉장히 작고 0에 가까운 값을 더해 살짝 이동시켜보니 Loss가 감소했음을 알 수 있습니다.
이 Loss를 바탕으로 미분값을 계산합니다.
다음 Weight를 h만큼 이동시킨 Loss가 증가했습니다.
마찬가지로 Loss 값을 이용해 gradient를 계산해주게 됩니다.
위와같은 방식을 거치며 Gradient를 계산하는 방법을 Numerical Gradient 라고 합니다.
Numerical Gradient는 쉽게 미분값을 얻을 수 있다는 장점이 있지만 하나의 gradient를 계산하기 위해서 f의 값을 계속해서 계산을 해주어야 해서 연산량이 매우 많다는 단점이 존재합니다.
반면 우리가 주로 사용하는 Chain Rule을 이용한 Analytic Gradient 계산 방법은 정확하고 빠르지만 계산 과정에서 실수가 있을 수 있다는 단점이 존재합니다.
이러한 단점을 보완하기 위해, 특정 Weight에 대한 미분이 잘 계산이 되었는가를 확인하기 위한 방법으로 Numerical Gradient 방법을 통해 미분을 계산해보는 Numeric Gradient Check 방식을 활용합니다.
학습시키는 모델은 굉장히 많은 파라미터들을 가지고 있습니다.
손실함수만을 이용해 모델을 학습시키게 된다면, 모델이 학습 데이터는 잘 적합시키지만 테스트 데이터 셋은 잘 적합시키지 못하는 Overfitting(과적합)을 야기할 수 있습니다.
따라서 를 감소시켜야 하는 손실함수에 를 증가시키는 규제항을 추가하며 과적합을 방지할 수 있습니다.
주로 R2 규제항을 많이 사용하며 feature 들이 많을수록 효과적이라고 합니다.
word vector들을 각각 돌며 Weight matrix와 행렬곱을 수행할때의 시간과 word vector들을 하나의 matrix로 합친 뒤 W와 곱연산을 했을때의 시간 차이는 10배 이상 납니다.
따라서 반복문을 사용하기보다는 matrix 연산을 사용하는것이 학습의 시간을 감소시키는데 효과적일것 입니다.
딥러닝 초기의 비선형 활성함수로는 logistic, tanh 함수가 자주 사용되었습니다.
하지만 두 함수 모두 exponential(지수) 연산이 필요해 연산량이 많아 Deep Learning에는 적합하지 않습니다.
딥러닝을 설계할때 가장 먼저 고려해야할 비선형 함수는 좌측의 ReLU입니다.
ReLU는 가장 간단한 비선형 함수이면서도 좋은 성능을 자랑합니다.
ReLU는 음수값에 대한 Gradient를 0으로 취급하기 때문에 이를 보완하고자 Leaky ReLU, Parametric ReLU 등의 ReLU가 변형된 비선형 함수가 제안되고 있습니다.
보통의 경우 일반 SGD를 사용해도 좋은 결과 성능을 예상할 수 있습니다.
하지만 더 좋은 결과를 기대한다면 learning-rate를 적절히 조절해주는것이 필요합니다.
더 복잡한 신경망일 설계할 때는 "Adaptive" Optimizers를 사용하는 것이 더 좋습니다.
Adaptive Optimizer는 계산된 Gradient에 대한 정보를 축적하며 파라미터를 조절해가는 방식을 사용합니다.
ex) Adagrad, RMSprop, Adam, SparseAdam...
0.001 정도의 Learning Rate로 학습을 진행할 수 있습니다.
Learning Rate가 너무 클때는 모델이 발산할 가능성이 있고 너무 작으면 업데이트양이 작아 학습을 느리게 합니다.
대부분의 경우 학습을 진행시키며 learning rate를 감소시키는것이 성능 향상에 도움이 됩니다.
투빅스 14기 정세영
backpropagation의 기초적인 내용을 다시 잘 짚을 수 있었고, NLP와 연결하여 이해할 수 있었습니다.
투빅스 14기 강재영
Backpropagation과 NLP retraining에 관한 전반적인 내용을 학습할 수 있었습니다.
A pitfall when retraining word vectors
Computation Graphs and Backpropagation
Regularization : 과적합 방지 방법 / Vetorization : 연산시간 감소 방법 / Actiovation : Relu, tanh 등 다양한 비선형 함수 ( 실제 많은 현실의 문제들은 비선형 문제이기 떄문에 ) / Parameter Initialization : Small Random Value / Uniform disribution( 너무 크고, 너무 작지 않게 적당한 값 배분 ) / Xavier ( 이전 레이어와 다음 레어이의 크기를 고려해 가중치의 분산을 조절 )
투빅스 15기 이수민
투빅스 14기 이정은
강의를 통해 Backpropagation과 성능 향상에 대한 흐름을 잘 이해할 수 있었습니다! : )
투빅스 15기 김동현
NLP를 역전파와 연관지어 자세히 알아볼 수 있는 시간이였습니다.
투빅스 15기 이윤정
투빅스 15기 조효원
Gradient를 계산하는 방법에는 Numerical Gradient와 Analytic Gradient가 존재하는데, 각각은 미분 공식을 이용하고 Chain rule을 이용한다. 이때, Analytic Gradient 방식을 사용하면 빠르고 대체적으로 정확하지만 실수가 발생할 수 있다는 단점이 있고, Numerical Gradient 방식은 연산량이 너무 커서 실질적으로 사용하기 어렵다는 단점이 있다.
NLP에서는 벡터 전체 단위로 학습을 하지 않고 window 단위로 학습을 진행한다. 수행할 작업에 맞춰서 가중치와 단어 벡터들이 업데이트되는데, 이때 특정 단어가 코퍼스 내에 등장하지 않거나 매우 적게 등장하는 경우 문제가 된다. 따라서 retraining은 권하지 않으며, 큰 단위로 학습된 pretrained 모델을 사용하는 것을 권장한다. 가지고 있는 데이터의 크기가 100만 개 이상일 때는 fine-tuning을 진행하는 것이 성능 향상에 도움이 되지만, 이보다 적다면 성능에 문제를 야기한다.
이 밖에도 신경망을 보다 빠르고 정확하게 학습시키기 위한 방법으로 overfitting을 막는 regularization 방식, 학습시간 감소를 위한 Vectorization, 비선형성, parameter Initialization, Optimizer, Learning Rate 등에 대한 구체적인 예시들을 확인했다.
투빅스 14기 강의정
Lecture 4. Backpropagation and Computation Graphs를 주제로 발표해주셨습니다.
투빅스 15기 김재희
역전파 과정과 편리한 역전파 계산을 위한 그래프에 대해 다뤘습니다.
본래 각 파라미터가 손실함수에 대해 어떤 방향을 가지는지 보려면 손실함수에 대해 직접 각 파라미터를 미분해야 합니다. 하지만 손실함수는 복잡하고, 이를 각 파라미터에 대해 미분하는 과정 역시 복잡할 수 밖에 없습니다. 이를 편미분과 chian rule을 이용해 간단하게 만들 수 있습니다.
chain rule을 이용할 경우 이전 층의 그래디언트가 이번 층의 미분에 직접 사용되게 됩니다. 이를 이용하여 중복된 계산을 줄일 수 있습니다.
gradient descent 만으론 효과적인 학습이 힘듭니다. 이를 개선하기 위해 다음과 같은 방법들이 사용될 수 있습니다.
투빅스 14기 정재윤
투빅스 14기 박준영
이번강의는 투빅스 15기 조준혁님이 진행해주셨습니다.
역전파 개념을 다시 복습할 수 있어서 좋았고. Neural Network의 다양한 기법들을 배울 수 있었던 유익한 강의였습니다. 감사합니다!
투빅스 14기 한유진
역전파에 대한 개념을 다시 한번 잡을 수 있어서 좋았고, 왜 이러한 것들이 등장하게 되었는지와 같은 흐름도 잘 짚어주셔서 내용을 이해하는데 많은 도움이 되었습니다! 좋은 강의 너무 감사합니다!