디지털 피아노 건반소음 없애기

잡기장 2022. 4. 12. 14:46

내게 가장 큰 취미 중 하나는 집에 있는 물건들을 고치거나 개선하는 것이다.

 

집에 중고로 구한 디지털 피아노가 한 대 있다. 아이가 심심할 때마다 한 번씩 치는데, 칠 때마다 건반에서 덜그덕 거리는 소리가 난다. 예전에는 안그랬던 것 같은데 요즘들어 소리가 갈수록 심해져서 피아노가 타악기가 된 것 같다 (원래 타악기인가?)

 

어떻게든 고쳐보려고 인터넷을 검색해봐도 디지털 피아노는 원래 건반에서 달그닥 거리는 소리가 난다고만 되어 있을 뿐, 딱히 해결 방법은 나와있지 않다. 바닥에 매트를 깔라는 등의 얘기는 있지만, 그건 층간소음 얘기이지 건반소음 자체가 줄어드는 것은 아니다.

 

최근 코로나로 집에 있으면서 혹시라도 건반의 달그닥 소리를 줄일 수 있을까 싶어 피아노 내부를 뜯어보게 되었다. 피아노를 분해하는 것이 쉽지는 않았지만 몇 번의 시행착오를 거치면서 결국 소음의 원인을 찾았다. 그리고 지금은 문제가 해결되어 건반소음은 거의 들리지 않고 부드러운 피아노 음을 들을 수 있다. 성공이다.

 

이 글에서는 피아노 건반 소음을 줄이기 위해 나름 시도했던 방법을 소개하려 한다. 집에 있는 피아노는 CASIO(카시오) Privia PX-720 모델인데, 다른 디지털 피아노에도 적용될지는 모르겠다.

그림1. Casio Privia PX-720

 

피아노 분해/조립

 

건반 수리를 위해서는 먼저 피아노를 분해해야 한다. 그런데 내부 구조를 모르는 상태에서 제품을 분해하는 것이 쉬운 일은 아니다. 혹시나 잘못 뜯었다가 제품이 망가지지나 않을까 걱정도 되고.. 하지만, 원래 분해가 가능한 제품이니 찬찬히만 한다면 누구라도 분해할 수 있다. 나도 처음에는 막막했지만 여러 시행착오를 거치면서 4~5번 정도 뜯다 보니 지금은 눈 감고도 분해/조립이 가능할 정도로 구조가 익숙해졌다. 제품마다 차이가 있겠지만 참고로 집에 있는 피아노 분해 과정을 적어본다. 분해할 때는 항상 다시 조립이 가능하도록 분해과정을 기록(사진촬영 등)으로 남기고 나사 등을 잘 분리해서 보관해 놓는게 중요하다.

그림2. 피아노 분해

 

1. 전원선 및 스피커 케이블, 패달 케이블 분리: 연결 위치를 잘 기억/기록해 둔다

2. 발판(패달) 부위와 중간의 스피커 부위를 다리에서 분리

  - 스피커 부위를 분리할 때는 피아노를 눕혀놓고 하거나 한쪽 밑을 괴고 분해한다

  - 분해 나사는 옆면 기둥의 고무캡 안에 숨겨져 있음 (칼 등으로 고무캡 제거)

3. 본체 양쪽의 다리 분리

  - (주의)다리를 분리할 때는 피아노를 눕혀놓고 하거나 밑면을 괴고 분해한다

  - 피아노를 세워놓은 채로 옆면을 때어내면 건반 본체가 그대로 바닥으로 추락 (대형사고!!)

4. 건반 뒷판 분리: 본체 뒷면에 있는 모든 나사를 푼 후(꽤 많다) 뒷면 판자를 때어낸다

5. 건반 상판 분리: 양쪽의 나사 몇개만 풀면 쉽게 분리된다

6. 건반 덮개 분리

  - 건반에 먼지가 들어가지 않도록 손으로 당기고 밀어서 건반을 덮는 부분

  - 양쪽에 톱니가 밖으로 빠지지 않도록 방지하는 걸림쇠 부분만 제거하면 본체에서 완전 분리가 가능

  - 건반 덮개까지 분리하면 이제 건반들이 온연히 모습을 드러낸다

7. 건반 앞면 분리

  - 개별 건반들(흰색, 검은색 건반들)을 하나씩 분리하기 위해서는 건반 앞면 분리가 필수이다

  - 앞면을 분리하기 위해서는 본체 밑면에 있는 나사들 중에서 가장 앞줄에 있는 나사들을 모두 제거하면 됨

8. 개별 건반 분리

  - 건반 앞면까지 분리하면 이제 흰색, 검은색 건반들을 하나씩 빼거나 끼울 수 있다

  - 핀셋 등을 이용하면 건반을 보다 손쉽게 뺄 수 있다

 

 

건반소음 없애기

 

디지털 피아노 건반 소음의 원인을 알기 위해서는 먼저 건반의 내부구조(mechanism)를 이해할 필요가 있다. 건반의 구조는 건반을 뜯어보면 쉽게 알수 있으며 그림으로 보면 아래와 같다(그림 3). 플라스틱 건반에는 쇠로 된 무게추가 연결되어 있으며 건반을 누르면 무게추가 올라가고, 건반을 놓으면 무게추가 내려가면서 건반이 들려지는 구조이다. 그리고 무게추 끝 부분의 바닥과 윗면에는 스폰지가 덧대여 있어서 무게추가 부딧힐 때의 충격과 소음을 흡수한다.

그림3. 디지털 피아노 건반의 내부 구조 및 소음 부위

 

처음에는 건반 소음의 원인이 무게추와 스폰지 사이에서 발생한 것으로 생각했다. 즉, 피아노가 오래되면서 스폰지가 경화되고 충격을 제대로 흡수하지 못하기 때문으로 말이다. 그런데, 여러 번의 시행착오와 테스트를 거치면서 건반 소음의 원인이 다른 데에 있음을 알게 되었다.

 

파악한 건반 소음은 크게 2가지인데, 하나는 건반을 누를 때 '딱'하는 뭔가에 부딪히는 소리이고 다른 하나는 건반을 놓을 때 발생하는 '덜걱'하는 소음이다. 이 두 소음은 발생 원인도 다르고 해결 방법도 다르다.

 

A. 건반을 누를 때 나는 소음 제거

건반을 누를 때 나는 소음은 플라스틱 건반과 건반 지지대가 부딪히면서 나는 소리이다. 건반 밑에는 건반을 누를 때 너무 들어가지 않도록 하는 지지대가 있는데(그림3. 참조), 이 지지대와 건반이 부딧히면서 '딱'하는 소리가 발생한다. 그래서, 건반 지지대 위에는 원래 완충제가 발라져 있는데, 시간이 지나면서 완충제가 없어지거나 굳어서 부딪히는 소리가 나는 것이다.

 

해결 방법은 지지대 위에 완충제를 다시 발라주는 것이다. 그런데 완충제가 뭔지 모르니, 내 경우는 동네 철물점에서 파는 구리스를 이용했다(요즘 나오는 뿌리는 구리스 말고 바르는 구리스를 사야 한다). 건반 지지대마다 구리스를 듬뿍 발라주니 건반을 누를 때 나는 소음이 부드러운 소리로 바뀌었다.

 

B. 건반을 땔 때 나는 소음 제거

건반을 눌렀다가 손을 때면 건반이 올라오면서 '덜걱' 또는 '덜거덕' 하는 소리가 난다. 처음에는 올려진 무게추가 내려오면서 바닥(스폰지)에 부딪히는 소리인줄 알았다. 그런데, 자세히 들어보면 무게추가 아닌 건반 플라스틱 쪽에서 소리가 난다. 그리고 여러 테스트 끝에 이 소음이 건반과 무게추의 연결부위에서 발생하는 것임을 알게 되었다.

 

집에 있는 피아노의 건반은 무게추와 연결 부위에 홈(구멍)이 있고, 이 홈에 무게추 끝(검은색 부분)을 끼워서 건반을 누를 때 무게추를 들어올리는 구조이다. 그림 3에 보면, 건반키 중간의 튀어나온 연결부위에 무게추의 검은색 부분이 끼워져 있어서 건반을 누를 때마다 그 위치가 조금씩 들어갔다 나왔다 하는 것을 볼 수 있다. 그래서 건반키에 뚫린 홈(구멍)은 무게추가 충분히 움직일 수 있도록 어느 정도 유격(여유 공간)를 두고 크게 만들어져 있다. 그리고 이 유격으로 인해 홈(구멍)에서 건반과 무게추 검은색 부분이 부딪히는 덜걱거리는 소음이 발생한다.

 

유격으로 인해 소음이 발생하는 이유는 다음과 같다. 먼저, 건반을 누르면 무게추가 올라간다. 그리고 건반을 놓으면 무게추가 내려가면서 건반이 들어 올려진다. 그러다가 무게추가 밑면의 스폰지에 부딪히면 스폰지의 탄성에 의해 무게추가 일시적으로 튀어올랐다가 내려온다. 이 때 건반은 관성에 의해 위로 올라가는 상황이기 때문에 무게추가 튀어오르면서 검은색 돌출부가 홈(구멍) 유격의 아랫쪽과 한번 부딪히고 튀었다 내려오면서 다시 홈 윗쪽과 부딪힌다. 그리고 이로 인해 순간적으로 덜거덕 하는 소음이 발생한다.

 

원인은 알았지만 이 경우는 해결 방법이 만만치 않다. 무게추 검은색 부위에 구리스를 몽땅 발라 보았지만 큰 도움은 되지 않았다. 근본적인 해결은 연결부 홈의 유격을 줄여주는 것인데, 유격을 너무 줄이면 연결부가 빡빡해져서 건반을 누를 때 키감이 안좋아질(건반이 잘 안눌러지고 잘 안올라오는) 수 있기 때문에 적당히 줄이는 것이 중요하다. 종이를 끼울까 테이프를 붙일까 고민하다가 생각해 낸 방법은 그림 4처럼 홈의 아래쪽을 실로 감는 것이다.

그림4. 건반 실로 감기

실의 두께만큼 아래쪽 유격이 매꿔지고, 또한 실의 완충 작용으로 인해 부딪히는 소음을 줄여줄 수 있다. 키감에 영향을 주지 않는 적당한 실의 두께와 감는 횟수에 대해서는 건반 1~2개를 가지고 충분히 테스트해 본 후에 적용하면 좋다. 개인적으로는 약간 두꺼운 실(다이소에서 파는 포장용/장식용 실)을 사용해서 모든 건반의 아래쪽을 두~세번 정도 감아주었는데, 효과는 아주 탁월했고 이로 인해 건반의 덜걱거리는 소리가 완전히(?) 사라졌다.

 

피아노 모델마다 건반 구조가 조금씩 다르니 위 내용은 CASIO 피아노에만 해당될 수도 있겠다. 그리고 집에 있는 피아노는 워낙 오래된 모델이라 요즘 나오는 모델에는 이러한 문제가 개선되었는지도 모르겠다. 하지만, 피아노 모델이 다를지라도 중요한 것은 문제의 원인을 정확히 파악하는 것이다. (연구하는 것도 그렇지만) 문제의 원인만 정확히 알면 해결책은 어떻게든 찾을 수 있다.

 

 

부록1. 빠진 건반 수리하기

 

피아노를 오래 쓰다보면 건반 1~2개가 빠져서 눌러도 안 올라오는 경우가 발생한다. 사실 처음 피아노를 분해하게 된 이유도 검은색 건반 하나가 덜렁거려서이다. 건반이 빠진 이유는 건반과 연결된 무게추가 무게추 회전축에서 빠져서이다 (그림 3. 참조). 앞에서와 같이 피아노 분해에 성공하면 수리 방법은 매우 간단하다. 해당 건반을 빼낸 후 무게추를 회전축에 꼭 끼워주면 된다. 만일 검은색 건반이 고장난 경우에는 먼저 양 옆의 흰색 건반을 빼내야만 검은색 건반이 빠진다.

 

 

부록2. 구리스의 활용 (팁)

 

앞서 구리스를 이용해서 피아노를 수리하는 방법을 설명했지만, 그 외에도 다양한 활용이 가능하다. 윤활제를 이용해서 집 안에 있는 물건들을 조금만 손보면 훨씬 편리하게 사용할 수 있다. 물건이 뻑뻑하거나 마찰 소음을 줄일 때 내가 집에서 애용하는 윤활제 세트로는 양초, MD-50(방청윤활제), 뿌리는 구리스, 바르는 구리스가 있다.

 

그림5. 진공청소기 바퀴와 정수기 버튼 수리

 

A. 진공청소기 소음 없애기 (드르륵 소리)

집에서 진공청소기를 사용하다 보면 바닥에서 드르륵 거리는 소리로 꽤나 시끄럽다. 청소기 흡입구 바닥면에 달린 조그만 바퀴들(그림5)에서 나는 소리인데, 조금만 손보면 된다. 먼저, 바퀴에 달린 이물질들을 제거해 준 후 양초로 바퀴 면을 잘 초칠해 준다. 그리고 바퀴 회전축에는 구리스를 발라준다. 회전축에 구리스(바르는 구리스)를 바르면 청소할 때 바퀴의 드르륵거리는 소리가 대부분 사라진다. 그리고 바퀴면에 양초칠을 해주면 청소기를 옆으로 이동할 때 부드럽게 이동한다. 청소기 흡입구는 바퀴 방향인 앞뒤로는 잘 움직이지만 옆으로는 잘 안움직인다. 그런데, 바퀴에 초칠을 하고 윤을 내주면 바닥면과 마찰력을 줄어서 옆으로도 잘 움직인다. 청소할 때 은근히 옆으로 이동할 때가 많은데 손에 힘이 덜 들어서 청소가 한결 쉬워진다.

 

B. 뻑뻑한 정수기 버튼 수리

집에서 사용하는 정수기가 어느 날부터 버튼이 뻑뻑하고 잘 안눌러진다. 그리고 눌러도 딸각 하고 눌렀다 나오는 느낌이 없다. 원인을 찾기 위해 전면 패널을 분해해 봤지만 딱히 문제를 찾기 어려웠다. 그러다가 전원을 끄고 버튼을 계속 힘껏 눌렀다 땟다 해보니 버튼이 좀더 잘 눌려지는 느낌이 났다. 그래서 버튼 사이에 구리스를 몇 방울 흘려주니 문제가 말끔히 해결되었다. 아마도 버튼 안에서 녹이 슨 것으로 생각된다. 버튼의 틈 사이로 구리스가 잘 스며들도록 이 경우에는 뿌리는 구리스를 사용했다. MD-50과 같은 방청윤활제를 사용해도 되겠지만 방청윤활제는 기름 냄새가 나기 때문에 냄새가 거의 없는 구리스가 적합하다. 그리고, 구리스를 정수기 버튼에 직접 뿌릴 수는 없으니 위생용 비닐장갑 안에 뿌린 후 비닐장갑에 작은 구멍을 내서 버튼에 액을 떨어뜨리는 방법을 사용했다. 액을 떨어뜨릴 때는 흘러내리지 않도록 패널을 (분해해서) 위로 들고 떨어뜨리면 좋다.

 

이 외에도 스탠드 접히는 부분이 뻑뻑할 때, 의자가 잘 안밀릴 때 다리에 초칠, 밥상을 틈새에 밀어 넣을 때 틈새 바닥에 초칠하기, 안경 다리가 뻑뻑할 때 구리스 바르기 등 그 활용도는 정말 많다. 참고로 구리스나 방청윤활제(MD-50) 등은 철물점이나 문방구 등에서 몇 천원 정도면 구매할 수 있다.

 

ps. 난 아무래도 전파상을 했으면 적성에 잘 맞았을 것 같다...

 

다크 프로그래머

'잡기장' 카테고리의 다른 글

내 어깨 위 고양이, 밥  (1) 2022.05.05
글쓰기에 대해  (3) 2021.02.05
아래한글(hwp) 멈춤 현상과 파워포인트(ppt)  (36) 2018.12.22

딥러닝과 Loss 함수의 이해

기계학습 2021. 9. 15. 23:04

딥러닝.. 내겐 여전히 블랙박스 같은 존재이다. 하지만 딥러닝도 크게 보면 기계학습 방법의 하나로서 딥네트워크를 이용한 모델링과 파라미터 추정 방법으로 볼 수 있다. 그래서 전통적으로 기계학습을 연구했던 사람들은 아마도 보다 넓은 시야를 가지고 딥러닝을 이해할 수 있을 것으로 생각한다.

 

이 글은 딥러닝에 대한 나름의 이해를 정리한 글이다. Loss 함수, 파라미터 공간, 최적화 기법 등이 어떻게 딥러닝과 연결되는가 주 내용이다. 딥러닝의 세부적인 내용보다는 전체적인 틀을 바라보고 해석한 글로 볼 수 있다.

 

 

딥러닝과 파라미터 추정

 

딥러닝도 크게 보면 x에서 y로의 함수관계 fw(·)를 찾는 문제로 볼 수 있다.

x → fw(·) → y

 

이 때 함수의 구조와 복잡도를 정하는 것이 모델링 과정인데, 딥러닝에서는 어떤 네트워크 아키텍쳐를 사용할 것인지, 몇 개의 층을 사용할 것인지, activation 함수로는 무엇을 사용할 것인지 등을 정하는 것이 모델링에 해당한다. 예를 들어 아키텍쳐로는 VGG, ResNet 등을 사용할 수 있고 activation 함수로는 ReLU나 sigmoid 등을 사용할 수 있다.

 

모델이 정해지면 모델의 파라미터가 정해지는데 딥네트워크에서는 입력층과 출력층 사이에 존재하는 모든 weight들이 모델 파라미터가 된다. 모델 파라미터는 모델에 종속되어 정해지는 것으로서 예를 들어 돌맹이의 궤적을 2차 다항식 f(t) = at2 + bt + c로 근사하기로 결정했다면 모델은 2차 다항식이고 모델 파라미터는 a, b, c가 된다.

 

모델과 모델 파라미터가 정해지면 이제 남은 일은 모델 파라미터의 값을 정하는 것이다. 주어진 입력(x)에 대해 원하는 출력(y)이 나오도록 모델 파라미터 값을 조정하는 것이 목적이다. 수집된 관측값들이 (xi; yi), i = 1, 2, ..., n라면 각각의 i에 대해 최대한 yi = fw(xi)가 되도록 파라미터 값을 찾게 되는데, 이 과정이 딥러닝의 학습과정 또는 파라미터 추정 과정에 해당한다.

 

그런데, 파라미터 추정을 위해서는 먼저 파라미터의 좋고 나쁨을 판단하는 기준이 있어야 한다. 그것이 바로 loss 함수를 정하는 일이다. 앞서 과정에서 모델과 모델 파라미터가 정해지면 일종의 파라미터 공간(parameter space)이 생성된다. 이 공간의 차원은 모델 파라미터의 개수와 동일하며 아직은 차원만 정해진 빈 공간이다. 그런데, loss 함수가 정해지면 이 공간에 산맥이 생기고 골짜기가 생긴다. 즉, Loss 함수에 따라서 각 파라미터 값에 대한 score(or 손실)가 매겨지기 때문에 이 score에 따라서 파라미터 공간에 높고 낮음이 생성된다.

 

딥러닝 학습에 있어서 마지막 선택은 주어진 산맥과 골짜기의 파라미터 공간에서 어떻게 최적의 답을 찾아갈 것인가이다. 파라미터 공간이 정해지면 이미 최적의 답도 같이 정해진다. 하지만 무한한 파라미터 공간을 미리 다 evaluation 해볼 수는 없기 때문에 현실적으로는 시작 위치에서 조금씩 해를 찾아갈 수 밖에 없다. 즉, gradient descent 방법, Gauss-Newton 방법, LM 방법 등과 같은 최적화 기법(optimizer)이 필요하다.

 

※ 일반적으로는 Newton, LM 방법 등의 성능이 더 좋다. 하지만 딥러닝에서는 현실적인 이유(파라미터 공간이 너무 고차원)로 gradient descent, 특히 stochatic gradient descent 류의 방식이 주로 사용된다.

 

이상의 내용을 정리해 보면 다음과 같다.

  • 학습데이터: problem의 domain을 정의
  • 네트워크 구조: 함수의 복잡도와 power를 정의, 모델 파라미터를 정의
  • loss 함수: 파라미터에 대한 evaluation(cost)을 정의
  • optimizer: 파라미터 공간에서의 탐색 방법을 정의

 

이중 어떤 요소가 더 중요할까? optimizer는 해 자체를 바꾸지는 못하지만 optimizer에 따라 해를 잘 찾을 수도 있고 못 찾을 수도 있다. 네트워크의 구조와 복잡도를 정하는 것은 비유컨데 닭 잡는데 소 잡는 칼을 쓸 것인지 아니면 소 잡는데 닭 잡는 칼을 쓸 것인지를 정하는 문제로 볼 수 있다. 물론 적당한 규격의 칼이 좋을 것이다. 학습데이터와 loss 함수는 선택된 칼의 규격 내에서 최적의 칼이 되기 위한 기준을 잡아준다.

 

 

Loss 함수의 역할

 

Loss는 영어 단어로는 상실, 손실을 의미한다. 그리고 기계학습에서의 Loss는 어떤 학습된 모델을 실제 데이터에 적용했을 때 모델의 추정 오차로 인해 발생하는 손실을 의미한다. 학습된 모델을 fw(·), 관측 데이터를 (xi; yi)라 하자. 이 때, 입력 xi에 대한 모델 추정값과 실제 관측값 사이의 오차를 residual이라 부르며 xi에 대한 residual은 ri = yi - fw(xi)로 계산된다. Residual이 단순히 모델 추정값과 참값(관측값) 사이의 차이를 말하는 반면에, Loss는 이 차이로 인해 발생하는 실제 계산상의 손실을 의미한다. 사실 Loss는 우리가 마음데로 정할 수 있으며 예를 들어 residual의 절대값을 Loss로 정하거나(L(xi) = ‖yi - fw(xi)‖), residual의 제곱을 Loss로 할 수도 있다(L(xi) = ‖yi - fw(xi)‖2). 이 외에도 문제나 응용에 따라서 focal loss, triplet loss 등 다양한 형태의 Loss 함수 정의가 가능하다.

 

앞서 Loss 함수는 파라미터에 대한 evaluation(cost)을 정의한다고 했다. 아래 두 파라미터 추정 문제의 예를 살펴보자. 식 (1)은 일반적인 L2-norm을 Loss로 정의한 경우이고, 식 (2)는 L2-norm에 파라미터 크기를 함께 고려하여 Loss로 정의한 경우이다.

$$\min_{w} \; {\left \|  y - f_w (x) \right \|^2}\tag{1}$$

$$\min_{w} \; {\left \|  y - f_w (x) \right \|^2 \!+\lambda \left \| w \right \|^2} \tag{2}$$

그림1. Rideg Regression (그림출처: http://primo.ai/index.php?title=Ridge_Regression)

 

식 (1)과 같이 Loss를 정의하면 정답(학습데이터)에만 초점을 맞추어 파라미터를 추정하게 된다. 그런데, 파라미터 공간은 워낙 고차원이기 때문에 그림1(좌) 경우처럼 식 (1)을 만족하는 해(w)가 너무 많아서 오히려 수렴이 어려울 수도 있다.  또는 반대로 파라미터 공간이 너무 굴곡이 심해서 쉽게 발산할 수도 있다. 하지만, 식 (2)와 같이 Loss를 정의하면 가능한 해들 중에서 크기가 최소화되는 해를 찾기 때문에 그림1(우)처럼 파라미터 공간이 안정화되어 상대적으로 쉽게 해를 찾을 수도 있다.

 

※ 기계학습 분야에서는 식 (2)와 같은 regularization term을 추가한 파라미터 추정 기법을 ridge regression이라 부르는데, ridge를 추가하는 것이 아니라 제거하기 때문에 ridge regression이라 부른다.

 

위 예는 기계학습 or 파라미터 추정에서 Loss 함수가 미치는 영향을 설명하기 위한 하나의 예시이며 이 외에도 다양한 형태의 Loss 함수 정의가 가능하다. Loss 함수를 어떻게 정의하느냐에 따라서 파라미터에 대한 evaluation 즉, 학습의 지향점이 달라지기 때문에 기계학습을 한다면 한 번쯤은 Loss 함수에 대해 고민해 볼 필요가 있다.

 

※ Loss 함수가 중요하긴 하지만 그렇다고 파라미터 공간을 마음대로 바꾸는 것은 아니다. 잘 생각해보면 학습에 사용되는 관측 데이터 자체가 이미 답을 제시한다. 즉, xi에 대해서는 yi가 나오도록 하는 파라미터를 찾아라고 알려준다. 따라서, 보다 정확하게 말하면 학습 데이터는 기준점을 제시하고 Loss 함수는 기준점에서 벗어날을 때의 패널티와 부가적인 제약조건을 정의한다고 볼 수 있다. 그리고 부가적인 제약조건에 따라서 학습의 지향점이 조금씩 달라질 수 있다.

 

 

딥러닝 Loss 함수

 

마지막으로 딥러닝에서 사용되는 Loss 함수들에 대해 간단히 살펴보려고 한다. 사실 Loss 함수도 워낙 종류가 많기 때문에 대표적인 몇 가지만 살펴보도록 하자. 먼저, yolo에서는 weighted least squares loss를 사용한다. 기본적으로는 L2-norm인데 요소(추정된 box와 ground truth box와의 중심거리, 박스 크기, 박스 overlap 등)별로 다른 가중치를 적용한다. 그리고 classification 문제에서는 대부분 cross entropy loss라는 것을 사용한다. 멀티 클래스 classification 문제에서는 클래스 개수만큼의 출력층 노드가 존재하는데, 학습시 입력 데이터의 클래스에 대응되는 출력노드의 출력은 1, 그 외의 출력노드의 값은 0이 되도록 학습하는 것이 일반적이다. 만일 입력 학습데이터의 클래스가 Ci이고 Ci에 대응되는 출력노드의 출력값을 pi라고 하면 x∈Ci에 대한 cross entropy loss는 L = -log(pi)로 계산된다 (일반적으로 딥러닝에서는 출력층 값에 softmax를 적용하기 때문에 pi는 항상 0 ~ 1 사이의 값을 갖는다). Cross entropy loss를 개선한 버전들도 존재하는데, balanced cross entropy loss는 클래스간 샘플 데이터의 불균형을 해결하기 위해 희소 클래스일수록 높은 가중치를 주도록 x∈Ci에 대해 L = -1/αi * log(pi)로 Loss를 계산한다 (αi: 전체 학습 데이터들 중에서 클래스 Ci에 속하는 데이터들의 비율). 그리고 hard example에 대해 좀더 높은 가중치를 주는 focal loss도 발표된 바 있다 (“Focal Loss for Dense Object Detection.” ICCV 2017).

 

그외 얼굴인식이나 image retrieval 분야에서는 ranking loss라는 것을 사용하는데, 입력 query 영상에 대해 정답 영상들(positives)과는 거리가 가깝게 하고 정답이 아닌 영상들(negatives)과는 거리가 멀게 하도록 Loss 함수를 설계한다. 예를 들어, 얼굴인식 응용에서 철수 얼굴 영상들을 p1, p2, ..., pn, 다른 사람들의 얼굴들은 q1, ..., qm라고 했을 때, pi들끼리는 거리를 최소화하고 pi와 qj 사이의 거리는 크게 하도록 Loss 함수를 정의한다. 이러한 응용에서는 query영상과 가장 가까운 DB 영상을 정답으로 찾는 것이 목적이기 때문에 계산된 거리값(distance) 자체보다는 그 거리값들의 상대적인 순서를 맞추는 것이 중요하다(pi들끼리의 거리가 pi와 qj 사이의 거리보다 작기만 하면 된다). 그래서 ranking loss라고 부르며 그 대표적인 예로는 triplet loss나 pairwise loss 등이 있다 (ranking loss도 굉장히 많은 변형들이 있다).

 

이 글에서는 개별 Loss 함수들을 설명하는 것이 목적이 아니기 때문에 기존의 Loss 함수들에 대해서는 간단히만 설명하였다. 중요한 것은 Loss 함수의 의미를 이해하고 활용하는 것이라 생각한다. 그리고 나아가서 자신의 문제에 맞는 Loss 함수를 직접 만들 수 있다면 더 좋을 것이다.

 

by 다크 프로그래머

'기계학습' 카테고리의 다른 글

YOLO와 성능지표(mAP, AP50)  (8) 2020.09.07
YOLO 윈도우즈(windows) 버전  (64) 2017.09.01
최적화 기법의 직관적 이해  (120) 2015.06.02

상관계수와 cross correlation

수학 이야기 2021. 9. 12. 16:33

상관계수(correlation coefficient)는 통계학 쪽에서 사용되는 용어이고, cross correlation은 신호처리 분야의 용어이다. 그리고 NCC(normalized cross correlation)도 신호처리 분야 용어이다.

 

수식적으로 보면 상관계수 계산식과 NCC 계산식은 매우 유사하다 ($\bar{x}$: X의 평균, $\sigma_x$: X의 표준편차, $n$: 데이터 개수, $x_i$: i번째 관측 데이터의 X 속성 값, $f(x), g(x)$: x에서의 두 신호 값).

$$상관계수(X, Y) = \frac{1}{n} \sum_{i=1}^{n}{\frac{(x_i - \bar{x})(y_i - \bar{y})}{\sigma_x \sigma_y}}\tag{1}$$

$$NCC(f, g) = \frac{1}{n} \sum_{i=1}^{n}{\frac{f(x_i) g(x_i)}{\sigma_f \sigma_g}} \text{ or } \frac{1}{n} \sum_{i=1}^{n}{\frac{(f(x_i)-\bar{f})(g(x_i)-\bar{g})}{\sigma_f \sigma_g}} \tag{2}$$

 

그런데, 두 식이 사용되는 목적이나 응용은 조금 다르다. 상관계수(correlation coefficient)는 두 속성 or 변량의 상호 연관성을 -1 ~ +1 사이의 값으로 수치화한 것이다. 예를 들어, 키와 몸무게의 관계, 수업 참여도와 성적의 관계, 환율과 금리의 관계 등 두 변인의 연관관계를 분석하는 것이 목적이다. 반면에, cross correlation이나 normalized cross correlation은 두 신호(음성신호, 영상신호 등)의 형태적 유사성을 단지 수치적으로 계산한 것이다. 여기서 'cross'라는 용어는 이동, 교차의 의미로서 두 신호를 서로 겹쳐서 correlation을 계산하기에 붙여진 이름이다. 그리고 두 신호가 겹쳐지는 시점은 한 신호를 shift시킴으로써 다양하게 조정될 수 있다. cross correlation이 사용되는 대표적인 예로 템플릿 매칭을 생각할 수 있다. 식은 거의 같지만 적용에 있어서 어감이나 느낌은 상당히 다름을 알 수 있다.

 

이 글은 상관계수와 cross correlation에 대해 최근 깨달은 것들은 정리한 글이다. 또한, 공분산(covariance), 분산(variance), correlation과 covariance 차이, auto correlation 등 관련 용어들도 같이 정리한다.

 

사실 이 글을 쓰게 된 계기는 아내 때문이다. 아내가 요즘 '연구방법론'(객관적 연구를 위한 과학적 방법론)을 공부하면서 t-검정, 상관분석 등을 공부하고 있다. 그러면서 책을 봐도 무슨 말인지 모르겠다고 어려워한다. 그래서 이래 저래 설명해 주게 되었는데, 사실은 설명을 하면서 스스로 배우고 깨달은 것들이 더 많다. 막연하게만 알고 있던 covariance(공분산)의 의미를 다시 깨닫게 되었고 correlation과 covariance의 차이도 보다 확실히 알게 되었다. 그리고 상관계수나 공분산(covariance)에서 두 변량의 값이 서로 페어링(pairing)된 값이라는 점도 새로운 깨달음이다.

 

 

공분산(covariance)

 

데이터 분포의 평균, 분산, 표준편차는 통계에서 가장 기초적인 개념이다. 이들 중 분산(variance)은 측정된 데이터들이 평균을 중심으로 얼마나 모이고 흩어져 있는지를 나타내는 지표로서 "(편차)2의 평균"으로 계산된다 (편차 = 데이터값 - 평균). 그리고 분산에 제곱근을 취하면 표준편차가 된다.

$$Var(X) = \frac{1}{n} \sum_{i=1}^{n}{(x_i - \bar{x})^2}\tag{3}$$

$$Std(X) = \sqrt{Var(X)}\tag{4}$$

 

이 때, 한가지 주의해야 할 점은 평균, 분산, 표준편차는 데이터 분포에 대한 특성값이고, 편차는 데이터 각각에 대한 특성값이라는 점이다. 예를 들어, 전국 학생들의 키를 분석한다고 했을 때 측정된 학생들의 키의 평균은 얼마, 분산은 얼마라고 말할 수 있겠지만 데이터 각각(철수의 키, 영희의 키, ...)에 대해 평균, 분산, 표준편차가 얼마다고 말하는 것은 이치에 맞지 않는다.

 

분산이 데이터의 흩어진 정도를 나타내는 값이라면 공분산(covariance)는 어떤 의미일까? 일단, 분산이 하나의 변수(e.g. 키)에 대해 계산되는 반면에 공분산(covariance)은 두 변량(e.g. 키, 몸무게)에 대해 계산된다. 관측된 데이터가 n개일 때, 두 변수 X, Y 사이의 공분산 Cov(X, Y)는 아래와 같이 계산된다.

$$Cov(X, Y) = \frac{1}{n} \sum_{i=1}^{n}{(x_i - \bar{x})(y_i - \bar{y})}\tag{5}$$

 

식 (3)과 (5)를 자세히 살펴보자. X의 분산은 자신의 편차에 편차를 곱한 평균이다. 반면에 X와 Y의 공분산은 X의 편차에 Y의 편차를 곱한 평균이다. X의 편차에 Y의 편차를 곱한다는 말의 의미는 무엇일까? 편차는 +, - 부호를 가진 값이기 때문에 두 편차를 곱한 결과는 +일 수도 있고 -일 수도 있다. 분산(variance)는 항상 양수(0 이상)이지만 공분산(covariance) 값은 +일 수도 -일 수도 있음에 주의하자. X와 Y의 공분산은 데이터들의 X 편차와 Y 편차의 부호가 서로 같을수록 큰 +값을 갖고 부호가 서로 다를수록 -로 큰 값을 갖는다. 그리고 X의 자체 분산과 Y의 자체 분산이 클수록 X, Y의 공분산의 절대값도 증가한다.

 

공분산을 이해하기 위해서는 계산에 사용되는 두 변량의 값이 서로 페어링(pairing)된 값이라는 것을 인지하는 것이 중요하다. 식 (5)에서 보면 $x_i$에는 $y_i$가 곱해지지 $y_j$가 곱해지지 않는다. 이것이 앞서 중요하게 깨달았다고 했던 두 변량이 서로 페어링(pairing)된다는 것과 관련된다. 페어링 관점에서 보면 식 (5)에서 $x_i$는 i번째 데이터의 X 속성값, $y_i$는 동일한 데이터의 Y 속성값으로 이해할 수 있다. 예를 들어 모집단=전국학생, X=키, Y=몸무게로 생각해 보자. 그리고, 측정된 표본집단에서 키와 몸무게의 공분산을 구하는 문제를 생각해 보자. 이 때, 페어링 관점에서 철수의 키에 대해서는 철수의 몸무게와 비교하고 영희의 키는 영희의 몸무게를 비교해야지 철수의 키와 영희의 몸무게를 비교해서는 안된다. 그리고 이러한 페어링 관계는 공분산 뿐만 아니라 상관계수 계산에도 동일하게 적용된다.

 

※ 신호처리 분야에서는 2차원 평면에 점들이 있을 때 이 점들의 X좌표와 Y좌표의 공분산을 구하는 문제를 생각할 수 있다. 이 때, 각각의 점들을 데이터로 볼 수 있고 이 점들의 X좌표와 Y좌표는 서로 페어링된 값으로 볼 수 있다.

 

 

correlation과 covariance

 

두 변수의 correlation은 두 변량의 곱의 평균으로 정의된다.

$$Corr(X, Y) = \frac{1}{n} \sum_{i=1}^{n}{x_i y_i}\tag{6}$$

 

correlation이란 단어 뜻으로 보면 '상호연관'이 떠오른다. 그런데, 곱해서 합하면 왜 상호연관이 측정되는지는 언뜻 이해가 어렵다. 그런데, X의 값의 범위가 한정되어 있고 Y의 값도 범위가 한정되어 있는 경우를 생각해 보면, 곱의 합은 X의 분포와 Y의 분포가 서로 일치할수록 증가한다 (모든 i에 대해 xi = yi일 때 최대).

 

correlation은 두 데이터 분포의 유사도를 측정하는 도구로서 두 분포가 일치할 때 가장 높은 값을 갖는다. 그런데, 두 분포가 서로 위치적으로 떨어져 있는 경우에는 분포의 형태가 유사하더라도 낮은 correlation 값을 갖게 된다. 따라서, 두 분포의 형태 or 경향성의 유사도를 측정할 때에는 각 데이터 분포에서 평균을 뺀 후에 correlation을 계산하는 것이 효과적이다 (zero-normalized correlation).

$$\text{zero-normalized }Corr(X, Y) = \frac{1}{n} \sum_{i=1}^{n}{(x_i - \bar{x})(y_i - \bar{y})}\tag{7}$$

 

그런데, zero-normalized correlation 식을 보면 식 (5)의 covariance 식과 동일함을 알 수 있다. 즉, 바꾸어 말하면 covariance는 zero-normalized correlation으로 볼 수 있다.

 

그림1. 두 분포의 correlation과 covariance

※ 분야에 따라서는 correlation과 covariance의 용어가 혼용되는 경우가 많다.

 

 

상관계수와 covariance

 

상관계수(correlation coefficient)는 통계학 분야에서 나오는 용어이다. 흔히, 통계라고 하면 수학 쪽으로만 생각하기 쉬운데 통계를 '사례를 모으고 분석해서 현상을 이해하는 연구 방법론'으로 본다면 통계는 경제학, 심리학, 사회과학, 의학 등 전 분야에 걸친 방법론이다.

 

상관계수(correlation coefficient)는 두 변량 X, Y 사이의 correlation 정도를 -1 ~ +1 사이의 값으로 수치화한 척도이다 ($\bar{x}$: X의 평균, $\sigma_x$: X의 표준편차, $n$: 데이터 개수, $x_i$: i번째 데이터의 X 속성 값, $y_i$: i번째 데이터의 Y 속성 값)

$$상관계수(X, Y) = \gamma = \frac{1}{n} \sum_{i=1}^{n}{\frac{(x_i - \bar{x})(y_i - \bar{y})}{\sigma_x \sigma_y}}\tag{8}$$

 

그런데 상관계수 식을 잘 보면 식 (7)의 공분산 식과 연관이 큼을 알 수 있다. 앞서, 공분산은 zero-normalized correlation으로 볼 수 있다고 했다. 그런데, zero-normalization을 했더라도 두 분포가 가지고 있는 값의 크기의 스케일(scale)에 따라서 correlation 값이 달라질 수 있다. 따라서 순수하게 상관도만 분석하기 위해서는 각 분포의 스케일을 1로 정규화한 후에 correlation을 계산할 필요가 있으며 이렇게 정규화된 두 분포의 상관도를 계산한 것이 상관계수(correlation coefficient)이다. 여기서 scale이란 값의 단위 또는 크기의 범위를 말한다. 예를 들어, 한국 중학생들의 키와 몸무게의 상관도를 분석하기 위해 키는 미터(meter) 단위로 몸무게는 킬로그램(kg) 단위로 측정했다고 하자. 그러면 평균을 보상한 키는 -0.3 ~ 0.3 m 사이의 값을, 몸무게는 -20 ~ 20 kg 사이의 값을 가질 것이다. 이렇게 값의 단위가 서로 다른 두 변량을 그대로 correlation을 취하면 그 결과는 예측이 힘들며 분석도 어렵게 된다. 하지만, 각 변량을 표준편차로 나누어 정규화한 후에 correlation을 계산하면 그 결과는 항상 -1 ~ +1 사이의 값을 갖게 된다 (Why? Cauchy-Schwarz inequality).

 

정리하면 상관계수(correlation coefficient)는 평균과 스케일을 보상한(평균은 0으로, 표준편차는 1이 되도록 정규화한) 후 계산한 두 변량의 correlation이다.

 

상관계수 계산값 r은 항상 -1 ~ +1 사이의 값을 가지는데, r>0이면 양의 상관관계(X가 클수록 Y도 증가), r<0이면 음의 상관관계(X가 클수록 Y는 작은 값), r = 0이면 X, Y가 서로 아무 관계가 없다는 것을 의미한다. 그리고 상관계수를 계산할 때 두 변량이 항상 페어링(pairing)된다는 점도 잊어서는 안된다.

그림2. 상관계수의 해석

 

상관계수의 해석: (댓글을 읽다보니 상관계수의 의미에 대해 오해가 있을 수 있겠다 싶어서 내용을 덧붙입니다) 상관계수가 높다는 것은 두 대상의 경향성이 유사하다는 것이지 값이 같다는 의미는 아니다. 예를 들어, 예측값과 관측값의 상관계수를 계산한다고 했을 때, 예측된 값이 40, 50, 60일 때 실제 관측된 값이 90, 100, 110이라고 해 보자. 이 경우 예측값과 실제값은 상당한 오차가 있다. 하지만 상관계수를 계산해 보면 매우 높은 값을 갖는다. 상관계수는 평균과 스케일(표준편차)을 정규화한 후에 계산하기 때문이다. 따라서, 응용에 따라 경향성 뿐만 아니라 값 자체도 유사해야 한다면 식 (6)처럼 평균, 표준편차 차이를 제거하지 말고 원본 값에 대해 correlation을 계산해야 한다.

 

 

cross correlation과 correlation

 

이제 신호처리 분야로 돌아와 보자. 사회과학, 심리상담학, 경제학 등에서의 correlation 분석은 두 변인 사이의 상호 연관도를 분석하기 위한 것으로서 그 데이터 값들이 서로 페어링(pairing)된 것이 특징이다. 반면에, 신호처리 분야에서는 단지 두 신호가 얼마나 형태적으로 유사한지를 수치적으로 계산한 것이다. 그리고 두 신호를 서로 겹쳐서 계산하기 때문에 cross correlation이라 부르며 두 신호를 어떻게 겹치는지(displacement)에 따라서 pairing 관계가 달라진다.

 

연속된 두 신호 f(t), g(t)가 있을 때 cross correlation은 일반적으로 다음과 같이 정의된다 ($\tau$는 displacement 파라미터).

$$f \star g(\tau) = \int_{-\infty }^{\infty } f(t) g(t+\tau) dt \tag{9}$$

 

그리고 이를 이미지 프로세싱에 적용하면 영상신호 f(x,y)와 템플릿 t(x,y)에 대해 cross correlation을 아래와 같이 계산할 수 있다.

$$\frac{1}{n} \sum_{x,y} f(x,y)t(x,y) \tag{10}$$

 

만일 영상 밝기 차이를 보상한 후에 correlation을 구하고 싶다면 아래와 같이 계산할 수 있다 (zero-normalized cross correlation).

$$\frac{1}{n} \sum_{x,y} (f(x,y) - \bar{f})(t(x,y) - \bar{t}) \tag{11}$$

 

또는 아래와 같이 각각의 신호를 표준편차로 나누어 스케일 차이를 보상한 normalized cross correlation을 구할 수도 있다.

$$NCC = \frac{1}{n} \sum_{x, y} \frac{f(x, y)t(x, y)}{\sigma_f \sigma_t} \tag{12}$$

 

그리고 평균과 스케일을 모두 보상한 normalized cross covariance를 구할 수도 있다 (계산 결과는 -1 ~ +1 사이의 값을 갖는다).

$$\frac{1}{n} \sum_{x, y} \frac{(f(x, y) - \bar{f})(t(x, y) - \bar{t})}{\sigma_f \sigma_t} \tag{13}$$

 

한 가지 하고 싶은 말은 용어나 수식에 너무 집착하지 말자는 것이다. 정말 중요한 것은 그 '의미'이다. NCC 식은 식 (12)가 맞겠지만 식 (13)을 NCC로 사용해도 큰 문제는 없다. 의미만 알면 자신이 원하는 목적에 맞게 식을 골라 쓰거나 변형해서 사용할 수 있다.

 

마지막으로 신호처리 분야에 auto correlation이라는 게 있다. auto correlation은 서로 다른 두 신호가 아니라 자신과 자신을 correlation하는 것을 의미한다.

$$f \star f(\tau) = \int_{-\infty }^{\infty } f(t) f(t+\tau) dt \tag{14}$$

 

by 다크 프로그래머

'수학 이야기' 카테고리의 다른 글

수학 과외  (17) 2022.06.22
벡터 외적을 이용한 직선의 교점 구하기  (0) 2020.09.10
구구단 암산법  (4) 2018.10.08