Share           Pin It

이젠 월간 정부환이 아니라 격월간 정부환으로 바꿔야할 듯합니다. 작년까지는 매주 토/일 이틀동안 사진을 찍으면서 돌아다녔는데, 올해에는 하루는 사진을 찍고 하루는 논문이나 자료 등을 보며 공부하면서 보내고 있습니다. 물론 겨울이다보니 추워서 밖에 잘 나가지 않은 것도 있고, 겨울에 돌아다닐만한 곳이 마땅치 않은 점도 있습니다. 그러다보니 한달에 4~5장의 사진만 공유하곤 합니다. 그래서 올해는 두달치를 모아서 글을 적으려 합니다.


1월 1일... 일출이 아니라 일몰.

도두봉에서... 공항 아파트 한라산 그리고 구름

사라오름

눈내리는 날

샤이니숲길

칠십리공원에서 한라산 반영 사진

망원렌즈가 아쉬웠던 날...

516 숲터널

서귀포에 봄이 오고 있다.

세화바당


=== Also in...

F: https://www.facebook.com/unexperienced

신고

댓글을 달아 주세요

Share           Pin It
지난 글에서 워드임베딩에 대한 생각을 정리하고 딥러닝과 결합해서 개인화 추천에 어떻게 적용할 것인가에 대한 간단한 스케치를 올렸습니다. (참고. 워드임베딩: http://bahnsville.tistory.com/1139, 개인화 추천: http://bahnsville.tistory.com/1141) 오늘은 그런 기술을 딥 개인화 시스템에 적용할 때 예상되는 문제점들에 대해서 생각나는대로 정리하려 합니다.

지난 글에 제시한 딥 개인화 아키텍쳐를 간단히 설명하면 다음과 같습니다.
  1. 텍스트, 이미지, 또는 웹로그 등의 유저 및 아이템 정보/이력에 포함된 개별 항목들을 워드임베딩 기술로 벡터화한다.
  2.  유저/아이템의 정보를 RNN이나 CNN 등으로 정형화된 벡터로 압축한다.
  3. 정형화된 유저벡터와 아이템벡터의 관계를 유저-아이템 interaction log로 학습한다.
  4. 학습된 Latent Vector로 유저-유저, 아이템-아이템, 유저-아이템의 연관도/유사도를 측정한다.
유저-아이템 행렬을 팩토라이즈하는 것이 가능하지만 그것보다 풍부한 유저/아이템 정보를 이용해서 바로 유저/아이템 벡터를 만들 수 있다면 1과 2는 하나의 과정으로 봐도 무관합니다.

위의 과정에서 3과 4는 통상의 ANN 학습방법이나 유사도 연산으로 쉽게 해결되는 부분입니다. 특히 3의 학습에 대한 아이디어는 지난 글에 간략히 언급했습니다. 하지만 1과 2의 Knowledge Representation은 오랫동안 고민했지만 쉽게 답이 나오지 않았습니다. 예전부터 워드임베딩 기술을 사용하면 될 것 같다는 막연한 생각을 가지고 있었지만 따로 공부하지 않아서 더이상 진도가 안 나갔는데, 최근 관련 분야를 공부하면서 가능성을 확인했습니다. 하지만 실제 문제에 적용하는 데는 여전히 해결해야할 장애물들이 많이 있습니다. 공부하면서 여러 힌트는 얻었지만 유저/아이템 벡터로 컨볼루셔한하는 실용적인 방법을 찾지 못했습니다. 워드임베딩 부분과 컨볼루션 부분을 나눠서 예상되는 문제를 정리합니다. 짧은 식견으로 떠오른 어려운 점들이지만 저보다 띄어난 분들은 별로 문제될 것이 없다고 보실 수도 있고 또 많은 연구자들이 관련된 해결책을 이미 내놓은 경우도 많습니다.

워드임베딩
기계학습이라는 것이 최초의 학습데이터로 모델을 만들어두면 영구적으로 사용할 수 있는 것이 아닙니다. 실제 운영하면서 새로 추가되는 데이터로 주기적으로 모델을 업데이트해줘야 합니다. 새로운 데이터가 추가될 때 모델의 구조가 바뀌지 않으면 단순히 (hyper-)파라메터들만 업데이트해주면 되겠지만, 워드임베딩의 경우 모델의 구조가 함께 바뀌기 때문에 전체 모델을 새롭게 빌딩하고 관련된 시스템 전체를 바꿔줘야 합니다. 새로운 텍스트에는 기존 학습 데이터에는 없던 신조어가 있습니다. 보통 OOV (out-of-vocabulary)라는 특수한 태그로 처리하지만, 데이터 양이 많아지면서 모든 신조어를 OOV로 처리할 수도 없고 중요한 신조어는 새롭게 사전에 추가해야 합니다. 기존 사전에 10,000개의 단어가 있었는데, 여기에 한개의 단어를 더 추가하는 것은 별 문제가 안 될 것 같지만, one-hot encoding에서 데이터 차원을 1만큼 증가시켜야 하고 그에 따라서 전체 가중치 W를 재계산해야 합니다.

일반적인 텍스트 문서 분석의 경우 몇달, 몇년치의 데이터를 모으더라도 추가되는 신조어의 수가 기존 사전 사이즈에 비해서 별로 크지 않아서 오랜 기간동안 OOV로 처리해도 시스템의 예측력에 큰 해를 주지 않습니다. 하지만 대형 쇼핑몰에서 상품을 추천해주는 경우라면 매년 추가되는 신상품의 수도 많을 뿐더러, 핫한 추천 대상이 돼야할 신상품을 사전에 추가하지 않을 수가 없습니다. 일반적인 텍스트 컨텐츠로 확대해서 유저의 검색쿼리나 방문했던 사이트를 기반으로 추천하겠다고 가정한다면, 매일 기존에 없던 수많은 새로운 패턴의 검색어가 등장하고 뉴스 기사만 하더라도 매일 수천건 이상이 새로 생깁니다. (새로운 문서 = 새로운 URL) 해외의 뉴스도 포함하고 블로그 등의 소셜미디어를 고려한다면 매일 추가되는 신종 아이템이 넘쳐납니다. 즉 사전 사이즈가 감당할 수 없을만큼 커지고, 그에 따라서 매번 모델을 새로 구축해야 합니다.

컴퓨팅 파워가 받쳐주더라도 학습 데이터를 무작정 누적해서 사용할 수도 없습니다. 오래된 것은 버리고 새로운 데이터로만 학습할 필요가 생깁니다. 신조어가 생기듯이 필요없어지는 단어가 생깁니다. 즉, 사전에서 빼주는 작업이 발생합니다. 사전의 구조가 바뀌면 당연히 모델을 새로 학습해야 합니다. 그리고 미리 정의된 사전이 아니라 매번 학습 데이터 (텍스트)에서 사전을 동적으로 구축하는 경우라면 모델 재구축은 필수입니다. 모델을 학습하는 것은 모델을 기반으로 예측하는 것에 비해서 리소스가 많이 들어가는 작업입니다. 그래서 재구축 주기를 너무 짧게 가져갈 수도 없습니다. 또 주기가 길어지면 OOV가 증가합니다. 상품이나 컨텐츠 추천에서는 OOV에 해당하는 신상이나 최신글이 가장 중요할텐데, 업데이트 주기를 기다리는 동안에는 유저의 프로필 (관심사)에 반영하지 못하는 어처구니없는 상황이 발생합니다.

그리고 이건 실제 작업해봐야 알겠지만, 사전 사이즈를 어느 수준까지 크게 가져가도 컴퓨팅이나 전체 시스템 성능에 영향을 주지 않을 것인가도 고민이 됩니다. 옥스포드 영어 사진에 약 17만건의 영단어가 등록돼있다고 합니다. 인터넷에서의 유저가 한 행동 이력으로 유저 프로파일을 만든다면 다양한 조합의 검색어, 접속했던 문서 (URL), 웹에서의 다양한 활동 등을 모두 사전에 추가한다면 세상의 모든 언어가 가진 단어의 수보다는 가늠할 수 없을만큼 훨씬 많아질텐데, 과연 그런 규모의 사전을 워드임베딩하는데 저비용으로 가능할까에 대한 의문도 듭니다. 여지껏 전체 웹 단위에서 상상을 펼쳤기 때문에 무모한 논쟁이기도 합니다. 각자 서비스 내에서의 추천/개인화를 위해서 데이터의 종류와 양을 잘 제한하면 이건 그저 기우일 뿐입니다. (학교에 있을 때는 웹 전체의 문서를 클러스터링해보고 싶다는 막연한 생각을 했었는데, 여전히 그런 버릇에서 못 벗어난 듯...)

사전에 색인된 단어 순서가 바뀌지 않고 상대적으로 적은 양의 신조어가 추가만 된다면 (또는 일부 불필요한 단어가 색인 순서는 그대로 둔 채 제외한다면) 가능한 기존의 워드임베딩 결과를 유지하면서 새로운 사전을 학습시킬 수 없을까에 대한 고민도 있습니다. 예를 들어, 원래 사전이 {A, B, C, D, E, F, G, H, I, J}로 총 10개의 단어로 구성됐는데, 신조어 K가 추가돼서 {A, B, ..., J, K}로 11개로 변경됐다고 가정합니다. 원래 사전에서 A는 [1 0 0 0 0 0 0 0 0 0]' (0이 9개)로 one-hot 인코딩으로 표현할 수 있고, 이를 워드임베딩했을 때 결과가 [0.7 0.5 0.9]가 된다면, 새로운 사전에서 A는 [1 0 0 0 0 0 0 0 0 0 0]' (0이 10개)로 표현하고 그 워드임베딩 결과가 기존의 [0.7 0.5 0.9]와 크게 다르지 않게 학습시킨다면 어느 정도의 신조어가 사전에 추가되더라고 굳이 기존의 모든 단어들을 재계산할 필요가 없어지고, 기존 단어들로만 구성된 유저/아이템 벡터는 별도 업데이트가 필요치 않을 수도 있겠다는 생각도 듭니다. 하지만, 어차피 신조어의 벡터를 구하기 위해서 전체 단어의 재학습 및 결과는 함께 진행되기 때문에 조금 불필요한 고민이었던 것 같습니다. 하지만 외부 환경이 조금 변경됐을 때 굳이 전체 시스템에 영향을 주지 않는 robust한 방법에 대한 고민은 여전히 필요합니다.

컨볼루션
지난 글에서 소개했던 Collobert의 논문을 보면서 처음에는 컨볼루션으로 유저 및 아이템 벡터를 쉽게 만들 수 있겠다는 생각을 했습니다. (참고 논문: http://www.jmlr.org/papers/volume12/collobert11a/collobert11a.pdf하지만 텍스트 문장에 적용했던 기술을 유저 및 아이템 프로파일에 그대로 적용하는 데는 문제가 있음을 바로 깨달았습니다. 텍스트 문장 (문서가 아님)은 보통 1~20단어로 구성돼있고, 많아봤자 100단어를 넘지 않습니다. 일단 단어의 개수가 많지 않고 개수의 분포도 (상대적으로) 일정하다고 볼 수 있습니다. 추천할 아이템 (컨텐츠)의 프로파일은 다소 길겠지만 길이에 제한이 있습니다. 하지만 유저 프로파일의 경우 쉽게 가늠이 되지 않습니다. (사용자가 입력한 검색쿼리, 접속한 URL 등을 모두 한 단어로 가정함) 두가지 포인트를 지적했는데, 프로파일의 길이가 길다는 것과 길이의 편차가 크다는 것입니다. 길이가 길더라도 편차가 적다면 복잡하더라도 하나의 scheme으로 압축할 수 있을텐데, 길이가 천차만별이면 고민이 깊어집니다. 큰 이미지라면 강제로 사이즈를 줄이고 원하는 비율로 crop해서 사용하면 되는데, 텍스트 문서는 이런 방식이 불가합니다.

앞의 논문에서는 인접한 단어 벡터 (워드임베딩)들을 컨볼루션하고, 컨볼루션된 것들 중에서 각 열의 최대값 (max-pooling)을 취합니다. 단어의 수가 별로 많지 않기 때문에 max-pooling을 하더라도 다양한 결과값이 만들어집니다. 하지만 단어가 많아지면 각 행의 max값들이 모두 비슷해질 가능성이 높아집니다. 예를 들어, [0 1] 사이의 랜덤 넘버 10개 중에서 max값은 1.0이 될 수도 있지만 0.7이나 0.8, 심지어 0.1도 될 가능성도 꽤 있습니다. 하지만, 10,000개의 랜덤 넘버 중에서 max값을 취하면 대부분 0.9 ~ 1.0이 될 것입니다. 문장 단위에서 convolution+max-pooling이 잘 동작하더라도 문서 (유저의 행동 이력) 단위에서는 불가능하다는 것입니다. 즉, 결과 유저 벡터들이 모두 유사해지고, 추천의 variance가 없어진다는 의미입니다. 문서의 길이가 길더라도 길이가 일정하면 동일한 조건으로 큰 컴볼루션 window 사이즈를 취하거나 여러 겹의 컴볼루션 레이어를 두는 식으로 해결책이 존재하겠지만, 길이가 일정하지 않으면... 어떤 논문을 보면 varying-size convolution filter를 사용하는 경우가 있어서 컨볼루션을 잘 설계하면 돌파구가 있을 듯도 합니다. (참고. https://arxiv.org/pdf/1604.06338.pdf) 부트스트랩하듯이 그냥 임의의 벡터를 선택해서 컨보루션 & 풀링하는 것도 생각해봤지만 이건 그냥 애초에 입력 데이터를 랜덤하게 선택해서 진행하는 것이 더 나을 것이고, 알고리즘의 일관성을 확보할 수가 없습니다. (역으로 짧은 입력 데이터를 임의로 확장하는 것도 별로...) Pooling층에서 같은 위치의 벡터 엘리먼트 sequence를 time series로 가정하고 wavelet (Fourier Transformation)으로 pooling하는 것도 가능하지 않을까?라는 생각도 듭니다.

유저의 행동 이력을 시간순으로 나열해서 RNN을 이용하는 방법도 생각해봤습니다. RNN이 CNN보다는 길이의 가변성에 더 유연합니다. 하지만 RNN도 문장이 아닌 문서 단위에서도 제대로 동작할지 의문이 듭니다. RNN은 개념적으로 이전까지의 결과 (이전의 모든 단어의 sum)과 현재 단어를 일종의 weighted sum하는 것입니다. (개념적으로 설명하면 그렇다는 것임) 이런 추론에 따르면 최신 행동 이력에 가중치를 부여하는 방식이라는 장점이 있지만, 역으로 과거 이력을 무시해버릴 가능성도 있어 보입니다. 예를 들어, 어떤 유저가 '제주도, 제주도 맛집, 제주도 펜션, ...., 제주도 항공권' 등의 키워드로 95회 검색하고 가장 마지막에 '포켓몬 고' 관련해서 5회 검색했다면 이 유저의 관심사가 제주도 여행보다 포켓몬 고로 표현될 가능성이 있습니다. 실제 RNN이 이런 식으로 작동하지 않겠지만, 통상의 RNN의 구조로 유추하면 그렇다는 것입니다. 최근 RNN에서 많이 사용하는 LSTM을 사용하면 또 다른 가능성이 있지 않을까라는 또 기대를 걸어봅니다. (LSTM을 설명한 번역글: http://whydsp.org/280) LSTM를 포함한 텍스트 또는 시퀀스 데이터를 위한 딥러닝 기술을 좀더 공부해봐야겠습니다. 아직 읽어보지는 않았지만 word2vec을 만든 Mikolov가 공저자로 참여한 논문 (http://cs.stanford.edu/~quocle/paragraph_vector.pdf)은 문장/문서의 paragraph vector를 만드는 걸 제안했고, Weinberger et al.은 feature를 hashing하는 방법도 소개했습니다 (https://arxiv.org/pdf/0902.2206.pdf). 여러 논문들을 훑어봤지만 아직 만족스럽지가 않습니다. 만족할 솔루션을 찾았다면 이런 글을 적지도 않았겠지만...

길이가 다소 일정한/제한적인 아이템 벡터보다는 가변적이고 긴 유저 벡터를 만드는 것이 고민이라고 적었습니다. 그런데 문제가 되는 유저는 전체 중에서 극히 일부 (10%미만?)에 해당하는 헤비 유저들 가능성이 큽니다. 이들 일부 유저 데이터만 제한하면 전체 시스템 측면에서는 이점이 있을 수 있습니다. 가장 쉬운 방법으로는 최근의 T기간 또는 N개의 최근 데이터만 사용할 수 있습니다. 추천에서는 최신 데이터에 대한 민감도가 중요하기에 쉽지만 괜찮은 방법입니다. 하지만 헤비유저의 과거 이력에 나타난 오래된 관심사를 반영하지 못할 수도 있다는 우려도 있지만, 오래된 관심사라면 최근 행동에도 반영됐을 가능성도 높고 또 고정 관심사와 연관된 새로운 행동을 통해서 빠르게 업데이트된다면 freshness를 고려하면 헤비유저의 반감이 적을 수도 있겠다는 생각이 듭니다. 그리고 만약 고정된/오래된 관심사라면 이 글에서 제시한 방법에 더해서 별도의 필터링을 위한 유저 관심사 (또는 성별, 연령과 같은 고정된 정보)를 구축해서 하이브리드/퓨젼으로 추천 및 필터링하는 것도 가능합니다.

랜덤 샘플링을 통해서 제한된 정보만 사용하는 것도 고려할 수 있습니다. 모든 물고기를 잡을 수 없다면 큰 물고기라도 잡아야 한다. (어차피 다양한 오프라인 테스트와 온라인 A/B 테스트를 통해서 generalization error가 적은 방식을 택하면 됩니다.) 앞서 소개한 Phan et al.의 논문에서 varying-size 컨볼루션 필터 방식 등을 더 고민해보면 좋은 해결책이 나오리라고 봅니다. 그리고, session이나 period (day-by-day)를 나눠서 별도의 컨볼루션을 만들고 그것들을 다시 컨볼루션해서 최종 벡터를 만들어내는 방식 (또는 세션 단위로 recurrent하는 방식)도 가능성이 있습니다. 또는 임베딩 벡터로 유사도 계산, 클러스터링, 및 topic modeling 등을 통해서 데이터를 축소하는 것도 좋은 접근법입니다. 작은 문제에서 은닉층을 2개 이상 가져가는 것도 버거웠던 시절이 있었지만 지금은 입력 데이터의 차원도 훨씬 커졌고 은닉층의 개수도 훨씬 많아져도 딥러닝을 성공하게 만든 breakthrough가 있었듯이, 이 문제/해결책도 좀 복잡해졌지만 조만간 깔끔하게 해결되리라 봅니다.

그리고, 저는 광고랭킹을 염두에 두고 가능한 유저의 모든 정보와 이력을 모아서 활용하겠다는 관점에서 생각하고 있지만, 특수한 서비스를 위한 추천이라면 데이터의 종류와 양이 충분히 다룰 수 있을만할 거라 봅니다. 광고에서는 유저가 어떤 서비스에서 어떤 활동을 했고 또 어떤 컨텐츠를 조회했는지 등의 모든 정보를 바탕으로 유저 프로파일을 만들어 활용하겠지만, 일반 쇼핑몰에서 상품을 추천하는 경우라면 기존의 CF 등에서 활용하는 수준의 유저별로 조회한 상품 목록만으로도 충분합니다. 자신이 속한 비즈니스 도메인 및 가용 데이터에 따라서 손쉬운 해결책이 존재하고, 이상의 고민이 불필요할 수도 있으니 새로운 접근법을 지나치게 거부할 필요가 없습니다. 서비스/비즈니스 도멘인을 한정하듯이 유저 정보의 종류를 한정하는 것도 방법이 될 수 있습니다. 유저가 검색한 쿼리만으로 유저벡터를 만들겠다거나, 개별서비스에서 정의한 카테고리 (공통의 카테고리일 필요는 없음)의 리스트만 활용하겠다거나, 긴글을 조회한 경우나 댓글 등의 조회 이상을 한 액션이뤄진 URL만을 대상으로 삼는다거나 등의 여러 제약 조건을 데이터를 한정할 수도 있습니다. 제가 이 글에 적었다고 해서 모든 방법이 유효하다는 것은 아닙니다. 단지 생각나는 것을 나열한 것입니다.

지금 바로 내 눈 앞에 보이지 않을 뿐이지 나와 비슷한 문제로 고민했던 수많은 연구/개발자들이 존재하고 있으니 일부는 이미 깔끔한 해결책을 찾아서 알려주고 있습니다. 미래는 이미 우리 곁에 와있지만 인식하지 못할 뿐이다라는 문구와 같이 많은 경우에 우리가 가진 문제의 해결책도 이미 누군가가 풀어놨는데 제대로 인지하지 못하고 있을 뿐입니다. 아직 검증하지도 않은 이런 아이디어를 글로 적는 것도 누군가에게 해결의 실마리를 줄 수 있지 않을까?라는 기대 때문이고, 이를 바탕으로 더 좋은 아이디어로 문제를 해결하고 그 과정과 결과를 논문이나 코드 등으로 공개한다면 조금은 더 좋은 세상이 되리라 기대합니다. 제 생각은 완벽한 해결책도 아니고 논의의 시작점도 아닙니다. 그저 이런 논의의 과정으로 더 많은 문제들의 해결책이 나왔으면 하는 바람일 뿐입니다. 그래서 때론 어리석은 생각도 적고 또 공개/공유하는 것입니다.

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced


신고

댓글을 달아 주세요

Share           Pin It
워드임베딩과 팩토라제이션을 설명한 지난 글에서 http://bahnsville.tistory.com/1139 저는 그 기술들을 크고 다양한 데이터 기반의 개인화 추천 data-rich personalization에 적용하는 것에 관심있다고 밝혔습니다. 이번에는 어떻게 개인화 추천에 활용할 수 있을 것인가?에 대해서 아이디어 차원의 글을 적습니다. 좀 naive할 수도 있음을 미리 밝힙니다.

불가능한 것은 아니지만 word2vec같은 워드임베딩 기술이나 SVD, NMF같은 팩토라이제이션 기술을 바로 개인화 추천에 이용하는 데는 한계가 있습니다. 유저별로 조회했던 아이템을 시간순으로 나열하고, 아이템을 word/vocabulary로 가정해서 아이템의 벡터를 만들 수 있습니다. 아이템 벡터의 cosine 유사도를 구해서 관련 아이템을 찾아내는 식으로 아이템 기반의 개인화 추천에 이용할 수가 있습니다. 또는 유저-아이템 행렬을 바로 팩토라즈해서 유저간, 아이템간, 또는 유저-아이템간의 연관도를 측정해서 추천하는 방식이 (추천 알고리즘 중에서) MF방식으로 알려져있습니다. 단순히 유저-아이템 sequence 또는 co-occurrence를 이용해서 추천에 사용할 수 있지만, 한정된 정보를 이용하는 데서 오는 한계가 명확히 존재합니다.

아래 그림은 워드임베딩과 딥러닝 기술을 이용해서 개인화 추천에 어떻게 적용할지를 설명하는 모델입니다. 그림에는 표시하지 않았지만 레이어 사이에 여러 은닉층이 있을 수도 있습니다. 이 모델의 핵심은 사용자와 아이템의 정보를 수치 벡터로 우선 표현하고, 다시 공통의 Latent Vector로 만드는 것입니다. 그렇게 만들어진 LV를 이용해서 유저간, 아이템간, 또는 유저-아이템간의 연관성을 계산합니다. 

유저 및 아이템 정보를 같은 체계인 Latent 벡터로 표현하는 네트워크 모델

** OUV/OIV, CUV/CIV, LUV/LIV: Original/Compressed/Latent + User/Item + Vector

첫번째 단계는 일단 사용자의 정보와 활동 이력 User History나 아이템의 설명 Item Description을 숫자 벡터 Original Vector로 표현하고, 다시 정형화한 Compressed Vector로 정제하는 것입니다. 먼저 사용자 정보는 사용자의 성별이나 연령, 거주지 등의 부가정보나 서비스에서의 행동 이력 (검색쿼리, 봤던 글이나 사진, 댓글, 좋아요활동, 구매 등)을 포함합니다. 텍스트나 ID로 표현되는 정보는 워드임베딩 기술로 벡터화, 사진/이미지는 CNN으로 벡터화 (또는 이미지에서 객체를 인식한 후 워드임베딩할 수도...), 또는 다른 형태의 정보도 수치벡터화 합니다. 아이템 정보도 비슷한 과정으로 Origina Vector를 만듭니다. 단순히 짧은 광고나 상품정보 뿐만 아니라, 장문의 컨텐츠나 관련 이미지 등을 벡터로 만든다면 벡터의 길이가 천차만별일 것입니다. 그래서 모든 유저 벡터 또는 모든 아이템 벡터의 길이를 맞춰주기 위해서 Original Vector를 Compressed Vector로 정형화할 필요가 있습니다. 압축된 CUV나 CIV의 길이가 같을 필요는 없지만 data loss가 크지 않다면 같게 만들어주는 것이 좋고, CV는 수백차원 이상으로 적당히 길어도 무관합니다. 짧을수록 실시간 연산에 용이하겠지만 정보 손실 information loss는 감내해야 합니다. 유저의 이력에서 시간이 중요한 요소라면 RNN을 사용하는 것도 괜찮고, 그저 전체를 스냅샷처럼 요약하는 것이라면 CNN으로 압축하는 것도 고려할 수 있습니다. (참고. 텍스트 convolution 방법: http://www.jmlr.org/papers/volume12/collobert11a/collobert11a.pdf Compressed Vector/Layer를 Convolution Vector/Layer로 불러도 될 듯.)
솔질히 말씀드리면, 이 부분에 대해서 구체적으로 어떤 기술을 어떻게 사용하면 좋을지를 고민/연구하지 못했습니다. 어쨌든 비수치형 데이터인 유저 및 아이템 정보를 간결한 수치벡터 CV로 표현합니다. 이번 글은 다음 단계에 초점을 맞췄지만 대부분의 기계학습에서 인풋을 어떻게 잘 정의/표현하느냐 (knowledge representation)는 기계학습의 성패에 결정적인 부분입니다.

위에서 CUV와 CIV의 길이를 같게 만들었만, CUV와 CIV의 내적 또는 코사인 유사도로 유저-아이템의 관계를 파악할 수 없습니다. 각 CV는 unsupervised로 구축했기 때문에 서로 간의 (CV벡터의 각 엘리먼트 간의) 연관성이 없습니다. 유저-아이템 행렬을 MF한 경우라면 사용자벡터와 아이템벡터의 내적이 곧 사용자와 아이템의 관계를 암시하지만, 위의 관계에서는 그렇지 않습니다. 즉, 사용자와 아이템을 표현하는 벡터의 길이만 같지 벡터의 각 element를 이루는 구성요소/방식이 서로 다릅니다. Bi-linear regression 모델을 이용해서 모든 '유저x아이템'의 계수를 측정할 수도 있지만, 앞서 말했듯이 CV는 수백차원의 벡터이기 때문에 데이터 차원 폭발 dimension explosion이 발생합니다. CUV과 CIV가 각각 100차원이라 하더라도 10,000개의 계수를 예측해야하는 문제가 됩니다. (처음에 유저 및 아이템 벡터를 만들려고 생각했을 때는 bi-linear regression을 고려했었지만 차원 폭발 문제가 우려돼서 포기함) 그래서, CUV와 CIV를 같은 조건으로 표현한 Latent Vector로 만드는 것이 다음 단계입니다.

CV는 여느 차원축소 dimension reduction 기술이 그렇듯이 unsupervised로 만들면 됩니다. 단 새로운 정보가 들어왔을 때도 기존의 변환 구조/결과를 크게 훼손하면 안 됩니다. 비슷한 정보를 가진 사용자는 결과 CUV가 비슷해야 합니다. A라는 사용자의 현재 CUV와 며칠 후 (행동 이력이 조금 추가/변경된)의 CUV가 크게 달라지면 안 됩니다. 데이터가 업데이트되면서 CV가 달라지겠지만 일관적이어야 한다는 것입니다. 한편, CV를 LV로 만드는 것은 이미 확보한 유저-아이템 관계를 이용한 supervised 방식으로 학습시킵니다. 즉, 어떤 사용자 U가 아이템 I를 구매했다는 정보를 이용해서 U의 CV를 LV로 변환 encoding하고 그 LV를 다시 CIV로 변환 decoding한 결과가 I의 CV가 되도록 학습시킵니다. word2vec처럼 LV가 유일한 은닉층일 수도 있고, 통상의 auto-encoder처럼 은닉층이 여러 겹일 수도 있습니다. word2vec의 skip-gram에서 입력 단어 벡터는 CUV가 되고 출력 맥락(단어) 벡터는 CIV가 되는 형태, 또는 번역할 언어의 문장을 CUV로 보고 번역될 언어의 문장을 CIV로 가정했을 때는 번역 시스템의 구조와 같습니다. 유저-아이템 네트워크를 처음 생각했을 때 NMT (Neural Machine Translation)과 개념상 구조가 같다고 봤습니다. NMT의 구조는 auto-encoder나 word2vec의 그것도 개념적으로 같습니다. 앞의 설명에서는 CUV-LV-CIV 순으로 학습시켰지만, 역순(CIV-LV-CUV)으로도 함께 학습시켜서 유저와 아이템이 동일한 LV체계를 갖도록 학습시킵니다. 그래서 CUV와 CIV의 차원을 같게 만들어야 한다고 적었습니다. (굳이 따를 필요는 없음)

중간을 많이 생략했지만, 사용자의 정보 및 이력을 LUV로 만들고, 아이템의 정보를 LIV로 표현했다면 추천 및 개인화에 필요한 모든 것이 끝났습니다. LUV1과 LUV2의 유사도를 구하면 사용자 U1과 U2의 유사도가 나옵니다. 즉, 나와 비슷한 취향의 사용자를 바로 확인할 수 있습니다. 비슷하게 LIV1과 LIV2의 유사도를 구해서 유사 아이템도 구할 수 있습니다. (유저-유저 또는 아이템-아이템 유사도는 그냥 CV의 연산으로 처리해도 됨) LUV와 LIV을 같은 식으로 표현했기 때문에 LUV와 LIV의 유사도를 이용해서 유저에게 가장 적합한 아이템들을 바로 선별할 수 있습니다. 그리고 한 가지 더 장점이 있습니다. 이제껏 단순히 유저-아이템 관계라고 설명을 했지만, 종류가 다른 아이템을 한꺼번에 학습시킬 수가 있습니다. 즉, 사용자 U는 컨텐츠 C도 봤고 광고 A를 봤다면 U-C, U-A의 관계로 학습시켜서 C와 A의 유사도도 측정할 수 있습니다. (설명을 많이 생략했지만...) 그래서 컨텐츠 C가 노출되는 화면에 다른 종류의 컨텐츠인 광고 A를 함께 노출시켜줍니다. 기존에는 단순히 사용자 U가 어떤 페이지에 접속했을 때 'U'의 정보만 고려해서 컨텐츠 C의 추천과 광고 A의 노출이 독립적으로 이뤄졌는데, 새로운 scheme에서는 C와 A가 같은 공간에서 LV로 만들어져서 LVc와 LVa의 유사도를 계산해서 문맥(현재 보는 컨텐츠)에 맞는 광고나 관련 상품 등을 노출할 수 있습니다. (유저와 무관한 맥락 광고를 제공. 물론 사용자를 고려했을 때 효과가 더 높겠지만...)

학습 Training
위에서 설명한 프레임워크가 제대로 작동한다는 것을 증명하기 위해서 어쨌든 CV-LV-CV (CLC)로 이어지는 네트워크를 supervised 방법으로 학습시켜야 합니다. OV에서 CV로 차원을 축소해서 정형화하는 바른 방법은 존재한다고 일단 가정합니다. CLC 네트워크의 구조나 가중치W 업데이트 방법 등은 보통의 ANN (MLP, auto-encoder, word2vec 등)과 동일해서 별도의 설명은 생략합니다. 관건은 어떤 데이터로 학습시키느냐입니다. 번역에서는 번역할 문장과 (인간이 번역한) 정답 문장이 존재하기 때문에 입력층에 번역할 문장을 넣고 출력층에 정답문장을 넣어서 W를 업데이트합니다. 추천에서는 이런 매핑 관계는 결국 유저-아이템 간의 interaction 유무를 정답세트로 봐야합니다. 예를 들어, 유저 U가 컨텐츠 A, B, C를 조회했다면 (U, A), (U, B), (U, C) [그리고, (A, U), (B, U), (C, U)]를 학습데이터로 보는 것입니다. 기존의 추천에서 사용하던 유저-아이템 행렬과 동일한 데이터입니다.

하지만 우려되는 점은 도메인마다 어느 수준까지를 유저-아이템 사이에 관계가 있다고 볼 것인가입니다. 광고를 예로 들면, 사용자 U가 광고 A, B를 클릭해서 광고주 페이지로 이동했을 때, 그 중에서 광고 B와 연결된 상품만을 구매(전환발생)했습니다. 광고를 클릭한 것만으로도 유저-광고를 연결해도 되는가 아니면 전환이 발생한 B만이 U에게 유효한 광고인가의 문제가 있습니다. 몇 년전까지만해도 트래킹 이슈가 있어서 클릭을 광고의 주요 지표로 봤지만 최근에는 실제 전환을 더 중시하기 시작했고 또 그에 따라서 다양한 트래킹 업체들이 등장했습니다. 하지만 전환 데이터는 여전히 수집의 어렵고 또 실제 전환 발생 빈도가 낮아서 데이터 양이 부족한 경우가 많습니다. 정답세트가 부족하다면 아무리 우수한 모델이 있더라도 제대로 학습시키지 못해서 좋은 성능을 기대하기 어렵습니다. 역으로 클릭 정보는 다소 많이 있지만 어뷰징을 포함해서 실제 매핑 관계가 아닐 가능성이 높습니다. ... 현실적으로 클릭과 전환을 모두 정답 세트로 사용하는 것입니다. 전환이 발생했다는 것은 이전에 클릭이 존재한다는 의미입니다. 그래서 클릭은 가중치가 1이 되고, 전환은 (클릭 1 + 전환 1) 가중치가 2가 됩니다. 전환에 더 fit한 모델을 만들면서 부족한 부분은 클릭으로 어느 정도 커버하는 형태입니다.

(바라건대 제대로 작동한다고 가정하고...) 일반적인 상품이나 컨텐츠 추천에서는 위에서 설명한 방법이 별로 문제될 것이 없는데 (제대로 동작한다면), 제가 지금 맡고 있는 광고는 추천과 결이 조금 다릅니다. 추천에서는 그저 1등 또는 상위 N개의 아이템만 선별해서 순서에 맞게 노출시켜주면 되는데, 광고에서는 예상CTR (Clickthrough rate)를 계산해야 합니다. 유저-아이템의 연관도가 높을수록 pCTR이 높게 나옵니다. 이는 보통 광고는 ecpm (expected cost per mille) 순으로 랭킹하는데, ecpm = pCTR * BA (Bidding Amount)로 계산되기 때문입니다 (보통 CPC광고에 한함). 즉, 유저와 아이템 (광고)의 연관도가 높거나 광고주가 높은 값으로 광고기회를 구매한 광고를 우선 노출시켜줘서 광고 플랫폼의 기대 수익을 높이는 방식입니다. 그리고 보통 과금액을 정할 때 Dutch auction으로 알려진 second-price로 과금합니다. 그래서 정확한 기대 CTR을 예측하는 것이 광고 사업에서 매우 중요합니다. (기대수익 계산과 과금액 산정이 일반 추천과 조금 상이할 수 있음) 그런데 앞서 설명한 방식에서는 CTR 수치를 얻지 못해서 기존 광고 시스템과 어긋나는 부분이 있습니다. 그런데 CTR이 유저와 아이템 간의 연관도 (즉 순서와 정도)를 나타내는 지표라면, 그냥 Sim(LUV, LIV)를 CTR의 대체제로 사용해도 크게 문제될 소지가 없지 않을까?라는 확신이 강하게 듭니다.

요즘은 기-승-전-딥러닝입니다. 이미지 객체 인식, 음성 인식, 자연어처리 등의 분야에서 딥러닝이 괄목할만한 성과를 냈습니다. 세계의 어딘가에선 딥러닝을 이용한 추천 시스템도 개발해서 활용하고 있으리라 봅니다. 논문이나 연구결과를 별로 못 봤는데, 글을 적으면서 좀 찾아보니 논문이 전혀없는 것은 아닙니다. 기존의 여러 알고리즘을 딥러닝에 맞게 변형한 것이나 딥러닝의 구조에 입력층만 잘 끼워맞춘 것 등의 논문들이 눈에 띕니다. 제가 구상한 것과 비슷한 구조의 논문도 눈에 띕니다. (참고. https://arxiv.org/pdf/1701.04783.pdf CV를 만드는 것까지는 유사하나 유저와 아이템 관계를 학습하는 부분에서 상이함) 직접 구현해서 테스트해보기 전까지는... 학교 다니면서 ANN을 야매로 공부했고, 3년 전에 딥러닝을 주목했고, 2년 전에 서베이 수준에서 딥러닝을 공부했는데, 추천에 딥러닝을 활용하는 방안에 대한 고민은 있었지만 팀을 옮기고 생각의 발전이 별로 없었습니다. 올해는 다시 공부하는 해로 정하고 이것저것 훑어보면서 다시 오래된 고민을 정리하고 있습니다. 실마리는 거의 다 찾았고 이젠 구현해서 테스트만 해보면...

... 직접 코딩해서 테스트해보기가 참 싫다. 내가 프로그래밍을 조금만 더 좋아하고 소질이 있었더라면 세상이 약간은 더 바뀌지 않았을까? 이게 글의 결론은 아닌데...

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced


신고

댓글을 달아 주세요

Share           Pin It
개인적으로 전문용어가 어색하게 한글화되는 것을 별로 좋아하지 않는데, regularization도 그런 경우에 속합니다. 적당한 한글 용어를 찾기가 어렵습니다. 인터넷에 검색해보면 '규제화'라고 번역한 경우를 봤는데 페널티로 모델 복잡도를 제어하는 방식에는 유효하지만 다른 방식에는 조금 어색한 표현입니다. '일반화'는 그냥 generalization를 번역한 것 같지만 또 한편으론 학습오류와 테스트오류를 합친 generalization error를 줄인다는 의미처럼 보여서 나름 합당한 면이 있습니다. '정규화'라고 번역한 경우도 있는데 개발자들이 많이 사용하는 regular expression을 정규식이라고 부르니 정규화도 타당한 번역이지만 데이터를 정규 분포를 따르도록 만드는 normalization, 특히 N(0, 1) 분포로 만드는 standardization을 뜻하는 것 같은 느낌이 강합니다. 적당한 한글 용어가 뭔지는 모르겠지만 이번 글에서는 regularization을 다루려고 합니다.

Occam's Razor (오캄의 면도날)라는 유명한 관용구가 있습니다. 일반인들에게는 조디 포스터가 출연한 <콘택트>라는 영화에 언급되면서 유명해진 용어입니다 (물론 일반인들은 인식하지 못하고 놓쳤을 가능성이 높겠지만...). 어떤 현상을 설명하는 두개이상의 주장이 있다면 간단한 쪽을 선택하라, 즉 복잡한 것을 잘라내라는 의미입니다. 다른 많은 분야에서 유용한 원칙이듯이 기계학습에서도 매우 중요한 원칙입니다. 예를 들어, y = ax + b정도의 몇 개의 변수와 간단한 선형식으로 표현이 가능하다면 굳이 더 많은 변수와 다항식이나 log, exp 등의 복잡한 항을 추가하지 않는 것이 바람직합니다. 그렇지만 적은 변수와 간단한 수식으로 표현이 불가능하다면 더 많은 변수와 다양한 표현력을 가진 항을 추가해서 모델의 설명도를 높여야 합니다. 하지만 충분한 설명도를 가지는 모델을 더 이상의 개선없이 복잡하게 만드는 것은 지양해야 합니다.

이런 상황에서 보통 등장하는 이슈가 'bias vs variance', 'training error vs test error', 또는 'underfitting vs overfitting' 논쟁입니다. 세가지가 모두 다른 것을 나타내지만 또 결국 하나로 귀결합니다. 모델이 얼마나 심플하면서 설명력이 있는가의 이슈입니다. 보통 편차bias가 낮은 모델은 학습오류가 낮고 overfitting됐을 가능성이 높고, 역으로 분산variance가 낮은 모델은 학습오류는 다소 높더라도 테스트오류가 낮고 덜 overfitting된 경우입니다. Underfitting인 경우에는 학습오류과 테스트오류가 비슷하겠지만 둘다 일정 수준 이상으로 높을 가능성이 많고 특별한 경우가 아니면 평균과 분산 모두 높을 가능성이 있습니다. 어쨌든 기계학습에서 편차와 분산, 학습과 테스트 오류, 피팅(학습)의 정도를 따지는 것은 너무 복잡하지 않으면서 설명도가 좋은 (낮은 평균과 분산, 작은 학습 및 테스트 오류) 모델을 찾겠다는 의지(?)입니다. 비슷한 성능을 보이는 모델이라면 구조가 간단한 것이 일반적으로 generalization error가 더 적을 가능성이 큽니다. 그리고 그런 모델을 찾는 것이 오캄의 면도날이자 기계학습자들의 목표입니다.

이렇게 모델의 설명도를 유지하면서 모델의 복잡도를 줄이는 것이 regularization이라고 보면 됩니다. 아래에는 일반적인 복잡도를 다스리는 regularization 방식에 대해서 간단히 설명하려 합니다.

1. Early stopping
모델이 복잡해지기 전에 막겠다는 것입니다. 즉, 모델을 만드는 초기 단계부터 계속 검증하면서 모델이 급격하게 복잡해지는 것을 막는 것입니다. 기계학습에서 보통 전체 데이터를 학습데이터 training data와 테스트데이터 test data로 나눠서, 학습데이터로 모델을 학습시키고 테스트 데이터로 학습된 모델을 평가합니다. 하지만 early stopping에서는 전체 데이터를 학습데이터, 검증데이터 validation data, 테스트데이터로 나눕니다. 학습데이터로 모델을 학습시킨 후에 검증데이터로 모델이 너무 복잡한지를 계속 체크하면서 검증데이터의 분산을 낮게 유지시킵니다. 그렇게 학습 및 검증된 모델을 최종적으로 테스트데이터로 모델의 예측력을 평가합니다. 하지만 이 방법의 문제라면 학습, 검증, 평가 데이터로 3등분(보통 7:2:1정도)해야 하기 때문에 데이터량이 조금더 많아야 합니다. 데이터량이 많아서 3등분하더라도 어떻게 나뉘느냐에 따라서 최종 모델의 예측력에 편차가 생길 수 있습니다. 어쨌든 모델을 만드는 초기부터 다양한 반례를 들어가면서 모델이 한쪽으로 치우치지 않도록 만드는 방법입니다.

2. Noisy input
Early stopping에서는 데이터를 3등분할만큼 충분해야 한다는 조건이 있습니다. 하지만 정답이 있는 데이터는 늘 부족합니다. 기계학습 발전 방향의 한축은 부족한 데이터를 극복하는 거였습니다. Bootstrap으로 랜덤 샘플링으로 cross-validation하는 것도 방법이지만, 가용한 데이터에 일부러 노이즈를 줘서 다양한 데이터로 뻥튀기하는 방법도 있습니다. 정답(Y)가 있는 데이터(X)에 약간의 노이즈를 붙여서 X'를 만들었을 때, 노이즈가 크지 않다면 X'의 답은 여전히 Y입니다. 이미지 데이터가 인풋이라면 이미지의 전체 중에서 일부만 crop한다거나 상하좌우로 뒤틀리게 만든다거나 역전 및 회전시킬 수도 있고, 이미지 전체에 랜덤 노이지를 추가할 수 있습니다. 이미지 데이터가 조금 손상됐지만 여전히 그 이미지가 가리키는 객체에는 변함이 없습니다. 이렇게 다양하고 풍성한 noisy 학습데이터(인풋스페이스)로 학습을 시키면 더 전체 데이터로 학습시키는 것과 비슷한 효과를 주게 됩니다. 신생아를 해롭지 않은 세균에 노출시켜서 면역력을 키우는 것과 같은 원리입니다. 하지만 오답 또는 오분류되는 샘플이 뻥튀기됐다면...
 
3. drop-out
복잡한 모델에서 일부 파라메터를 의도적으로 제거하는 방법도 있습니다. 변수가 100개인데, 학습할 때마다 일부 변수의 학습데이터에 null값을 준다거나 일부 모델 파라메터를 0으로 강제하는 방식입니다. 즉, 특정 변수나 일부 파라메터가 없더라도 모델 전체의 설명력은 떨어지지 않도록 학습시키는 것입니다. 인공망에서 일부 은닉층의 몇몇 노드를 불용화해서 다른 남은 노드들만으로도 괜찮은 결과를 만들어내도록 의도적으로 모델을 불구로 만드는 것입니다. (좋은 비유는 아니지만) 100명이 해야할 일을 일부러 평소에 가끔 90명에게 주고 훈련시켜서 갑작스레 몇 명의 결원이 발생해도 시스템은 정상적으로 작동하게 만드는 것과 비슷합니다. 단점이라면 여러 drop-out 조건에서 모델을 학습시켜야 하므로 학습에 소요되는 회수/시간이 늘어난다는 점입니다. 적당히 작은 모델이면 큰 문제가 아니지만 수백 수천대의 컴퓨터를 이용해서 며칠동안 학습시켜야하는 크고 복잡한 모델이라면 모델링 비용이 만만치가 않을 것입니다.

4. 복잡도 패널티
가장 많이 사용하는 방법으로 복잡도에 페널티를 주는 것입니다. 즉, 모델이 복잡해질수록 페널티가 커져서 목적식 loss function이 다시 커지도록 만드는 것입니다. 학습 효과가 페널티 때문에 다시 커지지 않는 범위까지 학습을 시키는 것입니다. 기계학습을 공부하면 L1 regularization과 L2 regularization이라는 용어가 종종 등장하는데, 이것이 모델 복잡도에 대한 페널티를 부여하는 것입니다. 회귀분석 regression에서 L1은 계수의 절대값의 합을 페널티로 제공하는 Lasso regression이고 L2는 계수의 제곱의 합을 페널티로 부여하는 ridge regression이 있습니다. 이런 shrinkage 방식으로 모델을 단순하게 만듭니다. 새로운 변수나 파라메터가 추가될수록 페널티가 커지기 때문에 무제한 늘리지 않는 선에서 모델 복잡도를 결정하게 됩니다. 참고로, 보통의 경우 미분가능 등의 이유로 제곱항을 많이 사용하지만, regression에서 절대값을 사용한 lasso는 때론 feature selection이라는 부가 효과도 있습니다. 

5. Pruning 및 feature selection
이걸 regularization이라고 부르는 것이 맞을지는 살짝 고민되지만, 불필요한 복잡한 가지나 변수 등을 쳐냄으로써 모델의 복잡도를 관리하는 것이니 포함합니다. Pruning은 보통 decision tree에서 많이 사용하는 방식입니다. 즉, decision tree를 100% 분류하도록 leaf node까지 모두 만들면 tree가 매우 커고 복잡해집니다. 그래서 오분류가 별로 크지 않는 선에서 중간 node로 합쳐서 아래쪽의 가지들을 쳐내는 방식입니다. 다른 모델에서도 feature selection 방식을 통해서 불필요한 또는 덜 중요한 변수들을 제거해서 모델을 만듦으로써 모델의 설명도를 어느정도 유지하면서 심플하게 만드는 것입니다.

6. Ensemble 
이건 regularization 방식은 아니지만, 복잡도를 다루는 한 방식이기 때문에 함께 적습니다. 위에서는 모두 복잡도를 줄이는 방식을 설명했는데, 앙상블은 오히려 복잡도를 더 증가시키는 방식입니다. 복잡도를 증가시켜서 복잡도를 낮춘다는 좀 아이러니한 방식입니다. 앙상블은 여러 모델을 만들어 합쳐서 하나의 큰 모델을 만드는 방식입니다. 배깅 bagging이나 부스팅 boosting도 큰 틀에서 앙상블이라 볼 수 있습니다. 앙상블은 개별 모델은 복잡해서 특수한 케이스에 대해서 틀릴 수도 있지만 여러/많은 모델들이 합의해서 결론을 짓기 때문에 틀릴 가능성을 낮추는 것입니다. 개인은 틀려도 집단은 틀리지 않는 일종의 집단지성입니다. 실제 decision tree를 배깅한 random forrest가 classification에서 state-of-the-art가 된 것은 우연이 아닙니다. 그리고 요즘 가장 핫한 deep learning도 매우 많은 선형/비선형 regression을 스태킹 및 앙상블한 것입니다. 모델의 복잡도를 잡는다는 것은 예상치 못한 실패를 막겠다는 것인데, 일부가 실패하더라도 더 많은 나머지가 실패하지 않으리라는 믿음이 앙상블을 만듭니다. 개별 모델의 복잡도는 잡는 것이 아니라 많은 모델을 이용함으로써 개별 모델의 복잡도를 무시하는 것입니다. 하지만, 앙상블의 개별 모델 및 전체 모델도 위에서 설명한 다양한 방식으로 regularization합니다. Deep learning에서도 모델의 강건성 robustness를 높이기 위해서 drop-out하면서 학습시키거나 의도적으로 노이즈를 준 adversarial sample을 이용해서 학습시키는 등의 regularization에 대한 여러 연구가 있습니다.

또 다른 방법들이 더 있겠죠...

Regularization이 모델을 깔금하게 만들면서 일반 오류 (학습오류 + 테스트오류)를 줄이는 좋은 방법입니다. 하지만 이것도 data-poor 시대의 유물이기도 합니다. 최적화 문제에서 가능한 모든 공간을 빠른 시간 내에 탐색할 수 있다면 -- 현실적으로 불가능하지만 -- 복잡한 최적화 알고리즘이 필요없습니다. 학습데이터가 표본 샘플이 아니라 전체 population이라면 오버피팅되는 것에 문제가 없습니다. 어차피 테스트할 샘플도 이미 학습데이터에 포함됐을 것입니다. 앞서 일부러 노이즈 데이터를 만들어내서 모델의 강건성을 높인다고 했듯이 전체 스페이스를 커버할 수 있는 데이터가 있다면 regularization이 필요없습니다. 데이터 디멘즌과 사이즈가 다르면 경험적 직관과 달라질 수 있습니다. 그럼에도 generalization error를 최소화하도록 모델을 regularize하는 것이 여전히 필요합니다.

Regularization를 뜻하는 가장 좋은 한글 용어가 뭔지는 여전히 모르겠으나 현재 문제가 변수 한두개로 해결되는 선형 문제가 아니라면 이 부분에 대해서 미리 공부해두는 것이 좋습니다. 

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced

신고

댓글을 달아 주세요