Upstage AI Lab 6기

딥러닝 강의 후기

jyun34 2025. 2. 11. 20:23

이전까지 머신러닝, mlops를 수강하고 딥러닝을 배우게 되었다.

 

머신러닝은 AI의 하위 단계, 딥러닝은 머신러닝의 하위 단계로 이러한 그림을 보인다.

 

머신러닝 이전에는 사람이 일일이 프로그램이 목표 달성에 필요한 연산을 사람이 직접 다 짜서 만드는 규칙 기반 프로그래밍 (Rule-based programming)이었다. 예를 들자면 스타 크래프트의 경우 싱글 플레이를 할 때 나오는 computer가 다 어느 타이밍에 건물을 지을지 사람이 다 짜놓은 프로그램 같은 거였다.

 

그 이후에 발전하게 된게 머신러닝으로 Feature을 뽑는 방식은 기존처럼 하되, 그 Feature를 판단하는 로직은 기계가 스스로 고안하는 장치를 만들게 되었다. 기계가 스스로 판단하기 때문에 머신러닝인 것이다. 

 

딥러닝부터는 출력을 계산하기 위한 모든 연산을 기계가 고안한 것이다. 기계 스스로 알아낼 게 더 많으니 더 많은 데이터가 필요로 하고 데이터가 커지면 커질수록 성능이 올라가는 법칙을 발견하게 되서 chat gpt 같은 고성능 AI 모델이 나오게 됐다. 그래서 OpenAI(오픈 아님)가 데이터를 수집할려고 기를 쓰는 이유가 그러한 이유 때문이다.

 

딥러닝 기술에는 다양한 방식이 있는데, 다루는 데이터에 따라, 이미지/동영상을 다루는 컴퓨터 비전(CV), 텍스트를 다루는 자연어 처리(NLP), 음성데이터를 다루는 음성 인식 등이 있다. 이를 바탕으로 이미지나 텍스트 같은 데이터를 인식하거나, 생성하는 모델이 나오게 되었다.

 

 

 

딥러닝 모델을 만드는데에는 다양한 요소가 있는데, 데이터, 모델, 손실 함수, 최적화 알고리즘 등이 있다.

데이터는 해결하고자 하는 문제에 따라 정답지인 라벨링 데이터를 표시해줘야한다.

이미지 라벨링
자연어 라벨링

 

모델은 입력을 원하는 결과로 바꿔주는 연산 과정을 구조화한 것이다. 이 과정에서 다층 퍼셉트론, DNN, CNN, RNN 등 다양한 모델이 나온다.

 

손실 함수는 실제 값과 모델이 추정한 값 사이의 오차, 오차를 수치화한 함수이다. 다양한 손실함수가 있지만 그 중에서 많이 쓰는 함수가 MSE, CE이다. 

 

최적화 알고리즘은 손실 함수를 최적화해주는 알고리즘으로 보통 옵티마이저(Optimizer)라고 불린다. Optimizer에서 가장 기본적인 것은 경사하강법(Gradient Decent)로 이걸 바탕으로 SGD, Momentum, Nesterov, AdaGrad, RMSProp, Adam이 파생됐다. 이건 이걸 다 사용한다.

 

 

 

 

딥러닝을 보통 신경망으로 비유를 하는데 실제 사람의 뉴런의 방식을 모방했기 때문이다. 그렇게 모방해서 나온게 다층 퍼셉트론으로 입력신호에 가중치(weight)를 더하고 활성함수(activation)를 거쳐 출력 신호에 도달하게 된다.

이 과정을 여러번 걸쳐서 나온게 사람의 뉴런과 비슷해서 신경망(Neural Network)라고 한다. 이렇나 이름은 다양한 모델 DNN, CNN, RNN에 반영되어 나왔다. 

 

 

활성화 함수(activation)는 여러가지가 있는데, sigmoid, tanh, ReLU, Leaky LeLU 등이 있다. 이 중에서 sigmoid, ReLU를 가장 많이 쓰는 듯 하다.

 

이러한 활성화 함수를 사용하는 이유는 입력신호가 활성화함수를 만나게 되면 위의 그림과 같이 곡선, 비선형으로 바뀌게 되는데, 이러한 결과가 모델의 학습 효율을 높이기 때문이다.

 

 

가중치 초기화는 모델의 layer가 깊어질수록 활성화 함수 이후 데이터의 분포가 한 쪽으로 쏠려 모델의 학습 효율을 악화시키기 때문에 사용한다.

sigmoid, tanh 함수를 사용할 경우, Xavier 초기화를 쓰고, ReLU 함수를 사용할  경우, He 초기화를 사용하면 된다. 

 

 

 

경사 하강법은 기울기가 감소하는 방향으로 x를 움직여서 f(x)의 최소값을 찾는 알고리즘으로 딥러닝에 그대로 적용된다.

이를 최소화하는 방향으로 움직이다가 최솟값에 도달하게 되면 학습이 끝나게 된다.

이를 이용해서 순전파, 역전파가 있는데 너무 복잡한 문제라 그냥 다른사람들이 만든 라이브러리를 쓰기에 프로그래머가 신경 쓸 문제는 아니다. 

하지만 기본적인 경사하강법은 지역최소점이라는 함정에 빠지게 되어 최솟값에 도달하지 못한다는 단점이 있는데, 이러한 단점을 보완하거나 찾는 속도를 빠르게 하기 위해 SGD, Momentum, Nesterov, AdaGrad, RMSProp, Adam가 나오게 되었다.

 

 

SGD는 모든 데이터를 사용하는 경사하강법을 일부의 데이터 샘플만을 경사하강법을 적용함으로써 그러한 문제를 해결했고, Momentum, Nesterov는 이전 기울기를 고려한 관성을 이용해 SGD보다 더 효율적으로 지역최솟값을 피하는 문제를 달성했다. AdaGrad, RMSProp은 가중치를 갱신함으로써 문제를 해결하고, Adam은 관성, 가중치 갱신을 둘 다 이용해서 문제를 해결해 뛰어난 성능을 보였다. 그래서 보통 Adam을 쓰지만 만능인 옵티마이저는 없어서 그냥 다 쓰고 더 나은 결과가 나온 옵티마이저를 쓴다.

-Optimizer의 하이퍼 파라미터
  • lr (학습률): 0.001 ~ 0.0001, 너무 크면 발산, 너무 작으면 학습이 느림
  • Batch Size: 32 ~ 512, 클수록 학습 안정적, 작을수록 일반화 가능성 증가
  • Weight Decay (L2 정규화 계수): 0.01 ~ 0.0001, 과적합 방지 효과
  • Dropout Rate: 0.2 ~ 0.5, 뉴런 일부를 랜덤하게 제거하여 과적합 방지
  • Momentum (SGD 사용 시): 0.9,
  • Beta1 / Beta2 (Adam 계열): (0.9, 0.999), 모멘텀과 RMSprop 결합 계수
  • 예시
optimizer = AdamW(lr=0.0005, weight_decay=0.01)batch_size = 128
dropout_rate = 0.3

 

 

 

그 외에 성능 향상을 위해 드랍아웃(Dropout), 정규화(Regularization) 등이 있다. 드랍아웃은 학습할 때는 뉴런을 무작위로 삭제함으로써 매번 다른 모델이 학습하는 것과 같은 결과를 나타내고, 추론 시에는 모든 뉴런을 사용해 여러 모델의 앙상블로 보일 수도 있다. (앙상블이란  개별적으로 학습시킨 여러 모델의 결과를 종합해서 추론하는 방식이다.)

 

정규화는 입력값과 출력값이 다르게 나올 경우, 같은 범위로 변환해주는 것을 의미한다.

데이터가 모델의 layer를 통과할 때마다 입력의 분포가 변하는 현상이 나타나는데, 데이터가 다시 고르게 분포할 수 있도록 하는게 정규화이다. 


레이어 정규화, 인스턴스 정규화, 그룹 정규화 등이 있지만 주로 쓰는 것은 배치정규화(batchnorm)이다.

  • 배치 정규화: 배치(batch)단위의 데이터를 기준으로 평균과 분산을 계산하여, 활성화 레이어 이후 출력을 정규화하는 방법. 길이가 다르거나, 배치가 1인 경우 효과가 없다. 이러한 이유로 텍스트 같은 시계열 데이터를 활용하기 어렵기 때문에 RNN이나 LSTM 모델에서는 적용하기 어렵다.
  • 레이어 정규화: 배치 정규화의 단점을 보완한 방법. 개별 데이터 샘플 내에서 모든 특징들의 평균과 분산을 계산하여 정규화한다. 배치 정규화와 다르게 길이가 다르거나 배치 사이즈에 무관하게 정규화가 가능하다.
  • 인스턴스 정규화: 데이터 샘플의 각 채널에서 평균과 분산을 계산하여 정규화한다. 이미지 스타일 변환 같은 분야에서 각 데이터의 고유한 정보를 유지하기 위해 사용된다.
  • 그룹 정규화: 인스턴스 정규화의 확장판, 배치 정규화의 단점인 배치 사이즈를 극복하기 위한 방법. 채널을 여러 그룹으로 나눈 후, 각 그룹 내에서의 평균과 분산을 계산하여 정규화하는 방법이다. 객체 인식이나 영역 분할과 같이 배치 사이즈를 늘리기 어려운 상황에서 활용 가능하다.

드랍아웃(Dropout), 정규화(Regularization)는 모델의 성능을 높이는데 아주 좋은 기법이지만 꼭 둘 다 쓸 필요는 없다. 하나만 쓰는게 더 좋은 결과가 나올 수 있기 때문이다. 이 3개를 다 써서 성능이 더 좋게 나온 것을 쓰면 된다.

  • BatchNorm, Dropout 사용 모델: 0.9802
  • BatchNorm 제거 모델: 0.9780
  • Dropout 제거 모델: 0.9819

 

그 외에도 학습이 진행될수록, 과적합이 일어나는 현상을 방지해주는 Early stopping이 있다.

 

 

-CNN
  • CNN의 출력을 피쳐맵(Feature map)이라 한다,
  • 신경망으로 데이터를 학습 시, 모델이 학습할 때 1차원으로 평탄화하는 과정에서  이미지 데이터가 갖고있던 "형상 정보"가 사라질 수 있다.
  • CNN은 이미지나 비디오 데이터에 좋은 성능을 낸다. 이미지가 갖고있는 형상정보, 위치정보를 잘 보존하면서 추출해내는 convolution 연산을 사용한다.
  • Stride: 입력데이터에 필터를 적용할 때 필터가 이동하는 간격을 의미. 피쳐맵의 크기를 조정할 때 사용하며, Stride의 값이 클수록 피쳐맵의 크기가 줄어든다.
  • Padding: Convolution 연산을 수행하기 전에 입력 데이터 주변을 특정 값(주로 0)으로 채우는 연산. Convolution 연산을 반복하면 피쳐맵의 크기가 줄어들어 결국 피쳐맵의 크기가 1이 될 수 있다. 피쳐맵의 크기가 너무 작아지면 CNN을 효율적으로 할 수 없다. 이러한 문제를 방지하기 위해 padding을 사용한다.
  • 이미지 데이터는 일반적으로 RGB 3개의 채널을 가진 3차원 데이터 구조이다. 필터의 채널은 입력 데이터의 채널을 따라간다. 출력의 채널은 1이다. 필터의 갯수가 늘어나면 출력의 채널은 필터의 갯수만큼 늘어난다.
평탄화 과정
Convolution 연산
출력의 채널 수 1
출력의 채널 수 필터의 갯수
-Pooling 연산
  • Pooling 연산은 이미지 데이터의 가로, 세로 방향의 크기를 줄인 연산으로, 피쳐맵에서 중요한 정보를 추출하기 위해 사용한다.
  • 일반적으로 슬라이딩 윈도우 방식으로 동작하며 2x2, 3x3 크기의 윈도우를 사용한다.
  • Max Pooling: 가장 대표적인 pooling 방식 중 하나. 피처맵에서 최대값을 취한다. 피쳐맵에서 가장 두드러지는 특징을 가져오는 특성 때문에 피쳐맵의 중요한 정보를 선별할 수 있다.
  • Average Pooling: 피쳐맵의 평균값을 취한다. 이미지의 전체적인 내용과 구조를 보존하는 것이 중요할 때 사용된다. 배경의 정보, 텍스처
  • 학습의 효율성: 학습 파라미터를 추가하지 않고 피쳐맵(데이터 크기)을 줄일 수 있다.
  • 잡음에 대한 강인성: 최댓값 외의 위치에 노이즈가 있을 때 영향을 받지 않는다.
  • Max Pooling
-RNN
  • 기존의 DNN, CNN은 고정된 크기에 적절치 않아, 크기가 고정되지 않는 데이터, 텍스트, 음성, 시계열 데이터를 다루는데 특화된 신경망이다.
  • one to one
  • one to many: 이미지 해석
  • many to one: 문장분류
  • many to many: 번역, 비디오씬 분류
  • 활성함수로 tanh를 주로 사용한다.
  • Backpropa 문제로 입력과 가까운 가중치의 업데이트에 문제가 발생해서, LTSM, GRU가 등장했다.
-LTSM
  • 망각, 입력, 출력 3개의 Gate를 통해 정보의 흐름을 조절한다. 이를 통해 시퀀스의 장기적인 정보를 잘 학습하고, 중요한 정보만 기억할 수 있다.
  • Forget: LTSM의 1단계, 기존 정보 중 어떤 정보를 버릴지 선택
  • Input: 입력 데이터 중 어떤 정보를 다음 상태로 저장할지 결정.
  • Output: 다음 상태로 어떤 정보를 보낼지 선택
-GRU
  • LTSM을 보다 단순화. Reset Gate와 Update Gate, 2개의 Gate로 유사한 성능을 내고 비용을 절감한다.
  • Reset Gate: 이전 정보를 얼마나 리셋할지 선택
  • Update Gate: Forget + Input의 기능을 하나로 합친것과 유사하다
-데이터 증강 기법: Resize, Rotation, Flipping, Crop
  • OpenCV 라이브러리: 위의 것을 간단하게 제공
  • Pytorch: 기본적으로 데이터 증강 기법 지원.
  • Albumentations: 색상변환, Blur, Noise, ElasticTransform 등 지원
  • ImgAug: Affine 변환, Gaussian Blur, 라벨링 데이터도 함께 증강. numpy 배열 기반으로 동작해서 세밀하게 컨트롤 가능.
  • Cutout: 이미지의 일부 영역을 검은색 또는 특정 값으로 가림으로써 데이터에 변화를 주는 방법
  • Mixup: 두 이미지의 픽셀 값을 선형적으로 조합(강아지 +고양이 mix)하여 새로운 이미지 생성. 해당 이미지들의 정답 라벨링도 동일한 비율로 조합.
  • Cutmix: Cutout + Mixup
  • MmgAugment: 문서 및 OCR 관련 데이터 증강에 특화, 배경 제거, 문서 구겨짐 효과, 노이즈 추가 가능

 

업스테이지 AI에서 제공해주는 딥러닝 강의 후기이다. 딥러닝의 구성요소 모델, 손실함수, Optimizer 등에 대해서 자세히 배우게 되고, 그만큼 분량이 많았던 파트였다. 여기에 나온 CNN, RNN 말고도 LSTM, ResNet, GoogLeNet 등의 모델의 등장을 간결하게 소개해줬지만 분량상 넣기 힘들었다.