Showing posts with label 연구. Show all posts
Showing posts with label 연구. Show all posts

Saturday, April 11, 2020

Q&A. 음악 유사도를 이용한 추천엔진 개발


질문


프로젝트로 음악의 특징 유사도를 이용한 내용기반 음악 추천시스템을 만드려 하고 있고, 현재 논문들을 서베이중입니다.
그런데, 음악의 어떤 특징을 추출해야 할지가 고민입니다. 널리 알려진 방법으로는 MFCC를 추출하여 DTW 기법을 활용하여 유사도 계산을 하는 것인데요, 이것이 과연 제 주제에 적합한지 아직 직관이 없습니다.
설문조사 결과, 두 음악이 유사한지를 판단하는 기준 중 가장 많은 표를 받았던 게 음악의 멜로디와 빠르기였는데, MFCC가 이러한 정보를 담을 수 있는지도 모르겠습니다

답변


mfcc에는 그런 정보가 거의 없습니다. 템포는 상대적으로 쉽게 추출가능하지만 (librosa 등) 멜로디는 추출과 유사성 비교 둘 다 까다롭습니다. 어느정도의 성능을 원하시는지 모르겠지만 유사한 곡을 찾는 성능이 프로젝트에서 제일 중요한 핵심이 아니라면 mfcc 기반으로 하셔도 뭔가 작동하긴 할겁니다.


추가 질문


국내 논문을 보던중에 크로마레벨표현으로 멜로디 유사도를 구현한 논문을 읽어봤습니다. 여기서는 MRR이 0.713으로 수치상 꽤 높은 값이 나왔는데, 혹시 멜로디 추출과 유사성 비교가 까다롭다고 하신 이유를 알 수 있을까요?

답변


mfcc는 수식으로 정확하게 정의되고 그 특징이 잘 알려져있죠. 그리고 지금 보니 본문에서 DTW를 활용한다고 하셨는데 그렇다면 음악을 mfcc의 수열로 나타내고 그 수열의 유사성이 음악의 유사성을 나타낸다는 가정일텐데, 더 흔하게는 주어진 음악의 시간축에서의 평균과 표준편차를 씁니다. 이렇게하면 성능이 대단히 뛰어나지는 않겠지만 각 음악 신호가 갖는 소리로서의 특징(음색)이 반영된 추천엔진으로 작동을 합니다. 그리고 음색은 음악을 구성하는 악기나 장르와 관련이 깊으므로 추천엔진이 엄청나게 취향을 저격해주진 않겠지만 크게 실패하지도 않겠죠.
반면 멜로디를 추출하고 거기에서 유사성을 비교한다면, 우선 멜로디가 정확하게 추출된다는 가정이 필요하고 (대충 되긴 합니다만) 여기에서는 정말로 멜로디라는 시계열 데이터가 유사한지 찾아내는 잣대가 필요합니다. 멜로디는 곡 전체를 아우르는 시계열 데이터인데 그렇다면 예컨대 4분짜리 곡 전체의 멜로디가 다 비슷해야 된다는것인지 (물론 그건 아니겠죠), 아니면 일부가 비슷하면 된다는것인지, 그렇다면 일부만 비슷한 멜로디를 어떻게 찾아낼 수 있을지 (메트릭을 잘 디자인해야하고) 등등 문제가 생각나네요. 결정적으로, 유저들은 멜로디가 비슷하면 비슷한 음악이라고는 응답하긴 했지만 글쎄요, 그게 어떤 유사성을 의미하는지 알기도 어렵고, 전혀 다른 장르인데 멜로디가 비슷하면 정말로 그 멜로디의 유사성이 호불호의 중요한 기준이 된다고 말할수있을지 회의적입니다. 따라서 이런 불확실성을 해소하는 것이 프로젝트의 목적이라면 얼마든지 재미있는 연구를 진행할 수 있습니다. 그렇지 않다면 굳이 시간을 들일 필요가 없구요.


Friday, August 23, 2019

Q&A. 오디오 코덱/디코더와 머신러닝/딥러닝

사운들리 그룹에 올라온 질문과 제 답변을 정리한 글입니다.

----------

질문

오디오 데이터셋의 오디오 포맷이 wav와 flac으로 섞여있습니다. 이를 librosa.load로 불러온 뒤 스펙트로그램이나 mfcc로 변환하려고 합니다. 이 경우에 flac을 wav로 변환해서 전체 파일 포맷을 동일하게 만들어둬야 하나요? 아니면 실시간으로 librosa.load로 불러서 바로 스펙트로그램, mfcc등을 계산하면 되나요?

1줄 답변

미리 변환하지 않고 그냥 librosa.load를 바로 쓰시면 됩니다.

3줄 답변

Flac은 무손실 압축입니다. 즉, 디코더 구현에 관계없이 원본 파형을 그대로 유지해야합니다. 따라서 아무 디코더나 쓰셔도 괜찮습니다.

여러줄 답변

질문의 요지는 "flac을 wav로 변환해서 전체 파일 포맷을 동일하게 만드는 과정"과 "librosa.load에서 사용하는 flac 디코딩 과정"에 차이가 있냐는 것입니다. 일단 flac은 무손실 압축이므로 3줄 답변에서 보듯이 어떻게 디코딩하든간에 차이가 없습니다.

조금 더 알아보면, librosa는 자체적인 오디오 디코더를 가지고 있지 않습니다. librosa는 backend로 시스템에 깔려있는 오디오 디코더를 사용합니다. 만약 디코더가 아예 없다면 에러 메시지를 내보냅니다. 그런데 보통 리눅스나 맥에서는 ffmpeg을 많이 사용하죠. 그리고 아마 직접 flac을 wav로 변환하더라도 마찬가지로 시스템에 설치된 (ffmpeg) 디코더를 사용하겠죠. 따라서 결과는 같습니다.

만약 mp3같이 손실 압축이라면 디코더 버전이나 구현이 중요한가요?

사실, 손실 압축이어도 마찬가지입니다. mp3를 예로 들면, mp3 코덱이 차이가 날 수 있는 부분은 인코더입니다. 공개된 인코더인 LAME같은 경우는 사실 성능이 별로 좋지 못합니다. 대부분의 mp3 인코더는 유료이고, 어떤 mp3 인코더를 쓰느냐에 따라, 같은 스펙 (예: 128 kbps) 이라도 성능(음질)에 차이가 날 수 있습니다.

그런데 질문의 상황은 디코딩 과정이 달라질 수 있냐는 것이죠. 오디오 디코더는 구현 방식에 따른 차이가 (거의) 없습니다. 다만 페북 그룹의 현동일님께서 답변해주신것처럼, 임베디드 시스템에 디코더를 구현한다든지 하면 연산량이나 연산방식 등의 제한으로 인해 다소 오차가 있을 수 있습니다. 하지만 이건 머신러닝에서 데이터를 처리하는 것과는 관련이 없겠죠.

mp3 압축 여부가 학습에 영향을 미치나요?

이건 상황에 따라 다릅니다. 별도의 포스팅으로 정리하도록 하죠.

Sunday, June 9, 2019

딥러닝과 오디오 데이터 전처리

이번 글에서는 딥러닝과 오디오 데이터 전처리 전반을 살펴보겠습니다. 제가 몇몇 발표 (2017-11-03 판교 혁신센터, "음악과 딥러닝의 사랑과 전쟁" (발표자료))에서 다룬적이 있는데, 이미지랑은 달리 오디오 데이터는 몇가지 특징이 있습니다.

  • 데이터 사이즈가 크다 - 상황에따라 천차만별이지만 오디오는 기본 16비트고 (이미지는 8비트 x 3, 4채널) 1초당 int16짜리 데이터가 44,100개가 있습니다.
  • 디코딩이 느리다 - 데이터가 크기 때문에 음성/음악 코덱 기술이 많이 발달했습니다. 그런데 오디오 코덱은 신호를 시작부터 끝까지 순차적으로 디코딩합니다. 그리고 연산량이 적어서 디코딩 속도가 빠를수록 좋긴 하지만, 한편으론 재생 속도보다 빠르기만 하면 일반적인 오디오 재생에는 별 문제가 없겠죠. 그러다보니 딥러닝 학습과정에선 문제가 될 수 있습니다. 즉, 디코딩 속도가 데이터 로딩의 병목이 될 수 있습니다.
  • 별도의 전처리가 필요할 수 있다 - STFT, Melspectrogram 등의 연산이 여기에 해당합니다.

그 외에, 일반적인 딥러닝 학습을 하다보면 누구나 겪게되는 상황이 있습니다.

  • 데이터가 커서 메모리에 다 안들어간다.
    • HDF? memmap?
  • 데이터를 추가하거나 데이터 전처리 파라미터를 편리하게 변경할 수 있어야한다.

이런 상황을 고려하면 해결책은 아래와 같습니다.

  • 저장 포맷
    • 디코딩이 끝난 오디오 데이터를 그대로, 파일마다 .wav (int16)나 .npy (numpy array, int16/float32/etc)로 저장
    • 예: audio_1.wav, audio_2.wav, ... audio_10000.wav
    • 장점: 로딩이 빠르다
    • 단점: mp3등 압축 코덱 대비 하드디스크 공간을 많이 차지한다. 그러나 대부분의 경우에 현실적으로 큰 문제가 아님. 하드디스크는 별로 안비싸고, 오디오 데이터셋이 보통 그렇게까지 크지 않음. 
  • 로딩 방식
    • 파이토치와 텐서플로 모두 데이터 로딩 모듈이 잘 짜여져있습니다. 각 모듈에서 데이터 인덱스(예: idx=10)를 받아서 파일을 하나 로딩하는걸 구현합니다.
    • 사용할때는 인덱스 ([1, 2, 3,.. ,10000])을 shuffle한 뒤에 순서대로 불러오면 됩니다.
    • 파이토치의 경우엔 예를들면 저는 이렇게 합니다 (소스).
    • 장점: 
      • 데이터를 쉽게 추가할 수 있음. 마찬가지로 shuffle도 다양하게 할 수 있음. (만일 hdf를 쓰면 연속된 메모리에서 불러와야 유리하므로 미리 셔플을하고 저장해야하는데 이 모든 데이터 준비 과정이 시간을 많이 잡아먹음)
      • 배치 사이즈만큼의 데이터를 불러오는 과정은 텐서플로/파이토치의 데이터 로딩이 알아서 멀티프로세싱으로 잘 수행하므로 편리하고 안정적임. 
  • 전처리
    • 가급적 대부분의 전처리를 gpu에서 수행 (stft 등)
      • 장점: 파라미터 변경이 쉬움. 나중에 모델을 배포하고 사용할때도 오디오 파일을 그대로 불러와서 진폭을 바꿔주고 (int16 --> float, [-1.0, 1.0]) 샘플링 레잇만 맞춰주면 바로 모델에 넣을 수 있어서 편리함. Dependency가 적어짐 (librosa같은 외부 라이브러리를 쓰지 않아도 되므로). 
      • 단점: gpu의 연산과 메모리를 조금 더 사용함.


Thursday, May 9, 2019

오디오 노멀라이즈(정규화) 방법 정리


오디오 신호를 입력받는 머신러닝이나 신호처리 시스템을 사용할 때는 입력받은 신호가 사용하기 적합하도록 다양한 처리를 해주곤 합니다. 가장 단순한 방법으로 오디오 신호의 레벨을 조정하는 노멀라이즈가 있습니다. 이번 포스트에서는 다양한 노멀라이즈 기법이 어떤 특징을 가지고 언제 적용할 수 있는지 알아보겠습니다.

용어

노멀라이즈(Normalize)는 정규화라고 번역하는경우가 많은데, 노멀라이즈에는 결과가 특정 기준에서 '1'이 된다는 의미를 함축하고있습니다. 좀 고민이 되는데 그냥 노멀라이즈라고 해버리겠습니다.

레벨 변경

우선 디지털 오디오 신호를 $x[n]$ 혹은 간단히 $x$라고 하겠습니다. 보통 노멀라이즈는 $x_{normalized} = K \times x$ 의 과정이 됩니다. $K>1$ 이면 소리가 더 커지는 증폭(amplification)이 되고 $K<1$이면 소리가 더 작아지는 감쇠(reduction)가 됩니다. 즉, 특별히 주파수별로 처리를 해주지 않는다면 소리의 특성은 그대로 남아있고 레벨만 변합니다. 청취자가 이 소리를 듣는 맥락이라면 이를 흔히 볼륨을 높이거나 낮춘다고 이야기합니다.

이제 노멀라이즈 기법에 대해 알아봅시다.

1. 진폭(Amplitude) 노멀라이즈 

디지털 도메인에서는 신호 $x$의 최댓값, 최솟값이 존재하죠. 정수로 표현하면 비트레잇에 따라 다르겠지만 Float으로 표현하면 $[-1, 1]$의 범위를 갖는것이 일반적입니다. 만일 $\text{max}(|x|)>1$인 신호가 있더라도 이를 오디오 '데이터'로 사용하는데는 별 문제가 없습니다. 즉, 이런 오디오 신호도 머신러닝 시스템의 입력값으로 사용할 수 있다는 말입니다. 물론 i) 시스템이 입력값의 크기와 무관한 성능을 보여야 하는지, ii) 실제로 원하는대로 작동하는지는 따로 점검을 해야겠지만요. 하지만 이를 그대로 재생한다면 진폭이 1이 넘는 구간은 제대로 소리가 나지 않습니다. 재생과정에서 이는 강제로 $[-1, 1]$구간이 되도록 짤리게되는데 이를 클리핑이라고 합니다. 클리핑이 난다, 클리핑이 뜬다, 등의 상황입니다.

정리하면, 재생하려는 오디오 신호는 진폭 노멀라이즈가 필요합니다.

2. 에너지(Energy) 노멀라이즈

에너지 노멀라이즈는 다소 상대적인 개념입니다. 신호 $x$와 $y$가 있을 때, 두 신호의 제곱의 합(의 평균)이 같아지도록 하는 과정입니다. 데이터셋에 신호가 많이 있다면 전체 신호의 제곱의 합(의 평균)이 전부 같아지도록 해야겠죠. 즉.. $\sum_n{x[n] ^ 2} / n $과 $\sum_n{y[n] ^ 2} / n $가 같아지도록 두 신호의 레벨을 조정하는 것입니다. RMS 에너지/볼륨 노멀라이즈라고도 이야기합니다.

진폭과 차이점은, 진폭보다는 에너지가 '실제로 사람이 들었을 때 느껴지는 두 신호의 크기'(=라우드니스)를 더 잘 나타내주기 때문에 에너지 노멀라이즈를 함으로써 두 신호의 '볼륨'이 같아지는 것(을 근사하는 것)이라고 볼 수 있습니다.

에너지 노멀라이즈는 머신러닝에서도 흔히 사용하는 방법입니다. 다만, 위에서도 이야기했듯이 에너지 노멀라이즈를 해주는게 학습하는 시스템의 특성과 잘 맞는지 고민해보고 사용해야합니다.

3. 라우드니스(Loudness) 노멀라이즈

우선 라우드니스의 개념을 알아보겠습니다. 위에서 제가 라우드니스를 '실제로 사람이 들었을 때 느껴지는 두 신호의 크기'라고 이야기했는데, 이 정의를 꼼꼼히 살펴볼 필요가 있습니다.

주관성

우선 소리의 크기 인지는 사람마다 다르므로 근본적으로 라우드니스는 주관적인 개념입니다. 그래도 뭔가 하긴 해야하니 '평균'적인 인지를 가정하겠습니다.

라우드니스는 주파수의 함수

에너지가 소리의 크기를 대략적으로 나타내주긴하지만 정확하진 않습니다. 에너지가 같은 신호라도 주파수가 다르면 라우드니스, 즉 체감상 느끼는 소리의 크기가 달라집니다. 예를 들어 사람은 3-5 kHz 대역의 소리에 예민하고, 주파수가 아주 낮아지거나 아주 높아지면 잘 듣지 못합니다. 그러므로 에너지가 같은 신호라도 $x$의 주 성분이 100 Hz에,  $y$의 주 성분이 3,000 Hz에 있다면 $y$의 라우드니스가 훨씬 큽니다. (물론 이것도 주파수 특성이 평탄한, 즉 100 Hz와 3,000 Hz의 소리를 둘 다 균일하게 재생하는 스피커나 이어폰을 사용하는 경우에 해당합니다.)

따라서 라우드니스를 맞춰주려면 주파수 분석을 해야합니다.

라우드니스는 레벨의 함수

그런데 그게 다가 아니고, 라우드니스는 레벨에 따라 달라집니다. 이걸 한번에 나타내주는 그림이 아래의 등청감곡선인데, i) 값이 주파수에 따라 달라서 선이 구불구불하고, ii) 구불구불한 패턴이 소리의 크기에 따라 다르다는 점을 이해하면 됩니다. 



따라서 정확한 라우드니스를 구하려면 주파수 분석뿐만 아니라 이 신호(signal)가 어떤 크기의 소리(sound)로 재생될지 알아야합니다.

..그런데 당연히 이걸 알 수가 없겠죠?
도대체 이 신호를 청취자가 들을 때 볼륨을 어떻게 설정하고 들을지 알 수가 없으니까요. 
애당초 디지털 도메인에 있는 신호에는 '라우드니스'라는 개념이 정의되지 않습니다. 

그렇지만 근사적으로 맞춰주고자할때는 위의 등청감곡선의 평균적인 분포를 이용하거나, 이를 더욱 더 근사한 A-weighting같은것을 사용합니다. 조금 신경을 쓴다면 예를들어 0 dBFS를 100 dB SPL과 같다고 가정하고 이를 기준으로 처리하는 방법도 있습니다.

마지막으로, 여러 신호를 균일하게 전처리하려는 목적은 아니지만 음성 신호 처리에서 사용하는 pre-emphasis도 라우드니스가 주파수의 함수이기 때문에 (구체적으로는 사람이 저주파수 성분을 잘 못듣기 때문에) 적용된다고 볼 수 있습니다.

4. Mu-law

Mu-law는 낮은 비트레잇(예: 8비트)으로도 최대한 좋은 음질을 얻기 위해 사용하는 방법입니다. 보통 16비트에서는 잘 사용하지 않습니다. 이 방법은 앞에서 소개한 노멀라이즈랑은 조금 다르지만 같이 소개하겠습니다. 

Mu-law는 웨이브넷에서 사용하면서 유명해졌죠. 웨이브넷은 오디오의 샘플을 직접 생성하는 뉴럴넷입니다. 그런데 최종 레이어에서 Softmax를 사용하고, 진폭 출력을 회귀(Regression)가 아니라 분류(Classification)문제로 보고 값을 예측합니다. 따라서 8비트 오디오를 생성하는 문제는 총 $2^8=256$개의 카테고리 중 정답을 고르는 문제인데, 이걸 16비트 오디오로 비트레잇을 올리면 $2^{16}=65536$개의 카테고리가 되어서 문제가 많이 어려워집니다. 이를 효율적으로 해결하기 위해 8비트 오디오를 사용하지만 mu-law를 활용했습니다. 다시말해, 진폭을 8비트로 양자화하는 방법중에서 결과가 듣기 좋도록(잡음이 덜 들리도록) 최적화하는 방법입니다.

Mu-law는 오디오를 더 높은 비트레잇의 오디오를 (예: 16비트) 더 낮은 비트레잇으로 저장하는 과정에서(예: 8비트) mu-law따라 저장하는것으로 미리 설정해줘야(=mu-law 인코딩을 수행한 뒤 저장)합니다. 다시말해 일반적인 8비트 오디오 신호를 다시 mu-law를 이용해 더 고음질로 저장하는것은 불가능합니다. 

5. 주파수 도메인 (STFT) 노멀라이즈

이건 오디오 신호처리보다 머신러닝에 국한된 이야기입니다. 상당수 연구에서 log STFT Magnitude $\log(M)=\log(|X|)=\log(|\text{stft}(x)|)$의 크기를 특정 구간으로 노멀라이즈합니다. 상황에 따라 $[0, 80]$, $[0, 120]$, $[-120, 0]$, $[-1, 1]$ 등.. 제각각입니다. 이쯤되면 오디오 신호라기보다는 입력 데이터의 값을 컨디셔닝해주는 것으로 보는게 더 알맞겠죠.

진폭에도 해당되는 이야기인데, 특히 오디오 신호나 STFT Magnitude를 생성하는 머신러닝 시스템이라면 출력값의 범위와 최종 레이어의 액티베이션 함수 등을 적절하게 선택해야겠죠. 예컨대 GANSynth에서는 마지막 레이어에 $Tanh$ 함수를 사용하지만, 가급적 함수의 선형 구간에 값이 해당되도록 하기 위해 STFT의 크기와 위상을 $[-1, 1]$로 노멀라이즈했습니다. 



이번 포스트는 여기까지입니다.




Monday, December 10, 2018

SANE 2018 발표 영상 공개

10월에 보스턴에서 열렸던 SANE 워크샵 영상 8개가 유튜브를 통해 공개됐습니다. 


  • 구글의 멀티모달 음성분리인 Tali Dekel - Looking to Listen: Audio-Visual Speech Separation




  • 구글의 Text-to-speech 시스템인 타코트론 등을 소개하는 Yu Zhang - Towards End-to-end Speech Synthesis 





  • 음성인식 대회인 CHiME의 역사를 통해 배우는 음성인식 성능의 역사 Jon Barker - Distant microphone conversational ASR in domestic environments 











Sunday, September 30, 2018

ISMIR 2018 논문 소개 [3/3]



차례

ISMIR 2018 논문 소개 [1/3]
ISMIR 2018 논문 소개 [2/3]
ISMIR 2018 논문 소개 [3/3] (이 게시물)


이번 글에서는 Late-Breaking/Demo 세션을 보겠습니다. 이 세션은 6+n페이지고 피어리뷰를 받는 정규 세션과는 다른 워크샵 트랙이라고 보시면 됩니다. 분량은 2페이지이고 MIR과 관련된 것이라면 실험이 진행중인 내용이나 데모 등 무엇이든 편하게 낼 수 있는 세션입니다.

LDB submissions

인공 와우(cochlear)는 음성 인식을 목적으로 하고 신체에 장착해야하므로 효율이 매우 중요합니다. 따라서 복잡한 연산이 어렵고 대략 수십 채널정도의 주파수 해상도를 갖고있습니다. 여기에서는 인공 와우를 장착한 사람들이 음악을 들을 때 어떤 요소를 중요시하는지 알기위해 인공 와우를 모사한 시스템을 통과한 음악을 들려주며 선호도를 AB 테스트로 조사했습니다.

그 결과가 그림 1입니다. 사람들은..
- 아는 노래 > 모르는 노래
- 정상 음질 > 떨어지는 음질

그리고..
- 모르는 노래, 정상 음질 > 아는 노래, 떨어지는 음질

이 이 실험의 제일 큰 수확이겠네요.

너무 간단한 결과지만 '아는 노래'로 널리 알려진 곡을 고르다보면 인기가 높은 곡이 나와서 애당초 '아는 노래'와 '모르는 노래'에 편향이 있을 수 있는데 (예를들어 '아는 노래' 집합의 노래 자체가 '모르는 노래'보다 더 사람들이 좋아할만한 노래라든지..) 이런걸 잘 걸러내고 실험한것 같았습니다.


피아노 악보에 있는 운지를 생성하는 파이썬 라이브러리입니다. 깃헙 코드 참고.

조만간 풀페이퍼로 나올것같은 완성도의 초록입니다. 흔히 악기의 음표 하나의 오디오 신호를  ADSR(attack - decay - sustain - release)의 인벨롭으로 해석합니다. 여기에서는 이를 HMM으로 모델링해서 채보에 이용했는데 매우 직관적이고 합리적인 방법으로 보입니다.

WaveGAN 등 좋은 연구를 많이 하고있는 Chris Donahue의 쩌는 데모입니다. 온라인에서 직접 보시죠.

요약하면, 단선율의 피아노 멜로디에서 다음에 나올 확률이 높은 노트 8개를 (RNN encoder로) 선정해서 8개의 키보드에 맵핑하고 이를 보여주는 방식입니다.

2페이지 워크샵 페이퍼에 수식이 15개라니..




Tonnetz는 음악에서 서로 다른 음표의 상대적인 관계를 시각화하는 방법입니다. 이 설명도 좋네요. Tonnetz를 이용하면 각 관계가 '그림'으로 나오는데 이 그림이 key-invariant, pitch-invariant등의 장점을 갖고있습니다. 이 초록에서는 이를 좀 더 발전시켰는데 제가 깊게 이해하진 못했습니다.

----

이상으로 ISMIR 2018 논문 소개를 마칩니다. 

ISMIR 2018 논문 소개 [2/3]


차례

ISMIR 2018 논문 소개 [1/3]

이어서 논문을 열심히 읽어보도록 합시다!

Papers

frame단위로 뭔가를 분류/예측/탐지하는 MIR문제가 많이 있습니다. 예를 들면 보컬 유무 탐지나 마디의 경계선을 찾는 다운비트 탐지같은 문제가 여기에 해당합니다. 이를 딥러닝 혹은 로지스틱 회귀 등으로 해결하려면 출력값에 Sigmoid를 적용해주고 이를 0.5를 기준으로 반올림하는 식의 방법을 많이 사용합니다.

그러나 상황에 따라서 0.5 미만의 값임에도 주변보다 값이 확연히 큰 피크에 해당한다면 "Positive"로 보는게 맞을때가 많이 있습니다. 이런 경우에 주변 값의 평균과 최대값 등을 비교하여 피크를 찾는 방법이 널리 쓰입니다. 본문의 식 1-3이 여기에 해당하고 Librosa의 peak_pick도 같은 원리입니다.

한편 이런 SGD기반의 최적화는 대체로 프레임단위로 ground truth가 존재하고 각 프레임마다 loss를 구하는 것이 보통입니다. 이 논문은, peak picking에서 주변 프레임과 비교를 통해 지역 극대값을 찾는다면 loss도 주변 프레임까지 고려해야 한다는 가설로 시작합니다. 즉 ground truth에 존재하는 지역 극대값을 예측모델이 따라갈 수 있도록 하자는 의미입니다.

그런데 여기에서 제안한 방법은 아무리 봐도 좀 의아하네요. 요약하면 $t=t_0$의 loss뿐만 아니라 주변의 loss까지 포함하자는 이야기인데, 어차피 전체 신호를 프레임으로 나누고 각 프레임에서 loss를 구한 뒤에 그걸 다 더하는 식으로 (=이 논문에서 식(4)에 나온대로) loss를 구하기 때문에 결과적으로 동일한것이 아닌지.. 

그리고 식(11)은 cross-entropy의 두 항에 가중치를 준 식인데 같이 나온 설명은 물론 틀린말이 아니지만.. 그림 4, 5를 보면 $\phi$가 1에 가까울수록 F-measure로 더 높은 숫자가 나오는데요, 이에 대해 본문에서는 아래와 같이 복잡한 해석과 추정을 합니다.

"For any values less than one, there is a dramatic decrease in performance which suggests that the false negative suppression half of the WCE function has a negative effect on performance. This is possibly due to the extremely high value given to flat parts of the activation function (see Figure 2), causing these parts of the activation function to become noisy. This suggests that the improvement is due to the false positive suppression half of the WMD system. As this alone achieves higher F-measures than the other proposed cost functions, then it also suggests that their improvement is also due to the suppression of false positives."

그런데 훨씬 직관적인 설명이 있습니다. 
- $\phi$ 가 작아질수록 (예: 0이면) target이 1일때의 loss를 크게 보므로 false negative를 줄입니다. 물론 반대로 $\phi$가 클수록 false positive를 줄이구요. 
- 여기에서 다룬 드럼 채보같은 문제는 라벨의 밸런스가 전혀 맞지 않습니다. 대부분의 프레임에서 아무 일도 없고 (target이 0) 어쩌다가 한번씩만 target=1이 되니까요. 
-- 그리고 이런 데이터 분포를 따라서 학습이 진행되기 때문에 뉴럴넷은 negative (target=0)를 훨씬 더 많이 예측합니다. 타겟의 대부분이 0이니까요. 
- 그런데 F-measure는 false negative와 false positive에 동일한 가중치를 주는 평가지표에요 (precision과 recall의 조화평균).  다시말해 데이터 포인트로는 몇개 없는 target=1들의 에러인 false negative에 훨씬 큰 가중치를 주고 전체 성능을 평가하는 셈이죠.
- 그러므로 학습을 진행할 때 $\phi=1$에 가까우면, 즉 false negative의 데이터 샘플에서 훨씬 큰 gradient를 받아오도록 해버리면 (<--> target=1인 데이터 샘플에 더 큰 가중치를 주면), F-measure 측정시 더 유리한 점수를 받습니다.

저자가 트잉여가 아니라 물어보긴 귀찮지만 아무래도 제 설명이 맞지않나싶습니다. 그리고 이 문제는 데이터에 가중치를 줘서 밸런스를 맞춰주면 바로 확인해볼 수 있고, focal loss같은것을 써도 되고, 아무튼 제안한 방법보다는 좋은 실험/해결방법이 많이 있다고 생각합니다. 



저자는 이미 여러번 보컬 탐지 (VD; Singing voice detection) 논문을 냈었는데, 그러다보니 보컬에 있는 프레임이 대체로 에너지가 더 높다는걸 깨달았습니다. 그리고 데이터 기반으로 VD문제를 풀다보면 시스템이 단순히 에너지 기반의 판정을 내려버리는 문제가 생길 수 있죠. 이를 해결하기 위해 컨볼루션 커널의 성분의 합이 0이 되도록 하는 zero-mean convolution을 제안합니다. 이렇게 되면 입력값 X에 있는 offset이 제거된다는것이 3페이지의 식에 잘 나와있습니다.

사실 저도 비슷한걸 드럼 분리에서 깨달았는데 이걸 가지고 휴리스틱으로 점철된 논문을 냈다가 까인게 5-6년전 일이군요. 혹시 관심있으신분...



실험이 잘 되어있는 좋은 논문이네요. 그런데 한편으론 에너지가 더 크다는 것도 정보의 일부고 실제 데이터가 그런 분포를 따른다면 그걸 이용하는것에 반드시 문제가 있다고 할 수 있을지.. 물론 제안하는 방법이 모든 SNR에서 더 좋은 성능을 보였기 때문에 이 경우에는 별로 중요하지 않습니다만.

작년에 나온 (스펙트로그램을 이용하는) U-net기반 음원분리 논문의 time-domain 버전입니다. 전에 여러 번 읽고 구현도 해봤는데요, 몇 가지 특징은..

- 크기가 작은 데이터셋으로 했을 때 스펙트로그램 U-net보다 살짝 좋은 성능이 나왔습니다.
- sisec 2018에서 괜찮은 성능을 보인 시스템 중 하나입니다.
- "valid" 컨볼루션을 사용할것을 제안했습니다. 맞는 방향이라고 생각합니다.
- U-net의 업샘플링 부분(디코더)에서 컨볼루션 레이어 기반의 업샘플링이 아니라 linear interpolation을 사용했는데 이것도 나쁘지 않아보입니다. 그런데 컨볼루션 업샘플링도 파라미터를 잘 셋팅하면 사실 linear interpolation이랑 비슷한 작용을 하는식으로 학습이 되지 않을까 싶기도 하구요.
- 입력 값으로 스테레오 채널을 모두 사용한것은 좋은 방향입니다. 그런데 여기서 한것보다 좀 더 적극적으로 할 수 있을것 같습니다.
- 네트웍의 전반부(인코더)는 conv1d와 decimate를 번갈아가면서 사용했는데, 사실 이것은 dilated conv1d를 쌓은것과 같은 연산을 수행합니다. (본문엔 나와있지 않습니다.)





다소 복잡한 뉴럴넷 구조를 쓰는데 아쉽게도 데이터셋에 따라서 기존 방법 (DSM [2]: 작년 ismir에 나왔던 간단한 컨브넷) 대비 제안한 방법(위의 3개 - segmentation, seg+ note, seg + time)항상 좋지가 않아서 좀 아쉽네요. 데이터셋이 작아서 그럴수도 있다는 생각도 듭니다. 그리고 이런식으로 결과가 나왔다면 데이터셋마다 어떤 특징을 갖고있는지 알아봐야할 때가 아닌가 합니다.

(c)의 데이터셋과 DSM 논문의 저자가 같은 사람(Rachel Bittner)인데요, 자기가 만든 데이터셋으로 제일 열심히 실험을 했던것일지도 -.-

제안한 방법중에 Segmentation이 나머지 두개보다 더 간단한건데 막상 성능은 더 좋게 나왔네요. 물론 차이가 크지 않고, note PNN과 time PNN은 transfer learning을 한것이라 Segmentation이 6 epochs동안 학습을 한 반면 note PNN, time PNN은 2 epochs만에 저 성능을 달성한 것이라고 합니다. 그런데 그건 pre-training시간을 빼고 계산한것인데 pre-training까지 포함하면 정말 유리한지? 물론 pre-training은 한번만 하는 것이니 데이터셋 내지 use-case가 여럿 있다면 여전히 장점이긴 하지만요. 그보다도 어차피 트레이닝 몇시간이면 될것같은데; 차라리 학습 데이터가 덜 필요했다면 모를까 엄청난 장점으로 보이진 않습니다.

전반적으로 실험이나 글쓰기도 괜찮고, Li Su가 공저자로 참여한 논문이 이번에 괜찮았던것으로 기억해서 앞으로 나올 논문도 기대가 많이 됩니다.


연구내용은 다소 평이하지만 런던에 있는 자동작곡 스타트업 Jukedeck에서 나온 논문이라 링크만 걸겠습니다. Jukedeck은 업계에서 상당히 잘 하고있는 스타트업이니 현업에서 어떤 방법을 사용하는지 알 수 있는 좋은 자료입니다.



아주 마음에 드는 논문입니다.

우선 symbolic domain(악보)에서 음악의 스타일을 바꾸는 스타일 트랜스퍼 문제를 푸는 논문입니다. 여기에서는 주어진 음악이 멜로디와 반주(accompaniment)로 이루어진 homophonic music이라고 가정하고, 멜로디를 그대로 둔 채 반주의 스타일만 바꾸는 상황으로 가정합니다. 

LSTM으로 feature를 생성하고, 이를 이용해 다시 autoregressive convnet으로 각 시점의 음표를 생성합니다. 여기에서 핵심은 섹션 2.4 스타일 트랜스퍼에 나온 알고리즘 1입니다.



일단 본문에 나온 바로는 [7] DeepBach의 변형입니다. 그런데 제 이해가 매우 얕아서 누가 자세히 알려주시면 좋겠군요. 


논문 소개 2/3은 여기까지입니다.


Saturday, September 29, 2018

ISMIR 2018 논문 소개 [1/3]



차례

ISMIR 2018 논문 소개 [1/3] (이 게시물)

ISMIR 2018

MIR(Music information retrieval) 분야의 가장 중요한 학회인 ISMIR(/이즈미어/) 2018이 막 끝났습니다. ISMIR는 현재 더블 컬럼 6+n페이지의 논문을 받고 있는데 이번에는 총 104편의 논문 발표가 있었습니다. 매년 제출되는 논문이 늘고있고 작년보다 약간 많은 논문이 나온것 같네요. 참가자수도 약 450명으로 작년의 300여명에 비해 크게 늘었습니다. 머신러닝 전반적으로 관심이 늘어나고 있고 프랑스 파리라는 위치도 한 몫 했겠죠.

이번에는 특이하게 모든 논문이 4분간의 구두 발표와 2시간 가량의 포스터발표를 둘 다 하는 형식으로 학회가 진행되었습니다. 첫 시도였는데 여러가지 장단점이 있었죠. 그리고 처음으로 구두 발표를 유튜브에 실시간으로 중계하였습니다. 

Trend

- 데이터셋 논문의 증가!
- 딥러닝이 절대 다수
- 자동 채보같은 문제에서 Convolutional RNN을 사용한 논문을 여럿 봄
- 세부 주제는 여전히 매우매우 다양함

Tutorials




Papers

ISMIR 논문은 전부 온라인에 공개되어있습니다. 몇몇 논문을 골라서 간단히 소개하겠습니다.

이 논문에서 푸는 문제는 Automatic drum transcription, 즉 드럼 채보입니다. 

드럼이 있는 오디오 신호 --[ADT System]--> 드럼 악보 

여기에서 제안하는 시스템은 Player와 Transcriber로 이루어져있습니다. Player는 학습 데이터가 부족한 부분을 채워주는 모듈로 기존 학습 데이터를 변형하거나 생성하는 역할을 하고, 이를 이용해 Transcriber는 점점 더 채보를 잘 할 수 있게 되는 셈입니다. 논문에서는 Generator/Discriminator로 이루어진 GAN에서 영감을 받았다고합니다. 기존 MIR 연구중에서도 데이터 크기를 키우는 Data augmentation 논문은 여럿 있었지만 이런건 처음보네요.

제안하는 방법은 (남들도 그렇듯) Stochastic gradient descent/Backpropagation입니다. 따라서 전체 end-to-end 시스템을 학습하려면 Player <--> Transcriber간 소통과 player 내부의 동작이 모두 미분가능해야겠죠. 섹션 2.2.1, 2.2.2를 보면 Player의 여러 과정이 θ로 매개변수화 되어있습니다. θ는 드럼 음원에 컨브넷(Player Convnet이라고 부릅시다)을 적용해서 구합니다. 그 결과 원래 입력 파일이 조금 바뀌고 (Augmentation) 추가적으로 다른 드럼 소리가 정해집니다 (Sample addition). 이 과정은 그림2에 잘 나와있습니다. 그림 1이랑 내용이 겹치지만 둘 다 올립니다.





학습은 GAN의 학습을 따릅니다. 즉 Transcriber는 y를 감소하는 방향으로, Player는 (1-y)를 감소하는 방향으로 최적화를 합니다. Wasserstein GAN 의 방식같군요.

실험 결과 분석은 생략합니다. 

4.4 섹션을 보면 Player의 역할에 대한 토의가 있는데 저는 동의하지 않는 내용입니다. 일단 전체 학습 구조가 이렇게 하는게 제일 좋은건지 잘 모르겠어요. 논문의 의도는 학습 데이터가 많지 않아서 뉴럴넷이 판단하기 어려운 케이스를 많이 만들어주는것이라고 하는데, i) Player Convnet이 정말 그걸 판단할 수 있는 구조가 아니라고 생각하구요, ii) Player가 문제를 어렵게 만드는것이 논문에서 의도한대로 학습데이터가 희소한 부분을 채워준다는 보장이 전혀 없습니다. 문제를 어렵게 만드는 전처리과정을 학습한것 이상으로 해석하는건 무리수라고 봅니다. 논문에서 관찰한대로 대부분의 매개변수가 범위내의 극대 혹은 극소값 (-1 혹은 1)을 가진 것은 값이 극단적일수록 일반적인 드럼 신호가 아니라서 문제가 어려워져서 그런것일 가능성이 더 높습니다. 만일 Player도 y를 감소하는 방향으로 학습했다면 Player가 아니라 trained preprocessor가 되었을테니까요. 

깃헙에 각종 데이터와 코드가 올라와있습니다.

다운비트 추정(Downbeat tracking)은 음악 오디오 신호에서 각 마디의 시작점(들)을 찾는 문제입니다. 최근에 딥러닝 기반의 다운비트 추정 시스템 논문이 여럿 나왔는데 이를 분석하는 논문입니다.

다운비트 추정 문제는 리듬과 직접적인 연관이 있는 문제이고 따라서 시스템이 리듬과 관련된 특징값 추출 --> 뉴럴넷 --> 각종 후처리로 이루어져있습니다. 그러다보니 여러 시스템을 공정하게 비교하기가 어렵고 각 과정의 중요도 내지 기여도를 판별하기 어려운데 이 논문에서 분석을 시도합니다.

그런데 논문에서 해석한것과 달리 저는 후처리(thresholding vs DBN) 말고는 전체적으로 큰 영향이 없는것으로 봅니다. 특히 중요한 요소라고 한 Datum vs Beat -- input signal granularity는 그렇게 중요하지 않아보여서 좀 의문입니다. 

굉장히 좋은 연구입니다. 실험을 더 추가할것도 없이 바로 TISMIR에 낼 수 있는 깊이가 아닌가 합니다.

크게 보면 자동작곡을 다루는 논문입니다. 여기에서는 멜로디에 맞는 코드를 찾는 harmonization과 코드에 맞는 멜로디를 생성하는 melodization을 번갈아가면서 수행하는 시스템을 보여줍니다. 이렇게 번갈아가면서 음악의 요소를 업데이트하는 방식은 실제로 사람이 작곡을 할 때도 거치는 과정이죠. "To partially and incrementally refine the (music) piece"라는 표현을 본문에서 사용했네요.



그림 2를 보면 각 모델이 어떤 역할을 하는지 잘 나와있습니다. i) 코드의 흐름을 먼저 예측하고 ii) 코드가 바뀌는 타이밍을 정하고 iii) 다시 코드 내에서 멜로디의 음표가 나오는 타이밍(멜로디의 리듬)을 예측하고, iv) 마지막으로 이에 맞추어 각 음표의 음고(pitch)를 결정하여 멜로디를 완성합니다.

온라인 데모도 보시길 추천합니다.

글쓰기도 나쁘지 않고 실험도 잘 했습니다. 다만 실제로 목적하는 바를 달성했는지 다소 의문이 들기도 하는데, 제가 많이 접해본 내용이 아니라 실험 결과를 평가하기가 어렵네요.

일단 논문의 목적은 VAE로 음악의 representation을 학습하되 (audio signal --[VAE]--> latent vector) 그 결과로 나온 latent vector가 우리가 원하는 의미를 갖도록 하는 것입니다. 유사한 내용으로 머신러닝에서 이야기하는 "disentangled" representation이 있습니다. 이는 hidden vector의 각 차원이 사람에게 중요한 의미(예: 사진의 밝기, 글씨의 기울기, 선의 굵기..)를 갖도록 한 것입니다. 

섹션 2.1엔 일반적인 VAE 수식이 정리되어있습니다. 쉽게말해 AE(Auto-encoder), 즉 자기 자신을 복원하는(encode-decoder) 뉴럴넷인데 중간에 나오는 hidden variable 혹은 latent vector인 $z$가 정규 분포를 따른다고 가정하고 이 정규분포의 평균과 분산이 인코더의 최종 결과가 되는 구조입니다. 디코더는 이 정규분포를 따르는 확률변수를 샘플링한 값을 입력으로 합니다. 논문의 그림 1에서는 인코더=Analysis, 디코더=Synthesis가 됩니다.



그림 1 우측을 보면 각 음원의 음색을 사람이 평가한 Perceptual ratings이 있죠. 얘네들을 MDS를 써서 차원을 줄인 것이 $\tau$입니다. 이제 이 정보를 이용해서 $z$가 $\tau$와 어떤 연관을 가지면서 학습이 이루어지게 하려고 합니다. 이를 위해 추가한 항이 식 (4)이고 그 결과 최종적인 비용함수는 식 (4) 바로 위처럼 됩니다.

그럼 어떤 연관을 갖게될까요? 본문에서는 "we want the distances between instruments to follow the perceptual distance" 라고 설명합니다. 즉 두 악기간에 인지적인 차이(perceptual distance)와 각 악기를 압축한 값 $z$의 차이가 서로 비례하도록 학습이 진행되는거죠. 이 거리(distance)를 측정하는 방법으로 유클리디안과 가우시안을 사용합니다.



섹션 3.1이 다소 뜬금없는데 여기서 설명하는 내용이 정확히 시스템에 어떻게 들어갔다는것인지 저는 잘 이해하지 못했습니다. 이 prior가 비용함수에 포함되었다는 것인지..



실험 결과를 보죠. 이렇게 학습을 진행하고 나온 결과 $z$ 를 PCA를 써서 3차원으로 압축한 것이 그림 3의 (b), (c), (d)입니다. 일반적인 VAE를 쓴것이 (a)구요. 제안한 방법대로 하면 각 악기별로 훨씬 더 구분이 된 결과가 나옵니다. 눈으로 봤을때 원하는 결과가 잘 나온것이죠.

섹션 5.2/표1이 좀 재밌는데요, 이 결과를 다시 레이어 1개짜리 뉴럴넷에 넣고 악기 분류 작업을 돌린 결과입니다. 일반적인 VAE가 악기 분류 작업을 제일 잘합니다! 저자들은 제안한 방법대로 하면 사람이 구별하기 어려운 악기들이(즉 종류는 다르지만 perceptual distance가 아주 작은 악기들이) 서로 겹치게 되어서 이런것이 아닌가 추측하네요.

5.3, 5.4, 5.5도 모두 의미있는 토의가 있고 특히 5.5는 온라인에 관련 영상도 있으니 참고하시길 바랍니다. 2페이지를 꽉 채운 결과 설명이 아주 인상적인 좋은 논문이네요. 



여기에서는 (convolutional) GAN으로 음악을 만드는 방법을 제안합니다. 일단 피아노롤(가로축은 시간, 세로축은 각 음표)을 생성하는 GAN인데, 최종 레이어에서 Binary value(0 또는 1)를 바로 생성하도록 수정을 가한것이 이 논문의 특징입니다. 

간단한 변화지만 뚜렷한 장점이 있네요. 기존에는 real-value로 나타난 피아노롤을 생성하고 사용할때는 이를 적당한 기준값으로 반올림하거나(thresholding) 값을 베르누이 확률분포의 파라미터로 보고 샘플링하는 방식(Bernoulli sampling, BS)을 사용했는데 둘 다 최종 결과물이 학습 과정시에 나오지 못하고 따라서 학습을 통해 해당 부분을 최적화할 수가 없습니다. 예컨대 GAN의 Discriminator가 이진화된 피아노롤을 못보는 것이죠. 이 내용이 2페이지의 '2 potential benefits' 중 첫번째 내용입니다. 두번째 장점은 학습 용이성입니다. 최종 결과물이 이진값이므로 전체 경우의 수가 급격히 감소합니다.

논문에서는 두가지 방식으로 이진화를 합니다. 식 (2)와 (3)에 설명되어있습니다. 그런데 원리 자체는 기존 방식과 크게 다르지 않고, 중간에 unit step function u()가 있는데 얘네들이 어떻게 미분가능한것인지 잘 모르겠네요.

실험 결과는 표 1에 정리되어있습니다. pretrained가 GAN을 쓰지만 제안한 Binary neuron을 안 쓴 것이구요. 그 외에 각종 학습방법에 따라 proposed, joint, end-to-end가 있습니다. 그런데 결과를 들여다보면 pretrained과 proposed가 별 차이가 없는 점은 좀 아쉽습니다.



OMR(Optical music recognition)은 이미지 파일로 악보를 받고 이를 인식하는 작업입니다. 악보 사진을 찍으면 이를 미디나 musicxml같은것으로 변환해주는 앱을 상상하시면 됩니다.



악보라서 일반적인 시각 객체 인식과는 조금 다르지만 일반적인 방법론을 대략 따르는것으로 보입니다. 이런 특징때문에 DWD(Deep watershed detector)를 사용합니다. 저자에 의하면 "simplify the desired energy surface to having small conical energy peaks of radius n pixels at the center of each object and be zero everywhere else" 라고 하는군요. 악보는 인쇄했거나 사람이 직접 오선보에 썼거나 결국 흑백으로 된 텍스트 비슷한 것이라 이 DWD를 적용하기에 적합한 상황이라고 합니다.




세상에서 유일하게 베이스 기타에 특화된 MIR을 최소 5년째 하고있는 Jakob의 논문입니다. 재즈 음악관련 과제가 있어서 가능한것이긴 하지만 정말 징한 녀석이죠.. 물론 제 논문을 2개나 인용했으므로 아주 좋은 논문인건 확실합니다.

그림 1을 보면 여러 악기가 섞여있는 음악 신호를 받아서 베이스 부분만 남긴(=Bass saliency estimation) 결과 예시가 나와있습니다. 이렇게 하고 나면 음원 분리나 채보 등의 작업을 하기에 유리해지겠죠.




일단 여기에서 [1/3]부를 마칩니다. 

Monday, September 10, 2018

음원분리 데모 SiSEC 2018

SiSEC은 Signal Separation and Evaluation Campaign의 약자로 2008년에 시작된 음원분리 경진대회입니다. 최근에 이 첼린지도 굉장히 많은 변화가 있었는데, 특히 홈페이지가 아주 예쁘게 단장되고 온라인에서 바로 데모를 들을 수 있게 되었습니다. 바로 여기! 입니다. (https://sisec18.unmix.app/#/) 최신 음악 음원분리 알고리즘의 성능을 쉽게 확인할 수 있습니다.

특히 2016년부터 데이터셋도 아주 예쁘게 정리가 잘 되어서 나오네요. 데이터셋은 MUSDB18인데 데이터셋을 편리하게 사용할 수 있게 유틸리티까지 오픈소스로 되어있어서 아주 쾌적하게 연구를 시작할 수 있습니다.

올해 열렸던 첼린지를 간단히 정리한 보고서가 아카이브에 공개되었으니 역시 참고하시길 바랍니다.

Sunday, February 25, 2018

오픈소스에 기여하는 방법

이번에는 오픈소스에 기여하는 방법을 자세히 안내해드리겠습니다.
제가 사랑하는 패키지 librosa에 제가 했던 PR을 예로 들죠.

WHY?

1. 오픈소스 소프트웨어 발전에 기여하므로 기분이 좋다
2. Git을 중심으로 여럿이서 개발하는 작업 흐름을 배운다 (유닛테스트, 문서화,..)
3. 여럿이서 개발할때 지켜야할 룰을 배운다. (코딩 컨벤션)
4. 학계, 업계의 사람들과 소통하며 인맥을 쌓는다.
5. 해당 버전의 소프트웨어가 인용되면 인용수가 올라간다. (개이득)

WHY NOT?

1. 어떻게 하는지 모른다.
2. 안해도 아무도 뭐라고 안함.
3. 귀찮다. 바쁘다.
4. 영어로 소통해야하므로 부담스럽다.

Pull Request?

줄여서 PR이라고 하죠. Pull해달라고 요청하는건데요, 다시말하면 내가 이런저런걸 고쳤으니 이걸 받아들여달라고 요청하는겁니다.

절차

정해진 방법이 있는건 아니지만 아래 과정을 참고하시죠.
- Issue 보드에서 새로운 기능이나 버그에 대해 논의하고 패키지 주인장과 공감대를 형성한다.
- 깃헙에서 해당 패키지를 Fork하고 그걸 clone한다. 
- Fork한 패키지에서 Branch를 하나 만든다
- Branch에서 버그를 고치든지, 새로운 기능을 추가하든지하고 이걸 Push한다.
(주의사항: 각 PR은 1가지 내용만 담고있어야합니다. 예를들어 버그 2개를 한번에 고치는 PR은 가급적 피하고 나눠서 해야합니다. 그래야 패키지 관리하는 입장에서 편리합니다.)
- Push한 내용을 PR한다
- 한번에 받아들여질수도 있지만 주인장이 원하는 요구사항이 있으면 이를 따른다. (예: 문서화 추가, 예제 추가, 테스트코드 수정 등..)
- 최종적으로 PR이 Merge된다. 끝!

예제

제 PR을 보시면 처음에 #647로 논의를 하고, 이에따라 첫번째 PR을 날렸습니다. 그런데 여기에는 유닛테스트가 잘 되어있지 않아서 이에대해 논의했고, 기존 코드와의 일관성을 위해 API에 대해서도 논의했네요. 테스트 방법과 코드 세부사항을 좀 더 논의했고 최종적으로 Merge가 되었습니다.


다소 귀찮지만 하다보면 굉장히 뿌듯하고 재미있습니다. 배우는것도 많구요. 특히 학교에서만 있으면 협업하며 개발하는 방법을 경험하기 어려우니 꼭 한번쯤 해보시길 권합니다. 

Friday, November 3, 2017

발표자료 - 음악과 딥러닝의 사랑과 전쟁





2017-11-03 판교 융합센터에서 발표한 내용입니다. 

Thursday, September 14, 2017

튜토리알 논문을 하나 썼습니다.

"Music information retrieval을 위한 딥러닝"이라는 제목으로 튜토리알 논문을 하나 썼습니다. 어제 아카이브에 올라왔네요.  논문 링크 | 코드 링크
핵심만 쉽게 설명하려고 애를 많이 썼습니다. 재미있게 읽어주세요.


Sunday, August 27, 2017

저널 논문, 리뷰, 스페셜 이슈

오늘은 잡담을 좀 하고싶네요. 박사과정에서 지금 중요한 때라서요.

제가 있는 학교에서는 학교나 학과에서 박사학위에 특별히 SCI저널이라든지 하는 조건이 없습니다. 특히 컴공에서는 점점 이런 추세로 바뀌고있죠. 그렇지만 제 지도교수는 저널 논문을 나름대로 조건으로 따지는 편입니다. 예외인 경우가 무지하게 많지만요.

특히 저는 펀딩 기간보다 빨리 졸업하려고 하다보니 이런 조건을 무시하고 졸업 논문을 작성하겠다고 설득하기가 어려웠죠. 요즘 이 분야가 사람들이 학위과정 졸업이나 프로젝트 실적, 테뉴어 심사같은 이유가 아니면 굳이 저널 논문을 쓰질 않아서 저는 좋은 저널 논문이 어떤건지도 잘 모르는 상태에서 저널 논문을 썼습니다.

그런데 어쩌다보니 주제 두개를 억지로 묶은 이상한 논문이 나왔고, 스페셜 이슈라 제출일/심사종료/발간 등 날짜가 정해진 곳에 제출을 했습니다. 며칠 전, 예정보다 일주일가량 빠른 리뷰를 받았는데 불안했던 예감대로 Major revision and resubmit -- in 2 weeks 라는 결과가 나왔네요.

저널 논문은 즉시 수락/minor revision/major revision/reject 정도로 결과가 갈립니다. 바로 수락되는 경우는 거의 들어본 적이 없고, minor revision이면 리뷰어가 언급한거만 조금 고치거나 하면 수락되죠. reject은 말 그대로 이 연구는 우리 저널에선 실릴 가능성이 없다는 거구요. 제가 받은 major revision은 고칠게 많지만 리젝주긴 미안하고 약간의 희망은 있다, 는겁니다.

그런데 이게 스페셜이슈를 만나면 조금 달라집니다. 스페셜 이슈는 정해진 날짜에 논문집이 나와야하니 편집자나 리뷰어도 논문이 넘치는 상황이 아닌다음에야 가급적 희망의 불씨를 살려두고싶어하죠. 그래서 major revision이라도 잘 고치면 한번쯤 더 minor revision을 하고 수락이 된다는 시나리오가 실현되길 바라고있습니다.

Major revision이면서 2주밖에 시간을 안주는건 좀 이상한건데 이것도 스페셜이슈 발간 일정때문에 그런것으로 생각합니다.

제가 받은 리뷰는 공통적으로 동떨어진 주제 두개가 논문 하나에 있는것이 이상하다는 내용입니다. 물론 저도 인정하구요. 그래서 급하게 전체 11페이지 분량에서 3페이지를 삭제하고 남은 내용을 발전시켜보고있습니다. 2주 안에 다시 낼 수 있을것 같긴 한데, 잘 될지 모르겠네요.

여기까지입니다. 나중에 저 읽으라고 쓰는 글이지만 공개로 작성합니다. 

Wednesday, June 14, 2017

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

음성/음악신호+머신러닝 초심자를 위한 가이드 전체 게시물은 여기를 클릭하세요.

데이터 수집

이번엔 데이터 수집을 주제로 글을 쓰겠습니다.

기존 데이터셋 사용

음악 데이터 셋은 http://www.audiocontentanalysis.org/data-sets/ 여기에 잘 정리되어있습니다.
오디오 관련 데이터셋은 좀 더 중구난방인데, 
- Urbansound8K by Justin Salamon
- AudioSet by Google, 2017 (유튜브 주소만 제공하고 직접 크롤링해야함. 어떻게? Fuel, YouTube-dl)
- DCASE audio detection by Queen Mary University of London
- Bird Audio Detection by Queen Mary University of London

이 정도가 생각나네요.

데이터 수집

살다보면 힘들고 험한 길을 가야할 때가 있죠.
freesound에서 직접 크롤링해서 뭔가 할 수 있지 않을까? 하는 희망을 한번쯤은 품어볼 필요가 있습니다.
아래 코드를 참고하세요. 주소는 여기





데이터 정리

데이터를 모으는게 다가 아니죠. 일단, 키워드로 검색을 했으니 특정 소리가 들어있는 음악 파일을 잔뜩 받았다고 해봅시다. 뭘 해야할까요?


  • Normalisation
import numpy as np
import librosa

x = librosa.core('event1.mp3', sr=None, mono=True)
x = x / np.max(np.abs(x))

  • Trimming
앞뒤에 조용한 구간이 있다면 싹둑 잘라주는편이 좋겠죠. 이건 어느정도 대애충 감으로 하는게 편할것같네요. 저라면, hann window같은걸 씌우고, 각 윈도에서 평균 에너지를 구해서 (np.mean(np.abs(windowed_source_x) ** 2)), 그 윈도 별 평균 에너지를 기준으로,아무런 음향 이벤트가 안일어나는 첫 N개의 윈도와 마지막 M개의 윈도를 날리겠습니다.

  • Augmentation
데이터가 부족하면 뻥튀기를 하고싶겠죠? 방법은 여러가지가 있습니다. 적당한 구간에서 pitch shift / time expanding을 하시면 무난할테고, 다른 잡음을 적당히 섞어주는것도 좋겠죠 (x = x + gain * noise). 이 정도만 해도 벌써 10배이상 데이터가 늘어날 것 같네요. 


  • 주의사항
음원이 매우 길다거나해서 여러 개의 학습 데이터 샘플로 쪼개서 쓰는 경우에, 같은 음원에서 나온 샘플 여러개가 training/validation/test 셋에서 섞이지 않도록 주의합시다.


이상입니다.

Friday, June 2, 2017

블로그를 하십시오.

독자가 컴공 대학원생이라고 가정하고 글을 쓰겠습니다. 아닌분들이 더 많겠죠? 본인의 상황에 맞는 조언인지 생각해보면서 읽으시면 되겠습니다.

블로그를 운영하면 생각보다 많은 사람들이 와서 봅니다.
그리고 연구는, 더군다나 취직은, '장사'의 속성을 지니고 있습니다.
아시다시피 그리고 컴공 분야 종사자들은 컴퓨터를 엄청 오래 합니다.

블로그에 논문을 설명해놓으면, 더 많은 사람들이 효율적으로 당신의 연구를 이해하게 됩니다. 그럼 더 많이 읽고 더 많이 인용하겠죠.
블로그의 좋은 글을 보면서 당신이 누군지 알게되고, 당신의 연구와 논문에 관심을 갖고 더 신뢰하게 됩니다.
블로그를 보면 독자는 당신의 연구 분야와 능력을 알게 되고, 더 낮은 기회비용으로 당신을 고용하려고 하겠죠.

모두 실제로 제게 일어난 일입니다. 저는 국문 블로그(여기), 영문 블로그, 깃헙 저장소 등으로 열심히 '영업'을 합니다. 지금보다 훨씬 영업할 껀덕지가 없을때부터 그랬습니다. 이건 제가 박사과정 시작하고 갔던 첫 번째 학회에서 (현재 DeepMind에서 일하는, AlphaGo와 Wavenet 논문의 저자) Sander Dieleman이 조언해준 덕분입니다. Sander도 Spotify x Convnet 게시물이 엄청난 인기를 끌어서 유명해졌고 그 결과로 딥마인드에서 면접 오퍼를 받았습니다. 저는 그런 스타급 연구자가 아니지만 현재 일하고있는 스타트업(버즈뮤직)에서도 제 블로그를 보고 연락을 줬고, 자문역으로 일하기 시작한 제이마플도 마찬가지입니다. 멜론에서도 연락이 왔었군요. 제가 런던에 있으니 더 용이한 것도 있겠지만 Mixcloud나 Kantar Media에서도 비슷한 연락을 받았습니다.

아마 제가 블로그/깃헙을 안했다면 아무 일도 일어나지 않았을 것입니다. 여러분, 블로그를 하세요. 엄청난 도움이 됩니다. 남들도 하루종일 웹서핑 하거든요.

Tuesday, March 14, 2017

ICASSP 2017 후기


ICASSP는 ieee의 신호처리 학회로 아마 이 분야에서는 제일 큰 학회일겁니다. 자세한 정보는 http://www.ieee-icassp2017.org 에서 한번 보시고 저는 단박에 논문으로 넘어가겠습니다.
오랜만에 Open access가 아닌 학회엘 갔더니 참 번거롭더군요. 프로시딩을 공유하니 다운받으시어요. 

그럼 무작위 리뷰 시작합니다.



https://lemonatsu.github.io/ 에 데모가 있습니다. 곡을 받아서 보컬을 분리하고, 음정을 찾아서 합성을 합니다. 좋은 음질을 이해 time-frequency domain이 아니라 time-domain에서 바로 합성을 합니다. 데모를 들어보면 음질 차이는 아주 뚜렷합니다.




그냥 22.2채널을 아직도 하고있다는게 놀라워서 하나 찍어봤습니다...


제목이 짤렸네요. 아래 포스터의 논문 제목은
FACIAL ATTRACTIVENESS PREDICTION USING PSYCHOLOGICALLY INSPIRED CONVOLUTIONAL NEURAL NETWORK (PI-CNN)
입니다. 

이 논문에서 제시한 방법이 과연 잘 작동하는건지 저는 별로 신뢰가 가질 않습니다. 우선, 네트워크의 구조를 보면 기본적인 구조는 흔히 알려진 컨브넷이구요, fine-tuning부분이 논문의 주 내용입니다. 본문에서는,

Recent psychology studies indicates that the skin color, smoothness, and lighting are three significant factors influ- encing the perception of facial beauty [1–3]. It inspires us to construct and improve the PI-CNN using a cascaded fine- tuning method with these facial features. 
라고 주장을 하고있구요.

그러면 이 신경망이 탐지하는 특징이 정말 사람의 '미'라고 할 수 있을까요? 데이터셋을 안봐서 모르겠습니다만, 논문에 실린 사진을 보고 판단하자면 소위 '예쁜' 얼굴 데이터는 사진의 품질이 더 좋습니다. 조명도 더 신경썼고 배경도 밝구요. 혹시 이 신경망은 사진의 품질이나 조명같은 특징에 반응하는건 아닐지 하는 의문이 듭니다.

실험에서는 500명 사진을 400:100으로 나눠서 학습했습니다. 데이터 크기도 좀 많이 작죠? 사진은 무려 223x223이나 되구요. 

마지막으로, Asiuan female faces with beautify scores 라는 데이터 자체가 별로 맘에 안드네요.




사진 찍을땐 제목만 봤는데 논문을 읽어보니 정말 별로네요. 이런 글이 대체 왜 학회에서 발표되는건지 정말 이해할수가 없습니다.
제목/본문에 '딥러닝'은 그냥 보기 좋으라고 넣은 단어로 이해하고 넘어가겠습니다.




Environmental sound detection을 34-layer resnet으로 구현했고 end-to-end로 작업했습니다. 최근 몇달간 비슷한 논문이 많이 나오네요.
Urbansound10k 데이터를 썼고 성능은 최고 72%가 나왔네요. SoTA를 찍지는 못했습니다. 
포스터에도 작게 나와있는데, 학습된 필터를 보면 역시 대충 mel-scale이라고 주장들 하는 모양이 나왔습니다. 저는 이게 특별한 스케일을 배운게 아니라 특정 주파수를 넘는 성분을 그냥 무시하고있는거라고 해석합니다. 아래 그림 보시죠.

더이상 특별히 언급할만한 내용은 없습니다.



개구리 소리를 분류하는 알고리즘입니다.
데이터가 많이 없어서, alexnet등 computer vision에서 공개한 네트웍을 그대로 사용하고 뒤에 SVM을 붙여서 하는 내용입니다. 음악에서도 AlexNet을 그대로 써서 장르 분석한 논문이 있었죠.








Deep Ranking: Triplet MatchNet for Music Metric Learning 발표자료입니다.



음악 관련이고, 데이터셋의 구성은 triplet (id1, id2, id3)으로 되어있습니다. MagnaTagATune에 딸려나오는 데이터인데, 곡 1을 기준으로 곡 2, 곡3중에 뭐가 더 곡1이랑 비슷한지 고르는겁니다. 
학습에는 ResNet을 썼구요.
Constraints Fulfillment Rate 이라는걸로 평가를 했는데, triplet으로 주어진 경우엔 결국 전체 샘플에서 triplet을 정확하게 고른게 몇퍼센트냐 - 즉 정확도 - 라고 보면 됩니다. 그리고 두 곡중에하나가 +면 나머지가 자동으로 -가 되기 때문에 랜덤으로 찍어도 50%가 나옵니다.
실험 결과는 70-71%가 나왔네요. 즉 2/3은 맞추고 1/3은 틀린다는 이야기입니다.

컨브넷을 돌리기엔 데이터셋이 너무 작은것이 아닌가 합니다. 전체 860개의 triplet, 993곡밖에 데이터가 없거든요.






음성 인식 과정에서 쓰는 filter bank를 학습하는 내용입니다.
필터뱅크를 gaussian shape을 가정하고 돌렸네요.
저도 비슷한걸 음악에 해봤는데, 이 논문이랑 비슷한 결과를 얻었습니다. 별로 흥미로운 결과는 아니었죠. 아래 그림 보시죠.


center frequency도 학습을 했지만 결과는 전혀 변하지 않았습니다.
각 필터뱅크의 gain만 조금 변했어요. 
그것도 아주 조금....;
작년 ICJNN에 나온 음악관련 논문도 비슷한.. 학습이 되었다고 보기가 어려운, 초기값에서 거의 변하지 않는 결과가 나왔죠.

성능은 조금 올라가긴 합니다. 하지만 이렇게 여러 결과를 보니, filterbank를 매개변수화하고 이를 mel-scale로 초기화한뒤에 학습하는 방법이 썩 좋게 보이질 않네요. 제일 큰 문제는  center frequency가 초기값에서 거의 변하지 않는다는겁니다. 설마 그 초기값이 global minima라서 그렇게 남아있는건 아닐테니까요.





(잘 모름) group lasso라는걸 써서 (lasso의 일종이겠죠) node activation의 sparsity를 만들고 잘 안쓰이는 노드를 날리는 내용입니다.




그레이스노트에서도 꾸준히 논문이 나오네요. 이 논문 말고도 더있었는데...
근데 제가 평소에 관심갖는 주제가 아니라 20000....



MIR에서 세계 최강의 산학협력을 하고있는 KKBOX/타이완에서 나온 논문입니다. 사용한 네트워크의 커널 모양 등 참고할만합니다. 












가사와 음원을 time-align하는 논문입니다. 그레이스노트에선 아주 중요한 일이겠죠?
이 논문은 접근방법이 좀 독특한데, 보컬을 분리하고, 가사는 speech로 합성을 해준뒤에 걔네를 비교합니다.
일반적으로는 보컬을 분리하고 그걸 써서 음성 인식을 하는데, 보통 음성과 달리 노래를 부른것이라 acoustic model 이 다르다는 문제가 있다고 합니다. 




새 소리가 대상이지만 이번에 이런 논문이 엄청 많이 나왔습니다. clip-level label을 이용해 frame-level prediction을 해주는 weakly-labeled learning입니다. 
논문의 그림을 보면 새 소리에 특화된 네트웍 구조를 잘 짠것같습니다.




제목: COMBINING UNIDIRECTIONAL LONG SHORT-TERM MEMORY WITH CONVOLUTIONAL OUTPUT LAYER FOR HIGH-PERFORMANCE SPEECH SYNTHESIS


재밌는 논문같아서 찍었지만 아는바가 전혀 없습니다. 설명충 등판 환영합니다!







SKT에서 나온 논문이네요. 학교 선배의 이름이 보여서 반가웠습니다. 학회장엔 안온것같지만..
멀티채널 VAD로군요. VAD는 정말 전통적인 문제지만 실제로 쓰다보면 아직도 완전 해결되지가 않았죠. 









음원 분리 하다보면 생기는 musical noise를 평가하는 방법입니다. 마크 플럼블리가 Surrey로 옮기고나서 계속 source separation/remix쪽 논문이 나오네요. 그쪽으로 큰 과제를 땄기때문에; 그렇습니다. 





오디오 태깅을 하는데, 정답 태그중에 일부만 랜덤으로 고르고, 그 일부에서 전체 태그를 예측하는 모듈을 추가해서 성능을 높인다고 합니다. 
그 모듈이라는건 결국 태그의 co-occurrence 를 추정하는 건데, 네트워크가 잘 학습되었다면 co-occurrence가 학습에 녹아들어있어야 하는것 아닌가 하는 생각이 듭니다만, 도움이 되나봅니다. 
데이터셋에따라 차이도 클거같네요. false negative가 많은 음악 태그의 경우엔 어렵지 않나 예상합니다.




인텔에서 나온 저전력 뉴럴넷 소개하는 포스터입니다.





다시한번, end-to-end, convnet, environmental sound detection 논문입니다. 



LSTM과 GRU의 차이를 분석하고, GRU의 'lazy update'를 LSTM에도 적용하자고 제안하는 내용입니다. 



DCGAN을 써서 음성의 감정 인식을 하는 내용입니다. Unlabeled data가 많아서 걔네를 이용해 GAN을 돌리면서, 그 discriminator에 레이어를 더 붙여서 A/V prediction을 하는 내용입니다.
Autoencoder랑 비슷하게, 저 방식이 반드시 원하는 작업에 필요한 feature를 추출한다는 보장은 없습니다. 

acknowledgements에 익숙한 아이디가 있어서 ..