• 티스토리 홈
  • 프로필사진
    Cat_Code
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
Cat_Code
  • 프로필사진
    Cat_Code
    • 분류 전체보기 (115)
      • [네이버 부스트캠프] (46)
        • ⭐주간 학습 정리 (43)
        • 🎶추가 학습 정리 (3)
      • [연습의 흔적들] (27)
        • 백준⚾ (26)
        • 캐글 & 데이콘 🤝 (1)
      • [ML] (23)
        • 머신러닝 💕 (5)
        • 딥러닝 🔫 (10)
        • 데이터 분석 🖤 (1)
        • 수학 ☑️ (4)
        • LLM🦜 (3)
      • [CS] (15)
        • 파이썬 🖤 (11)
        • 해체 분석기📝 (3)
        • Service Product (1)
        • MultiMedia (0)
      • [개발일지] (2)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [네이버 부스트 캠프 AI Tech]Data Augmentation & Efficient Learning
        2023년 03월 28일
        • Cat_Code
        • 작성자
        • 2023.03.28.:36

        본 글은 네이버 부스트 캠프 AI Tech 기간동안

        개인적으로 배운 내용들을 주단위로 정리한 글입니다

         

        본 글의 내용은 새롭게 알게 된 내용을 중심으로 정리하였고

        복습 중요도를 선정해서 정리하였습니다

         

         

        ✅ Week 4

        목차

        1. Data Augmentation
          1. data augmentation?
          2. type of augmentation  
          3. torch vision & albumentations 
        2. Efficient Learning
          1. knowledg distillation
          2. semi-supervised learning
          3. self-training

        ✅ Intro

        딥러닝을 학습하다 보면 항상 마주치는 문제, 고질적인 문제가 있다

         

        바로 Data이다 

         

        Data가 문제라고 ?😢😢

         

        처음 이 소리를 들으면 이해가 되지 않을 것이다

        하지만 다르게 생각해보면 금방 이해가 된다

         

        Data가 없으면 모델의 학습이 떨어지고, Data가 안좋으면 모델의 성능이 떨어지고, Data를 확보하기 어렵고, Data를 전처리하는데 시간이 많이 든다

         

        사실상 딥러닝 모델을 학습시킬 때 가장큰 주적은 데이터이다

        이러한 데이터의 과정을 관리하는 것이 가장 중요한 과제 중 하나라고 할 수있다

         

        물론 모델의 구조, 모델의 학습 방법 등 다양한 연구 분야가 주류를 이루고 있지만

        이러한 방법들의 근원에는 우리가 갖고 있을 수 있는 데이터 수의 한계 때문에 기인되었다

         

        실제로 데이터를 더 많이 던져주면 모델의 성능은 무조건 올라간다

        이건 불변의 법칙이다

         

        그러나 앞에서 말했듯이 데이터의 확보에는 한계가 분명하다

        따라서 우리는 이를 해결하기 위해서 다양한 방법을 시도하여야 한다 

        그러한 방법 중 대표적인 방법이 Data Augmentation과 Efficient Learning이다

         

        이제 이 둘을 자세히 살펴보도록 하자🔥

         


        1.  Data Augmentation

        🔥 1.1 What is data augmentation

         

        data augmentation은 무엇일까?

         

        말 그래도 하자면 '데이터 증강'이다 

        즉, 우리가 갖고 있는 데이터를 활용해서 새로운 범주의 데이터로 증강하는 방법인 것이다

         

        CNN 모델이 발전하기 전부터 이미 사용된 방법이고 CNN의 조상이라고 불리는 Alexnet 논문을 보더라도 Data Augmentation의 내용이 나온다

         

        그리고 최근에는 Cutmix - 예전에 리뷰한 글이 있다, Cutout, Mixup 등 다양한 향상된 기법들이 출연하였고

        이러한 방법들은 데이터 수의 한계를 어느정도 개선해주는 역할을 해주었다

        물론 이미지 데이터 뿐만 아니라 자연어 처리나 다양한 분야에서도 그 데이터에 맞는 증강기법이 존재한다

        하지만 나의 트랙은 CV이기 때문에 CV내용에 집중해서 살펴볼것이다

         

         


        🔥 1.2 type of augmentation  

         

        Transforming and augmenting images — Torchvision 0.15 documentation

        Shortcuts

        pytorch.org

        대표적인 augmentation 기법들을 한번 살펴보자

         

        Pytorch 공식  Doc를 참고하면 더 자세한 내용과 예시들이 등장할 것이다

        관심있는 분들은 위의 링크를 이용하기를 바란다

         

        이미지 데이터에서 augmentation은 쉽게 이해하자면 '이미지 변형'에 가깝다

        이러한 변형은 cv2 라이브러리를 활용해서 실행할 수 있다

        하지만 cv2를 활용하는 것은 매우 번거로운 일이다 

         

        고맙게도 우리의 슨배님들이 torchvsion과 다양한 라이브러리로 쉽게 할 수있게 만들어 주졌다

        따라서 이번 글에서는 torchvision을 이용해서 살펴볼 것이다

         

         

        그렇다면 이미지 변형하면 가장 쉬운 방법에 무엇이 있을까?

         

        • Resize 

        그렇다 바로 Resize이다. 사실 Resize는 이미 수차례 겪어봤다

        이미지를 원하는 inputsize에 맞추기 위해서 필수적으로 해야하기 때문이다

        224 x 224 이미지를 448 x 448 이미지로 변형하고

        또는 원하는 사이즈로 수정할 수 있다

         

        이러한 방법은 torchvision.transforms.Resize를 통해서 쉽게 할 수 있다

         

        • Brightness adjustment

        이미지의 크기를 변경해 보았다면 다음 살펴볼 방법은 이미지의 밝기를 조절하는 방법이다

        다양하게 이미지의 밝기를 변형하면서  새로운 input data를 만들 수 있다

        torchvision.transforms.ColorJitter을 이용하면 쉽게할 수 있다 - 자세한 파라미터는 공식문서 참고

         

        • 수직 수평 뒤집기

        앞에서 이미지의 밝기를 변형했다면 이번에는 이미지의 좌우 상하를 조절하는 방법이다

        쉽게말해서 원본 이미지를 뒤집어서 새로운 공간정보를 가진 데이터로 만드는 것이다

        torchvision에서는 random성 까지 추가해서 구현해 주고 있기 때문에 파라미터만 잘 조절한다면 쉽게 적용할 수 있다

        torchvision.transforms.RandomHorizontalFlip

        torchvision.transforms.RandomVerticalFlip

        등의 함수를 이용해서 쉽게 적용할 수 있다

         

        • Affine Transformation

        다음으로 살펴볼 것은 Affine 변형이다

        뭔가 새로운 단어가 나와서 어려워 보이지만 예시로 살펴보면 간단하다

        이런식으로 이지의 공간을 새롭게 구성해서 새로운 데이터를 구성하는 방법이다

         점, 직선, 평면을 보존하는 선형 매핑 방법을 아핀변환이라고 한다

         

        torchvision에 torchvision.transforms.RandomAffine을 활용하면 쉽게 구할 수 있다

         

        • Cutmix

        cutmix는 앞에서 살펴본 방식과 조금 다르게 직접 구현이 필요하다

        개념은 상당히 간단한데

        여러 데이터의 부분을 가져와서 합쳐 한장의 사진을 만들고 이 사진의 label 가져온 데이터의 label 만큼 섞어서 구성해준다

        이렇게 만들어주면 모델이 학습을 하면서 어느 부분에 더 집중을 해야 이 label의 특징인지를 학습할 수 있기 때문에

        모델의 성능이 많이 올라간다

        자랑스럽게도 네이버에서 제안한 논문이다

         

        비슷한 계열로는 MixUp, Cutout등의 기법이 있고 사실 Cutmix가 이러한 방법의 한계를 극복하기 위해서 나온 방법이기 때문에 cutmix가 더 좋다

        그리고 들이는 노력대비 성능이 많이 향상되기 때문에 반드시 시도해볼 만한 방법중 하나이다

         

         

        [논문 리뷰] CutMix : Regularization Strategy to Train Strong Classifiers with Localizable Features

        CutMix는 Data Augmentation의 방법 중 하나로 자랑스러운 우리 Naver Clova에서 작성한 논문이다. 2019년도에 나온 논문이지만 아직까지 상당한 영향을 미치고 있고 실제로 데이콘, 캐글같은 대회에서 Agume

        eumgill98.tistory.com

         

        • RandAugment

        위에서 살펴본 방법들은 사용자가 선택하고 적용해보면서 모델의 결과를 비교하여야한다

        하지만 실제로 이러한 과정은 매우귀찮다, 증강 기법은 위에서 살펴본 것 뿐만아니라 매우매우 매우 매우 많기 때문이다

         

        따라서 이를 랜덤적으로 적용해보고 비교하는 방법이 있다

        이를 RandAugment라고한다

         

        간단하게 우리가 지정해준 Augmentation 목록 중 랜덤적으로 적용을 해서 모델학습에 적용하는 것이다

         

        • Compose, P

        하지만 당신 만약에 랜덤과 운을 믿지 않는 사람이고, 당신의 실력을 믿는 사람이라면 Compose를 활용해서

        직접 다양한 Augmentation을 연속적으로 지정해줄 수 있다

        간단하게torchvision.transforms.Compose을 활용해서 리스트 안에 다양한 Augmentation을 넣어주기만 하면된다

        그리고 여기서 각 augmentation에 p의 하이퍼 파라미터를 적용해서 확률도 지정해 줄 수 있다 - 0.5는 50%확률로 적용된다는 뜻

        transforms.Compose([
            transforms.CenterCrop(10),
            transforms.PILToTensor(),
            transforms.ConvertImageDtype(torch.float),
        ])

        🔥 1.3 torchvision < =  albumentations

         

        Albumentations Documentation

        Albumentations: fast and flexible image augmentations

        albumentations.ai

         

        앞에서 살펴본 증강들은 대부분 torchvision을 통해서 설명하였다

        하지만 여기에 더 좋은 라이브러리가 하나있다 바로 albumentation이다

         

        이부분은 수업에 나오지 않은 이야기지만

        직접 학습을 하면서 알게된 노하우중 하나로 

        albumentations이 torchvsion보다 편하고 좋았다

         

        우선 장점은 아래와 같다

         

        1) one of를 활용해서 리스트안에 다시 확률을 적용할 수 있다

        실제로 이 방법은 p를 지정하지 않아도 3개로 묶었다면 1/3 확률로 지정된다

        그래서 관리하기가 더 쉽다

         

        2) torchvision과 똑같은 문법, 그리고 더 많은 기능

        albumentations은 일단 torchvision과 같은 문법이기 때문에 웬만한 torchvision의 기능이 전부 존재한다

        그리고 추가적으로 cutout 등을 구현하지 않고도 사용할 수 있다는 장점이 있고

        특히 ,dataloader에 파라미터로 넘겨줄 때도 적용이 가능하다는 호환성의 장점도 있다

         

        3) 속도! 속도! 속도!

        딥러닝에서 학습 시간은 생명이다 

        실제로 줄일 수 있다면 줄이는 것이 최선의 방법이다

        하지만 torchvision의 경우 cv2기반이기 때문에 변형을 해줄 때 시간이 많이 소요된다

        물론 albumentations도 cv2기반이겠지만 이러한 문제를 최적화하여서 torchvision과 비교했을때

        적은 시간이 소요된다 -> pytorch v2는 비교해 보지는 않았다..

         

        이러한 장점때문에 많은 사람들이 특히 속도때문에 albumentations을 사용하고있다

        한번쯤 사용해보는 것을 적극 추천한다


        2. Efficient Learning

        🔥2.1 knowledg distillation

         

        이번에 살펴볼 방법은 모델들 효율적으로 학습시키는 방법들이다

        이중 처음 살펴볼 내용은 knowledge distillation '지식 증류'기법이다

         

        사실 지식 증류기법은 2014년 힌튼 교수님의 논문으로 제시되었다 

        이 방법이 집중을 한것은 사실 모델 압축이라는 목표였다

         

        간단하게 이론을 살펴보면 다음과 같다

        마치 우리가 학교에서 공부를 하듯이 

        선생 모델이 학생 모델에게 지식을 증류하는 방법이다 

         

        엥? 그게 무슨소리일까?

        지식 증류에서는 큰 파라미터를 가진 선생모델이 있고 비교적 작은 파라미터의 학생모델을 사용한다

        여기서 둘다 같은 input data를 받고 output을 배출한다 그러면 선생 모델을 통과해서 나온 y'값과 학생모델을 통과해서 나온 y'값이 존재할 것이다 하지만 여기서 선생모델과 학생모델의 loss를 구해주는데 여기서 활용되는 loss는 softlabel이다

         

        쉽게 말해서 softmax 함수를 통과 하고 나온 확률들을 비교해서 - KL - divergence를 이용, loss를 구하는 것이다 

        즉, 최댓값을 뽑아서 라벨을 비교하는 것이 아니다 

        따라서 선생모델과 학생모델의 loss는 실제 y값이 필요하지 않다

        그냥 ouput의 차이로 학생 모델이 선생모델을 흉내내게 하는 것에 목적이 있기 때문이다

         

        그리고 학생모델은 또다른 loss를 하나 더 구하는데 이는 우리가 일반적인 딥러닝 모델을 학습할 때 구하는 loss로

        softmax를 지나서 argmax를 통과해서 나온 라벨과 실제 y의 라벨을 비교해서 loss를 구하는 방법이다

         

        이렇게 구해진 2개의 loss를 weight sum하여 backward를 통해서 업데이트를 해주면 물론 여기서 업데이트는 학생모델만 진행된다 - 가장 중요한 포인트는 선생모델은 가중지 업데이트가 되지 않다

         

        왜 이러한 방법을 사용할까?

        이런방법은 사실 큰 파라미터 모델을 활용해서 효율적으로 모델을 학습시키고 

        컴퓨팅 자원의 한계를 극복하기위한 모델압축의 개념으로 제안되었다

         

        즉, inference를 통해서 큰 모델은 output만 만드니까 시간이 적게소요되고 실제로 학습에 이용되는 학생모델은 작은 모델이니까 학습 시간도 적다

         

        최근에는 이러한 방법들을 더욱 발전시켜서 다양한 목적에서 이용된다

         

        뒤에서 살펴보겠다

         


        🔥2.2 semi - supervised learning

        준지도 학습? 번역하자면 이런 뜻을 갖고 있다

         

        쉽게 말해서 label이 없는 데이터와 있는 데이터를 모두 학습에 이용한것이다

        실제 데이터 셋을 구성하기 위해서 labeling하는 작업은 많은 시간과 돈을 소모한다

        따라서 데이터 셋이 가질 수 있는 데이터의 수는 한계가 있다

        이를 해결하기 위해서 사용되는 방법이 semi-supervised learning방법으로

         

        AutoEncoder등의 비지도 학습의 방법을 활용해서 unlabeled data에 label을 지정해주고 이를 학습에 이용한다

         

        이런방법이 효과적일 수 있는 이유는 데이터의 수의 차이에서 기인한다

         

        쉽게 말해서 라벨이 없는 데이터가 더 많기 때문에 조금 라벨링이 잘못되더라도 데이터의 수로 밀어 붙이는 것이다

         


         

        🔥2.3 self-training

        이러한 방법을 매우 효과적으로 적용한 방법이 self-training이다

        이 방법은 앞에 지식증류기법과 semi-supervised learning을 함께 적용하였다

         

        2020년 SOTA를 받는 모델이다

         

        방법은 다음과 같다

         

        우선 큰 모델의 선생모델을 선택하고 이 모델이 unlabel된 데이터를 labeling하게 한다

        그리고 이렇게 만들어진 대량의 데이터로 작은 모델인 학생모델을 학습시키고 

        이렇게 성능이 올라간 학생모델을 다시 선생모델로 바꾸고 점점 학생 모델의 사이즈를 키워가면서

        위의 과정을 반복하는 방법이다

         

        이를 Noisy Student Training방법이라고 하는데

        실제로 pretraining 모델을 활용하다보면 Noisy student라는 설명이 붙어있는 모델들을 볼 수 있을 것이다

        실제로 성능이 매우 좋다

         

        시간이 된다면 논문리뷰로 해보도록 하겠다


        오늘은 모델을 학습하는 다양한 방법들에 대해서 추가적으로 알아보았다

        물론 실전에 사용하기에 매우 좋은 방법들이라

        반드시 연습하고 적용해보면서 준비해야할 것 같다

         

        들이는 노력에 비해 성능이 많이 개선되는 이런 마법같은 기법들은 언제나 환영이니까...

        '[네이버 부스트캠프] > ⭐주간 학습 정리' 카테고리의 다른 글

        [네이버 부스트 캠프 AI Tech] Semantic segmentation의 흐름  (0) 2023.03.30
        [네이버 부스트 캠프 AI Tech] Wandb 사용설명서  (0) 2023.03.29
        [부스트 캠프]Week 3 회고 및 Week 4 목표 정리  (0) 2023.03.27
        [네이버 부스트 캠프 AI Tech] VAE 직접 구현하기 by Pytorch  (0) 2023.03.24
        [네이버 부스트 캠프 AI Tech] Multi-GPU에 간단한 고찰  (0) 2023.03.24
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바