Wednesday, May 17, 2017

두괄식 글쓰기: 영어 논문을 'Poor English'로 리젝 당하지 않는법

요즘 저랑 같은 사무실 쓰는 친구들이 학회를 준비중입니다. 최근에 리뷰가 끝났고 이제 통과/탈락 Acceptance/Rejection을 정하는 회의를 하더군요. 그리고 그럭저럭 재밌는 연구를 했지만 논문 작성 - 글쓰기를 매우 못해서 모든 리뷰어에게 낮은 점수/Rejection을 받은 논문을 보여주더군요.

인터넷에서 논문 리뷰 가이드를 찾아보면 '글쓰기'보다 연구 내용을 보고 평가하라고 써있곤 합니다. 그렇지만 현실에서는 영어 또는 글쓰기 이슈로 점수를 많이 깎이고 결과적으로 억셉될수도 있었던 논문이 리젝되는 슬픈일이 일어나곤합니다.

사실 억울하죠. 서양애들은 영어가 모국어가 아니더라도 한국어 화자가 얼마나 영어로 말하고 글쓰기가 어려운지 몰라요. 그렇지만 현실이 냉정하니 생존할 방법을 논의해봅시다. 저도 많이 부족하지만 제가 깨달은 몇가지를 이야기해보도록 하겠습니다. 

몇 가지 이야기를 할건데, 핵심 키워드는 "두괄식" 입니다. 

두괄식으로 초록 쓰기

오늘 제가 리젝당한걸 지켜본 논문의 시작은 두 문단으로 되어있습니다. 대략 이런식으로요. (제가 작성한 예제입니다.)

The development of parallel-computing hardware and optimisation techniques have been helped research on deep neural networks since 2000s when .. blahblah (중략)
This work present a music classification based on deep convolutional neural network. ... (후략)

즉, 첫 문단에 이 연구의 배경 설명을 소개하고 두 번째 문단에서 본격적으로 이 논문의 내용을 소개하는겁니다.

결론부터 이야기하면, 서양식 글쓰기에서 첫 번째 문단은 완전 불필요한 잉여문단입니다. 저런 소개를 빼고 조금도 어색하지 않아요. 리뷰어는 이미 해당 분야의 배경 지식을 갖고있습니다. 저런 소개는 잉여인데다가 리뷰어의 집중력을 흐트려놓습니다. 그리고 논문의 시작에서 강렬하고 좋은 인상을 주지 못하면 이미 "이 논문 뭐야? 어디꺼야?"이러면서 부정적으로 보게 되고 최악의 경우엔 제대로 읽지도 않아요. 부당하지만 현실.

게다가 영어 실력이 조금 떨어져서 쓸데없는 내용을 담은 이상한 문장이 나왔다면? 리젝률이 막 올라가는거죠. 오늘 본 논문이 딱 이랬어요. 

즉, 부족한 영어실력 * 두괄식이 아닌 글쓰기 = 리젝. 따라서 일단 두괄식으로 초록을 쓰세요. 초록 첫 문장에서 바로 강펀치를 빵! 날리셔야합니다.

두괄식으로 본문 쓰기

마찬가지 내용입니다. 각 문단의 첫 문장만 모아놓으면 자동으로 개요가 되어야한다고 생각하면 편합니다. 문단의 첫 문장은 그 문단의 가장 중요한 내용을 요약해야합니다. 만일 중요한 내용이 두 개가 나온다면 문단을 나누세요.

두괄식으로 문장 쓰기

논문에서는 'we'가 아니라 수동태로 문장을 작성하라고 배우죠. 그런데 보면 종종 we로 시작하는 문장도 있어요. 이걸 더 자세히 설명해볼게요.

1. Audio signals are converted into short-time Fourier transform.
2. Short-time Fourier transform is adopted to represent audio signals.
3. We use short-time Fourier transform to represent audio signals.

언뜻 보면 같은 내용을 다르게 표현한것 같지만 논문 글쓰기를 하는 경우에는 저 셋을 구별해서 사용해야합니다.

일단, 1과 2는 소위 수동태고 3은 능동형 문장이네요. 그럼 어떤 차이가 있을까요?

1. 주어가 Audio signals로 되어있네요. 이 경우엔 오디오 신호를 어떻게 처리하는지가 제일 중요한 상황입니다.
2. 주어가 Short-time Fourier transform이네요. 이 맥락에서 다른 방법 (CQT, Mel-spectrogram, ...)이 아니라 STFT를 사용했다는 사실이 중요한거죠.

사실 1과 2는 그렇게 다르진 않습니다. 독자가 읽기에도 별 차이 없는 경우가 대부분일거에요. 그러나 3은 아주 다릅니다.

3. 상황에 따라 "We used short.."로 쓰는게 나을수도 있어요. 아무튼, 왜 논문인데 능동형이냐! 이 문장은, 제안한 방법이 꼭 STFT를 써야하는건 아니고 다른것도 가능한 상황, 즉 알고리즘 내부에서 STFT를 쓰건 다른걸 쓰건 큰 차이가 없고, 이 논문에서 보고하는 실험은 STFT를 썼다는걸 명시하는 경우에 쓸 수 있는 문장입니다. 반대로, STFT를 (거의) 반드시 써야하는 상황이라면 1이나 2처럼 쓰는것이 더 적합하겠죠.

결론

초록도, 본문의 문단도, 문장도 모두 두괄식으로 써야합니다. 한국인의 대화/글쓰기 사고방식이 두괄식이 아니라 두괄식으로 쓰려고 맘먹어도 자꾸 잊을거에요. 그래도 계속 이걸 잊지말고 계속 쓰고 고치다보면 훨씬 좋은 글이 나올거에요. 그럼 다들 좋은 논문 쓰길 바랍니다.

Saturday, April 29, 2017

ISLR 2.2 - An Introduction to Statistical Learning (with applications in R)



pdf 다운로드 링크
구매 링크 (네이버 책)

2. 통계 학습 Statistical Learning

2.2 모델 정확도 평가 Assessing model accuracy


이 책에서는 선형 모델보다 복잡한 다양한 모델을 소개할 예정입니다. 왜 이렇게 많은 모델이 존재하고 이걸 다 공부해야 할까요? 그냥 제일 좋은거 하나를 쓰면 되지 않을까요? (아님) 안타깝게도 모든 경우에 제일 적합한 최고의 모델같은건 없습니다. 데이터 셋에 따라 다른 모델의 성능이 더 좋을 수 있고 문제에 따라, 목적에 따라 다 다를 수 있습니다.

제일 좋은 모델을 고르려면 어떤 모델이 좋은지를 평가할 수 있어야합니다. 이 부분을 알아봅시다.

2.1.1. 학습 성능 평가 Measuring the quality of fit

데이터 셋이 주어져있을 때 여기에 제일 잘 맞는 모델을 고르려면 모델의 성능을 수치화해야합니다. 회귀 regression 문제에서는 흔히 평균 제곱 오차 (MSE, Mean square error)를 많이 사용합니다. 말 그대로 오차의 제곱을 평균낸 것이죠.

$MSE = \frac{1}{N} \sum_{i=1}^n (y_i - \hat{f}(x_i))^2$

$y_i$가 정답, $\hat{f}(x_i)$가 우리의 예측 값이구요. 예측값이 정답에 가까울수록 MSE는 작아지게 됩니다.

학습 셋에서 구한 MSE를 '학습MSE' (training MSE)라고 하죠. 그런데 우리가 진짜로 신경쓰는건 학습MSE가 아니라, 생전 처음 보는, 새로운 데이터에서 모델의 MSE - 즉 시험MSE (test MSE)입니다. 예를 들어 주가 예측 모델을 짰다고 하면, 과거의 주가 패턴을 분석해서 모델을 만들고 학습시키겠죠. 그런데 이 모델의 학습MSE가 완벽해서 과거의 주가를 100% 맞추는건 아무 의미가 없습니다. 시험 셋에서의 성능 -- 즉 내일 주가를 맞추느냐! 가 중요하겠죠. 그래야 돈을 버니까!

때론 시험 셋이 있어서, 시험셋에서 성능이 제일 잘 나오는 모델을 고르면 되기도 합니다. 그런데 아닐때도 있죠. 그럼 어떻게 해야할까요? 흔한 오해는 학습MSE를 보고 판단하는겁니다.



그림 2.9를 보시죠. 우측 회색 선이 학습MSE, 빨간 선이 시험MSE입니다. 모델의 복잡도가 올라갈수록 학습 MSE는 계속 감사합니다. 왜냐면, 복잡한 모델일수록 어떻게든 학습 데이터에 모델을 "끼워 맞추는" 식으로 학습할 여지가 많기 때문입니다. 왼쪽 그림의 녹색 그래프가 바로 그런거죠. 복잡한 데이터에 막 그래프가 쭈글쭈글거리면서 끼워맞춘거죠.

이런 경우에 빨간 선, 즉 시험 셋의 MSE가 제일 적은 점(파랑 네모)로 골라야 최적의 선택이 됩니다.

2.2.2. 바이어스-베리언스 트레이드 오프 The bias-variance trade-off


시험MSE(의 제곱)는 아래와 같이 세 항으로 나눌 수 있습니다.

$E(y_0 - \hat{f}(x_0))^2 = Var(\hat{f}(x_0)) + [Bias(\hat{f}(x_0))]^2 + Var(\epsilon)$

여기에서, 역시 $\epsilon$은 우리가 어떻게 할 수가 없습니다. 따라서 여기에 있는 Variance와 Bias를 최소화하는것이 좋겠죠.

그런데 대체 여기에서 말하는 Variance와 Bias가 뭘까요?

Variance는 데이터셋을 바꾸면 일어날 수 있는 $\hat{f}$의 변화입니다. 만일 Variance가 크다면, 같은 모델을 학습 데이터만 바꿔도 오차가 확 증가합니다.

Bias는 실제로 일어나는, 훨씬 복잡한 상황을 이보다 단순한 함수 $\hat{f}$를 사용함으로써 생기는 오차입니다. 예를 들어 실제로 일어나는 상황엔 입력-출력 사이에 비선형성이 작용하는데 이걸 선형으로 모델링한다면 어쩔 수 없이 오차가 생기게됩니다.

일반적으로, 복잡하고 유연한 모델을 쓸수록 Variance가 증가하고 Bias는 감소합니다. 당연히 그렇겠죠. 그러나 이는 실제 문제가 어떤지, 그리고 우리가 어떤 데이터를 가지고 있는지에 따라 달라집니다.

2.2.3. 분류기 설정 The classification setting

그동안은 MSE를 쓰면서 회귀 모델을 가정했습니다. 이번엔 분류의 경우에 어떻게 되나 보도록 합시다. 우선 평가 방법으로 흔히 오차율 error rate을 계산합니다.

$\frac{1}{n}\sum_{i=1}^n I(y_i \neq \hat{y}_i)$

이 식에서 $\hat{y}_i$는 i번째 입력 데이터로 모델이 예측한 값입니다. 그리고 $I()$는 indicator 함수라고 흔히 부르는데, $I(true)=1$, $I(false)=0$ 으로 정의됩니다. 즉, 예측 값이 맞다면 -- 예를 들어 숫자 인식기라면 0-9중에 3을 예측했고, 실제로 정답이 3이면 $I()$가 1이 되는 것이죠. 따라서 최종적으로 100개를 테스트했는데 정답이 95개면 오차율은 $5/100=0.05$가 나오는 간단한 방식입니다.

베이즈 분류기 The Bayes Classifier
베이즈 분류기는 아래의 식을 (Bayes rule) 최대화하는 클래스 $j$를 고르는 분류기입니다.

$Pr(Y=j | X=x_0)$

쉬운 예를 들면, 만일 클래스가 두개인 이진분류 binary classification이면, $Pr(Y=1
 X=x_0 > 0.5 $이면 $Y=1$로 예측을 하는 방식입니다.

베이즈 분류기는 테스트 오차율을 최소화하는 규칙입니다. 이 오차율을 베이즈 오차율 Bayes error rate이라고 부릅니다.

KNN; K-nearest neighbors
그럼 베이즈 분류기를 쓰면 참 좋겠죠? 그러나 실제로는 조건부확률 $Pr(Y=j | X=x_0$를 모르기 때문에 불가능합니다. 즉 베이즈 분류기는 영원히 도달할 수 없는 궁극의 목표같은거죠. 이 조건부 확률을 추정하는 방법이 여러가지가 있는데 그 중 하나가 KNN입니다.




KNN은, 학습 데이터의 $X$를 보고, 테스트 데이터 $x$가 들어왔을 때, $x$ 근처의 가장 가까운 값 $K$개의 클래스를 살펴보고 다수결로 여기에 쫓아가는 방식입니다. 즉 자기 주변의 값을 보고 비슷한걸로 가는, 매우 직관적인 방법입니다.

$K$가 1이면 무조건 제일 가까운걸 쫓아갑니다. 반대 극단으로, 학습 셋이 100개의 데이터인데 $K$가 100이라면 무조건 전체 학습 셋에서 제일 많은 라벨을 쫓아가는거죠. $K$가 작을수록 decision boundary - 클래스를 결정짓는 경계선이 울퉁불퉁 꼬불꼬불해집니다.


여기에서도 적당한 $K$를 고르는것이 중요합니다. 아래 그림을 보면 $1/K$가 증가할수록 -- 즉 $K$가 감소할수록 -- 학습 오차는 줄어들지만 테스트 셋 오차는 어느순간 오히려 증가합니다.


2.3 Lab: Introduction to R


PDF파일을 보고 직접 해보시길 바랍니다.


ISLR 2.1 - An Introduction to Statistical Learning (with applications in R):



pdf 다운로드 링크
구매 링크 (네이버 책)

2. 통계 학습 Statistical Learning

2.1. 통계 학습이란? What is statistical learning?


통계 학습을 설명하기 위해 여기에서는 간단한 예를 하나 듭니다. (통계) 컨설턴트로 업무를 맡게 되었고 고객이 매출을 늘리기 위해 어떤 광고를 어떻게 집행해야하는지 궁금해하는 상황이라고 가정해보죠. 200개의 다른 시장 자료가 있고, 각각은 TV/라디오/신문 광고를 얼마씩 집행했으며 발생한 매출인지를 정리한 자료입니다. 예를 들어 TV가 효과가 제일 좋고, 라디오는 별로니 양을 줄이시고, 이런 컨설팅을 해줄 수 있겠죠. 아래 그림 (그림 2-1)같은 형태가 될테구요.


이 상황이라면 종류별 광고 예산을 입력 변수 input variable으로, 매출 sales을 출력 변수 output variable로 놓을 수 있습니다. 기호를 쓴다면 $X_1$, $X_2$, $X_3$이 각각 TV/라디오/신문 광고 집행 비용에 해당하겠죠. 출력은 $Y$가 되구요.

이 식을 좀 더 일반적으로 쓰면, 입력을 $X=(X_1, X_2, .., X_p)$로 놓고 이 입력과 출력간에 어떤 관계가 있는지를 알아내는게 우리의 목적이 됩니다. 수식으로 쓰면..

$Y = f(X) + \epsilon$
가 되게습니다.
이 식에서 $f$가 뭔지는 지금 모르고, $\epsilon$은 뭔진 모르지만 $X$완 관계 없는 추가적인 노이즈가 됩니다. 평균은 0이구요. 이렇게 가정을 하면 $f$는 $X$와  $Y$의 관계를 규정하는 함수가 됩니다.

2.1.1. f를 추정하는 이유

$f$를 추정하는 이유는 두가지가 있습니다. 예측 prediction과 추론 inference 입니다.

Prediction
$X$는 알지만 $Y$를 모르는 경우가 보통입니다. 이럴 때 $f$의 추정값 $\hat{f}$를 안다면 출력값을 역시 추정 $\hat{Y}$할 수 있겠죠. 

$\hat{Y}=\hat{f}(X)$

이렇게요. 위에서 $\epsilon$의 평균이 0이라고 가정했기때문에 추정치는 평균적으로 $\epsilon$을 무시한거구요. 이렇게 값을 예측하는 경우에 $\hat{f}$을 블랙박스로 생각합니다. 즉, 그 구조가 뭔지는 알바 아니라는거죠. 정확한 예측만 한다면.

$\hat{Y}$의 정확도는 줄일 수 있는 에러 reducible error와 우리가 어찌할 수 없는 에러 irreducible error 두 가지에 달려있습니다. "완벽한" 함수 $f$를 찾았다 하더라도 이를 이용한 추정치 $\hat{Y}=f(X)$는 오차 $\epsilon$이 있습니다. 왜냐하면 $\epsilon$를 처음부터 그렇게 정의했기 때문입니다. 이 $\epsilon$ 때문에 생기는 오차를 irreducible error라고 부릅니다.

예를 들어, $\epsilon$는 애당초 우리가 측정을 안하는 값의 영향일수가 있겠죠. 위의 예를 들면 티비/신문/라디오랑 관계 없는 다른 요소가 (당연히) 매출에 영향을 줄 것이고 따라서 저 데이터로 아무리 노력을 해도 그 부분은 모델에 넣을 수가 없습니다.

이 책에서는 우리가 데이터로 모델링할 수 있는 오차인 reducible error를 줄이는데 초점을 둡니다.

Inference
예측도 좋지만, 대체 어떤 과정으로 이런 일이 일어나는지 그 내부 논리/구조를 알고싶을 수도 있겠죠. 이렇게 모델을 추론하기 위해 $f$를 추정 estimate합니다. 책에는 3가지로 나눴지만 결국은 
어떤 입력이 출력과 어떤 관계가 있는지
를 알아보는 일 입니다.

2.1.2 어떻게 $f$를 추정하나요?

앞으로 다양한 선형/비선형 모델을 보겠지만 몇가지 공통점이 있습니다. 일단 $n$개의 데이터가 주어진다면 이를 학습 데이터라고 부릅니다. 데이터 하나가 $j$개 (예: 입력이 티비/라디오/신문 3개라면 $j=3$)의 입력을 갖는다고 하죠.

우리의 목적은 통계 학습을 학습 데이터에 잘 적용해서 함수 $\hat{f}$를 찾는 것입니다. 잘 찾아졌다면 어떤 데이터를 가져와도 대략적으로 $Y=\hat{f}(X)$가 성립하겠죠.

매개변수 방법 parametric methods
매개변수 방법은 두 단계로 이루어져있습니다.
  1. 함수의 형태를 특정한 모양으로 가정합니다. 예를 들어
    $f(X) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + ... + \beta_p X_p$
    라고 가정을 할 수 있겠죠. 참고로 이를 선형 모델이라고 부릅니다. 
  2. 모델을 고른 뒤엔, 학습 데이터를 써서 모델을 학습 (fit, train)합니다. 그렇게 하면 $\beta_0, \beta_1, ..., \beta_p$를 다 구하게 됩니다. 
이렇게 모델을 짜면, 함수 $f$를 구하기 위해서는 매개변수 $\beta$를 구해야겠죠.

비 매개변수 방법 non-parametric memthods
비매개변수 방법은 함수의 형태가 이런이런식일거다-라는 가정을 전혀 하지 않고, 바로 함수 $f$의 모양을 찾습니다.

2.1.3 예측 정확도와 모델 복잡도의 트레이드오프


그림 2.7, p25

위의 그림을 보면 여러가지 모델의 복잡도 (혹은 유연함, flexibility)를 x축에 그렸습니다. 그런데 복잡하고 유연한 모델이 있는데 왜 단순하고 형태가 제한적인 모델이 필요할까요?

복잡한 모델은 성능이 잘 나올수 있는 대신에 추론 inference을 하기가 어려워서, 대체 '왜' 이렇게 예측을 하는지 설명하기가 interpretability 어렵습니다. 물론 성능을 최대한 높이기 위해서라면 복잡한 모델을 쓰는게 좋겠죠. 그런데, 그렇다고해서 무조건 제일 복잡한 모데을 쓰는게 좋은것은 아닙니다. 이상하죠! 제일 큰 이유는 과적합 overfitting때문입니다. 나중에 뒤에서 다시 다룹니다.

2.1.4. 지도학습과 비지도학습 supervised vs unsupervised learning

대부분의 통계 학습 (혹은 기계 학습)은 지도학습과 비지도학습으로 나뉩니다.

지도 학습은 입력 $x$와 예측값 $y$가 같이 주어지고 이를 이용해 모델을 구하는 것입니다. 비지도학습은 $y$가 없이 입력 $x$만으로 뭔가 하려는거구요.

예를 들어 위 그림에서 (우리는 색깔과 기호로 구분된 정답 $y$를 알고 있지만) 점을 같은 그룹의 점끼리 모아주는 군집화 clustering 가 이에 해당합니다.

2.1.5. 회귀 대 분류 Regression vs Classification problems

입력 및 출력 변수는 '양적' 혹은 '질적' 값입니다. 양적 quantitative 값은 사람의 나이나 키, 온도, 가격처럼 연속적인 값을 의미합니다. 반면에 제품의 브랜드 (A, B, C), 어떤 병에 걸려있는지 아닌지 (True, False) 등의 특징은 숫자로 표현되지 않는 질적 qualitative 값입니다. 혹은 이를 categorical이라고도 합니다.

양적 값을 예측하는 문제를 회귀 regression 문제, 질적 값을 예측하는 문제를 분류 classification 문제라고 합니다. 다만 이 구별이 항상 깔끔하게 되는건 아닙니다. 문제를 풀기에 따라 분류문제도 회귀 모델을 써서 풀 수 있고, 그 반대도 가능하구요. 예컨대 성별을 예측하는 문제를 (0, 1)로 나눠서 분류 문제로 풀 수 있지만 이를 [0, 1] 사이의 연속된 값을 예측하도록 모델을 세우고 맨 마지막에 여기에 반올림을 적용해서 예측값을 구할 수 있겠죠.








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에 익숙한 아이디가 있어서 ..





Friday, December 30, 2016

번역 - Generative Adversarial Network (GAN) 설명


오랜만에 설명 자료 하나 번역합니다. 주로 http://blog.aylien.com/introduction-generative-adversarial-networks-code-tensorflow/ 를 보고 번역합니다만 적당히 편집과 내용추가가 있어서 1:1 번역은 아닙니다.

GAN?

시선을 끌기위해 예제부터 뽑아오자. 아래 예제가 GAN으로 만든 - 요즘 신문기사처럼 표현하면 "인공지능이 그린" 그림이다. 








서문

최근에 GAN: Generative Adversarial Network가 무지무지 인기를 끌고있다. GAN은 Ian Goodfellow가 https://arxiv.org/abs/1406.2661 등에서 제안한 것이다. 참고로 2014, 2015년에 Adversarial example 등 용어가 범람하면서 다소 개념이 애매한 부분이 있는데, 이는 Ian Goodfellow의 Quora답변을 참고하자. 아무튼 위대한 Yann LeCun이 꼽은 중요한 기술 1위 GAN이라는게 뭔지 한번 알아보겠다.

Discriminative vs. Generative 구별 대 생성 모델

간단하게 구별 모델과 생성 모델을 짚고 넘어가자.
  • 구별 모델은 입력-->출력의 관계를 알아내는 것이 목적이다. 즉, 조건부 확률 p(y|x)을 추정하자는 것.
  • 생성 모델은 더 일반적인 입력과 출력의 관계를 알아내려는 모델이다. 즉 p(x, y)을 추정하자는 것. p(x, y)를 알면 당연히 p(y|x)도 알아낼 수 있을 뿐만 아니라 더 재밌는 일을 할 수 있다. 예를 들어 새로운 (x, y) 데이터를 생성할 수 있고, 그래서 이름이 생성 모델이다. 더 강력한 정보를 필요로 하는 만큼 더 어렵다.

Generative Adversarial Networks


(그림 출처: https://ishmaelbelghazi.github.io 라고 나오는데 이 블로그가 사라짐..)

위의 그림이 GAN의 구조다. 간단하지요! 그야 간단히 그렸으니까 그렇고, 저기에서 보통 discriminator (구별망)와 generator (생성망)가 여러 층의 신경망로 이루어진 경우가 대부분이다. 대부분의 연구가 이미지를 다루고 있고, 그래서 두 신경망도 컨브넷인 경우가 많다. 자, 핵심은,
GAN의 핵심은,

  1. 생성망은 최대한 실제 데이터와 비슷한 데이터를 생성해내려고 하고
  2. 구별망은 열심히 그 둘을 구별하려고 한다는 것
이다. 이를 원문에서는 minimax two-player game이라고 표현했다. 

수식으로는 아래처럼 표현한다.



  • arg max D: 여기에서는 목적함수를 극대화하는 분류망 D를 찾는다
    • 첫번째 항 E[Log D(x)]은 실제 데이터 (x), 예를 들어 진짜 그림을 넣었을 때의 목적함수의 값이다. 
    • 두번째 항 E[log(1-D(g(z)))]은 가짜 데이터 (G(z)), 즉 생성망이 만들어낸 그림이 들어가있다. 그리고 arg max D인데 항 내부는 1-D(G(z))이다. 다시 말해 둘째 항의 극대화는 D(G(z))의 극소화다.
    • 결과적으로, 이 두 항의 목적함수를 이용해 
      • 진짜 그림을 넣으면 큰 값을,
      • 가짜 그림을 넣으면 작은 값을
    • ..출력하도록 구별망 D를 열심히 학습시키자는 것이다.
  • arg min G: 이 말은 목적함수를 극소화하는 생성망 G를 찾자는 이야기다.
    • G는 두번째 항에만 포함되어있다.
    • 전체 함수를 극소화하는 G는,  둘째 항을 극소화하는 G이고, 결국 D(G(z))를 극대화하는 G이다.
    • 결과적으로, 구별망을 속이는 생성망 G를 열심히 학습시켜보자는 이야기다.

코드

예제 (깃헙 저장소 원문)의 일부를 간단히 소개하겠다. 코드는 텐서플로우로 되어있다.


 def generator(input, hidden_size):  
   h0 = tf.nn.softplus(linear(input, hidden_size, 'g0'))  
   h1 = linear(h0, 1, 'g1')  
   return h1  

 def discriminator(input, hidden_size):  
   h0 = tf.tanh(linear(input, hidden_size * 2, 'd0'))  
   h1 = tf.tanh(linear(h0, hidden_size * 2, 'd1'))  
   h2 = tf.tanh(linear(h1, hidden_size * 2, 'd2'))  
   h3 = tf.sigmoid(linear(h2, 1, 'd3'))  
   return h3  


각각 생성망과 구별망이다. 여기에서 중요한 내용이 언급되었다. 생성망보다 복잡하게 구별망을 짜야한다!

사실은 아래 코드가 핵심이다.

 with tf.variable_scope('G'):  
   z = tf.placeholder(tf.float32, shape=(None, 1))  
   G = generator(z, hidden_size)  
 with tf.variable_scope('D') as scope:  
   x = tf.placeholder(tf.float32, shape=(None, 1))  
   D1 = discriminator(x, hidden_size)  
   scope.reuse_variables()  
   D2 = discriminator(G, hidden_size)  
 loss_d = tf.reduce_mean(-tf.log(D1) - tf.log(1 - D2))  
 loss_g = tf.reduce_mean(-tf.log(D2))  

아래 두 줄이 각각 구별망과 생성망에 arg max D, arg min G를 구현한 부분이다. loss를 감소하도록 학습되기 때문에 loss_d는 위에서 소개한 식과 부호가 반대다.

결과




보강

위의 영상을 보면 결과가 조금 아쉬운데, 이에 대해 https://arxiv.org/abs/1606.03498에서 해결 방법을 소개했다. 미니배치를 써라! 구별망이 한번에 여러 샘플을 보게 하라는 내용이다. 그 외에도 몇 가지 방법이 있는데 실제로 써본적이 없으므로 원문을 참고하면 된다.

그 결과는? 아래처럼 더 잘된다.




------

번역은 여기까지입니다. 우리모두 열공!

Wednesday, December 7, 2016

Stochastic Gradient Descent 자동 학습속도 조절 알고리즘 정리


이미지와 내용은 http://www.deeplearningbook.org을 참고했습니다. 저도 별로 이해하고있는게 없어서 간단히 요약만 합니다.


  • AdaGrad를 보면, 그라디언트를 1/sqrt(r)에 비례하도록 크기를 조절합니다(노랑색). 그리고 r은 그라디언트^2를 누적해서 더한 값입니다(초록색). 결과적으로 학습이 진행되면서 학습속도(learning rate)가 지속적으로 감소합니다. 
  • 이 방법은 Convex 최적화 관점에서 보면 - 즉 풀고자하는 문제가 컨벡스라면 - 별 문제 없습니다. 하지만 딥러닝 모델의 경우에 어느정도 학습을 진행하다보면 학습 속도가 너무작아진다는 문제가 실험적으로 밝혀졌습니다.
    • 아마도 이는 saddle point때문이 아닌가 생각합니다. 

  • RMSProp은 AdaGrad와 비슷하지만 (노랑색) 차이가 있습니다 (빨강색). ρ (rho)는 보통 0.9를 사용하는데, 쉽게 이야기하면 ρ만큼만 기억하고, (1-ρ)만큼만 업데이트를 합니다. 혹은 이 과정이 계속되면 아주 오래전의 그라디언트는 지속적으로 ρ가 곱해지면서 값이 작아지게 되고, 최근에 추가된 그라디언트가 상대적으로 큰 영향력을 발휘하게됩니다. 결과적으로 학습 속도의 감쇠가 AdaGrad보다 약하게 일어납니다.
  • RMSProp은 힌튼의 Coursera 강의에서 처음 소개되었고 한동안 (사실 지금도) 가장 널리 쓰인 방법입니다. 사람들이 강의노트를 인용하곤했죠.



  • 이 내용은 RMSProp에 (빨강색) Nesterv momentum을 추가한겁니다 (파랑색). Momentum = 관성. 즉 부화뇌동;하지 않고 상대적으로 차분하게 업데이트한다고 생각을 하시면 됩니다.


  • Adam은 최근에 가장 널리 사용되는 방법입니다. 보다시피 1st moment (s), 2nd moment (r)을 구하는 과정에서 관성(momentum)을 적용합니다. 
  • correct bias는 제가 잘 이해하지 못했습니다.

Monday, December 5, 2016

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

서문

가이드 3편입니다. 기존 가이드는 1편, 2편을 참고하세요.
모 대학원의 모 분께서 음악 신호와 머신러닝에 대한 질문을 주셨는데 중요한 점을 콕콕콕콕콕콕 집어서 물어보셔서 블로그에 글을 쓰기로 했습니다.

질문-답변 1


음악 인식쪽이 생소하다 보니 일단 먼저 music genre classificaiton(음악,음성신호 입력 --> [전처리] --> [특징값 추출] --> [분류기] --> 결과) 를 주제로 toy porject를 해보려고 합니다. 툴은 librosa를 쓸 예정입니다.

궁금한 점이 몇가지 있는데

1) 혹시 mp3파일이 주어졌을때 전처리를 하고 특징값 추출을 하는 하는 소스코드가 있으시면 공유 가능한가요?

- 상황에 따라 다르지만 대체로 추출과정은 https://github.com/fchollet/keras/blob/master/keras/applications/audio_conv_utils.py#L27 을 참고하시면 됩니다.
여기에서는 mel-spectrogram만 뽑는데, 여기에 다른 추출기를 추가하시면 되겠습니다.

2) 제 계획은 librosa가 제공하는 여러개의 특징을 최대한 많이 사용하고 후에 PCA등으로 후처리를 하려고 하는데, librosa가 제공하는 특징 (http://librosa.github.io/librosa/feature.html)중에 음악 분류에 적합한 특징에는 어떤 것이 있을까요?

- MFCC는 필수고, 그 외에 spectral-시리즈와 zero-crossing + tempo (http://librosa.github.io/librosa/generated/librosa.beat.estimate_tempo.html) 등을 쓰시면 됩니다.
그리고 특징값 추출 전에 http://librosa.github.io/librosa/generated/librosa.decompose.hpss.html 을 사용하셔서 두 채널을 따로 하시면 도움이 될겁니다.

질문-답변 2


지난번에 말씀하신데로 간단한 특징 추출 과정을 수행해보고 있는데, 몇가지 궁금한점이 있습니다. 

1) https://github.com/fchollet/keras/blob/master/keras/applications/audio_conv_utils.py#L27 을 참고하라고 하셔서 소스코드를 살펴봤습니다. 보통 음악 파일들은 3분이상이며, 제각기 길이가 다른데 소스코드에서 음악 파일의 가운데 DURA = 29.12 초 구간만을 프로세스 하더라고요. 이렇게 하는 이유는 각 음악 파일 별로 길이(재생 시간)가 다르지만 같은 크기(차원)의 특징 벡터를 얻기 위함인가요? 그리고 가운데 29초만으로도 충분한 정보가 있다고 가정하고 처리하는건가요?  끝으로 이렇게 가운데 구간을 trim 하는 기법이 일반적인 기법인가요?

- 이유: 맞습니다. 시간에 따른 정보를 어떻게 합치느냐에 따라 다르겠지만 링크의 컨브넷은 입력 신호의 길이를 29.12초로 제한하고 있습니다. 이보다 짧은 경우에는 나머지를 0으로 채워서 입력으로 넣어도 무방하지만 긴 경우에는 적당한 구간을 잘라줘야합니다. 그리고 말씀하신대로 가운데 29초가 충분한 정보가 있다고 가정하는 것입니다. 물론 상황에따라 다를테고, 제가 논문에서 사용한 음원은 기본적으로 30-60초의 '미리듣기'용 음원입니다. 이런 경우엔 사실 어디를 사용하더라도 무방하겠죠.
가운데를 사용하는건 아무래도 가장 단순하고 그러면서도 적당히 작동하는 방법입니다. 그 외에도 대중 가요의 경우 60-120초 사이에 하이라이트 (혹은 chorus, 혹은 싸비..)가 있다고 가정할수도 있구요.  이 외에도 가장 중요한 구간을 뽑아주는 방법를 여러가지로 생각해볼 수 있겠죠. 간단한 방법으로는 frame별로 energy를 계산해서 평균 에너지가 제일 높은 30초를 뽑을수 있겠죠. 보다 복잡한 방법으로는 음악 내 다양한 구간을 잘라주는 알고리즘을  사용한 뒤에 어디가 하이라이트인지 뽑을수도 있구요. 이는 원하시는 성능과 연산량에 따라 결정하시면 됩니다.

2)  음성/음악신호+머신러닝 초심자를 위한 가이드 [2편]을 보면,  프레임 마다 특징값을 뽑는 것이 아니라 오디오 신호 전체를 표현할 특징값을 찾기 위해 평균 및 분산 MAX를 뽑는다고 하는데 혹시 관련 논문 아시면 제목 알려주 실 수 있나요?
그리고 1)질문과 연관지었을 때 제가 음악 처리를 할때, 음악 파일 1개의 전체 구간에 대해서 평균 분산을 구하게 되면 아무래도  정보가 많이 뭉개질것 같더라고요. 그래서 1)번의 코드처럼 아예 처음부터 가운데 구간이 충분히 의미 있다고 가정하고 29.12초의 짧은 구간만을 평균, 분산 등을 이용해서 오디오 레벨 특징을 뽑으려고 하는데  reasonable한 방법인가요?

http://dspace.library.uvic.ca:8080/bitstream/handle/1828/1344/tsap02gtzan.pdf?sequence=1 를 보시면 평균과 분산 등을 사용했습니다. 그 외에도 frame-based feature를 clustering하고 이를 기반으로 quantized count를 사용하는 방법(http://dawenl.github.io/publications/LiangZE15-ccm.pdf)도 있습니다.
그리고 가운데 구간만 사용하는것이 곡 전체를 사용하는 것보다 나을것이라는데 동의합니다.  

3) 특징 추출 시 HPSS를 통해 2채널로 분리한 뒤  특징을 추출하라고 하던데, 예를들면 제가  LIBROSA에서 제공하는 특징들 중   A,B,C 를 추출하려고 한다면, 하나의 음원으로부터 각 채널별로  A,B,C를 추출해서 총 6개(3*2)의 특징을 구하라는 말씀이신가요? 예제들을 잘 보면 어떤 특징은 H채널에서 뽑고, 어떤 특징은 P채널에서 뽑더라고요. (https://github.com/librosa/librosa/blob/master/examples/LibROSA%20demo.ipynb

말씀하신대로 Harmonic + Percussive에서 모든 특징을 다 뽑아도 큰 문제는 없겠지만 가장 relevant한 정보만 뽑는다고 한다면, 각 트랙에 맞춰서 특징값을 골라주는게 좋겠네요. 하모니나 pitch에 관련된 특징값(chroma-어쩌구, ) 은 harmonic 트랙에서 뽑고, rhythm/onset/tempo 등은 percussive 트랙을 이용하시구요. spectral_어쩌구; (spectral centroid, ..)가 좀 애매한데, 얘네들은 분리하기 전 채널을 이용해 추출하는 것이 좋아보입니다.

4) 종종 특징들을 뽑고 아래와 같이  LOG화 시키던데 이렇게 하는것이 일반적인 방법이며, 인식 향상에 도움이 되나요? 
# Convert to log scale (dB). We'll use the peak power as reference.
log_S = librosa.logamplitude(S, ref_power=np.max)
네. 우선 STFT/CQT/Melgram등의 time-frequency representation은 log()를 씌워 데시벨 스케일로 바꿔주는것이 좋습니다. (그 외에도 일반적인 머신러닝에서 하듯 zero-mean unit-variance로 standardisation을 해주는것이 좋을테구요.) 이런 전처리는 인식 향상에 도움이 됩니다. 
5) 음악 인식 분야에서도  CNN을 이용한 기법들이 도입되고 있다고 들었는데, 보통  CNN의  input 은 주로 어떻게 처리해서 주나요? 그리고 혹시 관련 논문을 알려주실 수 있나요?
여러가지 경우가 있습니다.
Pitch와 관련된 정보 추출: CQT를 사용하고 대역폭을 음의 fundamental frequency가 분포할 수 있는 영역으로 제한한다. (대략 30Hz - 3kHz정도가 되겠죠)
리듬관련: STFT나 Mel-spectrogram을 사용한다.  
풀고자 하는 문제가 사람의 musical perception에 관련된 경우 (예: 감정 인식): Mel-spectrogram을 우선적으로 고려하고 STFT도 가능하면 테스트해본다. 주파수 대역은 대략 4kHz - 11K를 고려한다.
잘 모름: 8kHz나 16kHz로 샘플링하고 STFT (n_fft=1024 또는 512)와 Mel-spectrogram (128 bins)를 써본다.
음악이 아니라 음성이 입력이다: Mel-spectrogram을 최우선적으로 고려한다.
음악, 음성이 아니라 '소리'에 관련된 작업이다: STFT를 사용하고 Mel-spectrogram을 고려해본다. 
그리고 이와 관련된 논문은 아직 없습니다. 제가 대략 2-4개월내로 하나 작성하려고 계획중입니다. 

6) 제가 앞으로 해보려는 것은 일단  음원이 주어지면 고정 길이로 음원 구간을  trim  시키고, 이 구간에 대해 여러개의 특징벡터를 추출하려고 해요. 이렇게 하면, 음원에 대해서 (프레임 개수)  X (프레임당 특징 벡터들의 차원의 합)의 행렬이 만들어 질텐데, 음악 장르를 구분하는  task라고 가정하고  CNN 의 input으로서 이 이차원 행렬 그대로 주는게 좋을까요 아니면 2)에서 언급한것처럼 이 2차원 행렬의 프레임별  평균, 분산등을 구해서  1차원 벡터로 차원을 축소 한 뒤 입력으로 주는 것이 좋을까요?

데이터 개수가 충분히 많다면 2차원 데이터를 쓰시고, 그렇지 않으면 1차원 벡터로 입력 데이터의 크기를 줄여야겠죠. 장단점이 있어서 해보기전엔 정하기 어려워보입니다.