본문 바로가기

대학원 면접준비 & 후기

딥러닝 관련 질문 정리

1. 퍼셉트론 이란?

 여러 입력신호들을 받아서 합친 뒤, 임계값을 검사하여 임계값보다 크면 1, 작으면 0을 출력하는 알고리즘. 이때 임계값 검사하는 함수는 Step Function을 사용합니다.

 

2. 다층 퍼셉트론 이란?

 기존의 단층 퍼셉트론으로는 XOR 게이트 문제를 해결할 수 없었습니다. 입력에 대한 출력의 관계가 비선형적이므로  Step Function으로는 XOR 게이트를 풀 수 없었습니다. 하지만 퍼셉트론을 여러개 쌓으니 XOR 게이트 문제를 해결할 수 있었습니다.

 

3. 신경망 이란?

 퍼셉트론을 쌓아서 만든 거대 비선형 분류기입니다. 뉴런들이 연결되는 방식은 다층 퍼셉트론과 유사하지만, 입력신호를 합치는 과정에서 활성화 함수라는 것을 사용하여, 입력데이터를 비선형적으로 추출해나가는 모델

 

4. 활성화 함수란?

 우리의 목표는 입력데이터를 벡터화 했을 때, 어느 벡터값이 중요한지 알아야 그 값에 W값을 높게 할당할 수 있습니다. 그래야 입력 데이터의 특징을 추출할 수 있고,  추출해나가면서 특징맵을 결합하여 추론을 할 수 있습니다. 

 

 즉 활성화 함수란, 중요한 입력값은 큰 가중치를 곱하고, 그에 해당하는 높은 값으로 바꿔줍니다. 중요하지 않은 입력값은 작은 가중치를 곱하여 0 또는 0에 근접할만큼 작은 값으로 바꿔주는 함수 입니다. 

 

 퍼셉트론에서는 활성화 함수로 Step Function을 썼는데, 이건 입력이 크든 작든 임계값만 넘으면 1이 출력되기에 입력에 대해 출력이 불연속적인 결과가 나오게 됩니다. 그러므로 활성화 함수의 조건으로는 연속함수여야 하고, 중요한 값(높은 가중치가 곱해진 값)은 그에 해당하는 값으로 바꿔주고, 안중요한 값(작은 가중치가 곱해진 값)도 그에 해당하는 값으로 바꿔줘야 하므로 비선형 함수여야 합니다. 

 

5. Bias의 역활?

데이터셋이 불균형 할 때, 적은 데이터 셋에 대해 우선권을 부여하는 역활을 합니다. 

 

6. 손실 함수란?

신경망이 추론한 값과 정답을 비교했을 때, 신경망이 얼마나 구리게 판단하는지 알려주는 척도. 이때, 추론값과 레이블을 손실함수에 넣어야 합니다. 손실함수 값은 정확도와 반비례 관계 입니다.

 

7. Regularization(규제)란?

 신경망이 학습이 진행될수록, 중요한 입력데이터에 대해 높은 W를 배정하게 됩니다. 그러나 학습을 너무 많이 하게 되면 학습데이터에만 대응을 잘 할 수 있게 W가 배정되어서 시험데이터를 신경망에 넣었을 때 성능이 좋지 않아집니다. 그렇기 때문에 높은 가중치에 대해 Weight Decay를 적용할 수 있습니다. 그러나 신경망에서는 Weight Decay는 좋은 성능을 내지 못하므로 신경망에서는 Dropout을 주로 사용합니다.

 

Dropout은, 학습을 진행할 때는, 신경망의 임의의 뉴런을 차단시켜서 학습을 하는 방법입니다. 이 Dropout은 Layer의 형태로 Conv이나 Dense Layer 뒤에 삽입해줍니다. Dropout의 효과로는, 신경망은 입력데이터의 여러 특징을 파악해나가며 입력데이터가 무엇인지 추론을 하게 되는데, Dropout을 넣어줍으로써 특징들간의 상호작용을 방지할 수 있습니다. 그 결과, 훈련데이터에 대한 정확도는 내려가지만, 시험데이터에 대한 정확도는 증가하게 됩니다.

 

그 외에 신경망에서 사용하는 Regularization으로는 Batch Normalization, Data Augmentation 등이 있습니다.

 

8. Chain Rule(연쇄 법칙) 이란?

여러 입력이 있고 이 입력들이 여러 함수를 통과할 때, 입력단의 한 지점에 대한 출력의 변화량을 의미합니다.

(ex: ∂z/∂x=∂z/∂t⋅∂t/∂x)

 

9. 정확도 개념 대신 손실함수라는 개념을 쓰는 이유?

신경망이 추론한 예측값과 레이블의 차이를 표현하는 데에 손실함수 값이 쓰이는데, 현재의 W에 대한 손실함수값의 기울기를 알면 수정할 W의 방향을 알 수 있기 때문

 

10. 역전파란? 

출력단의 국소적 미분을 순전파의 반대 방향으로 전파시켜나가서, 최종적으로는 W에 대한 손실함수 값의 변화량을 구하는 방법. 즉 W로의 연쇄 법칙입니다. 

 

이때, 출력단에서 활성화함수인 Softmax 함수와 손실함수인 Cross Entropy 함수를 통과하게 될텐데, 이 과정의 역전파 값이 추론값과 레이블 사이의 오차 이므로, W에 대한 손실함수 값의 변화량을 알려면 오차를 역전파해나가면 됩니다.

 

11. W optimizer들에 대한 간단한 설명

Ⅰ. SGD

 - gradient에 학습률을 곱한값으로 W를 갱신하는 방법.

 - 그러나, SGD는 local minima나 saddle point를 탈출하지 못한다는 단점이 존재

 

Ⅱ. SGD Momentum

- gradient에 대해서만 W를 갱신해줬던 SGD와 달리, gradient와 velocity에 대해 W를 갱신해주는 방법

- local minima나 saddle point를 만나도 velocity factor 덕분에 탈출할 수 있음

 

Ⅲ. AdaGrad

- W 갱신치를 처음엔 크게 하다가 학습을 진행할수록 갱신치를 줄여나가는 방법. <- 이를 위해선 W 갱신 식에 

  gradient를 나눠주면 된다

- 하지만 saddle point를 탈출하지 못하는 단점이 있기에 이 점을 개선한 RMSprop 라는 기법을 사용함

 

Ⅳ. Adam

- RMSprop와 SGD Momentum을 합친 W 최적화 기법이며, 어느 아키텍처든 동작이 잘되는 장점이 있음

 

12. 가중치 초기값 이란?

먼저, 가중치를 초기화 할때 하나의 값으로 초기화 하면 안됩니다. X*W 연산을 할때, 역전파 되는 값으로는 곱셈할 값의 반대값이므로, X를 통해 역전파 되는 값은 하나의 값으로 전파되게 됩니다.

 

신경망이 깊을수록 활성화 값에 문제가 생깁니다. 활성화 함수로 sigmoid, tanh일때를 살펴보겠습니다. 가중치 초기값 설정을 상당히 큰값으로 하게 된다면, 활성화값은 모두 활성화 함수의 양끝값에 몰리게 됩니다. 그 이유는 입력이 크면 활성화 값도 커지는데, 신경망이 깊을수록 커진 활성화 값이 더더욱 커지기때문입니다. 활성화 값이 양끝에 몰리면 기울기소실 문제등이 발생할 수 있습니다

 

가중치 초기값 설정을 상당히 작은값으로 하게 된다면, 활성화값은 모두 활성화 함수의 중간값에 몰리게 됩니다. 그 이유는 입력이 너무 작으므로, 그에 해당하는 활성화값인 0 또는 0.5에 값이 몰리기때문입니다. 활성화 값이 중앙에 몰리게 되면 활성화값이 소실되거나 표현력 제한 문제가 생길수 있습니다

 

이를 해결하기 위해, 활성화 함수로 sigmoid를 쓰는 경우엔 가중치 초기값으로 Xavier 초기값을, 활성화 함수로 Relu를 쓰는 경우엔 가중치 초기값으로 He 초기값을 사용합니다.

 

13. Batch Normalization 이란?

가중치 초기값 문제에서 보았듯이, 신경망이 깊을수록 활성화값 즉, 그 다음 Layer의 Input 값이 distribution해집니다. 이 경우 학습의 안정성이 떨어지게 됩니다.

Batch Normalization은 그러면, Input이 distribution하면 강제로 gaussian 형태로 펴주게 하자는 생각에서 나왔습니다. Batch Normalization은 Conv 또는 Dense Layer 뒤에 Layer의 형태로 넣어주는데, 그 결과 학습의 안정성이 높아지게 되고 학습속도가 증가하며 Overfitting도 막아주는 기능도 해줍니다.

 

14. Dropout과 Batch Normalization의 차이점?

 Dropout은 학습시, 입력데이터 미니배치에 대해 Randomness를 적용한 결과가 나오게 됩니다. 그 후 그 다음 미니배치에 대해서도 Randomness를 적용하면서 신경망을 훈련시킵니다

 시험시엔 미니배치가 아닌 모든 시험데이터를 모델에 넣음과 함께 Dropout은 적용하지 않습니다. 그러나 이러한 결과는 Randomness의 평균을 적용한 결과와 같습니다.

 

 Batch Normalization도 학습시, 입력데이터 미니배치에 대해 얼마만큼 펴줄건지를 결정하는 Stochasticity를 적용한 결과가 나오게 됩니다. 그 후 그 다음 미니배치에 대해서도 Stochasticity를 적용하면서 신경망을 훈련시킵니다.

 시험시엔 미니배치가 아닌 모든 시험데이터를 모델에 넣음과 함께 Batch Normalization은 적용하지 않습니다. 그러나 이러한 결과도 Stochasticity의 평균을 적용한 결과와 같습니다.

 

Dropout은 입력데이터의 특징들간 상호작용을 막아주는 역활을 한다고 했는데, Dropout을 적용하는 과정이 Batch Normalization을 적용하는 과정과 같으므로 둘 다 Overfitting을 막아주는 역활을 할 수 있습니다.

 

15. 하이퍼 파라미터 탐색하는 방법?

우선 넓은 하이퍼 파라미터 log scale 범위를 설정합니다. 그 후 이 범위에 대해 약간의 학습만 진행한 뒤 loss를 보고 탐색범위를 좁혀나갑니다. 좁힌 탐색범위에 대해 많은 학습을 진행한 뒤 검증데이터로 loss를 확인합니다. 그 다음 좁힌 탐색범위에 대해 많은 학습을 진행한 뒤 검증데이터로 loss를 확인합니다. 이러한 과정을 반복한 뒤 최고의 성능을 내는 하이퍼 파라미터를 선정합니다.

 

16. CNN의 필요성?

기존에는 이미지를 1차원 데이터로 바꿔주는 작업을 했는데, 이 경우 픽셀간 상관관계가 사라지며, 같은 입력이미지이지만 입력이미지가 회전이나 쏠림이 생겨도 1차원 데이터로 바꿔주면 전혀 다른 결과가 나오게 됩니다. 이를 해결하기 위해 고양이 시각 인식 방법에서 시각피질에 반응하는 과정은 필터와의 합성곱을 함으로써 특징을 추출합니다. 그러므로 입력이미지를 그대로 사용할 수 있게 됩니다.

 

17. CNN 과정을 설명 

우선 입력이미지를 신경망에 넣습니다. 입력층쪽의 필터는 입력이미지의 단순한 특징만을 추출해냅니다. 그러므로 입력층의 필터를 통과한 결과, 단순한 특징들에 반응한 특징맵이 필터의 갯수만큼 생깁니다. 그 후, 필터의 갯수만큼 나온 특징맵들을 채널방향으로 합쳐주게 될텐데, 그 다음 Layer의 필터들과 반응하게 될것입니다.

 

 모델 중간의 필터는 모델의 앞쪽의 합쳐진 특징맵에 대해 특징을 추출하게 되므로 약간 복잡한 특징에 반응하는 필터가 나오게 되고, 모델 끝부분의 필터는 그전까지의 합쳐진 특징맵에 대한 특징 추출과정이므로 매우 복잡한 특징에 반응하는 필터가 나오게 됩니다. 

 

즉 CNN은 입력 이미지의 특징을 단순한 특징에서 복잡한 특징까지 단계적으로 이해하는 과정을 거칩니다.

 

18. Pooling 과정이 필요한 이유?

첫 번째로, 입력이미지가 특징에 반응한 부분은 그리 많지 않습니다. 그러므로 연산의 효율을 위해 반응하지 않은 부분 즉 픽셀값이 작은 부분은 제외해줍니다. 그 결과 학습할 parameter의 수도 감소하게 됩니다

두 번째로,  모델의 이동불변성(어디에 물체가 있든 인지할 수 있게하는) 특징을 가질 수 있게 하기 위함입니다.

 

19. GoogLeNet이 등장하게 된 이유?

 특징맵과 필터들을 연산하게 되면, 필터에 갯수만큼의 특징에 대해 반응한 특징맵이 나오게 되는데, 이 특징맵들은 서로 높은 연관성이 없을수도 있지만 다량의 특징맵이 나오게 되고 또한 신경망이 깊어질수록 채널이 깊어지므로 연산량도 증가하게 됩니다.

 그러므로 특징맵 추출하는 과정은 Sparse하게 하고 추론하는 과정(softmax)은 Dense하게 하면 높은 연관성 있는 특징맵들이 나오게 되고 연산량 문제로 해결할 수 있습니다. 

 

20. ResNet이 등장하게 된 이유?

ResNet은 깊은 신경망은 얉은 신경망의 성능을 보장할 수 있어야 한다는 가설을 바탕으로 만들어진 아키텍처입니다. 얉은 신경망을 깊은 신경망으로 바꿔주려면, 입력=출력이면 W = 0, 입력=Conv을 통과한 출력이면 W는 얉은 신경망에서 복사한 결과를 가져옵니다. 즉 얉은 신경망을 깊은 신경망으로 바꾸어서 학습하는건, 모델의 잔차를 학습하는 것과 같아집니다.

 

ResNet의 가설을 위해 Residual Block 구조를 만들었지만, 그 결과 입력을 그대로 출력과 연결시켜주니 gradient는 최소한 1을 가지므로 기울기 소실 문제를 해결해줄 수 있습니다. 또한 신경망은 입력의 특징에 반응한 특징맵을 합쳐나가며 단계적으로 이해한다고 했는데, 입력자체도 같이 반응시킬때 넣어주니 단계적으로 이해하기가 더 쉬워집니다.