개발공부 & 부트캠프/[부트캠프] 회고

[데이터 엔지니어링 부트캠프]7월 4주차 회고

포리셔 2023. 7. 30. 22:04

좋았던 점

  • 딥러닝 파트 뒷부분으로 가면서 토이 데이터뿐만 아니라 실제 데이터를 이용해서 실습을 할 수 있었습니다. RNN 모델 실습을 할 때 Yahoo finance의 주가 데이터를 이용해 주가 예측 모델을 만들었습니다. 참고로 그 날 오후, 2차전지 관련주 주가가 널뛰기를 했습니다.
  • 자바로 넘어오면서는 이론 설명과 예제 실습의 균형이 잘 잡혀있었습니다. 후술할 네이버 클라우드에 자료를 올려주시는데 혹시나 수업 중에 놓친 부분이 있어도 수업 정리 pdf를 같이 제공해주셔서 좋았습니다.

아쉬웠던 점

  • 자바로 넘어오면서 새 강사님께서 오셨는데 예전 강사님들만큼 슬랙이나 줌을 적극적으로 활용하시지는 않는 것 같습니다. 수업 자료 공유가 네이버 클라우드로만 이뤄지는 게 조금 아쉽습니다. 그 대신이랄까 날짜별로 폴더가 구분되어 있고, 파일 이름만 보고도 어떤 내용일지 알 수 있게 해 주신 건 또 좋았습니다.

배운 점

딥러닝 심화

전이 학습

전이 학습이란 미리 훈련된 모델(pre-trained model)을 불러온 후, 이 모델에 추가적인 레이어를 더하거나 추가적인 학습을 진행시키는 학습 기법을 말합니다. 전이 학습을 할 때는 미리 훈련된 모델 사용의 이점을 극대화하기 위해 몇 가지 팁과 스킬이 더해집니다.

  • GlobalAveragePooling (GAP): Pooling 연산의 일종인 average pooling의 변종 중 하나로, 입력 Feature map의 채널 하나의 평균값을 추출하여 $1\times 1\times channel$의 feature map을 생성하는 pooling 연산입니다. 추출한 feature map을 flatten해서 분류기에 전달하면 많은 연결 노드와 파라미터가 필요하게 됩니다. 이때 GAP를 사용하면 노드와 파라미터의 개수를 효과적으로 줄일 수 있습니다.
    일반적으로 채널의 개수가 많을수록 GAP를 사용할 때 이점이 크고, 반대로 채널이 작다면 Flatten 연산을 쓰는 것이 유리합니다.
  • 보통 pre-trained Model에서 feature extractor 부분을 사용합니다. 출력 레이어의 경우 모델을 만든 사람이 아닌 우리가 사용하고자 하는 데이터셋의 목적에 맞게 변경해야 하므로 재사용할 수 없는 경우가 대부분입니다.
    따라서 위 이미지와 같이 모델의 일부분, 특히 top에 해당하는 부분만 학습시키기 위해 나머지 부분은 frozen 시켜서 non-trainable parameter로 만들어주는 조치가 필요합니다.
  • 미세 조정(fine tuning): 전이 학습을 위한 pre-trained model을 내 데이터셋(custom dataset)으로 재(추가)학습시키는 것을 미세 조정이라고 합니다. 모델의 크기, 그리고 커스텀 데이터셋과 pre-trained modeld을 학습시킬 때 사용한 데이터셋 간의 클래스 유사성을 고려해 학습 전략을 수립합니다.

주요 CNN 모델

전이 학습에서 불러올 때 주로 사용되는 소위 네임드 모델들이 있습니다. AlexNet부터 시작해 본격적으로 CNN 기반 딥러닝 모델 알고리즘의 포문을 연 VGG16, skip connection 기법을 통해 hidden layer의 수를 획기적으로 늘린 ResNet, 그리고 마이크로 디바이스에서도 실행할 수 있게 모델의 경량화를 이끌어낸 MobileNet 등이 있습니다.
이러한 모델들은 직선형 모델이 아닌 여러 분기점을 가지는 등 다소 입체적인 구조를 가지기에, Sequential() 메서드가 아닌 함수형 API, 다중 출력 레이어, 다중 입력 모델 등 다른 방법을 써서 구현해야 합니다.

RNN(Recurrent Neural Network)

데이터 간의 순서가 주용한 소위 순차 데이터를 처리하는 데 특화된 신경망으로, SimpleRNN과 LSTM 등의 모델이 있습니다. 일반적인 SimpleRNN의 경우 순차 데이터의 길이가 길수록 앞쪽의 기억이 뒤쪽에 영향을 미치지 못해(달리 말하자면 기억이 잊혀져) 학습 능력이 떨어집니다. 이를 해결하기 위해 LSTM, GRU 등의 모델이 등장했습니다.

GAN(Generative Adversarial Network)

실제 데이터의 분포를 이용해 그럴 듯한 가짜 데이터를 만들어나는 생성자(generator)와, 생성자가 만들어낸 가짜 데이터와 진짜 데이터 중 어떤 것이 진짜인지를 판별하는 판별자(discriminator)를 함께 학습시켜 경쟁시키는 모델을 말합니다.

자바 기초

자바 개발 환경

자바 버전은 11 버전을 사용했고, IDE는 이클립스를 사용해 수업을 진행했습니다. VS Code나 PyCharm과 달리 별도의 설치 과정 없이 exe 파일만 있으면 어디서나 코딩을 할 수 있다는 이점이 있었습니다.

자바의 특징 (파이썬과의 차이 위주로)

  • 자바는 함수라는 개념이 없고 무조건 클래스를 정의하는 것부터 시작해야 합니다. 클래스로 시작해서 클래스로 끝나는 언어다 보니 초기 진입장벽이 좀 있는 편입니다.
    자바 클래스는 첫 글자를 무조건 대문자로 시작하고, 이를 Pascal 표기법이라고 합니다. 여러 단어를 붙일 때는 CamelCase 표기법이라고 해서 새 단어가 시작될 때마다 대문자로 시작합니다. 예를 들어 FileOutputStream, ServerSocket과 같이 표기합니다. 다만, 클래스 외에 패키지 등을 정의할 때는 특별히 이 법칙을 지키지는 않아도 됩니다.

  • 자바 구문: 아래 사항 중 배열까지만 잘 기억해도 (어떤 언어를 쓰든 간에) 코딩 테스트에 큰 지장은 없습니다. 어느 수준 이상 올라가면 알고리즘 공부를 하는 게 더 중요합니다.

    • 데이터의 종류: 대부분의 프로그래밍 언어들은 사용하는 데이터의 종류가 크게 다르지는 않습니다. 다루는 방법에 따라 변수, 상수, 리터럴 등이 있고, 자료형(타입)에 따라서 숫자형, 문자형, 논리형(파이썬과 자바는 논리형 자료형을 지원합니다) 등이 있습니다.
    • 연산자: 80% 정도는 대부분의 언어가 비슷한 연산자를 사용합니다. 자바에는 산술 연산자(+, -, *, /, ++ 등), 비교 연산자, 논리 연산자, 비트 연산자 ~(시스템 개발에 주로 사용되괴, 웹 프로그래밍에서는 사실상 쓸 일이 없습니다), 형변환 연산자(자료형을 변환하려면 함수를 호출해야 하는 파이썬과 달리, 자바는 자료형 변환을 연산자로 수행할 수 있습니다), 대입 연산자 등이 있습니다.
      단, 자바의 경우 피연산자의 개수에 따라 단항 연산자, 이항 연산자, 삼항 연산자 등이 지원됩니다.
    • 제어문: 자바의 제어문은 파이썬에서의 제어문과 거의 똑같고, 몇 가지 추가되는 구문들이 있습니다. 그래서 이미 프로그래밍 경험이 있다면 그렇게까지 어렵지는 않습니다. 조건제어문, 반복제어문, 분기제어문 세 가지로 구분됩니다.
      • 조건제어문: if, switch
      • 반복제어문: for, while, do ~ while
      • 분기제어문: break, continue
    • 배열: (엄밀한 자료구조 개념으로는 차이가 있지만) 파이썬의 리스트와 유사한 자료구조입니다. 좀 더 정확히는 넘파이의 ndarray 객체와 더 유사합니다. 여러 개의 데이터를 다룰 때 사용되며, 1차원/2차원 등으로 구분됩니다.
    • 클래스 정의 방법, 멤버 변수 선언, 메서드 + 객체 생성 방법과 활용 방법
    • 클래스 상속(inheritance), 추상 클래스, 인터페이스
    • 예외 처리(try - catch 문)
    • 자주 사용되는 API 학습: 필요할 때마다 공부하면 되겠습니다.
    • 변수 생성 및 선언: 정적 컴파일 언어의 특성을 갖고 있는 탓에, 자바에서는 변수명을 선언하기 전에 자료형부터 먼저 선언해야 합니다. 또한, 한 번 선언한 자료형에 맞는 값만 대입할 수 있습니다. 아, 참고로 타입과 변수명까지만 필수고, 값은 굳이 지정하지 않아도 됩니다. 값을 지정하지 않으면 메모리 상에서 그 부분을 빈 공간으로 남겨 놓습니다. 대신, 한 번 선언한 자료형은 엄격하게 준수해주셔야 합니다!
      • 변수형(괄호 안은 바이트 수): 정수형 - byte(1), short(2), C언어와의 호환에만 쓰일 따름, int(4), long(8) / 실수형 - float(4), double(8) / 문자형 - char(2) / 논리형 - boolean
        • short 자료형에 대한 첨언: 이 자료형이 가장 쓸모없어진 이유로, 자바는 연산을 할 때 int 자료형으로 자동으로 바꿔서 연산을 합니다.
      • 대입 연산자 심화편: 대입 연산자 사용 시 변수명 = 식; 형태로 나타냅니다. 여기서 우변의 식에는 변수명, 리터럴, 상수, 연산식, 리턴값이 있는 메서드의 호출식 등이 올 수 있습니다. 좌변의 변수명을 l-value, 우변의 값을 r-value라고도 표현합니다.
    • 리터럴: 소스 코드에서 사용되는 데이터 값
      예시: 10, 10.0, "ten", '십'("십")
      • 서로 다른 크기의 변수형을 연산할 때는 더 큰 바이트 수를 갖는 변수로 변환됩니다. 예를 들어 1 + 1은 정수형 2를 반환하지만, 1.0 + 1은 실수형 2.0을 반환합니다.
      • 자바는 둘 중 하나가 문자라면, 다른 한 변수도 문자로 바꿔주는 기능이 있습니다. 예를 들어 '1' + 1은 문자 리터럴이 되기 때문에 아스키 코드로 변환되어 정수 49를 출력하고, "1" + 1은 문자열 리터럴이 되어 "11"을 반환합니다.
      • 자바에서는 따옴표('')를 사용하면 문자 변수가 되지만, 쌍따옴표("")를 사용하면 문자열로 지정됩니다. 그래서 위의 예시에서 ten의 경우 알파벳 3개를 썼기 때문에 쌍따옴표를 써서 문자열로 지정하는 것입니다.
    • 상수: 한 번 값을 지정(초기화)하면 그 값을 변경할 수 없는 변수
      • 자바에서 권장하기를, 상수 변수는 특별히 그 이름을 대문자로 쓰라는 관례(custom)가 있습니다. 대신 CamelCase 표기법을 준수할 수 없기 때문에 편의상 언더바(_)를 MAX_VALUE, MIN_VALUE과 같이 적습니다. 또한 상수 변수를 선언할 때는 자료형 앞에 final문을 붙여서 지정합니다.
  • 자바 변수명 규칙: $와 언더바(_)만 변수명에 사용할 수 있으며, 상수가 아닌 변수는 반드시 그 이름을 소문자로 시작해야 합니다. 그리고 여느 프로그래밍 언어가 그렇듯 예약어(키워드)는 변수명으로 사용할 수 없습니다!

  • 예시

    int v1 = 65; // 65
    char v2 = 65; // A, 아스키 코드
    final int MAX_VALUE = 100; // 정수형 상수 변수, 100

앞으로 바라는 점

  • 딥러닝 후반부에 구글 코랩과 로컬 환경을 왔다갔다 하면서 실습을 진행했는데, 연구실에서의 기억을 더듬어 집에 있는 컴퓨터에 GPU 가속 환경을 구축해봐야겠습니다. 그러니까... 뭐부터 깔아야 되더라....??
  • 자바가 그렇게까지 어렵다고 느껴지지는 않는 단계지만, 아무래도 파이썬에 비하면 시작할 때 적어야 되는 코드의 양이 조금 더 많은 것 같습니다. 실수를 줄이려면 자주 타이핑해서 익숙해져야 할 것 같습니다.