Channel random seed와 Noise random seed는 다르게..

Deep Learning Based MIMO Communications
Timothy J. O'Shea, Tugba Erpek, T.Charles Clancy
[Online] arXiv:1707.07980


위 논문은 사실 나온 지는 꽤 됐다. 딱 작년 이맘쯤?
Autoencoder를 응용한 MIMO encoding-decoding 기법을 다루는데, 논문을 자세히 보면 알겠지만 기존 optimal이라고 잘 알려지고 그렇게 믿어왔던 scheme 보다 성능이 뛰어난 예를 몇 가지 볼 수 있다. (Learning이 잘 된 case에 대해서)

예를 들어 기존 MRC와 Alamouti 같은 경우는 두 안테나에서 보내는 신호를 각각 equal power로 쏜다는 가정 하에서 optimal한 detection 방법을 찾았다.

반면 이 논문에서 제안하는 Autoencoder는 두 신호의 송신 power를 적당하게 unequal 하게 하는 transceiver 방법을 배우게 된다고 한다.


<Alamouti와 Autoencoder (tuning 안된) 성능 비교 (출처: arXiv:1707.07980)>

위 결과는 Alamouti와 Autoencoder의 BER 성능 비교이다.
저자가 말하기를 이 실험에서 Autoencoder가 tuning이 제대로 되지 않았다고 하는데, 특히 low SNR 부분에서 조금만 더 손 보면 나아질 가능성이 있어보인다.
물론 tuning 자체가 엄청난 노력이 필요한 일이지만.


여하튼 이러한 흥미로운 일이 있는데 1년 전이라 그런지 벌써 먼 옛날 논문 처럼 느껴진다. 요즘 워낙 세상이 빠르게 변하니까 ㅜㅜ
이 논문도 한동안 봐야지 봐야지 하다가 이제서야 reproduce를 시작하게 되었는데..

창피하지만 Alamouti랑 MRC 짜느라 며칠을 버렸다...

내가 처음 Alamouti랑 MRC 실험한 때는 2013년 상반기에 학부 졸업논문을 쓸 시기였다.
그때는 사실 STBC의 orthogonality, rate-1 code 및 power normalization 등등 에 대한 개념이 없어서 그런 것들을 머리 속에 탑재하면서 코딩하느라고 많이 힘들었다.
그런 입장에서 보면 지금은 사실 Alamouti와 MRC는 전혀 하루 종일 붙잡고 있을 코딩이 아니다.

그런데 왜 박사를 졸업하는 이 시점에서 나는 Alamouti와 MRC 때문에 며칠을 버렸나?
며칠을 삽질하다가 드디어 오늘 잠에서 깨자마자 문득 떠오른 생각이 있었는데, 그 부분을 바꾸니 정말 귀신 같게 모든 것이 해결됐다...
(오류의 원인을 찾은 내 자신에 대해 너무 기쁘지만 또 동시에 너무 창피하다..ㅋㅋ)

사실 오류의 근원은 내가 학위 과정을 하면서 중요하게 생각했던 매 data sample마다 random seed를 fix 시키는 과정에서 나왔다.

보통 통신 쪽에서는 채널에 따라 성능 품질이 오르락 내르락 하기 때문에 평균적인 성능을 살펴보는 것이 중요하다.
따라서 어떤 특정 변수의 영향을 보고 싶을 때 변수도 바꾸고, 또 동시에 채널도 매 순간 random으로 설정하면 적은 양의 data sample 가지고는 smooth 한 성능 그래프를 얻기 힘들다.
특히 bit error rate의 경우 10^-5의 error를 찍으려면 적어도 10^7 정도의 data sample은 돌려봐야 제대로 smooth 하게 찍힌 성능 그래프를 얻을 수 있을 것이다.

따라서 비교적 적은 data sample 양을 가지고 하나의 특정 변수 변화에 따른 성능 변화만 확인하고 싶으면 매 data sample 마다 채널은 random seed를 통해 고정시킨 후에 해당 변수에 대한 성능 변화를 확인하는 것이 일반적이다.
그래서 나 같은 경우 보통 channel realization에 해당하는 random seed 값을 모든 sub function에 넣는 편이다.

그런데..
이 매 실험마다 fix 시킨 'master' random seed가 channel을 생성하는 sub function에도 들어가고 noise를 생성하는 sub function에도 들어가다보니 channel coefficient와 noise 값이 같아지는 상황이 발생한 것...

한 마디로 말해 channel과 noise가 서로 correlation이 1이 되어버리게 된 것이다.
서로 independent하고 random이어야 되는데 이렇게 서로 관계가 생기다 보니 detection이 더 잘되어버림.

이 작은 실수를 바꾸니 모든 것이 해결 됐다!
즉, channel sub function과 noise sub function에 서로 다른 random seed를 넣어 줌으로써 해결


후..
이제 최종 boss Autoencoder를 짜볼까..?

Comments