[AIFFEL] 22.Jan.21 - Structure_of_Deep_Learning

Deok Jong Moon·2022년 1월 21일
0
post-thumbnail

오늘의 학습 리스트

  • MNIST 숫자이미지 데이터 왜 255로 나누는 걸까?

    • 쓰려는 모델, 특히 활성화 함수에 따라 다르다고 하는 것 같다.
    • "sigmoid function works more efficiently with data range 0.0-1.0."
    • 그렇기에 어떤 경우엔 모델의 performance가 normalization 하기 전이랑 똑같다고 한다.
  • 입력층 -> 은닉층(1개) -> 출력층 구조에서

    • data feature가 d개
    • 은닉층 뉴런 갯수 H개
    • 출력층 뉴런 갯수 K개이면
    • 입력층to은닉층 가중치 : WdWdxHH
    • 은닉층to출력층 가중치 : WHWHxKK
    • 그리고 사실 이건 3개의 레이어 같지만, 알고보면 2개의 레이어다.(입력층은 그냥 input일 뿐 층이 존재하지는 않는다. 헷갈리면 연결이 몇 번 되는지 생각하면 됨)
  • bias는 가중치를 뜻하는 +1+1은 이전 뉴런들과는 연결이 안된다.(해당 층의 bias와 곱셈만 하는 것이기 때문에)

    • weights는 그래프의 'steepness'를 바꾸지만, bias는 위치를 옮겨주는 역할을 한다.
  • Fully-Connected Neural Network

  • 활성화 함수

    • 결론적으로 linear 모델과의 차이를 준다.(정확히는 레이어 사이에 이 비선형 함수가 포함되지 않은 MLP는 한 개의 레이어로 이루어진 모델과 수학적으로 다른 점이 없다.)
      • Non-linearity in simple words can be thought of as “The outcome does not change in proportion to a change in any of the inputs”.(링크)
    • 지금은 ReLU를 많이 쓰는데, 이유는 sigmoid 같은 함수를 쓰면 vanishing gradient problem 발생!
    • 그리고 exp 함수 쓸 때 비용 손실이 크다
  • Vanishing Gradient Problem

    • Chain Rule을 통해 얻는 중간 미분계수(?)들이 1보다 작고, 심지어 0에 가깝게 된다면, 이들을 곱한 최종 미분계수는 더더더더더 작아진다.
    • 그래서 입력층에 가까운 미분계수들은 중간에 곱해야 하는 미분계수들이 많아져서 출력층 쪽 미분계수보다 더 작고 train이 굉장히 느리다.
    • 반대로 출력층에 가까운 건 그나마 train에 빠르다.
    • 하지만 그렇다고 출력층에 가까워서 다행이란 건 아니다.
    • 결국 입력층 쪽의 부정확한 레이어들을 근간으로 해서 출력층이 이루어지는 것이기에, 전체 Neural Network가 망가지게 된다.
  • 그래서 나온 해결책이 새로운 활성화함수!

    • ReLU의 미분계수는 결국 0 아니면 1이다.
    • 그래서 vanishing gradient problem을 해결해준다.
    • 하지만 이것에도 문제는 있는데,
    • 바로 0보다 작은 음수가 input으로 들어오게 되면 해당 미분계수는 0이 되어 죽어버린다는 것...
    • 그래서 큰 음수 weight이나 bias가 중간에 끼게 되면 골치 아프게 될 수 있다.(Neural Network를 수학적으로 이해하면 이런 디버깅 인사이트를 얻게 되는 구나...)
  • 그래서 또 나온 해결책은 leaky ReLU

    • max(0,x)max(0, x)가 아닌 max(0.02x,x)max(0.02* x, x) 이 정도의 값을 주는 함수이다.
    • 그럼 비록 0보다 작은(음수) input일 때 미분계수가 음수가 되어버리지만 그래도 존재하기는 한다.
  • 하지만 그렇다고 ReLU나 leaky ReLU가 궁극의 해결책은 아니다.

    • 결국 이들로 인한 값이 0~1에 묶여 있지 않기에 더 층이 깊어질수록 explode할 가능성이 있고,
    • 값을 0~1 사이로 만들어주지 않는다는 점에서 확률적으로 해석하기도 힘들다.(맞나..?)
    • 그리고 initial weight은 대부분 0~1사이의 값이기에 이 자체가 vanishing gradient로 우릴 이끌기도 한다.(근데 그럼 값을 크게 하면 되는 거 아닐까....?라는 단순한 생각이 든다.)
    • 그래서 이건 black or white의 문제가 아니다.
  • Exploding Grading Problem

    • 반대로 중간 미분계수(?)들이 1보다 크게 된다면, 이들을 계속 곱하면 최종 미분계수는 폭발해버린다.
  • tanh 활성화함수

    • 함수의 중심값을 0으로 옮긴다.
      • sigmoid의 최적화 과정이 느려지는 문제를 해결한다는데 왜인지 모르겠다.
    • -1 ~ 1 사이의 값이 나옴
  • Loss Function

    • cross-entropy
      • 공식의 뜻이 헷갈렸었는데, 결국 보면
      • 확률(0~1)을 input으로 집어넣으려 하는 건데
      • 로그 함수에서 input이 0~1 사이이면 -\infin ~ 0이다.(특히 input이 0에 가까울수록, 즉 확률이 작을 수록 -\infin를 향한 기울기를 가파르게 된다)
      • 근데 이것을 (-)로 거꾸로 해주니 확률이 작을수록 \infin에 가까워지고,
      • 의미적으로 실제 라벨값(1)에 대한 확률이 작아지면 손실함수 값이 커지니 조심해!이다.
  • Weight initialization 또한 하나의 중요한 파트이다.

    • 이로 인해 global minima가 아닌 local minima에 빠질 수도 있고
    • vanishing gradient problem도 생기고...

감사할 거리

1) 오늘 Dense Layer 혹은 NN에서 각각의 레이어마다 input 데이터 차원과 output 차원이 어떻게 돌아가는지 좀 깨달았다. 여태까지는 '앞과 뒷 레이어 간에 숫자가 달라도 되는 건가...?' 하는 막연한 궁금증이 있었는데 결론적으로 내가 가졌던 궁금증은 상관 없다는 거였다. 그냥 내 마음대로 뉴런 내 파라미터(?) 수를 조절하는 거였고, 사실 그만큼 모델이 복잡해지고 하는 것이기 때문에 그 숫자는 앞뒤 레이어간 상관 없이 적는 것도 있다는 걸 깨달았다.

profile
'어떻게든 자야겠어'라는 저 아이를 닮고 싶습니다

0개의 댓글