이번 학기에 [자성재료]라는 전공수업을 듣게 되었는데요. 이 과목에서는 특이하게도 총 3번의 팀프로젝트를 진행합니다. 교수님께서 문제와 실험 조건을 알려주시면, 그에 맞게 직접 실험을 설계, 수행, 발표를 하는데요. 이번 게시글에서는 첫번째 팀 프로젝트에서 제가 맡은 간단한 시뮬레이션(?) 프로그램을 만든 경험에 대해 정리해보고자 합니다.
제가 Simulator를 만들어보게된 이유는 ‘위 문제들을 프로그래밍으로 한 번 구현하고 해결해보자!‘에서 시작했습니다. 1번 문제의 경우 엑셀을 이용해도 쉽게 구할 수 있지만, 문제 2번의 경우에는 엑셀만으로는 최적의 해를 구하기 어렵다고 판단했는데요. 따라서, 문제 2번의 최적화된 해를 구하기 위해 Simulator를 만들게 되었습니다.
저희는 Biot-savart law로 구한 위 수식을 바탕으로 모델을 개선해나갔습니다. 해당 수식은 전선의 두께를 고려하지 않고 매우 얇다고(~0) 가정한 식입니다. (이론에 대한 자세한 내용은 다음 글을 참고해주세요.)
실제 실험에서는 코일이 x축 방향 뿐만 아니라 y축 방향으로도 감기며, 전선의 두께에 의해 코일을 감을수록 측정부로부터 x축, y축 방향으로 멀어진다는 것을 반영해야합니다.
최종적으로 Simulator에서 사용한 모델은 다음과 같습니다.
1) 단일 코일 모델
Wire의 Diameter, Coil의 x축 y축 감은 개수를 고려한 모델
코일의 시작점을 코일의 반지름(r) + 와이어의 반지름(R)로 설정
솔레노이드 안 코일의 거리는 와이어의 지름(D)만큼 떨어짐
변수
a1: 코일의 반지름
n_x: x축 방향으로 코일을 감은 수
n_y: y축 방향으로 코일을 감은 수
R, D : 전선(Wire)의 반지름과 지름
x : 코일 중심으로부터 떨어진 거리
2) 최적화에서 사용한 Helmholtz Coil 모델
코일이 두개이기 때문에 코일1과 코일2 식을 합쳤다. (1)번 식과 다른점은 각 코일의 반지름, 감은 수가 다르고, 두 코일 사이의 거리(d)를 고려해야한다.
변수
a1, a2: 두 코일의 반지름
d : 두 코일 사이의 반지름
n_x1, n_y1 : 첫 번째 코일의 x/y축 방향 감은 횟수
n_x2, n_y2 : 두 번째 코일의 x/y축 방향 감은 횟수
3) 데이터 분석에서 사용한 Modified Helmholtz coil 모델
2)번의 모델에서 마지막 층의 x축 방향으로 Coil을 감은 개수(α)를 추가로 고려한 모델
1. 최적화와 데이터 분석에서 다른 모델을 사용한 이유는? 실험을 진행하면서 추가로 코일을 감거나 줄이는 경우가 발생했습니다. 이에 대응하기 위해 마지막 층의 x축 방향의 Coil 감은 개수를 따로 고려한 모델을 사용했습니다. 최적화 과정에서는 alpha 를 추가하면 최적화 도구가 찾아야할 범위가 증가하기 때문에 α 를 고려하지 않았습니다. 2. 1번(단일 코일)의 모델을 2, 3 번 (두 코일)로 확장한 것입니다.
Bayesian Optimization은 매 회 새로운 hyperparameter 값에 대한 조사를 수행할 시 ‘사전 지식’을 충분히 반영하면서, 동시에 전체적인 탐색 과정을 체계적으로 수행할 수 있는 방법론입니다. 이는 어느 입력값 x를 받는 미지의 목적 함수(objective function) f(x)를 상정하여, 그 함숫값 f(x)를 최대(최소)로 만드는 최적해 x를 찾는 것을 목적으로 합니다. 본 실험에서는 베이지안 최적화 기법을 이용하여 8개의 하이퍼 파라미터 최적해를 가능한 한 적은 수의 입력값 후보들에 대해서만 그 함숫값을 순차적으로 조사하고, 손실함수(목적 함수)를 최소로 만드는 최적해를 빠르고 효과적으로 찾는 것이 주요 목표라고 할 수 있습니다. (Bayesian Optimization 에 대한 자세한 내용은 다음 글을 참고해주세요.)
3) 목적 함수(손실 함수)
본 실험에서는 MSE(Mean Squared Error)를 목적 함수로 사용하였습니다. MSE 값이 최소화되는 하이퍼 파라미터 값을 찾습니다. 여기서 MSE 값이 작다는 것은 모델값이 직선에 가깝다는 것을 의미합니다.
4) 베이지안 최적화 구현
베이지안 최적화를 구현하기 위해 hyperopt 라이브러리의 tpe 알고리즘 (베이지안 최적화 알고리즘 surrogate 모델 중 하나)을 사용하였습니다.
이번 프로젝트는 수식을 바탕으로 모델을 구현하여 물성(자기력)을 예측해보고, Optimizer를 이용해 최적화된 해를 찾는 측면에서 굉장히 뜻깊은 경험이었네요 ㅎㅎ
실제 프로젝트 발표에서는 시간 관계상 시뮬레이터를 보여주지 못해서 아쉬웠네요 ㅠㅠ.. 그리고 교수님의 날카로운 질문들(ex. 오차 그래프를 보여준 이유 등)에 굉장히 당황했었고 소중한 피드벡(발표자료에는 표를 웬만하면 넣지 않기)들이 기억에 남네요. '단순히 데이터가 이렇게 나왔습니다!'에서 끝나는 것이 아니라 데이터들이 왜 이렇게 나왔는지 깊이 생각해보는 것이 더 중요하다라는 것을 뼈저리게 느꼈습니다. 다시 한번 이론(+분석)의 중요성과 발표 전달력(어떻게 하면 다른 사람들을 쉽게 이해시킬 수 있을까?)에 대해 돌아보게된 시간이었습니다.