Convolution 소개

파라미터 수 손으로 직접 계산해보기

알렉스넷의 파라미터 수 구하기

input = 224 224 3
filter = 11 11 3
fisrt param = $11113482 ~= 35k$

Modern CNN

AlexNet

네트워크가 두 개로 나뉘어져 있다. 당시 GPU가 부족했기 때문임. 두 장의 GPU로 학습하고 합쳤다. 인풋에 $11 * 11$ 필터를 사용했는데, 파라미터 관점에서 좋진 않다. 상대적으로 많은 파라미터가 필요하기 때문. 이후 5개의 Convolution 레이어와 3개의 Dense 레이어를 사용한다. 최근 200-300개 네트워크를 가진 신경망에 비하면 Light한 편이다.

Key Ideas

  • Rectified Linear Unit(ReLU) 활성화 함수를 사용했다. $ReLU = max(0, x)$
    • 리니어 모델이 갖는 좋은 성질들을 가질 수 있게 한다.
    • 리니어 모델들의 성질을 가지고 있기 때문에 학습하는 SGD나 Gradient Descent로 학습을 용이하게 한다.
    • 활성화함수를 사용할 때 이전에 많이 활용하던 Sigmoid나 tanh 같은 경우 값이 커지면 슬로프가 줄어들게 된다. 슬로프가 결국 기울기니까, 뉴런의 값이 많이 크면(0에서 벗어나면) Gradient Slope는 0에 가까워진다. 이 때 Vanishing Gradient 문제가 발생할 수 있는데, ReLU를 사용하면 해당 문제를 해소할 수 있음
  • GPU Implementation (2 GPUs)
  • Local Response Normalization(어떠한 입력 공간에서 Response가 많이 나오는 부분을 죽이는 것임. 최근엔 많이 사용되지 않음), Overlapping pooling
  • Data Augmentation
  • Dropout
자세히 보기

Vscode에서 Python Convention 지정하기

  1. vscode에 python extention 설치하기

  2. 가상환경에 autopep8 패키지 설치

    • conda install autopep8 (anaconda)

    • pip install autopep8 (pip)

  3. 가상환경에 pylint 패키지 설치

    • conda install pylint (anaconda)

    • pip install pylint (pip)

  4. vscode에서 cmd , (mac) ctrl , (window) 를 누르고 Settings 탭에 진입.

  5. Settings 검색창에 FormatOnSave 검색 후 체크박스에 체크.


위의 방법으로 되지 않는다면, vscode의 settings.json 파일 확인 후 아래 인자들이 작성되어있는지 확인, 되어있지 않다면 복붙하고 저장

  • python.formatting.autopep8Path 는 직접 확인하여 작성해야함.
    • Mac(m1)의 경우 Conda 설치시 /opt/homebrew/Caskroom/miniforge/base/bin/autopep8 경로에 있음.
1
2
3
"editor.formatOnSave": true,
"python.formatting.provider": "autopep8",
"python.formatting.autopep8Path": "Autopep8 실행파일 위치",
자세히 보기

빛예닮특강 - 논문읽는법

1. 제목 & 저자

제목을 통해 해당 논문이 어떤 내용을 담고 있을지 상상해 보는 것이 좋음.

  • 예를들어 Show, Attend and Tell: Neural Image Caption Generation with Visual Attention 해당 논문의 제목만 보고 ‘’아 이 논문은 Image Caption에 대한 논문이겠구나. 오 근데 시각적인 Attention을 이용했네?’ ‘Attention이 뭐지? 그냥 읽을까?’ ‘조금 찾아보고 읽을까?’ ‘아 이건 완벽하게 공부하고 다시 읽자’ 와 같이 모르는 용어가 나타났을 때 어떻게 대처할지 등 논문을 읽을 방향성을 잡을 수 있다.
  • 멘토님은 아주 조오오오금 (사전지식 정도만) 서치하고 읽는다고 하심

또한 제목과 더불어 저자를 보면 논문의 신뢰성을 대략적으로 추정할 수 있음.

  • ex) 조경현교수님: RNN의 축을 그으셨던 대가가 참여했으니 이 논문의 수식이나 피쳐들에는 오류가 없겠구나!
  • 신뢰성이 중요한 이유 중 하나: 매우 유명한 GAN 논문에는 수식의 오류가 있었음. 즉, 저자를 보고 의심할 수 있는 능력이 있어야 함.

2. Abstract

2. Abstract

최대한 꼼꼼하게 읽자. Abstract 부분은 논문에서 가장 처음으로 읽게 되는 파트다. 해당 파트를 읽고 이 논문을 계속 읽을지 말지 판단할 수 있기 때문이다.

  • ‘Abstract만 읽었는데 재밌네’ -> 논문을 읽어봐야겠다!
  • ‘이거 Abstract 너무 어려운데..?’ 혹은 ‘하나도 이해 못하겠다..’ -> 읽지 않는 편이 좋음.

3. Instruction

자세히 보기

Optimization 소개

“Language is the source of misunderstandings” - Antoine de Saint-Exupery (1900-1944)

용어에 대한 정리를 하고 넘어가야 이후에 오해가 생기지 않는다. 용어 통일이 가장 중요하기 때문에 용어에 대한 명확한 컨셉을 잡아볼 것임.

Introduction

Gradient Descent

  • First-order iterative optimization algorithm for finding a local minimum of a differentiable function.
  • 찾고자 하는 파라미터에 대해서 손실함수를 미분한 편미분값을 가지고 학습을 하겠다는 것임.
  • Local minimum: 손실함수를 미분했을 때 극소적으로 좋은 로컬 미니멈을 찾는 것을 목적으로 함.

Important Concepts in Optimization

  • Generalization (일반화)

    • 대부분의 경우 일반화 성능을 높이는 것이 목적이다.
    • 일반화 성능을 높이기만 하면 좋은 것인가?
      • 일반적으로 학습을 시키게 되면 Iteration이 지나면서 Training Error를 줄이게 되는데, Training Error가 0이 되었다고 해서 우리가 항상 원하는 최적값에 도달했다는 보장이 없다.
      • 일반적으로 Training error가 주어지지만, 어느정도 시간이 지나고 나면 Test Error가 커짐, 즉 학습에 사용하지 않은 데이터에 대해서는 성능이 오히려 떨어지게 된다.
      • 즉, 일반적으로 일반화는 테스트에러와 트레이닝 에러의 갭을 줄이는 것을 의미한다.
      • 만약 우리 네트워크가 안좋아서 학습데이터에 대한 성능이 안좋으면, 일반화의 퍼포먼스가 좋다고 해서 테스트 데이터의 성능이 좋다고 말할 수 없다.
      • 일반화의 성능은 테스트와 트레이닝 에러의 갭을 말하기 때문이다.
  • Under-fitting vs. over-fitting

    • 학습데이터에 대해서는 잘 동작을 하지만 테스트데이터에 대해서 잘 동작하지 않는 것을 OverFitting이라고 한다.

  • Cross validation

    • 일반적으로 데이터가 분리되어 있음 (Train, Test, Validate)
    • 보통은 학습 데이터로 학습시킨 모델이 학습에 사용되지 않은 밸리데이션 데이터를 기준으로 학습이 잘 되었는지 확인하는 과정이다.
    • 하지만, 트레인과 테스트를 반반으로 했을 때, 트레인을 80 테스트를 20으로 했을 때 등 Split 범위에 따라서 학습의 퍼포먼스가 달라질 수 있다. 이러한 것을 해결하고자 하는 것이 Cross Validation이다. (혹은 K-Fold Validation)
    • 네트워크를 학습할 때 수많은 파라미터가 존재한다. 또한 Hyper Parameter들에 대한 기준이 없다. 따라서 Cross-validation을 통해 최적의 Parameter Sets 을 찾고, 파라미터를 보정한 상태에서 모든 학습데이터를 학습에 사용해야 더 많은 데이터를 사용할 수 있다.
    • Test Data는 어떠한 방법으로든 학습에 사용되어서는 안된다. 즉, 학습에는 Train과 Validate 데이터만을 이용해야 한다.
  • Bias-variance tradeoff

    • 사격을 할 때 항상 같은 곳에만 찍히면 (원점이 아니더라도) 좋은 것이다. 전체 모델을 어느정도 평준화 시키면 최적값에 도달할 가능성이 많기 때문이다. 이것을 Low Variance라고 한다. (출력이 얼마나 일관적으로 나오는 지)

    • 이것에 반해 Variance가 크면 비슷한 입력이 들어와도 출력이 많이 달라지는 것을 의미한다.

    • Bias라는 것은 출력에 따른 평균적으로 True Target에 접근하는 정도를 의미하며, Bias가 크면 Mean에서 많이 벗어나는 것을 의미한다.

    • 학습 데이터에 Noise가 껴있다고 가정했을 때 내가 이 노이즈가 껴있는 타겟 데이터를 미니마이즈하는 것에 대하여 세 파트로 나뉘어진다. 내가 미니마이즈하는 것은 하나의 값(cost)이지만, 그 값은 세 파트로 나뉘어져 있어서 한 파트를 줄이면 다른 파트가 커질 수밖에 없는 Trade-off 관계이다.

      위 식에서 cost를 minimize한다는 것은 bias와 variance, noise를 minimize 한다는 것을 의미한다.

  • Bootstrapping

    • 신발끈을 말하는 것이며, 그 뜻은 신발끈을 들어올려 하늘을 날겠다라는 허황된 뜻임.
    • 딥러닝에서는 학습 데이터가 100개가 있다고 하면, 100개 중 80개를 사용하겠다 등 일부만 뽑아서 사용한다는 것을 의미한다.
    • 이렇게 했을 때 하나의 입력에 대해서 각 모델들의 출력이 달라질 수 있다. 이 때 각 모델들의 예측값들이 얼마나 일치를 이루는지 보고 전체 모델들의 특성을 알고자 하는 것이다.
    • 학습데이터가 고정되어 있을 때 subsampling을 통해 여러 학습데이터를 만들고 그것을 이용하여 여러 모델 혹은 metric을 만들겠다는 것임.
  • Baggin and boosting

    • Bagging(Bootstrapping aggregating)
    • 학습데이터를 여러 개를 만들어서 (Booststrapping) 여러 모델을 만들고 그 모델의 output들을 가지고 평균을 내겠다는 뜻임.
    • 학습데이터가 고정되어 있으면 이것을 모두 이용하여 하나의 결과를 내는 것이 좋을 것 같지만 사실은 그렇지 않다. N개의 모델을 만들고, N개의 모델의 출력값의 평균이나 Voting을 통해 나오는 결과를 사용하는 것이 보통 성능이 더 좋다.
    • Boosting: 학습데이터를 시퀀셜하게 바라봐서 간단한 모델을 만들고, 모델에 학습데이터를 다 넣어본다. 모델에서 80개는 잘 예측을 했지만 20개는 잘 안되었다. 이 때 모델을 하나를 더 만드는데 전에 안되었던 20개에 데이터를 잘 예측하는 모델을 만든다. 이렇게 모델들을 만들고 합친 이후에 하나의 struct learner를 만들고, 그 weight를 찾는 방식을 말한다.

Practical Gradient Descent Methods

Stochastic gradient Descent

  • 하나의 샘플을 이용
자세히 보기