greatsangho의 이야기

SK AI캠프 14주차 후기 본문

프로그래밍/SK AI 캠프

SK AI캠프 14주차 후기

greatsangho 2024. 11. 23. 22:41

The four Fs

  • FACTS(사실, 객관) : 이번 일주일 동안 있었던 일, 내가 한 일

이번주는 CRNN, UNet, GAN, SRGAN, 멀티모달에 대해 공부하였다. CNN기반 이미지 처리는 전에 공부한 것과 같았지만, 이번에는 CTC손실과 함께 결합하여 캡챠를 인식하도록 학습시키는 과정을 진행하였다. 이미지의 경계를 구분하는 UNet에 대해 공부하였다. UNet은 인코딩, 디코딩과 스킵 연결로 구성되어 있으며 이를 이용하여 강아지와 고양이의 경계선을 구분하는 모델을 학습하였다. 사람들의 얼굴을 학습하여 얼굴 이미지를 GAN으로 생성하는 모델을 만들었다. SRGAN을 이용하여 VGG라는 기존 학습된 모델을 이용하여 이미지에서 특성을 더 잘 뽑아내고 고화질로 변환하는 학습을 잘 진행할 수 있게 된다. 마지막으로 교사모델을 활용하여 간소화된 모델을 교사모델과 정답 데이터를 바탕으로 교사모델에 가깝게 간소화된 모델을 학습시키는 방법을 공부하였다.

ADsP 사전결과가 공개되었고 합격하였다.

  • FEELINGS(느낌, 주관) : 나의 감정적인 반응, 느낌

LLM을 공부하다가 이미지 처리를 하니 GPU RAM에 대한 부담이 줄어든 것 같다. 물론 멀티모달을 진행할 때 RAM관리가 필요하다. 때마침 데이콘에 이미지 복원과 관련된 내용이 올라와 대회에 참가하였다. 아직 멀티모달이 제대로 구현되지 않았지만 다시 시도하여 구현하도록 해야겠다. GAN에 대한 내용을 더 공부하고 대회에 참가하니 코드에 대한 이해 및 아이디어가 떠오르는 점이 좋다.

  • FINDINGS(배운 것) : 그 상황으로부터 내가 배운 것, 얻은 것

UNet 논문을 읽으며 스킵 커낵션 및 파생되는 개념들에 대해 알 수 있었다. 멀티모달 또한 기존 이미지 및 LLM 학습과정과 크게 다르지 않다는 것을 알 수 있었다. GAN이 다른 딥러닝 과정보다 모델을 빠르고 정확하게 학습시키는 방법인 것 같다.

Normalize는 평균값과 표준편차를 설정해 주는 것이다. torchvision.transforms의 Compose에서 설정을 한다.

    self.low_res_tf =  tf.Compose([
        tf.Resize(32),
        tf.CenterCrop(32),
        tf.ToTensor(),
        tf.Normalize((0.5,0.5,0.5),(0.2,0.2,0.2))
    ])
출처: https://greatsangho.tistory.com/85 [greatsangho의 이야기:티스토리]

일반적으로 평균은 0.5 표준편차는 0.2에서 성능이 잘 나온다고 한다. 표준편차는 0.5로 설정하기도 하는데 이는 적용하는데이터와 모델에 따라 차이가 있다. Resize를 한 뒤 CenterCrop을 진행하는 과정을 거치도록 코드가 되어있다. 32의 크기로 줄인다고 할 때 바로 Resize에서 (32,32)를 하게 되면 길이가 긴 사진들을 찌그러지는 문제가 발생한다. 따라서 이미지 비율 변형을 막기 위해서는 Resize(32) 후 CenterCrop(32)를 진행한다.

https://blogs.nvidia.com/blog/tensorfloat-32-precision-format/

데이터 타입에 대해 공부하였다. FP16, FP32의 경우 성능 차이가 발생하는데 자료형의 크기가 작아도 FP32와 같은 범위를 표현하고자 BFloat16이나 TF16 등의 자료형이 존재한다. 이런 자료형을 사용하는 이유는 정확성을 약간 희생하더라도 더 빠르고 가볍게 모델을 학습하기 위함이다.

모델을 어느 순간에 저장하는 것이 좋은지에 대한 고민을 해 보았다. epoch 안에서 모델의 오차가 가장 적을 때 저장하는 방식은 모델이 순간적으로 오차가 튈 때 저장하여 일반적이지 않은 상황에 대한 학습데이터를 담는 경우가 많았다. 각 epoch 당 최소 loss를 비교하는 것은 이러한 문제를 줄일 수 있었다. 하지만 loss값이 낮다고 항상 좋은 모델인 것은 아닌 경우도 있었다. 전부 학습을 하고 저장하는 방식은 최대한 많은 데이터를 학습한 뒤의 가중치를 저장하기 때문에 성능이 우수하다. 하지만 과하게 학습되는 등의 상황에서 그 외의 이유로 최적의 값이 아닐 경우가 존재하였다. 시도를 하는 동안 최종 단계에서 저장하는 경우가 더 좋은 경우도 있었고, 각 단계에서 최적의 결과를 나타내는 경우도 있기 때문에 최적의 결과를 위해서는 두 경우를 모두 선택한 뒤 더 성능이 좋은 모델을 선택하는 것이 현재로서 가장 최선의 방법인 것 같다.

  • FUTURE(미래) : 배운 것을 미래에는 어떻게 적용할 지

다음주에 팀 프로젝트를 진행하는데 이에 맞추어 서비스 할 내용을 구현할 수 있도록 전부 리뷰하도록 해야겠다. 이번에 배운 GAN은 이미지 생성이나 인식 측면에서 사용자의 문제를 인식할 수 있는 시스템 등을 구현하는데 도움이 될 것 같다.

코딩 테스트 및 자격증 준비를 더 하도록 해야겠다.

반응형