48일차 간단한 회고

오늘 아침에 드디어 베이스라인 코드의 문제점을 찾았습니다. 간단히 설명하겠습니다.

딥러닝으로 이진분류 문제를 풀 때 보통 시그모이드 함수를 마지막에 달아줍니다. 0~1 사이 확률로써 값을 뽑아내기 위함이고 이를 Binary Cross Entropy Loss를 이용해 손실 값을 구합니다.

그러나 베이스라인에 쓰인 BCEWithLogitsLoss 함수는 시그모이드 함수가 내장되어 있습니다. pred를 시그모이드 하기 전 값이라고 생각하면 아래와 같이 표현 가능합니다.

  • nn.BCELoss : ( sigmoid(pred), target )
  • nn.BCEWithLogitsLoss : ( pred, target )

시그모이드 함수를 언제 취해주느냐 차이인데 모델 마지막에 시그모이드를 달아주면 BCELoss 함수를, 달아주지 않으면 BCEWithLogitsLoss 함수를 사용합니다.

BCEWithLogitsLoss 함수를 사용하면 시그모이드 함수를 달아준 것과 같은 효과가 나며 비슷하지만 미세하게 BCEWithLogitsLoss 함수를 사용하는 것이 모델 학습에 유리하다는 실험 결과도 있다고 합니다.

베이스라인에서 BCEWithLogitsLoss 함수를 쓰는 것 자체는 문제가 없으나 실제 값을 예측할 때는 pred 값에 시그모이드를 씨워야하는데 그렇지 않으니 0~1 사이 값이 아닌 이상한 값으로 예측하는 것 입니다.

모델 학습은 정상적으로 되나 시그모이드 함수를 취해주지 않아 output 값이 이상한 현상이였습니다.

뒤돌아보니 나름 기본적인 것인데 딥러닝 부분에서 아직 많이 부족하구나 자책도 했고 그래도 이번 기회에 부족한 부분을 잘 채웠구나하는 생각도 듭니다.

조금 잘한다고 우쭐하기도 했던 것 같은데 아직 능숙한 엔지니어가 되기까진 시간이 필요한 것 같아요. 그래도 한 걸음씩 성장하는 기분이 듭니다.

이외에도 LSTM을 중간에 적용했을 때 그래디언트 베니싱 문제가 계속 발생하는데 이를 해결하고 있습니다.

이 과정에서 오피스아워 시간에 조교님이 설명해주신 breakpoint 함수를 너무 잘 쓰고 있습니다.

디버깅이 정말 강력하구나 몸소 체감하고 있고 이걸 지금까지 모르고 코딩한 내 자신이 너무 안타까웠습니다.

팀원들과 피어세션 시간에서는 진행상황 공유를 많이 했는데요. 아무래도 DKT는 처음 한 부분이여서 저를 포함해서 진행이 조금 더딘 것 같습니다. 외부대회를 겸하고 있어서 마음이 조급하긴 한데 몸은 안따라주네요. ㅋㅋ.

그래도 일정관리가 중요한 만큼 팀원들과 커뮤니케이션을 활발히 한 것 같습니다. 처음 팀을 꾸렸을 때 보다 소통도 훨씬 활발히 되는 것 같아 좋습니다. 다만 팀원분들이 많이 순해서 그런지 저를 조금 어려워하는 것 같기도 합니다. 편하게 막 놀리고 그랬으면 좋겠는데 아마 한번 더 만나면 괜찮아질 것 같아요.

또 게임듀오라는 회사를 소개받는 시간을 가졌습니다. 인상깊었던 내용은 다음과 같아요.

  • 게임이 현실세계보다 데이터가 더 잘 쌓인다 => 게임 도메인에 관심을 가지는 것도 좋을지도.
  • 게임을 좀 더 재밌게 할 수 있는 모델 => 비전모델 바탕 더 풍부한 시각효과
  • 벨런싱 작업(강화학습) + QA 등 자동화 + 이상치 탐지
  • 개인화된 패턴을 활용한 유저 분석 + 게임 시장 분석.

구체적으로 데이터나 AI가 비지니스에 어떻게 적용되는지 들어서 좋은 기회였고 게임을 완전 좋아하진 않지만 관심을 가져볼 수 있겠다는 생각이 들었습니다. 다만 아직은 안정적인 서비스라기보단 조금 큰 틀에서 바라본다는 느낌도 조금 듭니다.

내일은 U+ 팀원들과 오프라인으로 만나는 날 입니다. 모두 98년생이라는 말을 들어서 내적 친밀감이 생기네요.

현재 등수도 괜찮고 아직 점수 올릴 건덕지도 남아있어서 욕심이 납니다. 두 마리 토끼를 다 잡을 수 있을까요?