시작하며,

나는 그동안 프론트엔드 개발을 주로 해왔다.
사실 어떤 개발이든 그 자체로 재밌었지만, 주로 유저들에게 빠른 서비스를 제공하기 위한 개발을 하다보니 자연스럽게 프론트엔드의 역량을 많이 기를 수 있었다.
지금은 AI시대이다. 그렇다고 프론트엔드 개발자가 AI로 대체되지 않을 것이다.
하지만 AI에 대한 이해가 있으면 충분히 경쟁력이 있는 개발자가 될 것이다.
따라서 나도 AI에 대해 좀 공부해보고자 한다.

딥러닝이 무엇인가?

딥러닝은 인간의 뇌 작동 부분은 모방해서 재현하는 것이다.

Neuron

인간의 뉴런이 학습 메커니즘 중에 가장 뛰어난 학습 도구이다.
notion image
 
notion image
입력은 정규화하는 과정이 중요한데, 이것은 Yann LeCun의 Efficient BackProp 관련하여 좋은 내용이 있다.
가중치로 신경망이 학습하기 때문에, 시냅스는 꼭 필요하다.
신경망은 모든 경우에 가중치를 조정하면서 결정을 내린다.
특정 뉴런에 어떤 신호가 중요하고 어떤 신호가 중요하지 않은지, 어떤 신호가 전달되고 어떤 신호가 전달되지 않을지,어느 강도의 신호가 전달될 지 정하는 것이다.
 
notion image
먼저 가중치를 다 더하고 활성화 함수를 적용한다.
그리고 함수에 따라 뉴런이 신호를 전달하거나 전달하지 않는다.

Activation Function

활성화 함수 유형 4가지를 알아보자.
notion image
Threshold Functiom예, 아니요 유형의 함수이다.
 
notion image
로지스틱 회귀에서 나오는 방법이다.
매끄럽고 점진적으로 진행한다.
시그모이드 함수는 마지막 층인 출력층에 아주 유용하다.
특히 확률을 예측할 때 유용하다.
notion image
정류화 함수가 가장 많이 사용되는 함수 중 하나이다.
notion image
시그모이드 함수와 비슷한데, 하이퍼볼릭탄젠트 함수는 0 아래로 내려간다.
각 함수에 관해 너무 자세히 알아보지는 않는다.
하비에 글로롯이 2011년에 쓴 논문 ‘Deep sparse rectifier neural networks’라는 논문에서 자세히 공부할 수 있다.
지금 당장은 아니고 실용적인 면에 익숙해졌을 때 논물을 참고하면 이해도 더 잘 될 것이다.
 
이진수값에는 어떤 값을 쓰는 것이 좋을까?
  • threshold activation function
  • sigmoid activation function 은 y가 1일 확률을 알려주는 함수이다.
 
실제로는 숨겨진 층에서 rectifier activation function을 사용하고
신호가 시그모이드 활성화 함수가 적용될 출력층으로 전달이 되어서 확률을 예측할 수 있다.
 

How do Neural Networks work?

은닉층이 없어도 이미 대부분의 머신 러닝 알고리즘에서 사용할 수 있는 상태이다.
하지만 신경망은 많은 유연성과 기능을 얻을 수 있다는 장점이 있다.
바로 은닉층이 그 기능이다.
 
notion image
 
머신러닝은 모든 입력층의 요소를 이용하는데, 딥러닝은 입력층의 특정 요소를 이용한다고 생각하면 되려나?
머신러닝은 모든 피처를 동일하게 사용하지만 딥러닝은 입력의 일부분 또는 계층적 정보를 활용한다고 한다.
근데 생각해보니 머신러닝도 결국 피처의 가중치를 조절하여 특정 요소를 이용할 수 있는거 아닌가?
딥러닝은 피처 자체를 만들어내는 과정이고, 은닉층의 뉴런이 새로운 피처라고 보면 된다.
 
비유를 들어보면,
머신러닝
“특정 방식(RBF, 다항식 등)으로 종이를 접어서 직선을 긋는 것” (종이 접는 법은 정해져 있음)
딥러닝
“종이를 원하는 대로 접고 자르면서, 어디가 중요한지 스스로 정하는 것” (접는 방식도, 자르는 방식도 모두 학습)
느낌상 머신러닝은 물고기를 주는 것이라면, 딥러닝은 물고기를 잡는 방법을 가르치는 것 같다.
 
무언가 딥러닝이 더 유연하고 좋을 것 같지만 그럼에도 머신러닝 기법이 더 적합한 상황으로는,
  • 데이터가 적을 때
  • 해석 가능성이 중요한 경우
  • 훈련/예측 속도가 중요한 경우
  • Tabular data에서는 여전히 강력

How do Neural Networks learn?

개와 고양이를 구분하는 프로젝트를 진행한다고 생각해보자.
일반적인 코딩으로는 if문을 통해 고양이의 귀는 이렇게 생겨야 하고, 수염을 찾고, 어떤 식으로 생긴 코를 찾아야 하고, 어떤 형태의 얼굴을 찾고 등등 직접 프로그래밍을 해야 한다.
그러나 딥러닝의 경우에는 신경망만 코딩하면 된다. 아키텍처만 코딩하는 것이다.
 
cost function 은 예측한 값에 오류가 있다는 것을 나타낸다.
cost function도 엄청 여러 가지이다. 그 중 아래 공식을 흔히 사용한다고 하는데,
그 이유는 경사하강법을 공부할 때 알게 된다고 한다.
 
에포크 epoch란 전체 데이터 세트를 통해 모든 행을 가지고 신경망을 훈련시키는 것이다.
1 epoch에서 모든 데이터에
  • 가중치를 곱하고
  • 활성화 함수를 적용하고
  • 손실함수를 구한 후
  • 다시 가중치를 업데이트한다.
목표는 비용 함수의 최소치를 찾는 순간 최종 신경망을 완성한 것이다.
이 과정 전체를 역전파라고 한다.
 
비용 함수에 대해 더 알아보고 싶으면, 아래 링크의 첫 번째 답변에서 좀 더 자세히 공부할 수 있다.
Cross ValidatedCross ValidatedA list of cost functions used in neural networks, alongside applications

Gradient Descent

경사하강법이 최적화 문제를 해결하는데 아주 효율적인 방법이다.
하지만 경사하강법의 문제는 비용 함수가 볼록해야지만 사용할 수 있다는 것이다.
하지만 함수의 모양이 볼록하지 않다면 어떡해야할까?
 

Stochastic Gradient Descent

notion image
우리는 손실함수가 제곱한 형태라서 이차함수 형태로 나올 것이라 생각했다.
그러나 다차원 공간이라서 볼록하지 않은 모양으로 바뀔 수 있다고 한다.
그래서 이럴 때 평법한 경사 하강법을 적용하려고 하면 잘못된 가중치를 얻을 수 있다.
이를 해결하기 위해 확률적 경사 하강법을 사용한다.
확률적 경사 하강법은 볼록할 필요가 없다.
 
기존의 (배치)경사 하강법은 신경망에서 모든 행을 실행한 다음 가중치를 조정하고 전체 행을 다시 실행한다.
그러나 확률적 경사 하강법은 한 번에 한 행만 실행하고 가중치를 조정하는 것이다.
확률적 경사 하강법은 전반적인 최소치를 찾는게 아니라 로컬 최소치를 찾게 되는 문제점을 피하는데 도움이 된다는 것이다.
한 번에 반복 한번, 행 한 번을 실행하기 떄문에 변동성이 훨씬 높다.
 
하나씩 하다보니 확률적 경사 하강법이 느릴 것 같지만 실제로는 더 빠르다.
전체 데이터를 메모리에 로드해서 모든 행이 다 실행 될 때까지 기다릴 필요가 없기 때문이다.
 
배치 경사 하강법은 결정론적인 알고리즘이지만 확률적 경사하강법은 말 그대로 확률적인 알고리즘이다.
신경망의 시작 가중치가 똑같다면,
배치 경사 하강법은 매번 똑같은 반복을 하고 같은 결과로 가중치가 업데이트 될 것이다,.
그러나 확률적 경사 하강법은 같은 결과가 나오지는 않을 것이다.
그래서 둘의 장단점을 합친 미니 배치 경사 하강법: 10개, 100개 정도 데이터를 실행하고 조정하는 방법도 있다.
 
🔽 경사 하강법 적용 관련 좋은 글
A Neural Network in 13 lines of Python (Part 2 - Gradient Descent) - i am trask
 
🔽 경사 하강법의 수학적인 내용이 담긴 책
Neural networks and deep learning

Backpropagation

역전파는 고급 알고리즘이다.
역전파의 가장 큰 장점은,
  • 모든 가중치를 동시에 조정할 수 있다.
    • 정확하게 어떤 오차가 신경망의 어느 가중치에 의해 나타나는지 파악할 수 있다.
 
신경망 훈련 단계
  1. 가중치도 시작값은 필요하므로 0과 가까운 무작위 값으로 설정된다.
  1. 첫 번째 행에 대한 데이터 세트의 첫 관측치를 입력층에 입력한다.
  1. 왼쪽에서 오른쪽으로 순전파한다.
    1. 뉴런은 각 뉴런의 활성화의 영향이 가중치에 의해 제한되는 방식으로 활성화 된다.
    2. 즉, 가중치가 각 뉴런 활성화의 중요성을 결정한다.
  1. 예상 결과를 실제 결과와 비교하여 오차를 측정한다.
  1. 오른쪽에서 왼쪽으로 오차가 역전파된다.
    1. 오차에 얼마나 책임이 있는 뉴런인지를 확인하며 가중치를 업데이트한다.
    2. 이것을 계산할 수 있는 이유가 역전파 알고리즘 구조 방식 덕분이다.
    3. 학습률은 가중치를 얼마나 업데이트하느냐에 따라 결정된다.
  1. 1단계에서 5단계를 반복한다.
  1. 전체 훈련 세트가 인공 신경망을 통과해서 에포크를 만들고 더 많은 에포크를 만든다.
    1. 계속해서 반복하고 반복하면 신경망이 점점 더 잘 훈련하고 손실 함수를 줄여간다.