Idealim
article thumbnail

이번 학기에 [자성재료]라는 전공수업을 듣게 되었는데요. 이 과목에서는 특이하게도 총 3번의 팀프로젝트를 진행합니다. 교수님께서 문제와 실험 조건을 알려주시면, 그에 맞게 직접 실험을 설계, 수행, 발표를 하는데요. 이번 게시글에서는 첫번째 팀 프로젝트에서 제가 맡은 간단한 시뮬레이션(?) 프로그램을 만든 경험에 대해 정리해보고자 합니다.

1. 문제 정의 및 개발 동기

1-1. 문제 정의

이번 프로젝트 문제는 크게 단일 코일과 Helmholtz Coil(2개의 코일)를 우리가 원하는 H(Magnetic Field Strength) 값을 얻도록 설계하는 것입니다. (단, 설계조건은 1A 이하, 코일의 지름 5cm 이상)

Problem 1. 단일 코일 디자인

  • 코일 중심부의 자기력(Magnetic field Strength)이 24~26Oe 사이로 설계
  • 코일의 끝부터 거리에 따른 H 구하기

Problem 2. Helmholtz Coil 디자인

  • 25~10 Oe 까지 선형으로 변하는 최적의 Helmholtz Coil 설계

1-2. 개발 동기

제가 Simulator를 만들어보게된 이유는 ‘위 문제들을 프로그래밍으로 한 번 구현하고 해결해보자!‘에서 시작했습니다. 1번 문제의 경우 엑셀을 이용해도 쉽게 구할 수 있지만, 문제 2번의 경우에는 엑셀만으로는 최적의 해를 구하기 어렵다고 판단했는데요. 따라서, 문제 2번의 최적화된 해를 구하기 위해 Simulator를 만들게 되었습니다. 

2. Helmholtz Coil Simulator

2-1.Simulator 목적

Simulator의 목적은 크게 다음과 같습니다.

1. 코일의 Magnetic Field Strength(H)를 구하는 수식을 모델(코드)로 구현

코일의 H를 구하는 여러 수식을 모델(코드)로 구현하고, 비교분석을 통해 모델을 개선해나갑니다.

2. Helmholtz Coil (문제 2)의 하이퍼 파라미터(실험 변수) 최적화하기
Bayesian 최적화 기법을 통하여 실험에서 최대 8개의 최적화된 하이퍼 파라미터를 찾습니다.

3. 모델(이론)값과 실험값 분석하기
최소자승법을 이용하여 실험값이 직선에 얼마만큼 가까운지 평가하고, 이론값과 실제값을 비교분석합니다. 추가적으로 오차가 얼마만큼 발생했는지도 확인합니다. 

2-2. Simulator 에서 사용한 Model

원형 도선에 의해 생기는 자기장

저희는 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 번 (두 코일)로 확장한 것입니다.

3. 베이지안 최적화 기법을 이용한 하이퍼 파라미터 최적화

1) 실험에서의 하이퍼 파라미터

실험에서 최적화할 하이퍼 파라미터(변수)는 다음과 같습니다.

  • 두 코일의 반지름 (a1, a2)
  • 코일간의 거리(d)
  • 코일의 x축 방향, y축 방향 감은 개수 (N_x1, N_x2, N_y1, N_y2)

2) 베이지안 최적화 기법이란?

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 모델 중 하나)을 사용하였습니다.

4. Simulator 사용법

 

GitHub - Idealim/Helmholtz-coil-simulator-streamlit

Contribute to Idealim/Helmholtz-coil-simulator-streamlit development by creating an account on GitHub.

github.com

시뮬레이터의 소스 코드와 설치 방법은 위 github 사이트를 참고 부탁드립니다.

시뮬레이터는 크게 모델의 이론값을 계산하는 Calculator, 최적화된 하이퍼 파라미터를 찾는 Optimizer, 실험값과 모델값을 분석하는 Data Analysis 페이지로 나뉩니다. 각각의 페이지 사용방법을 자세하게 다뤄보겠습니다.

4-1. 코일의 모델값 계산하기

사이드바에 있는 Calculator 버튼을 클릭하면 해당 창이 뜨는데요. 각 변수에 맞는 값을 입력하고 실행버튼을 클릭하면 이론값과 그래프를 출력합니다.

참고로 단일 코일(문제 1)에 대한 모델값을 출력하고 싶으면 'Helmholtz Coil 추가하기'의 n_x2, n_y2를 0으로 설정하면 됩니다.

추가로 저희 팀은 코일의 중심부를 위 그림처럼 빨간 좌표로 생각하였습니다. 

4-2. 베이지안 최적화 도구로 최적의 실험 변수 찾기

최적화 페이지입니다. 상당히 복잡(?)하게 생겼는데요. 사용방법에 대해 자세하게 알아보겠습니다.

1) 베이지안 최적화 도구로 찾은 변수 범위(Range), 단위(Step) 지정

먼저, 최적의 해의 단위를 정합니다. ex) 0.5 설정 → 설정한 범위 안에서 해를 0.5 단위 스텝으로 해를 찾습니다.

다음으로 각 변수별로 최적의 해를 찾을 범위를 지정합니다. 해당 범위 안에서 최적의 변수를 찾습니다.

만약 값을 고정하고 싶으면 위 사진처럼 고정하기 체크박스를 선택 후, 값을 입력합니다.

2) 전선 반지름 설정

전선의 반지름 값을 입력합니다. 

 

 


참고로 0.001 단위는 반올림되어 표시되기 때문에 '설정한 하이퍼파라미터 값'에서 R이 제대로 입력되었는지 확인해주세요.
또한 '변수 중에 전류가 없네?'라고 생각하실 수 있는데 전류를 1A로 가정하고 계산을 진행했습니다.

3) 최적화 도구 변수 설정 

모델값을 얼마의 간격으로 계산할지 설정합니다. 값이 작을수록 데이터 개수가 증가합니다.

다음으로 해를 찾는 과정을 몇 번 반복할지 설정합니다.

  • 고정하지 않은 변수들이 많다면 반복횟수를 높이는 것을 추천드립니다.
  • 반복횟수가 증가할수록 정확도가 높아질 수 있습니다. 단, 소요 시간은 증가합니다.

4) 설정한 변수값 확인 및 결과 확인

설정된 파라미터를 확인하여 자신이 설정한 값이 맞는지 확인합니다. (변수명이 좀 다를텐데 설정한 변수 순서와 같다고 보면 됩니다 ex. r1 = a1) 그 후 실행 버튼을 클릭하면 결과를 출력합니다.

출력 결과는 다음과 같습니다.

  • 최적의 그래프와 예측값
  • 최적의 파라미터, 손실값

4-3. 데이터 분석하기

데이터 분석 페이지는 최소자승법으로 실험값의 추정선을 구하는 부분모델(이론)값과 실험값을 비교하는 부분으로 나뉩니다.

결과 예시

1) 최소자승법으로 실험값의 추정선 구하기

해당 입력칸에 맞는 값을 넣어주면 결과를 얻을 수 있습니다.  

2) 실험값 vs 모델값

실험값과 모델값을 비교하기 위해서는 1)에서 입력된 실험값이 있어야 합니다.

모델의 변수를 설정하면 위 그림과 같은 결과를 얻을 수 있습니다. 

3) 퍼센트 오차

각 실험값별 퍼센트 오차를 출력합니다. 

추세선의 퍼센트 오차는 |(실험값-추세선 값)/추세선값|으로 계산됩니다.

반면, 모델의 퍼센트 오차는 |(실험값 - 모델값)/모델값]으로 계산됩니다.

Project 후기

이번 프로젝트는 수식을 바탕으로 모델을 구현하여 물성(자기력)을 예측해보고, Optimizer를 이용해 최적화된 해를 찾는 측면에서 굉장히 뜻깊은 경험이었네요 ㅎㅎ

실제 프로젝트 발표에서는 시간 관계상 시뮬레이터를 보여주지 못해서 아쉬웠네요 ㅠㅠ.. 그리고 교수님의 날카로운 질문들(ex. 오차 그래프를 보여준 이유 등)에 굉장히 당황했었고 소중한 피드벡(발표자료에는 표를 웬만하면 넣지 않기)들이 기억에 남네요. '단순히 데이터가 이렇게 나왔습니다!'에서 끝나는 것이 아니라 데이터들이 왜 이렇게 나왔는지 깊이 생각해보는 것이 더 중요하다라는 것을 뼈저리게 느꼈습니다. 다시 한번 이론(+분석)의 중요성과 발표 전달력(어떻게 하면 다른 사람들을 쉽게 이해시킬 수 있을까?)에 대해 돌아보게된 시간이었습니다. 

긴 글 읽어주셔서 감사합니다.

참고자료

1. [BAYESIAN OPTIMIZATION 개요: 딥러닝 모델의 효과적인 HYPERPARAMETER 탐색 방법론 (1)]

 

반응형
profile

Idealim

@Idealim

읽어주셔서 감사합니다. 잘못된 내용이 있으면 언제든 댓글로 피드백 부탁드립니다.