Thursday, January 21, 2016

리알못: 리눅스 알지도 못하는 사람들을 위한 가이드

스티브 잡스님의 은혜를 받으며 살아가던 저같은 앱등이도 살다보면 리눅스를 써야할 날이 옵니다. 아니, 왔습니다. 저에게 리눅스는 제 컴덕 친구들이나 흐흐거리며 다루는, 혹은 리눅스를 만든 녀석이 메일링 리스트에서 또 누군가랑 싸웠다는 기사를 흘낏 보며 떠올리는, 아주 추상적인 존재였죠. 그러나 학교와 회사의 서버를 써야하고, 그런데 서버는 리눅스로 되어있고, 나는 일개 학생/직원일 뿐이고, 그래서 20년전 MS도스를 쓰던 시절에 혹은 PC통신에서나 쓰던 ls, cd ..같은 명령어를 써보며 마치 내가 뭘 할 줄 아는 것 처럼 이런 저런 디렉토리를 오간 뒤에 결국은 인정했습니다. 아, 이걸 공부해야 하는 구나.

막상 리눅스 책이나 강좌를 보면 수백 페이지 분량의 엄청난 것들이 나옵니다. 리눅스란 무엇이고, 누가 언제 만들었고, 무슨무슨 종류가 있고, 어쩌구 저쩌구... 커널은 뭐고..등등.

이런 내용 다 제끼고! (저도 모를뿐더러; ) 리눅스 초보를 위해 아주 간략히 정리해드리겠습니다. 사실, 네이버 구글 찾으면 어지간한건 다 나옵니다. 그런데 문제는 이거죠. 뭘 찾아야 할지 모른다는 것.

그래서 아주 간략히, 정말 간략히 개념만 설명합니다. 더 자세하고 훌륭한 설명은 다시한번 구글링 하시길 바랍니다.


  • 리눅스? 유닉스?
    • 리눅스는 유닉스의 한 종류입니다. 아니 정확하게 따지면 유닉스와 유사한 뭐라고 하는데 그냥 리알못들은 그런가보다 하고 넘어갑니다. 
  • 무얼 설치해야하나요?
    • 혹시 직접 설치해야 한다면 linux ubuntu download를 구글링하셔서 맨 위 링크를 누르세요. 여러 버전이 나올텐데 LTS (Long Term Support) 버전을 쓰세요. 지금은 14.04네요.
  • 알아야할 명령어 목록
    • $ ls - list
      • 디렉토리의 내용을 보여줌
    • $ pwd - print working directory
      • 현재 디렉토리의 위치를 알려줌
    • $ less some_text_file.txt
    • $ more some_txt_file.txt
      • 텍스트 파일의 일부를 후다닥 볼 수 있음.
    • $ tail some_text_file.txt
    • $ head some_text_file.txt
      • 마찬가지. 텍스트 파일의 맨 앞/맨 뒤를 출력해줍니다.
    • $ touch temp.abc
      • 저 파일이 없다면 temp.abc라는 파일을 생성합니다. 파일의 내용은 비어있습니다.
      • 파일이 있다면 저 파일을 한번 툭 건드려주게됩니다. 결과적으로 파일의 '최종 수정한 날짜'가 현재 시간으로 바뀝니다.
    • $ mkdir directory_name
      • 디렉토리를 만듭니다.
    • $ rmdir directory_name
      • 디렉토리를 삭제합니다.
    • $ cp file.txt new_file.txt
      • 파일을 복사합니다.
    • $ mv file.txt new_name.txt
      • 파일을 이동합니다. 이 명령어를 이용해 이름을 바꿀 수 있습니다. 
    • $ echo 'blah blah
      • blah blah 라고 출력합니다.
    • $ cat files.
      • 여러 파일을 붙입니다.
    • $ tar, zip
      • 파일 압축/해제.
    • $ wget url
      • url의 파일을 다운받습니다.
    • $ chmod, chown
      • 파일/디렉토리의 권한을 바꿔줍니다.
    • $ sudo 
      • 각종 커맨드 앞에 sudo를 붙여주면 super user의 권한으로 뭔가를 하게됩니다. 수퍼 유저는 다시말해 admin, 관리자 계정입니다. 따라서 이걸 하려면 관리자 계정의 권한을 갖고있어야합니다.
    • $ top
      • 작업관리자입니다. 아주 유용하죠.
    • $ iotop, iostat
      • top과 비슷한데 각종 기기간의 입출력 내역을 보여줍니다.
    • $ nohup
      • $ nohup python main.py > log_file_name.txt &
      • 커맨드 실행 내역의 결과를 log_file_name.txt 에 저장합니다.
      • 서버에 접속해서 이걸로 커맨드를 실행하면 그 이후에 접속을 끊어도 커맨드가 계속 실행되게 됩니다. 아주 유용하죠. 
      • 그럼 중간에 실행을 중지하고싶다면?
    • $ kill, pkill
      • pkill python
      • kill 12345
      • pkill python은 실행중인 파이썬을 전부 종료합니다.
      • kill 12345는 프로세스 아이디 12345를 종료합니다.
      • 프로세스 아이디는 top 을 실행하면 왼쪽에서 볼 수 있습니다.
    • $ screen
      • nohup과 비슷한데, 저는 더 유용하게 쓰고있습니다.
      • 쉽게말해 가상의 스크린을 여러개 띄워놓고 필요할 때 해당 스크린에 접속해서 사용하는 것 입니다.
      • screen -S screen_name 으로 새 스크린을 만들고,
      • 새 스크린 내부에서는 ctrl+a, d 를 눌러서 밖으로 나올 수 있습니다.
      • screen -x 를 하면 스크린 목록을 볼 수 있습니다.
      • screen -x screen_name 으로 기존에 만들어놓은 스크린에 다시 들어가서 일을 할 수 있습니다.
      • 서버에 접속해서 일하실 땐 디폴트로 스크린을 하나 만들어서 들어가서 쓰시면 중간에 접속이 끊어져도 서버에서 실행중인 프로세스가 종료되지 않아서 좋습니다.
    • [tab]
      • tab키는 정말 중요합니다.
      • 디렉토리에서 abdefefsdsdfsdfsdcscs.sh 라는 파일을 실행하고 싶다면...
      • 다 타이핑 하지 마시고, 앞에 몇개만 타이핑한 뒤 [tab]키를 눌러보세요.
      • 만일 디렉토리에
        • abc123.txt, abc456.txt, ddd.txt
      • 이렇게 3개의 파일이 있다고 하면,
        • a 까지 치고 탭을 누르면
          • $ a [tab]
        • abc까지 자동 완성이 됩니다.
          • $ abc
        • 여기서 추가로 1을 타이핑하고 탭을 누르면
          • $ abc1 [tab]
        • abc123.txt가 자동완성이 됩니다.
          • $ abc123.txt
        • 왜냐면 abc로 시작하는 파일이 두개가 있기때문이죠. 즉, ddd.txt의 경우 훨씬 쉬워지죠. d로 시작하는 파일은 저것 하나뿐이므로...
          • $ d [tab]
        • 을 누르면
          • $ ddd.txt
        • 라고 자동 완성이 됩니다.

Monday, January 4, 2016

음성/음악신호+머신러닝 초심자를 위한 가이드

소개

음성, 음악신호를 이용해 이러쿵저러쿵~~처리를 하고 머신러닝으로 뚝딱~ 하는 프로그램을 짜고싶다 (짜야한다..)! 그런데,

i) 오디오 신호 처리는 알지만 머신러닝을 몰라요.
OR
ii) 머신러닝은 알지만 오디오 신호 처리는 몰라요.

에 해당하시는 분들을 위해 간단한 포스팅을 씁니다. 예를 들면 아이 울음 소리를 번역하는 어플, 음악에서 자동 기타 코드 인식 등의 경우가 있겠죠.


가정:

- 문제: 아이 울음 소리를 번역하자! 이 아이가 a.배고파서 우는지 b.졸려서 우는지 이 두 가지만 고려.
- 사용 언어: 파이썬.
- 데이타: 아이 울음소리가 녹음된 파일 100개 (1.wav, 2.wav, ..., 100.wav)
- 라벨링: 되어있음. (파일명이 짝수면 배고픔, 홀수면 졸림)

가장 전통적인, 전형적인, 그리고 어지간한 성능을 보여주는 방법인 Feature extraction (특징값 추출) + classifier (분류기)의 조합을 시도해봅시다.
[방법 1] MFCC를 특징값으로 사용 + Logistic regression classifier를 써서 분류 - 가장 간단한 방법입니다.


[방법 1 - 단계a. 특징값 추출 Feature extraction]


* 준비물: 파이썬 패키지: librosa (documentation), 컴퓨터, 두뇌, 시간, 손가락, 공기, 지구 등.

- - 설치방법 생략.

* librosa.core.load

를 써서 오디오 파일을 읽어온다.
> y, sr = librosa.load('data/baby_cry.wav')

- - arguments 설명
- - - sr=22050 : input 샘플링 주파수입니다. 아마도 갖고있는 오디오 파일의 샘플링 주파수는 22050이 아닐 확률이 큽니다. 이렇게 값을 설정해주는 것은 11025 Hz 까지의 값만 써도 된다는 가정을 한 것이죠. 잘 모르시면 그냥 두세요.
- - - mono=True : 스테레오 음원일경우 모노로 바꿔준다는 말입니다. 역시 그냥 두시면 됩니다. 대부분의 경우 모노면 충분합니다. 이 글의 타겟이시면 스테레오 음원이 필요한 경우가 아닐거에요.
- - - offset, duration: 오디오 파일의 특정 구간만 쓰실경우 설정하시면 됩니다. 그러나, 초심자라면 이걸 쓰지 마시구요, 갖고있는 오디오 파일에서 의미있는 구간만 미리 잘라놓으세요. 예를들어 음원이 60초인데 아기 우는 소리가 20~35초에 있다면 그 부분만 남기고 나머지는 버려서 15초로 만들어놓고 쓰시면 됩니다.

* librosa.feature.mfcc

를 써서 오디오 신호를 mfcc로 바꾼다.
> mfcc = librosa.feature.mfcc(y=y, sr=sr)

- - arguments 설명
- - - n_mfcc=20 : mfcc 계수의 개수입니다. mfcc가 가장 활발하게 쓰이는 음성 인식에서는 대략 이 값을 수십개 (20~50)로 설정하고 씁니다. 즉 그정도면 충분하다고 알려져있습니다. 다만 주어진 상황과 목표에 따라 그 값은 다를 수 있습니다. 우선 20으로 두시면 됩니다.
- - mfcc란?
- - mfcc는 음성/음악 인식에서 가장 널리 쓰이는 특징값입니다. 자세한 설명은 위키를 참조.
mfcc 프레임 기반 특징값입니다. 즉, 각 프레임 (대체로 수 십 ms)마다 하나의 mfcc vector가 나오게 됩니다.
위의 코드를 실행하면 mfcc는 2차원 어레이가 할당됩니다. 즉

> print mfcc.shape 

를 하시면 (20, number_of_frames)이 나오게 됩니다.

이제 이 특징값을 써서 분류기를 활용해봅시다.


[방법 1 - 단계b. 분류기 Classifier]


* 분류기 Classifier

분류기란, 말그대로 분류를 해주는 기..;;입니다. 예를 들어, 20차원의 mfcc 벡터를 입력으로 하면 요 애기가 배고파서 우는지, 졸려서 우는지를 알려주는 녀석이죠. 즉 y = f(mfcc) 으로 표현해보면 f( )가 분류기에 해당하고, y는 그 결과입니다. y는 [0, 1] 중에 하나를 고르는걸로 우리가 설정해놓을 수 있죠. 즉 0=배고프다, 1=졸리다. 이렇게 설정해놓고 그에 맞춰서 트레이닝을(기계를, 혹은 알고리즘을 학습시키는 것을) 해 주는 것이죠. 좀 더 일반적으로는

판단 = f(특징값)

으로 쓸 수 있겠죠?
Logistic regression, SVM, decision tree, random forest, neural networks 등 분류기의 종류는 아주아주 많습니다.

* Logistic regression

(거의) 제일! 간단한! 분류기입니다.

*준비물: 파이썬 패키지: scikit-learn

열심히 설치하시면 됩니다.
$ pip install sklearn

* scikit-learn의 linear model의 LogisticRegression

를 쓰겠습니다.  (예제 참고)

1 > from sklearn import linear_model 
2 > logreg = linear_model.LogisticRegression()
3 > logreg.fit(X_train, y_train)
4 > y_test_estimated = logreg.predict(X_test)

요 네 줄의 코드가 핵심입니다. 그러나! 그 전에!

* X_train, y_train, x_test, y_test

머신 러닝 알고리즘의 트레이닝에선 반드시! 교차 검증 (Cross-validation)을 해야합니다.
쉽게말해, 100개의 음악 파일중 짝수는 배고픈, 홀수는 졸린 울음소리였죠? 그렇다면 2,4,6,8,..., 60 까지, 총 30개의 배고픈 울음 소리와 1,3,5,7,...,59까지, 총 30개의 졸린 울음 소리를 모아서 총 60개를 트레이닝 셋으로 두고, 나머지 40개를 테스트 셋으로 두죠. 그게 뭐냐구요? 쉽게 말하면 우리의 알고리즘 학생에게 기계학습을 열심히 시키는데, 1~60까지로 공부를 시키고 (트레이닝), 잘 이해 했는지를 61~100번으로 시험을 보는겁니다 (테스트). 왜 이렇게 하냐면, 이렇게 안하면 다들 시험에 나오는 것만 공부하고, 그래서 시험은 잘 보지만 막상 써먹을 수가 없게 되기 때문입니다.  즉, 이렇게 학습시킨 알고리즘으로 어플을 만들면 진짜로 사용자의 아기가 울었을때는 왜 우는지 전혀 맞출 수 없는거죠. (이걸 과적합/오버피팅/Overfitting이라고 합니다.)
그래서 우린 어떻게 하냐면요,

- 1~100의 wav 파일의 MFCC를 전부 구합니다.
- - 원래는 파일 하나당 여러 프레임이 존재하고, 따라서 파일 하나당 여러 개의 MFCC 벡터가 존재합니다.
- - - 귀찮으니 이걸 평균내서, 파일 하나당 하나의 MFCC 벡터를 만들었다고 합시다. 그러면 우린 총 100개의 MFCC 벡터를 갖고있지요. (n_mfcc=20, 즉 벡터는 20차원이라고 하죠.)
- 또, 아까 말했듯이 짝수는 배고픈 (=0), 홀수는 졸린(=1) 울음 소리에요.
자 이제,

- - - X_train은 60-by-20이 되도록 만드세요. 즉, 각 row는 각각의 mfcc가 되는거죠. 1번파일부터 60번 파일까지 순서대로~
- - - Y_train은 60-by-1 numpy 어레이로 하구요. 즉, 길이가 60인 [1,0,1,0,.....1,0] 이 되겠죠?
- - - X_test는 40-by-20이 됩니다. 여기엔 61번파일부터 100번 파일까지의 mfcc값을 넣습니다.
- - - Y_test는 40-by-1이구, 역시 [1,0,...1,0]인데 길이가 40이죠.
그리고 나서, 위의 코드를 돌리면! 그리고 나서,

5 > print y_test_estimated

를 통해 값을 보셔도 되고, 아무튼 열심히 y_test와 y_test_estimated를 비교하시면 됩니다.

*정리

"MFCC를 특징값으로 사용했고, 60:40으로 train set/test set을 나누었고, logistic regression을 이용해 분류(classification)를 했습니다."
- (MFCC,) training set, test set, logistic regression, classification 이 무엇인지 간략한 개념을 이해하셨으면 성공!
- 과연 방법 2를 쓰게될지는 모르겠습니다만 여튼 도움이 되었으면 좋겠습니다.





Thursday, December 24, 2015

비틀즈가 스포티파이/디저/아마존 등 스트리밍 서비스에 상륙!



2015년 12월 24일 12:00부터 각종 스트리밍 서비스에서도 비틀즈를 서비스하기 시작했습니다. 당연히 캐롤이 나와야 할 날인데 가게에서도, 옆방에서도 비틀즈를 틀어놨더군요. 과연 비틀즈의 위엄입니다.




원래 비틀즈는 아이튠즈 등 mp3 판매 사이트에서 서비스되지 않았었죠. 그러다가 2010년 11월 16일 아이튠즈에만 최초로 서비스를 개시합니다.


 그 이후로 5년이 넘게 애플을 통해서만 비틀즈의 음원을 다운/재생할 수 있었습니다. 국내 네이버뮤직/멜론 등에서도 비틀즈 원곡이 없는 이유는 이때문입니다.

찾아보니 아직 국내 서비스에서는 안되는 것 같네요. 그렇지만 한번 길이 열렸으니 곧 가능해질 것이라 생각합니다.

Friday, December 11, 2015

인턴 인터뷰 후기 (1)


이틀전에 판도라 인턴 전화 인터뷰를 봤습니다. 화상통화가 아닌 전화로 이루어졌고, 프로그래밍 인터뷰가 아니라 연구에 관련된 내용을 이야기할거라고 사전에 고지를 받았습니다. 전체 인터뷰는 45분으로 잡혀있었구요.

대충 질문만 재구성하면 아래와 같습니다.


→ 너 레쥬메 잘 봤다. 관련해서 자기 소개같은거 함 해봐라.
→ 레쥬메에 있는 논문 1에 대해 설명해줘라.
→ 레쥬메에 있는 논문 2에 대해 설명해줘라.
(여기까지 약 15분)

→ 자, 이제.. 너 인터넷 되니? ㅇㅇ 키고 여기 접속해봐. 프로그래밍 인터뷰를 할건데. 어 이거 보여? 지금 준비됐으면 제곱근 구하는 함수를 한번 스스로 짜볼래? 너가 편한 언어로.

파이썬으로 짰고, 주어진 화면은 함수 이름이나 입력 변수도 없는 빈 페이지였습니다. 물론 화면 공유로 보고있구요. 그래도 tab이 먹혀서 구글독스보다는 나은 환경일거에요. 입력 변수의 범위와 오차 범위를 물었고 바이너리 서치로 루프를 짜서 풀었습니다. 딱히 메모리를 신경쓸만한 상황은 아닌것 같았고 연산이 아주 효율적인것같진 않았지만 거기까지 신경쓸 정신적 여유는 없더군요. 이 단계에서 15분정도 썼습니다.

→ ㅇㅇ 잘했다. 이걸 음... 우리가 이게 실제로 (문법 오류나 실수 없이) 작동하는 코드인진 모르겠지만 맞게 짠 것 같다. 어 그럼 이제 우리한테 혹시 뭐 질문같은거 있니?

저는 가게되면 어떤 플젝을 하게 되는지 물어봤고 제가 미리 준비한 연구 주제에 대해 자세히 얘기했습니다.

여기까지 했더니 50분이 지났고 인터뷰는 끝났습니다.

박사과정 연구인턴이라 프로그래밍 인터뷰의 수준은 개발자보다는 낮겠죠? 여튼 참고하시고 도움 되시길 바랍니다.




Friday, December 4, 2015

Tuesday, November 24, 2015

판도라 비공식 인터뷰 후기


얼떨결에 판도라 인턴십 비공식 인터뷰를 하게됐습니다. 나중에 리뷰 겸 인턴을 구하는 분들 도움되시라고 간단히 정리. 추후 진행되면 더욱 업데이트할게요. 그리고 이런저런 이유로 영어 단어도 전부 한글로 씁니다. 이유는 알아서 짐작하시길..



  1. 판도라 인턴은 기간이 정해져있고 여름에 11주간 진행된다고 공지에 올라와있음. 공고는 11월중에 올라오고, 기한이 되지 않아도 원서를 받는대로 심사를 진행함. 다들 그렇듯 경우에 따라 학회에서 괜찮은 논문을 썼다든지 하면 바로 오퍼를 하기도 함. 그런 경우에도 전화로 비공식적인 인터뷰는 진행한다고 들었다. 
  2. 지원하려는 자리는 음악 추천 및 머신 러닝과 관련된 싸이언티스트 인턴. 일반적으로 박사과정생을 뽑음.
  3. 홈페이지에 가서 봤는데 몇가지 궁금한 사항이 있어서 문의메일로 뭐뭐가 궁금하다고 메일을 썼다. 그런데 답장엔 답변 대신에,
    1. 안뇽 반갑다 언제 통화되냐? 전화로 얘기하자
    2. 그나저나 좀더 너에대해 알고 전화하면 좋을테니 레쥬메를 보내줄래?
  4. 라고 옴. 이래저래 나쁠것 없으므로 승낙함. 레쥬메도 보내줌. 
  5. 그런데 이래저래 일이 꼬여서 두번이나 미뤄짐. 그래서 그냥 궁금한점을 메일로 자세히 써서 물어봤으나 전화로 하자고. 물론 전화가 편하지. 어... 언어문제 빼고. 그래서 알았다고하고, 오늘 드디어 전화!

--- 2015-11-25 비공식 전화 인터뷰 ---
  1. 행아웃으로 통화를 했고 (원래는 전화를 건다고 했으나 미국→영국 국제전화가 사무실에서 막혀있다고..) 어쩌다보니 영상통화.
  2. 통화 내용
    1. 판: 어 안녕 방가방가
    2. 나: ㅇㅇ 하잉하잉
    3. 판: 들림??
    4. 나: ㅇㅇ들림
    5. 판: 자 일단 내가 몇가지 아주 쬐금만 몇가지만 물어볼게 그담에 그 질문 나한테 하믄 됩니다. 자 일단, 어 너 연구주제를 보니까 (머신러닝, 음악추천) 아주 우리 회사랑 딱 맞아떨어지던데.. 그걸 고른 이유가 뭐야???
    6. 나: 어.. 그게..음.. 두가지 이윤데 일단 이론적으로 머신러닝을 공부하는게 재미있고 유용해서 골랐다. 그리고 음악을 만들어서 소비하는 여러 과정중에서 맨 끝단에 있는 스트리밍 업체에서 일하면서 소비자를 위한 서비스를 하는 연구를 하고싶었다. 학교 들어갈때 연구계획서 쓰는데 이런 생각을 갖고 계획서를 썼고 그래서 하게됐다. 요즘 마침 머신러닝도 엄청 인기고, 스트리밍업체들이 한참 뜨고있고 머 니네회사나 스포티파이 애플뮤직 구글뮤직 등등 그래서 아주 우연히 좋은 때를 잘 만난거같다.
    7. 판: 어 그래 음...너 판도라에 혹시 아는사람 있나? 친구나?
    8. 나: 어..아니..없다. 누가누가 있는지만 좀 안다.
    9. 판: 그래 그럼 이제, 흠, 음악에 대해 어떻게 생각해? 음악이라는게 개인적으로 뭐야 너한테?
    10. 나: (매우 당황) 어..음..어..음..어..음..어 아주 좋아하지 일단 나한테 아주 중요하고 내 주변애들이 다 그렇듯이..어..
    11. 판: 음 그래 머 이를테면 어떤거 많이 들어?
    12. 나: 응 뭐 락 팝 재즈 클래식 다 듣는데. 흠. 클래식은 코딩할때 주로 듣긴하지만 ㅎㅎ
    13. 판: 어 뭐 이를테면 제일 좋아하는 아티스트가?
    14. 나: 어..비틀즈? 스티비원더? 마이클잭슨?
    15. 판: 아 그래. ㅇㅇㅇ 음. 그래. 그럼이제.. 너 졸업까지 얼마남았지?
    16. 나: 응 2년?
    17. 판: 어 그럼. 2017년? 12월?
    18. 나: ㅇㅇ응 10월이나 12월이나.
    19. 판: 좋아좋아. 그래그럼 이제... 자 이제 너가 연구를 통해 풀고싶은 기술적인 문제가 뭐야? 
    20. 나: 음 우선.. 음악 추천이라는게, 사람들이 그럭저럭 맘에 들어하지 특히 음악을 막 엄청나게 듣는 사람들이 아닌경우에. 그러니까 스포티파이나 판도라가 잘 풀린거고. 근데 그렇지 않은 사람들 이를테면 나나 내 친구들처럼 음악을 엄청 좋아하는 사람들, 돈을 막 더 쓸수도 있는 사람들, 그런 사람들은 아직 만족을 많이 못하는거같아. 이건 기술적으로도 아직 음악 추천이 발달이 덜 되어서 그렇겠지. 그리고 이걸 잘 해결하면 프리미엄서비스로 비즈니스 모델을 더 할수있을텐데.
    21. 판: 음 그래그래. 맞아그래. ㅇㅇ 그럼, 음. 회사에서 너가 생각하는 드림팀? 어떤 조직 어떤 팀과 일하면 제일 좋을거같아?
    22. 나; 음..음..(약간 당황. 포인트를 잘 못잡음) 글쎄, 일단 내가 전에 다닌 회사는, 3년반 다닌 회사는 9-10명정도 되는 팀이었어. 한번에 보통 2-4명정도랑 일했고. 글쎄.. 어떤게 이상적인진 모르겠지만. 음. 사실 잘 모르겠고 인턴을 하면서 그런걸 같이 배울 수 있지 않을까 생각하고있어. 기술적인것 말고도 소통 문제라던지.. 언어문제도 될 수 있고. 회사의 문화나. 그런것도 같이 배우고싶어.
    23. 판: ㅇㅇ 그래 인턴이라는게 그런거지. 자 이제 음 레쥬메를 보니까 파이썬 매틀랩 등등 써있는데 어떤게 니 메인이야?
    24. 나: 어..매틀랩이었었어. 근데 이젠 파이썬이야. 지난 1년동안 거의 항상 파이썬을 썼어. 
    25. 판: 그렇구나. 어 레쥬메를 머신러닝 등등 관심있다구 써있구. 그럼 너의 장점이 뭐라고생각해?
    26. 나: 어..일단 머신러닝 딥러닝 공부를 열심히 하고있고 (..) 회사와 비교하면 아니지만 비교적 큰 크기의 데이타를 다뤄본 경험이 있고. 글구 나는 지난번 회사에서 쓰리디 오디오 관련된 일을 했는데, 심리음향 관련된 공부도 (매우...) 조금 했고. 음향학과 관련된 경력이 있는데 이게 직접적으로 음악 추천이랑 관련된건 아니지만 충분히 응용 가능한 지식이라고 생각해.
    27. 판: 응 그래 그럴거야. 음, 너 그럼 A/B test를 해본적이 있나?
    28. 나: 어...정확하게 무슨의미지? 
    29. 판: (설명해줌. 일반적인 의미로)
    30. 나: 어, 오디오 신호처리 관련해서 연구 목적으로는 해봤어. 근데 요즘은 회사에서 서비스를 기획하면서 A/B test를 통해 의사 결정을 하는것 같은데, 물론 기본적으로 같은거지만, 그런건 해본적은 없지.
    31. 판: 어 그렇구나. ㅇㅇ 괜찮을거야. 자 이제 진짜 거의 끝나가는데.. 어 너 혹시 다른회사랑도 인터뷰 했어?
    32. 나: 어..아니 아직은. (...사실 원서는 냈는데 분명 인터뷰라고 그랬으니;;)
    33. 판: 좋아좋아.ㅎㅎ 음. 그리고 우리는 미국에 서부에 있는데 너 괜찮아? 여기 와서 일할 수 있어?
    34. 나: 어어 당연하지. 그러고싶다 야. (이놈의 런던)
    35. 판: 응 그래. 혹시 뭐가 바뀌거나 하면 언제든지 알려줘. 니 상황이나 ... 
    36. 나: (이땐 잘 못알아들음) 어 음 어 어 ...
    37. 판: 자 이제 물어봐봐! (여기까지 17-18분 걸림)
    38. 나: 어...어..........(진이 빠졌음) 일단 가면 내가 무슨일을 하는거야? 주어진 일이 있나 아니면 내가 제안한걸 하는거야? 올해에 한 애가 그러는데 자기가 제안한 거의 그대로 일을 했다던데.
    39. 판: 음. 일단, 짧게 대답하자면, 둘 다야. ㅎㅎㅎ 우린 일이 엄청 많고 그래서 인력이 필요하고 그래서 인턴도 뽑는거야. 그래서 이런저런 일을 시키기도 하고. 그렇지만 너가 제안하는것도 얼마든지. 특히 너가 제안한걸 맘에 들면 당연히 그렇게 할거고 기본적으로 관련있는 일을 할테고. 와서는 별 관심없이 그냥 시키는일만 하는애들도 많아. 근데 넌 연구하고싶은게 있겠지? 
    40. 나: ㅇㅇ 그렇지. 음. 그래. 어.. 나 헬조센징인데 비자는 괜찮아?
    41. 판: 어 .. 에프원 비자 말인가?
    42. 나: ..아마?
    43. 판: ㅇㅇ 알아볼게.
    44. 나: 음 그래. 어..음.. 그다음껀..물어봐도 되나..
    45. 판: 물어봐물어봐
    46. 나: 인턴십 인터뷰  절차가 어케돼?
    47. 판: 응. 음. 너가 일할 팀이랑 두번 인터뷰할거야. 거기 멤버랑 한번 하고, 그 때 코딩 인터뷰를 아마 할거고. 그담엔 연구에 대해서 좀 더 구체적인 얘기를, 일할 팀의 매니저들이랑 하게될거야. 둘 다 전화인터뷰로 하게되고, 상당히 빠르게 진행돼. 일단 시작되면 두 번의 인터뷰가 다 아주 빨리.
    48. 나: 음. 그래. 그다음엔.. 인턴십에서 논문을 써도 되나?
    49. 판: 우리가 그걸 권장하진 않지만 막지도 않아. 하게되면 너네 매니저랑 얘기하게 될 일인데, 잘 협상해봐. 근데 가능해.
    50. 나: 어 그렇구나..응 인제 끝인듯.
    51. 판: 응 그래. 야 지원하게되면 얼른 알려주고, 그럼 뭐야 다음주나 다다음주쯤 지원 하는거야??
    52. 나: (당황) 아 아니 어.. 일단 지도교수랑 얘기도 좀 해야하고..
    53. 판: ㅇㅇ 그럼 한 12월 첫째나 둘째주?
    54. 나: 응 ㅇㅇ 그럴게.
    55. 판: ㅇㅋ 알려줘. 빠이빠이~ 참 그럼 인터뷰는 지금 이시간에 또 하면 되는거야?
    56. 나: ㅇㅇ 어 미국 서부 기준으로 오전중에 아무때나 하면 될거같아
    57. 판: ㅇㅇ 알았엉 빠이~
    58. 나: 안뇽~

결과적으로, 내용에 대한 예고 없이 진행됐지만, 그리고 비공식이라고 여러번 강조했지만 실제로는 상당히 중요한 질문을 많이 받았습니다. 사실상 첫번째 인터뷰라고 봐도 무방할듯해요. 




Thursday, November 5, 2015

[Korean] ISMIR 2015 요약


2015 International Society of Music Information Retrieval (ISMIR)이 끝났습니다. 관심있게 본 발표를 정리하니 도움 되길 바랍니다.




서울대학교 융합기술원의 MARG랩에서 나온 논문입니다. 저도 한때 관심있었던 분야라 저자분과 이야기를 좀 했습니다.
연구의 가정은 스팩트로그램에서 wideband로 분포한 성분이 곧 타악기 성분이라는 것 입니다.
실험에서는 Derry Fitzgerald, Ono의 논문과 비교를 하였습니다.
저자의 말씀에 의하면 실제로는 Derry Fitzgerald 방법보다 좋지가 못하다고...
기본적으로 이 논문은 주파수 축에서의 분포만을 모델링했는데, DF는 주파수축/시간축 두 방향에서 각각 타악기/하모닉 악기의 분포를 모델링했습니다. 즉, DF방법에 비해 실제로 나타나는 현상을 덜 반영한 모델에서 출발하였기 때문에 나오는 한계가 아닌가합니다.






[2] Understanding uses of commercial music services through personas
Jinha Lee 교수님의 논문입니다.
음악 서비스의 유저 그룹을 clustering하고 어떤 패턴을 보이는지 연구한 내용입니다.
그룹 수가 7개나 되는데 전체 실험자 수가 40명밖에 되지 않는 점이 좀 아쉽습니다만 내용은 아주 자세합니다. (반대로 생각하면 숫자가 적어서 다채로운 공통점을 찾기가 쉬웠던 것 일수도 있지요. 즉 몇명 없는 사람의 특징에 오버피팅된...) 7개의 그룹은 두가지 특징에 의해 결정됩니다. 하나의 축은 Companionship - 얼마나 소셜하게 음악을 듣는가: [상-중-하]==[소셜-중립-개인적], 이고, 또 하나의 축은 투자(Investment) - 얼마나 음악에 시간/돈을 투자하는가:[상-중-하]==[투자하는 편 - 중립 - 안한다] 입니다. 조합을 하면 총 9개가 나오게 되지만, 주로 소셜 측면이 [상] 인 경우에 투자 측면은 [상, 중]만 존재하고, 소셜이 [하] 인 경우에 투자가 [중,하] 만 존재한다고 하네요.
이와 관련해서는 그동안 (Jennings 2007) 이 주로 인용되었었는데, 앞으로 이 논문도 많이 참고가 되지 않을까 합니다.





Music recommendation과 관련해서 가장 많은 논문을 쓰고있는 Markus Schedl 교수 랩에서 나온 논문입니다.
CF방식에서 latent factor에 social tag를 추가하였습니다. 
이미 어지간한 회사에서는 쓰고있는 방식일거라고 생각합니다만 아무튼 논문으로는 novel하긴 합니다.





Gracenote에서 소위 day-of-a-year, 즉 연중 각종 이벤트에 관련된 (temporal context) 사람들의 청취 패턴을 조사하였습니다. 데이타는 2012년 1년동안 스트리밍된 호ㅜ쑤이고, 크리스마스/할로윈/성 패트릭 데이 등에서 피크가 크게 나왔네요. 
이번 여름에 제가 네이버 랩스에서 하려고 했었던 것과 유사한 가정을 하고, 그 가정을 점검하였습니다. 가정했던 내용이 어느정도 성립하는걸 보니 다행스럽기도 하면서 그 내용이 출판된걸 보니 아쉽기도 하고 그러네요. 



일단 너무 광범위한 제목이라 좀 맘에 안들지만...
조지아텍에서 나온 논문입니다.
구체적인 내용보다도 셋팅에 먼저 눈이 가네요.
11025 Hz 샘플레잇, CQT - 36 bins/octave, 최저 주파수 110 Hz (베이스기타는 무시하는군요...)부터 최고 주파수 3520 Hz까지로 필터뱅크를 썼네요. 반음 하나당 3개의 bin이 나오고 전체는 180개가 됩니다.
그리고,
그림 2에 전체 시스템이 나와있는데 뭐 그림을 저렇게 그렸는지... 나중에 자세히 보고 보완하든지 하겠습니다. (퍽이나...)



우선 제목에서 semantic은 semantic web에서의 semantic으로 보시면 되겠습니다. 즉 db에 정리된 artist 관련 정보를 이용한 artist similarity measure를 제안한 것입니다. 예를 들어 멤버가 겹치는 밴드는 유사성이 높다든지 하는 내용입니다.




[7] Exploring data augmentation for improved singing voice detection with neural networks

음악 신호와 딥러닝을 적용할 때 data augmentation을 어떻게 해야하는지에 대해 다룬 논문입니다. 이미지의 경우 rotation/flip등의 인위적인 왜곡을 통해 트레이닝 데이타 수를 늘리는데, 음악에서는 그동안 필요에 따라 소소히 쓰여왔지만 이에 대해 정리된 논문은 없었습니다. 안그래도 필요성을 느끼던 차에 이번에 이 포스터도 나왔고, Brian McFee는 오랄로 유사한 내용을 발표했습니다.
다만 두 논문 모두 그동안 흔하게 쓰여왔던 방식 - pitch shift/time stretch/loudness 정도를 제시하였는데 이 외에 좀더 좋은 방식이 없을까 하는 의문이 듭니다. 아, 그리고 gaussian noise를 더하는 방식도 있는데, 음성인식에서라면 모를까 음악과 관련된 머신러닝 작업에서 노이즈를 더하는 것은 일반적인 의미를 갖기는 어려워보입니다.



결과를 보면 데이타를 늘렸다고 늘 좋아지지는 않습니다. 



아주 재미있는 논문입니다. 이번 학회에서 best post representation award를 받았습니다. 
사실 내용은 잘 이해를 못했고 데모를 들어봤는데 정말 웃깁니다. 벌이 웅웅거리는 소리로 비틀즈 노래의 멜로디를 바꿔놨거든요.




2015년 여름에 판도라에서 인턴을 한 Dawen Liang이 발표한 논문입니다. 내용 자체는 흔히 나오는, cold-start problem을 해결하기 위하 content-based recommendation입니다. 2014년 스포티파이에서 인턴을 한 Sander에 이어서 판도라에서도 유사한 접근을 하네요. 
사실 너무 당연한 일인 것이, 그동안 판도라에서는 수십명의 음악 전문가가 곡을 하나하나 태깅해왔습니다. 그렇게 쌓인 곡이 대충 100만-200만정도 되는데, 문제는 전체 음악 DB는 3-4천만곡이라는 거죠. 당연히 머신러닝이 필요하구요.
논문에서는 MSD를 사용했는데, 판도라 내부에서도 그들의 데이타를 갖고 같은 작업을 했다고 합니다. 
2015년 ICML의 워크샵에서 같은 저자가 발표한 논문과 사실상 같은내용이라고 슬금슬금 실토했습니다.




[10] Music boundary detection using neural networks on combined features and two-level annotations
위에서 소개한 data augmentation 논문과 같은 저자가 쓴 논문입니다. 소속 기관인 OFAI는 오시트리아의 국가연구소라고 합니다.
CNN을 통해 바운더리를 트레이닝 하였고, 트레이닝 방식은 바운더리를 포함한 부분에서는 1을, 바운더리가 없는 부분에서는 0을 라벨링하였습니다. 바운더리라는것이 그야말로 경계면이다보니 어떤 크기의 스펙트로그램을 어떻게 주어야 할지 좀 애매할 수 있는데, 여기서는 우선 그렇게 길지 않은 구간의 신호를 (예를들어 1-2초? 기억이 잘 안납니다만..) 사용하였고, 바운더리가 정확히 가운데에 있는 신호에 더 weight를 주었습니다.
바운더리를 찾기 전에 pre-processing으로는 harmonic-percussive separation을 사용하였습니다. 그렇게 할 경우에 채널이 2개 있는 이미지처럼 처음에 데이타를 사용 가능할텐데, 여기에서는 어떻게 했는지 모르겠네요.




굉장히 성능이 좋은 데모를 준비하였고 학회 전 주말에 있었던 핵데이에서 상을 받았습니다. 
사실 내용은 전혀 보지 않았습니다. 대신 데모 영상을 찍었습니다.




DNN으로 아무리 난리를 쳐도 왜 코드 인식이 완전히 해결되지 않는가? 하는 문제인데,  아래 그림을 잘 보시면...


- 12음계, 평균율에 맞지 않는 음원이 있어서.
- 평가 방법의 문제
- task formulation, subjectivity: 저한텐 거의 같은 문제로 보이는데 결국 데이타셋의 문제죠. Consistency가 보장이 되지 않는다는 것.


그 예로 U2의 with or without you의 코드를 들었습니다. 각종 DB및 tab웹사이트에서 나온 코드를 비교하면 다들 조금씩 다릅니다.
팝음악은 악보나오고 음악이 나온것이 아니라, 음악이 나오고 악보가 나온것이라 어쩔 수 없는 문제입니다.


흥미로워보여서 찍었습니다만 아직 안읽어봤습니다. City University에서도 딥러닝과 음악을 접목한 연구가 꾸준히 나오고있습니다. 다만 folk melody와 같이 지엽적인 (안타깝지만 서양 음악은 이제 서양만의 음악이 아니라는 사실은 인정해야합니다. 그렇다고 그 이외의 것들을 '제3세계'로 보는 관점에 동의하는건 아닙니다만.) 소재는 전 개인적으로 좀 별로...



역시 딥러닝이라 찍어봤습니다만 잘 모르는 task라서 자세히 읽어봐야 알 듯 합니다.



[15] Mirex에서 music/speech 구분 1등을 한 논문입니다. 근데 mirex에 낸거라 출판된 논문이 없네요.
일단 1등뿐만 아니라 다른 거의 모든 방법이 다 CNN을 사용하였습니다.




[16] 제 논문입니다. CNN feature를 들어보고 뭔 일이 일어나는지 이해해보자! 라는 내용입니다.
자세한건 여기로.

마지막으로, 왜 사진이 없는지 모르겠습니다. 퀸메리의 Siddharth가 쓴 논문은 RNN을 써서 코드 인식을 하는 내용입니다. 굉장히 똑똑한 친구라 좋은 내용일거라고 생각하고 저도 오늘 읽어보려고 합니다... 논문은 여기.




여기까지 ISMIR 2015 저의 요약본이었습니다.