기간: 10/13 ~ 10/17

2차 프로젝트 + 자연어 처리 파트 시작 + 해커톤 준비 = 🐕고생


📕8주차 리뷰

2차 프로젝트가 정말 힘들었다. 극단적인 불균형 데이터를 다루는 데에 있어서 많은 경험이 필요할듯하다..

그래도 덕분에 많은걸 찾아보고 적용해보면서 한편으론 재밌는 경험이었다.

 

이번주부터 NLP 과정에 들어갔다. 대학에선 모델을 가져다쓰는 정도의 경험뿐이었어서, 이론과 함께 원리를 하나하나 짚어보는게 생각보다 낯설고 머리가 따라주지 않는게 느껴진다. 그래도 재밌으니 그걸로 된 거 아닐까?

 

SK와 Anthropic에서 주관하는 해커톤에 참가하기로 했다. 마음이 맞는 동기 분들과 4인 팀을 맺고 호기롭게 도전해본다.

원래 처음은 경험에 의의를 두고 맛만 한 번 보자... 라는 마인드지만, 공개된 주제를 살펴보니 많이 매운 맛이다.

 

그리고 지난 추석 연휴에 역전파를 좀 더 상세하게 공부했다. 제대로 이해했는지는 나도 모르겠다...


2차 프로젝트 회고

주제: 넷플릭스 유저 특성에 따른 구독 이탈 예측

보자마자 한숨부터 나온 극단적인 데이터였다.

주어진 데이터셋에서 이탈 고객이 90%를 차지하는, 매우 치우쳐진 형태였다.

 

시청시간, 구독플랜, 월 소득, 상호작용 빈도 등등 좋은 특성들이 많았지만 문제는 이탈 고객과 잔류 고객 사이의 패턴 차이가 없었고,

모델이 이탈 고객에 대해 오버피팅이 된 것인지 예측 과정에서 일단 이탈(1)로 찍는듯한 모양이 보였다.

 

양쪽 클래스에 대해 recall은 비슷하게 높지만 precision이 굉장히 낮고

비율이 아닌 절대 수치로 보면 모델이 그냥 대부분의 상황에서 이탈이라고 보고 있다.

학습한 데이터가 패턴이 모두 일정하고, 그 중 대부분이 이탈이었으니 어쩔 수 없다.

 

https://github.com/SKNetworks-AI19-250818/SKN19_2ND_3TEAM?

 

GitHub - SKNetworks-AI19-250818/SKN19_2ND_3TEAM: 넷플릭스 유저 특성에 따른 구독 이탈 예측

넷플릭스 유저 특성에 따른 구독 이탈 예측. Contribute to SKNetworks-AI19-250818/SKN19_2ND_3TEAM development by creating an account on GitHub.

github.com

오버샘플링(SMOTE), 가중치 선정, BalancedRandomForest 등 불균형 데이터를 극복하기 위해 여러 시도를 해보면서 새로운 경험이 되기도 했고, 실제 세상의 데이터가 항상 깔끔하진 않기 때문에 나름 괜찮은 경험이었던 것 같다.


오차역전파법(Backpropagation)

전반적인 흐름은 알겠지만 디테일한 부분은 명확하게 와닿지 않아 지난 추석연휴 동안 좀 더 파봤다.

우선 크게 두 가지 질문을 두고, 이를 해결하려는 방향으로 공부했다.

  • 역전파 과정에서 내적과 외적 연산이 필요한 이유
  • 왜 가중치 갱신 시 항상 빼주기만 하는가 더하면 안되나?

1. 역전파를 하는 이유

학습하면서 여러 갈래로 퍼진 오차를, 거슬러 역추적하면서 다시 하나의 뉴런으로 요약

  • 어떤 은닉층에 있는 뉴런 하나의 오차(책임)를 계산해야 하는 상황
  • 이 뉴런은 다음 층에 있는 뉴런들에게 신호를 보냈고, 최종 오차에 기여함
  • 이 뉴런이 짊어져야 할 책임 오차는, 자신이 보냈던 다음 층 뉴런들의 오차를 취합하여 계산
    → 가장 큰 오차를 퍼뜨린 범인을 검거하고, "가중치를 이렇게 고쳐라" 하고 재할당해주는 것

2. 목표

각 층을 거슬러 올라가며, 각 층에 있는 뉴런들의 오차 기여도를 수색

= 특정 층(L)에 있는, 특정 뉴런 j의 오차 ∂j를 계산해야 함.

3. 상황

  • 뉴런 j는 L+1에 있는 모든 뉴런 k들과 가중치 Wkj로 연결되어 있다.
  • L+1의 뉴런 k들은 j에게서 전달받은 가중치로 자신의 오차 ∂k를 계산해 보관 중이다.

4. 계산

순전파 과정 중 뉴런 j가 남긴 총 책임량 = 다음 뉴런이 가진 오차 x 이 뉴런이 전달받은 가중치

'뉴런 k들이 가진 오차 ∂k'에 둘을 연결하던 '가중치 Wkj만큼의 영향력'을 곱해서 합산

 

한마디로, 오차 벡터와 가중치 벡터의 유사도를 산출하는 과정이므로 여기서 내적을 사용한다.

5. 가중치 갱신

입력값과 출력 오차의 상호작용 맵을 만들어 모든 엣지(edge)에 책임을 묻는 과정

이렇게 해야 하는 이유는, 가중치를 준 쪽이 일방적으로 책임을 쓰지 않게 하기 위함

가중치를 받은 뉴런이 범인일 수도 있기 때문

  • 가중치 Wkj는, 이전 층의 뉴런 j에서 현재 층의 뉴런 k로 향하는 엣지
  • 이 엣지가 최종 오차에 얼마나 큰 책임이 있는지를 판단해야 함
    • 값을 보낸 뉴런 j가 얼마나 강한 activation을 가지고 있는가?
      → activation 자체가 약했다면 가중치가 높아도 오차가 작았을 것이기 때문
    • 신호를 받은 뉴런 k가 최종 오차에 대해 얼마나 책임이 있는가?
      → 받은 쪽에서 계산된 오차가 작다면 이 엣지의 책임은 작기 때문

5-1. 새 가중치 계산

가중치 Wkj의 책임(그래디언트) = Wkj의 변화율에 따른 최종 오차의 변화율(Chain Rule)

→ Wkj가 변하면 k의 활성화 함수 입력값(Zk)이 변하고, 이에 따라L이 변한다.

  • Wkj는 이전 층의 뉴런 j와 현재 층의 뉴런 k를 연결한다
  • 이 가중치가 최종 손실 L에 영향을 미치는 경로는 단 하나

현재 층의 오차 벡터 ∂k와 이전 층의 활성화 벡터 ∂j외적과 정확히 일치

→ 가중치(그래디언트) 행렬 = 활성화 벡터를 오차 벡터의 방향으로 보내버리는 선형변환

→ 오차의 관점으로 다시 바라보기

  • 입력 신호(활성화 벡터)가 최종 오차에 어떤 식으로 기여했는지를 밝히는 것
  • 외적 행렬 = 활성화 벡터에서 오차와 상관도가 높은 원소들만 남은 결과물

 

역전파 과정에서 내적과 외적 연산이 필요한 이유

  • 내적: 임의의 뉴런이 뽑아낸 오차 벡터와 그 뉴런이 받은 가중치 벡터 간의 유사도
  • 외적: 임의의 뉴런이 뽑아낸 오차 벡터와 그 뉴런이 받은 활성화 벡터의 상호 영향력

왜 가중치 갱신 시 항상 빼주기만 하는가?

  • 오차와 상관도가 높은 원소들을 제하기 위해

+ Recent posts