Tuesday, August 23, 2016

음악 플레이리스트 생성에 대한 조사 번역

From manual to assisted playlist creation: a survey라는 논문을 간단히 정리했습니다.
덤으로 각 섹션별로 점점 요약이 과격해지는 과정을 즐기시길 바랍니다.



1. 서문
음악을 찾는 것은 번거로운 일이다. 스트리밍 업체에서는 플레이리스트라는 수단을 써서 이용자들에게 곡을 추천하기 시작했다. 플레이리스트는 단순히 아티스트나 장르같은 주제로 곡을 모으는것을 넘어서 음악 카탈로그를 탐색하는 수단이 되었다. 
최근 약 10년간 플레이리스트를 자동으로 생성하는 연구가 많이 있었다. 어느 시점부터 완전 자동 생성이 아니라 그 과정에 사람이 개입하는 연구가 많이 나왔다 [23, 53, 78]. 이용자의 피드백이 들어가는것이 중요하고, 또 그 피드백을 이용해 이용자가 좀 더 활발하게 서비스를 이용하도록 하기도 한다. 플레이리스트를 만드는걸 좋아하는 이용자들이 있기 때문이다. 또, 사람이 만들었다는 점이 이용자들에게 더 어필하기도 한다 [6, 9, 59]. 이런 현상은 다분히 감성적인 측면이 있다.  좋은 성공 사례는 8tracks가 있다. 사람들은 인간적인 측면을 좋아한다!
이 논문은 플레이리스트의 자동생성/수동생성/생성을 도와주는 기술 이렇게 3가지를 리뷰한다.

2. 배경
2.1 플레이리스트의 역사
(초략..) 라디오 프로그램은 진행자의 성격이 반영된 플레이리스트를 제공했다. DJ라는 개념이 생기면서 곡을 끊기지 않고 듣는 믹스라는 개념이 생겼다.최근에는 웹기반의 플레이리스트 공유라는 개념이 생겼다. (Spotify, Rdio, 8tracks, 애플뮤직 등).
결과적으로 플레이리스트라는 개념은 계속 바뀌어왔다. 대략 중요한 특징은 i) 공통점이 있는 곡을 모으고 ii) 만족 극대화를 위해 순서를 잘 조절하고 iii) 개인적인 취향이 그 과정에서 개입하고 iv) 곡과 곡 사이의 전환을 부드럽게 하고싶어하는 점이다.

2.2 플레이리스트의 정의
중요한 점: 여러 곡의 집합, 명확한 순서가 있다, 같이 듣도록 선택된다.
믹스테입과의 공통점:
- 믹스테입: 순서가 중요하다, 명확한 주제가 있다, 길이가 정해져있다, 공유를 위해 만들어졌다. 
- 플레이리스트: 구성이 더 자유롭고 길이가 바뀌기도 한다.
저자의 정의: A playlist is an arbitrary sequence of songs meant to be listened to as a group and that fit a certain theme or purpose either for individual reproduction or sharing.

2.3 플레이리스트의 분류
* 창작자와 이용자의 관계에 따라 - 전문 제작가/청취자/아마추어 제작자/플레이리스트 네가지 개념의 관계로 정의
혹은, 제작자와 제작 의도에 따라
* 방송용 라디오 플레이리스트 *개인화된 라디오 플레이리스트 *아마추어 플레이리스트 *클럽 플레이리스트 *앨범 트랙 *컴필레이션 트랙.

2.4 플레이리스트가 갖춰야할 특징
인기도, 신선함, 통일성, 다양성, 음악적 특징, 곡의 전환과 어우러짐

3. 플레이리스트 제작 기술
3.1 수동 제작
3.1.1 스타일
공통적으로는 여러 곡을 고른뒤에 그 곡을 배치하는 방식으로 이루어진다. 

3.1.2 사람들이 플레이리스트를 만드는 방법
*목적, *곡을 고르는 기준, *어떤 특징을 갖춘 플레이리스트를 만들지 결정
[30]에 의하면 플레이리스트를 만드는 이유는 *공부, 등산, 운동 등 활동의 배경음악으로 쓰기 위해 *감정 표현이나 전달을 위해 *파티 등 이벤트에 사용하기 위해.
또, [30]에 의하면 플레이리스트에서 곡의 순서는 대체로 중요하지만 곡을 정렬하는 명확한 기준을 발견하기는 어려움. 매우 거칠게 이야기하면 *특별한 이유가 없다면 같은 아티스트의 곡을 연달아 틀지 않음 *서로 상호 보완하는 곡을 이어서 튼다 *첫곡은 전체 곡중에서도 좋은 곡이어야하지만 제일 좋은 곡은 아님 *마지막곡은 매우 중요. 왜냐하면 다 듣고난 뒤의 인상을 좌우하므로. 
사람들마다 곡을 다르게 받아들이고 표현하지만 공통적으로는 1)곡 자체의 특징과 2)음악을 듣는 상황 이라는 두가지 특징으로 나뉨. 이 경우엔 음악을 듣는것이 제일 중요한 일이 아니라 배경음악으로 쓰임. 상황의 경우에 템포나 장르보다는 감정이 중요하다거나, 또 어떤 모임이냐/곡의 인기도/이용자의 나이가 중요하게 상호작용. 

3.1.3 장단점
수동으로 곡을 만드는건 시간이 많이 든다는 단점이 있다. 또 수많은 카타로그에서 곡을 고르는건 매우 어려운 일. 

3.2 자동 생성
3.2.1 문제 정의
seed가 되는 정보를 받아서 플레이리스트를 만들어주는 것.

3.2.2 생성 기술
[14], [83]의 서베이 참조해서 정리하면 (**주: 범주가 좀 이상하군요)
1) 유사성 기반
2) CF기반
3) rule을 정의하고 이를 이용
4) 통계모델: HMM등
5) 사례 분석: 
5) 
6) 

3.2.3 장단점
자동 생성이라 상세 조절이 어렵고 작동 원리 파악이 힘듬.

3.3 생성을 도와주는 기술
사람들은 플레이리스트 만드는걸 좋아하지만 이게 쉬운일이 아니므로 이걸 도와주는 기술이 나왔다.

3.3.1 상호작용
시각화 등을 이용해 이용자와 상호작용하므로 사람들의 참여가 늘어나고 애정듬뿍

3.3.2 Control
사람들이 플레이리스트 제작 과정을 통제하거나 적어도 통제한다고 느끼는것이 중요.

3.3.3 시스템 투명성
결과적으로 어떤 과정을 통해 플레이리스트가 만들어지는지 이해하게 됨

3.3.4 이용자 개입 (Engagement)
이용자는 특별히 어떤 곡을 찾기보다는 뭐가 있나 둘러보는 경우가 많다

3.3.5 기술
Maps: 곡을 (2D 평면에) 시각화하고는 것
Graphs: 곡과 곡의 관계를 그래프 구조로 정의

3.3.6 장단점
곡 시각화를 통해 플레이리스트 제작하는 것은 자동과 수동의 장점을 합칠 수 있다. 

3.4 정리
생략

4. 분석 및 토의
4.1 수동 플레이리스트 생성
- 제일 간단.
- 여전히 플레이리스트 제작 과정은 연구 대상
- 제작자 자체에 대한 연구도 필요 (그래?)

4.2 자동 생성
- 제작자가 필요없음
- ‘통제’가 전혀 없다는 특징

4.3 Assisted 플레이리스트 생성
역시 앞의 내용 반복

4.4 실험 및 평가
평가:매우 중요하다.
주관 평가로 사용자의 만족도 측정 가능 (당연하지..)
객관평가로 다양성/통일성/신규성/신선함/친숙함/곡 전환 등 평가 가능 [67]
생성 툴의 경우엔 -생성 툴이 얼마나 좋고 편한지 -그 결과로 만든 플레이리스트가 얼마나 좋은지 평가 가능

4.5 세가지 방법 비교


5. 결론
앞에 나온 말 반복. 끝.

제프리 힌튼 - 드롭아웃을 깨닫게 된 3번의 '아하'

2016년 8월 초에 레딧 머신러닝에서 있었던 구글브레인 팀과의 AMA(Ask Me Anything: 무엇이든 물어보세요!)에서 드롭아웃을 발견하는 과정을 누가 질문했습니다. 원문은 여기입니다.

[–]figplucker 23 points  
How was 'Dropout' conceived? Was there an 'aha' moment?
[–]geoffhintonGoogle Brain 67 points  
There were actually three aha moments. One was in about 2004 when Radford Neal suggested to me that the brain might be big because it was learning a large ensemble of models. I thought this would be a very inefficient use of hardware since the same features would need to be invented separately by different models. Then I realized that the "models" could just be the subset of active neurons. This would allow combinatorially many models and might explain why randomness in spiking was helpful. 
Soon after that I went to my bank. The tellers kept changing and I asked one of them why. He said he didn't know but they got moved around a lot. I figured it must be because it would require cooperation between employees to successfully defraud the bank. This made me realize that randomly removing a different subset of neurons on each example would prevent conspiracies and thus reduce overfitting.
I tried this out rather sloppily (I didn't have an adviser) in 2004 and it didn't seem to work any better than keeping the squared weights small so I forgot about it.
Then in 2011, Christos Papadimitriou gave a talk at Toronto in which he said that the whole point of sexual reproduction was to break up complex co-adaptations. He may not have said it quite like that, but that's what I heard. It was clearly the same abstract idea as randomly removing subsets of the neurons. So I went back and tried harder and in collaboration with my grad students we showed that it worked really well.

제프리 힌튼: 드롭아웃은 총 세 번에 걸쳐 깨닫게 되었습니다. 우선 2004년에 레드포드 닐이 저한테 이야기해준 내용입니다. 인간의 뇌의 용량이 이렇게 큰 이유는 어쩌면 뇌 안에 여러 모델이 있고 그 모델을 합치는 (ensemble) 것 때문일지도 모른다는 내용이었죠. 그 당시에는 그 이론이 현실적으로 너무 많은 하드웨어를 필요로 하기 때문에 비효율적이라고 생각했습니다. 그러다가 어느 순간 그 모델이 꼭 큰 모델이 아니라 전체 뉴런의 일부가 될 수도 있겠다는 생각을 했습니다. 그렇게 생각하면 신경 세포가 임의로 반응(spike)하는 것도 설명을 할 수가 있겠다구요.
그러고 얼마 지나지 않아서 은행을 갈 일이 있었습니다. 그런데 은행을 갈때마다 창구 직원이 매번 바뀌더라구요. 직원에게 왜 그런지 물어보니 본인도 잘 모르지만 그런 순환이 자주 일어난다고 대답했습니다. 저는 아마도 은행에서 횡령같은 범죄를 일으키려면 여러 직원의 협동이 필요해서 그것을 막기 위한것이 아닌가하는 생각을 생각을 했습니다. 그리고 같은 논리로 계속 다른 뉴런의 부분집합을 제거하면 뉴런들의 음모 - 즉 과적합(overfitting)을 막을 수 있지 않을까 하는 생각을 했어요. 그래서 2004년에 이걸 대강 구현해봤습니다 (당시에 저를 지도해줄 사람이 없었죠). 당시엔 그렇게 잘 돌아가지가 않아서 l2-reguralisation이 더 나은것으로 결론을 내리고 잊고 있었습니다.
그런데 2011년에 크리스토스 파파디미트리우가 토론토에서 강의하는걸 들었습니다. 강의 내용중에 생물의 2세 생산이 (두 유전자를 임의로 합치는 과정에서) co-adaptation을 막는 의미를 갖는다는 내용이 있었습니다. 어쩌면 강의의 촛점은 약간 다른 것 이었을 수도 있어요. 아무튼 저는 그렇게 받아들였습니다. 그리고 뉴런의 일부를 제거하는 것과 본질적으로 같은 내용이었죠. 그래서 이번엔 대학원생들과 함께 좀 더 열심히 구현을 해봤고 결과적으로 이 이론이 잘 작동한다는 것을 밝혀냈습니다.

----------
아이디어의 착상, 구현 실패, 재도전으로 구현 성공. 
대부분의 아이디어가 이런 과정으로 빛을 발하는 것이 아닌가 합니다. 
그리고 제프리 힌튼같은 사람도 지도해줄 사람이 없어서 구현을 실패했었다는게 재밌군요. 

Saturday, August 20, 2016

음악 자동 태거 (auto-tagger): 학습된 컨브넷 공개

깃헙 저장소에 제가 학습시킨 음악 자동 태거를 공개했습니다.
참고하시길 바랍니다.

예제 파일과 음원을 포함하고 있어서 코드만 보셔도 쉽게 이해하실 수 있습니다.

https://github.com/keunwoochoi/music-auto_tagging-keras


Wednesday, August 17, 2016

ISMIR 2016 - Day 3, 4


Day 3: Poster session 3


이 논문과,


이 논문은 거의 내용이 일치합니다.
우선, ground truth는 binary vector입니다. 다양한 드럼의 요소 - 심벌1, 심벌2, 스네어, 킥, 하이햇 등에 차원을 하나씩 할당한것이죠. 이 ground truth를 프레임별로 만들어줄 수 있겠죠? 그리고 오디오의 2-d representation (Log-frequency spectrogram)을 입력으로 넣어주고, RNN으로 이를 학습시킵니다. 끝~






아주 중요한 논문입니다. 이번 학회 논문중에 제일 중요하지않나 합니다.

음악 신호를 2차원으로 표현하면 주파수-시간축으로 나타냅니다. 여기서 주파수축이 linear scale이냐, mel-frequency냐, log scale냐의 차이가 있을 뿐입니다.

여기서 큰 문제가 발생하는데, 이미지랑 너무너무다른, 배음(harmonics)이라는 놈이 존재한다는거죠. 예를들어 440Hz 음은 880Hz, 1320Hz등 배음이 존재합니다. 

즉 N Hz 성분은 N-1, N+1성분과 상관관계를 갖는것이 아니라, 2N, 3N, 4N Hz 성분과 상관관계를 갖죠.

따라서 convolutional kernal을 '띄엄띄엄' 만들어주면 이 상관관계를 컨볼루션으로 모델링 할 수 있습니다. 위 그림의 spiral으로 표현된게 요겁니다.

진작 이렇게 했어야하고, 저도 비슷하게 구현했던적이 있는데 MTT/MSD로 데이터셋을 넘어오면서 작업이 멈췄습니다. Brian McFee도 얼마전에 같은 이야기를 했었구요.

특히 배음관계가 중요한 작업 - 악기인식 - 에 더 큰 영향이 있을겁니다. 꼭 참고하세요. 


Day 4: Oral session






제 논문입니다. 논문에 사용된 컨브넷의 크기를 최적화하고 다시 학습시킨 모델을 깃헙 저장소에 공개했으니 역시 참고하시길..


남주한 교수님 연구실의 금상은씨가 쓴 논문입니다. 
Multi-column approach를 적용해 보컬 분리를 했는데요, 아마 다른 작업에도 적용할 수 있는데가 많을 것 같습니다. 


Late-Breaking/Demo session

Late-breaking/demo 세션은 2+1페이지에 간략한 연구 내용/계획등을 요약해 자유롭게 발표하는 자리입니다. 정식 학회지로 출판이 되진 않고 온라인으로만 공개됩니다. 


마젠타팀에서 나온 내용인데요, 음... 야심차게 지은 이름 (Audio DeepDream)에서 알 수 있듯이 좀 별로네요. 저자가 구글브레인이라 써있는데 인턴이라고 써있지가 않아서 좀 놀랍습니다.



제가 요즘에 하는 내용입니다. 음악/플레이리스트의 '설명'을 자동으로 생성해주자는 계획인데 의도는 가상하나 데이터가 부족해서 힘들군요.



역대 최강의 학회 테이블을 소개합니다.


사실 이 세션은 제가 발표하느라 다른 포스터를 잘 못봤습니다.
깃헙에서 보려고 하니 클릭하면 웹브라우저에 파일이 뜨는게 아니라 자동으로 다운로드가 되는 바람에 읽을 마음이 들지가 않는군요. 
따라서 여기에서 턴을 종료합니다. 


Tuesday, August 9, 2016

세상에 있는 (거의) 모든 머신러닝 문제 공략법

좋은 블로그 게시물이 나와서 번역합니다. 원문은 이곳을 참고하시기 바랍니다.
Karpathy의 글도 그랬지만 그림은 그대로 퍼오고, 글도 가급적 그대로 번역합니다. 교육 목적으로 활용해주시길 바랍니다.
제가 보충 설명을 하는 경우엔 괄호안에 (**요렇게) 적어놓았습니다.

세상에 있는 (거의) 모든 머신러닝 문제 공략법 (Approaching (Almost) Any Machine Learning Problem)

저자: Abshshek Thakur 
번역: 최근우

데이터 사이언티스트들은 하루종일 데이터를 다룹니다. 사람에 따라 다르겠지만 60-70%의 시간을 데이터를 전처리하고 원하는 형태로 변환하는데 사용한다는 사람도 있습니다. 그런 과정이 끝나고 나면 실제로 데이터에 머신러닝 알고리즘을 적용합니다. 이 글에서는 간단한 전처리 과정 및 머신러닝을 적용하는 과정을 자세히 다룹니다. 여기에서 소개하는 파이프라인은 제가 백개가 넘는 머신러닝 대회에 참가한 경험을 바탕으로 배운 내용입니다. 

파이썬을 사용해 설명드리겠습니다.

데이터

머신러닝을 활용하려면 데이터를 테이블의 형태로 변환해야합니다. 이 과정은 시간도 오래걸리고 힘든 과정입니다.

이 테이블의 각 행(row)은 각각의 데이터 샘플에 해당합니다. 보통 입력 데이터를 X, 레이블 (혹은 출력)을 y로 표현합니다. 레이블은 하나의 열(single column)일 수도 있고 여러 열로 이루어져 있을 수도 있습니다.

레이블의 종류

  • 단일 열, 이진수 (분류 문제. 레이블엔 두 개의 카테고리가 존재하고 모든 데이터 샘플은 반드시 둘 중 하나의 카테고리에만 해당하는 경우. 0과 1로 각각 다른 카테고리를 표현할 수 있으므로 이진값을 사용한다.)(**예: 텍스트를 보고 저자의 성별을 맞추는 경우)
  • 단일 열, 실수 (회귀 문제. 단일 열이므로 단 하나의 값만 예측하면 된다.)(**예: 텍스트를 보고 저자의 나이를 예측하는 경우)
  • 여러 열, 이진수 (분류 문제. 여러 카테고리가 존재하고 각 데이터는 하나의 카테고리에 해당한다.)(**예: 댓글을 보고 작성자가 응원하는 스포츠 팀을 맞추기, 이 경우에 열의 개수는 스포츠 팀의 개수와 같다.)
  • 여러 열, 실수 (회귀 문제이나 여러 값을 예측함.)(**예: 의료 검진 데이터를 보고 피검사자가 여러 종류의 암에 걸릴 확률을 예측. 이 경우 열의 개수는 암 종류의 개수와 같다.)
  • 다중 레이블 (분류 문제, 각 데이터 샘플이 여러개의 카테고리에 속할 수 있다.)(**예: 음악 신호를 보고 드럼, 기타, 보컬이 있는지 여부를 판단하는 경우. 열의 개수는 3개가 된다.)

평가 방법

어떤 경우든지간에 머신러닝 알고리즘의 평가는 필수입니다. 각 카테고리의 데이터 개수가 크게 차이나는 경우에 ROC AUC를 사용할 수도 있고, 다중 레이블 분류 문제는 카테고리 크로스 엔트로피나 다중레이블 로그 로스 등을 활용합니다. 
평가 방법은 상황에 따라 다르기 때문에 여기에선 자세히 다루지 않습니다.

라이브러리

필수적인 라이브러리를 몇 가지 소개합니다.
  • 데이터를 보고 간단한 연산을 수행: pandas
  • 각종 머신러닝 모델:  scikit-learn
  • 최강의 그라디언트 부스팅 라이브러리: xgboost
  • 뉴럴 네트워크: keras
  • 데이터 시각화: matplotlib
  • 실시간 모니터링: tqdm
아나콘다를 사용해 다양한 라이브러리를 쉽게 설치할 수 있습니다. 저는 사용하고있지 않지만 각자 판단하시길 바랍니다.

머신러닝 프레임워크



2015년부터 제가 개발중인 머신러닝 자동화 프레임워크의 그림입니다. 이 글에서도 그림과 같은 구조로 작업을 수행합니다.

가장 일반적으로 적용되는 단계를 진한 분홍색 화살표로 그렸습니다. 우선 앞에서 이야기한 전처리 과정을 거쳐 표 형태로 데이터를 정리하고나면 이 단계를 시작할 수 있습니다.

전처리


우선 우리에게 주어진 문제가 어떤 문제인지 파악해야합니다. 이진 분류(0 vs 1)인지, 여러 카테고리중 하나를 고르는 다범주 분류(multi-class classification)인지, 다중 레이블 분류문제인지 아니면 회귀 문제인지를 명확하게 결정해야합니다. 그리고 나면 우리가 가지고 있는 데이터를 학습 셋(training set)과 검증 셋(validation set)으로 나눕니다. 아래 그림을 참고하시길 바랍니다.


(**중요) 두 셋으로 나눌 때에는 반드시 레이블 정보를 사용해야합니다.  분류 문제의 경우 stratified splitting을 사용하시기 바랍니다. 파이썬에선 scikit-learn을 사용하면 됩니다. (**이렇게 하면 두 셋에서 레이블의 분포가 동일하게 유지됩니다.)


회귀 문제의 경우 그냥 간단하게 K-fold로 셋을 나눠주면 됩니다. 회귀에서도 분포를 유지하는 방법이 있긴 한데 독자여러분이 생각해보시길 바랍니다. (**아니 저기..)



이 코드에서는 검증 셋의 크기를 전체의 10%로 설정했습니다. 이 값은 가지고 있는 데이터의 크기에 따라 적절히 설정하면 됩니다.

이렇게 데이터를 나눈 뒤에는 두 셋을 동일하게 처리해야합니다. 그리고 절대 학습 셋과 검증 셋에 데이터가 겹치면 안됩니다. 그렇게 할 경우 마치 학습이 아주 잘 된 것 처럼 착각할 수 있습니다. 실제로는 엄청난 과적합(overfitting)이 일어나겠죠.

다음 단계는 데이터에 어떤 형태의 값이 있는지 알아내는 것입니다. 대략 숫자, 범주 정보, 그리고 문자열 데이터정도로 나눠서 생각할 수 있습니다. 카글의 타이타닉 데이터셋을 살펴볼까요?


여기에서는 survival이 레이블이 됩니다. 그리고 각 승객의 좌석 등급, 성별, 탑승한 항구는 범주화해서 생각할 수 있습니다. 나이, 형제자매의 수, 부모/자녀 등은 숫자 정보가 되구요. 마지막으로 이름은 문자열입니다. 이 작업 (**생존 여부를 예측하는 작업)에서는 크게 중요하지 않을 것 같군요.

우선 숫자를 봅시다. 이 값은 특별한 전처리 필요없이 바로 사용할 수 있습니다. 따라서 정규화(normalization) 및 머신러닝 기법을 바로 적용하면 됩니다.

범주 데이터는 두가지 방법으로 처리할 수 있습니다.
  • 카테고리를 라벨로 변환

  • 카테고리를 이진 변수 (one-hot-vector)(**하나의 성분만 1이고 나머지는 0인 벡터)로 변환

여기서 OneHotEncoder를 쓰기 전에 우선 LabelEncoder를 적용해야 하는 점을 주의하시기 바랍니다.

타이타닉 데이터셋의 문자열은 문자열 변수의 예로는 별로 좋지 않습니다. 일반적으로 문자열을 어떻게 다루는지 한번 알아보겠습니다.

우선 (**pandas를 쓸 경우) 아래 코드를 써서 데이터에 있는 모든 텍스트를 하나로 이어 붙일 수 있습니다.


그리고 여기에 CountVectorizer 또는 TfidfVectorizer를 사용합니다.



보통 TfidfVectorizer가 더 잘 작동합니다. (**당연히.. ) 대체로 아래처럼 셋팅하면 무난하게 사용 가능합니다.


만일 이 Vectorizer를 트레이닝 데이터에만 적용했다면, 나중에 사용할 수 있도록 하드디스크에 저장을 해놓아야합니다.


이제 Stacker 모듈을 봅시다. 여기에서는 다양한 특징값을 합칩니다.
일반적인 데이터는 np.hstack으로 벡터를 이어주면 됩니다.
만일 데이터가 sparse한 경우 (대부분의 값이 0인 경우) scipy.sparse를 사용합니다.


만일 PCA같은 과정이 포함되어있다면 sklearn.pipeline.FeatureUnion을 쓰면 됩니다.


자, 드디어 데이터 전처리가 끝났습니다. 
이제 머신러닝 알고리즘을 적용하면 됩니다.

머신러닝 적용

어떤 모델을 적용할까요? 위의 단계를 밟은 경우엔 트리 기반의 알고리즘만 가능합니다. 트리 기반의 모델은 여러가지 종류가 있습니다.

  • RandomForestClassifier
  • RandomForestRegressor
  • ExtraTreesClassifier
  • ExtraTreesRegressor
  • XGBClassifier
  • XGBRegressor
선형 모델을 사용하려면 위의 특징값을 Normalize하는 과정을 거쳐야합니다. sklearn의 Normalizer나 StandardScaler를 사용하면 됩니다. 단, 데이터가 dense한 경우에만 사용이 가능합니다. Sparse한 경우엔 결과가 좋지 않습니다. 

위의 트리 모델을 사용해서 그럭저럭 괜찮은 결과가 나왔다면 이제 모델을 자세하게 튜닝할 차례입니다.

다음 단계는 decomposition 입니다.


여기에선 LDA와 QDA는 생략합니다. 고차원 데이터의 경우 PCA(주성분분석)를 쓰면 차원을 효과적으로 줄일 수 있습니다. 이미지의 경우 10-15개의 성분을 사용해보고 차원을 늘려가며 성능을 비교해보십시오. 그 외엔 50-60개정도의 성분으로 시작해보십시오. 단, 값을 그대로 사용해도 괜찮은 상황이라면 굳이 차원을 줄일 필요는 없습니다.


텍스트의 경우는 sparse 행렬에 SVD를 적용합니다.

보통 120-200정도의 값을 사용합니다. 이보다 큰 값을 쓴다면 연산량에 유의하십시오.


이제 선형 모델도 사용할 수 있도록 특징값을 normalize하거나 re-scaling합니다. (**특징값의 범위를 조절) 그리고 나면 유용한 특징값을 고르는 Feature Selector 단계로 들어갑니다.


특징값을 선정하는 방법은 여러가지가 있습니다. Greedy 알고리즘을 쓸 경우엔, 우선 하나의 특징값을 골라서 모델을 돌리고 여기에 다른 특징값을 더하거나 빼면서 결과를 비교합니다. AUC로 모델을 평가하면서 특징값을 고르는 코드를 참고하십시오. 

아래의 코드는 RandomForest를 이용한 예제입니다. 이렇게 학습한 모델을 저장해놓고 나중에 사용할 수도 있습니다.


n_opimators 등의 하이퍼파라미터를 너무 크게 설정하면 과적합(overfitting)이 일어나니 주의하십시오.

혹은 xgboost를 사용할 수도 있습니다.


데이터가 sparse한 경우에도 RandomForestClassifier, RandomForestRegressor, xgboost 등을 사용 가능합니다.

그 외에도 chi-2로 특징값 선택이 가능합니다.


여기에선 k를 20으로 설정했는데, 이 값 역시 하이퍼파라미터이므로 최적화가 필요합니다.

지금까지 여러 모델을 소개했습니다. 데이터를 처리할 때 이렇게 학습한 모델을 꼭 저장해놓으십시오.

모델 선택 및 최적화

이제 모델을 선택하고 하이퍼파라미터를 최적화하는 일이 남았습니다.


널리 쓰이는 모델은 아래와 같습니다.
  • 분류
    • Random Forest
    • GBM
    • Logistic Regression
    • Naive Bayes
    • Support Vector Machines
    • k-Nearest neighbors

  • 회귀
    • Random Forest
    • GBM
    • Linear Regression
    • Ridge
    • Lasso
    • SVR

하이퍼 파라미터를 최적화하는 과정은 정해진 공식이 없습니다. 많은 사람들이 이와 관련해 질문을 합니다만 데이터와 모델에 따라 달라지기때문에 한마디로 말하기가 어렵습니다. 또, 몇 가지 팁이 있지만 경험이 많은 사람들은 이 비법을 숨기려고 하기도 합니다. 하지만 제가 알려드리겠습니다.

각 모델별로 어떤 하이퍼파라미터가 있는지 정리하면..


위의 값을 임의로 조합한 랜덤 서치를 추천합니다. 
제 생각일뿐이지만, 위의 값을 기반으로 찾아본다면 충분할겁니다.

정리

마지막으로 학습 과정을 정리해보면..




그리고 학습 과정에서 저장한 각종 변환(transform)을 다시 불러와서 validation/test set에 사용해야겠죠?


마무리

위의 과정을 잘 따라하면 대체로 아주 좋은 성능을 얻을 수 있을 것입니다. 물론, 잘 되지 않는 경우도 있겠죠. 그러면서 배우는 것이니 열심히 해보시길 바랍니다.

ISMIR 2016 - Day 0, Day 1, Day 2

지금 학회가 진행중입니다만 우선 2.5일치 정리합니다.

Day 0: Tutorial

T1은 재즈 역사 소개 / 재즈 데이터셋 및 발표자들이 개발한 툴을 소개했습니다. T1의 발표자인 Jakob Abeßer는 재즈 관련 연구를 많이 한 사람입니다. T4는 EEG에 대한 소개였는데 발표는 매우 지루했습니다. 발표자료를 github에 올렸다고 했는데 어딨을까요..;;

제가 제일 관심있는 내용은 Tutorial: Natural Language Processing for Music Information Retrieval입니다. 내용 자체는 매우 기본적인 NLP입니다. 그리고 링크를 들어가 보시면 음악 관련 데이터로 학습한 word2vec 모델을 공유하고있습니다. 

T2는 MIR에 관심있는분이나 연구/공부를 시작하는 분들을 위한 내용입니다.
T6 - Why Hip-Hop is interesting은 MIR에서 일반적으로 가정하는 음악 신호와 힙합이 어떤 차이를 갖고 있는지에 대한 내용입니다.

Day 1: Papers

12음계의 representation인 chromagram은 STFT/CQT에서 하모닉스를 단순히 더하는 방식으로 계산할 경우 신호의 하모닉스 성분때문에 많은 노이즈를 포함하게됩니다. 이를 deep neural network를 이용해 더 잘 계산해주겠다는 내용입니다.
Chromagram은 오디오 feature representation의 하나로 멜로디나 코드 추출 등에 사용할 수 있습니다. 딥러닝으로 Feature를 학습하는 방식이 정확히 어떤 쓰임새가 있을지 따지긴 어렵습니다만 연구 방식은 유효합니다.

한참 boundary detection논문을 내던 저자가 이번엔 다른 문제를 푸는 논문을 냈군요. 10k 트랙을 이용하는데, 레이블링 정보가 트랙 전체에 보컬이 있냐/없냐로만 되어있습니다. 이걸 컨브넷을 써서 학습시킨 결과를 다시 시간 프레임별로 적용하면 결과적으로 각 프레임에 보컬이 있냐 없냐의 문제 (제목의 Pinpoint이 의미하는 바가 이것이겠죠)를 풀 수 있다는 내용입니다.
즉, 곡 전체의 라벨로 학습시켜도 더 작은 단위의 판단을 잘 내릴 수 있게 된다는 내용이구요.

이 방식이 작동할 수 있는 이유를 대충 설명하자면 그냥 데이터가 많아서, 오차가 상쇄된다고 볼 수 있습니다. 다르게 보면 강화학습의 학습 과정과도 같은 셈입니다. 강화학습에서도 t0부터 t1사이에 일어난 모든 이벤트 중에 사실 중요한 이벤트는 아주 일부일 수 있습니다. 그렇지만 t0-t1사이의 모든 이벤트가 같은 레이블에 의해 reward나 penalty를 받게 되지요. 이 논문의 적용 방식도 같고, 다만 강화 학습에서는 그런 다양한 example이 시간축에 분포하는 반면 여기에서는 spectrogram의 하나의 axis일 뿐인 것이죠. 혹은 이미지 분류에서도 꼭 pixel별 라벨링이 되어있지 않아도 deconvolution을 해보면 어떤 위치에 객체가 있는지 대략 알아낼 수 있는것과 같습니다.

발표 마지막에 아주 재미있는 데모가 있었습니다. 결과적으로 이 컨브넷이 뭘 학습하냐?라는 것이었는데 아무 스펙트로그램에다가 선을 마구 그려서 컨브넷에 보여주니까 대각선 성분이 있으면 보컬이 있는것으로, 대각선이 없고 가로/세로선만 있으면 보컬이 없는 것으로 판단하더군요. 아..아이유의 삼단고음은 어떻게 될지 궁금하군요. 아무튼 그래서 스펙트로그램에 VOICE라고 그림을 확 그렸더니 (그림을 그린 부분이 높은 값을 갖게 되겠지요) V, O, C 처럼 대각선 성분이 있는 곳은 보컬이 있다고 판단을 하더군요.




Last.fm 로그를 수집합니다. 플레이로그와 함께 사용자의 나이/국가/성별을 모았구요.
그리고 사용자 모델링을 통해 3가지 feature를 제안했습니다. Exploratoryness, Mainstreamness, Genderness입니다. 앞의 2개는 EchoNest에서 artist profile에 있던것과 비슷한 내용이고, 이름도 직관적이죠. 마지막 featurer의 경우 저는 정확히 이게 어떤 작용을 할 것인지 잘 감은 안왔습니다만 Paul Lamere (Spotify)의 블로그 포스팅 Gender Specific Listening에서 소개한 것 등 남/녀의 취향 차이는 있겠죠.

이제 계산한 user feature와 demographics 정보를 이용해 추천을 해야하는데, 추가된 정보를 어떻게 user-item matrix에 집어넣어서 factorise를 해줄 수 있을 것이냐가 문제겠죠? 이 논문에서는
S. Rendle. Factorization machines. In IEEE 10th Inter- national Conference on Data Mining, pages 995–1000, Sydney, Australia, 2010. IEEE. 
의 방법을 사용했다고 합니다. 논문을 인용만 했는데 설명이 너무 안된것이 좀 아쉽군요. 안봤지만 아마도 여러 유사한 목적의 다른 논문처럼, factorise하기 위한 objective function에, 추가된 criteria에 맞춘 항을 더한뒤에 SGD로 최적화하는 전형적인 방식이 아닐까 생각합니다.

결과는 심플한데요, 논문의 그림 2를 보시면 이런저런 정보를 다 사용하면 Matrix factorisation의 RMSE가 제일 낮아진다 - 즉 retrospective evaluation의 결과로 제일 좋다 - 는 내용입니다.

뒷부분에 추가로 주말/주중이라는 컨텍스트 정보를 추가했는데 결과는 별로 성능이 좋아지지 않습니다. 제 의견은 사용자 모델링에서 사용자가 얼마나 컨텍스트에 민감한지 - 즉 user.contextualness 같은 내용을 더 모델링하지 않으면 컨텍스트 관련 추천은 늘 이런식이 아닐까 합니다. 저자랑도 비슷한 이야기를 했구요.



USC의 Julian McAuley가 발표한 Amazon review dataset이 있습니다. 여기에서 음악 관련 카테고리만 모아서 열심히 정리를 한 데이터셋인 MARD: Multimodal Album Reviews Dataset을 발표했습니다.

아마존 product ID와 Musicbrainz ID가 매칭이 안된다는 슬픈 이유로 (API에 항목은 있지만 값이 대부분 비어있습니다) Entity recognition을 써서 장르나 밴드 이름등을 뽑아는 등 각종 귀찮은 text preprocessing작업을 거쳐서 만든 데이터셋입니다. 

그리고 이 데이터셋을 이용해 장르 분류 작업을 간단히 보였구요. 

드럼 기초 테크닉인 strike(치는것), buzz roll, flam, drag 네가지를 구별하는 논문입니다. 


Day 2


MIREX라는 이벤트가 있습니다. ISMIR에서 하는 competition인데요, 음.......... 한마디로 이야기하면 이제 정말 문제가 많습니다. 작업 개수는 너무 많고, 관리에 어려움이 많고 비효율적이고 등등. 참다못한 Brian이 Kaggle for MIR을 만들어야한다! 라는 내용을 제안하는 발표였습니다.

각종 인프라를 위한 소프트웨어가 공개되어있고, 이래저래 가능한 시나리오입니다. 다만 중간중간에 돈이 들어가는 부분이 있고, 사람들의 참여가 많이 필요하겠죠. 시도가 잘 되길 빌고있습니다.

각종 스트리밍 서비스 - 정확히는 클라우드 뮤직 서비스, 즉 본인의 음악을 업로드해서 쓰는 iTunes Match, Amazon, Google Music - 에 대한 사용자 조사입니다.

중간에, 60%정도 되는, 많은 사람들이 돈을 지불하고 쓸 용의가 있다고 응답했다. 고 써있는데 저는 좀 회의적입니다. 설문조사에서 사람들이 솔직하게 답하지 않는 흔한 오류가 아닐까요? 그 사람들이 스스로 '돈을 낼 용의도 있는데?'라고 말하거나, 혹은 진심으로 그렇게 믿는다 하더라도 이렇게, 이렇게! 이렇게 좋은 뮤직 스트리밍 서비스가 많은데 지금도 공짜로 쓰는 사람들이 엄청나게 많은 마당에 무슨 의미가 있는걸지 잘 모르겠습니다. 행여나 그게 진심이라면 스트리밍 업체에서는 무료 사용자의 만족도를 일부러 낮춰서 결제를 유도해야하는걸까요?

슬라이드가 공개되어있는지 모르겠습니다만 사진 몇장 첨부합니다.










Michele가 퀸메리에 방문연구와서 연구한 내용이군요. NLP동네에 ANEW라는, Affective Norm for English Words, 즉 각종 감정에 관련된 단어를 Arousal-Valence-Dominance 총 3개의 축으로 된 3d 공간에 맵핑시켜놓은 데이터가 있습니다. 이 데이터가, 즉 벡터 맵핑이, 음악의 감정(mood/emotion) 관련된 태깅이나 분류 문제에 직접 사용하기엔 좀 맞지 않는 면이 있습니다. 저도 한번 테스트해봤다가 너무 맞지 않아서 관뒀는데, 이걸 이래저래하게 고쳐쓰자는 내용입니다.

몇 달동안 같은 연구실에 앞-옆자리에 앉아있던 친군데 이걸 연구했는줄을 오늘 알았습니다...


아주 재밌는 내용입니다. 전에 영문 블로그에 정리했던 ICML 2016: ML4MD 워크샵에서도 비슷한 논문이 있었습니다. 각종 아이템 (song, user, playlist,...)의 co-occurrence를 이용해 word2vec비슷한 embeddings을 학습시키고 그걸 이용해 추천이나 분석을 하는 내용이고 이 논문도 유사한 내용입니다.

이 연구의 특징은 Song, Session, User 이렇게 3가지 카테고리를 하나의 평면에 맵핑했다는 내용입니다. 여기서 Session이란 대략 플레이리스트 비슷한건데, 곡 하나가 끝나고 다음 곡 재생되는 시간 간격이 10분이 넘으면 별도의 session으로 보는걸로 정의했습니다.


그리고 위의 그림처럼 같은 network에 있으면 co-occurrence라고 보구요.

시각화를 위해서는 직접 2D로 embedding을 구했고, 추천에 이용한 벡터는 128차원입니다.

사용한 데이터는 타이완의 KK Music이라는 곳의 로그이고 2015년 상반기 6개월간의 데이터를 썼습니다.


평가는 precision-recall을 보았는데 가장 기본적인 MF보다 좋은 성능을 보입니다.



이 데이터가 좀 재밌습니다. 사용자 한명을 고정하고 그 사용자가 들은 음악을 2D 평면에 배치시킨 것입니다. 여기에 Clustering을 써서 사용자가 현재 듣는 세션이 어떤 '모드'의 세션인지 (즉 어떤 cluster에 해당하는지) identify한 뒤에 그에 맞는 추천을 해준다면 자연스럽게 personalised contextual recommendation이 될 것 같습니다.

제 연구 분야이기도 해서 저는 아주 맘에드는 내용이었습니다.

제가 포스터 세션이 조금 일찍 갔는데, 3저자인 지도교수가 1저자인 학생에게 아주 자세한 내용을 묻더군요. 음... 그러니까 와서 발표할때까지 지도교수는 이 논문이 어떤 내용인지 잘 몰랐다는 이야기가 되겠습니다. 거기에서라도 물어보고 관심 가지는게 어디냐 하는 생각을 했습니다.

그리고 이 세션이 끝나고 어쩌다가 아마존 뮤직(@씨애틀)에서 엔지니어로 일하고있는 사람과 이야기를 했는데, 자세한건 이야기할 수 없지만 이 논문과 아주, 아주 비슷한 알고리즘을 회사에서 사용중이라고 하더군요. 그 정도면 이미 말해선 안되는 내용을 말한 것 같습니다만... 


서울대 이교구교수님 연구실에서 나온 논문입니다. DNN을 스펙트로그램이 아닌 cepstrogram에 적용하는 내용입니다. 왜냐하면,
...because a cepstrogram is shown to be a more robust representation to capture the dymanics of the overall timbre than a spectrogram.
이라고 합니다. 제가 잘 모르는 내용이라 논문 본문을 인용했습니다.

...input representation을 잘 몰라서 뒷부분 내용을 리뷰하기가 어렵군요...

실험에서는 GTZAN dataset을 사용했습니다. 너무 오래된 데이터셋이라 좀 문제가 있는데, 
  1. Corey Kereliuk, Bob L. Sturm, and Jan Larsen. Deep learning and music adversaries. IEEE Transactions on Multimedia, 17(11):2059–2071, 2015. 
에서 제안한 splitting을 사용했습니다. 그리고 random splitting의 결과도 같이 본문에 포함했습니다. 



음악 추천 관련입니다. 사용자의 skip/playing을 기반으로 현재 곡에서 다음 곡으로 나아가야할 '방향' 벡터를 구해주고, 이에 맞춰 곡을 추천해주는 알고리즘입니다. '방향'을 구하는 알고리즘이 핵심이구요.

대략 설명하면, 사용자의 log를 보고 co-occurrence를 통해 곡과 곡의 관계를 graph로 정의합니다. 이 때 co-occurrence를 사용해 곡와 곡을 잇는 edge의 값 (=similarity)을 구해주구요. 그리고 그 graph를 그대로 사용하기엔 연산량이 많아서 ISOMAP으로 n-dimensional space로 맵핑해줍니다. 

그리고 그 space에서 각 곡의 '진행 방향', 즉 공간에서 곡과 다음 곡의 상대적인 위치를 이용해 현재 사용자의 '관성' (혹은 진행 방향/속도..)를 구하고, 이를 통해 다음 곡을 고릅니다. 만일 사용자가 스킵할경우엔 그 방향의 반대방향으로 진행하게 되구요.

상당히 잘 진행한 연구라고 생각합니다. 다만 평가하는 부분에서 와닿지 않는 부분이 많이 있었습니다. 실험 설계가 과연 제안한 알고리즘을 평가하기에 적합한지도 잘 모르겠구요. 하지만 dynamic listening 상황을 가정한 연구라 평가하기가 엄청나게 어려웠을걸 감안해야겠죠. 아주 아주 유효한 접근 방식이라고 생각합니다. 실험까지 잘되었으면 (그리고 지도교수의 도움으로 앞부분이 좀 더 멋지게 포장이 된다면) 진짜 훌륭한 논문이 되었을거란 생각이 들었습니다.