머신러닝 데이터셋 생성
이 장에서는 OghmaNano를 사용하여 머신러닝 데이터셋을 생성하는 방법을 설명합니다. 일반적으로 이러한 데이터셋은 학습, 추론 또는 예측을 위해 TensorFlow와 같은 외부 프레임워크를 사용하여 내보내고 처리합니다.
1. 소개
모델링을 사용하여 실험 데이터로부터 물리적 장치 매개변수를 추출하는 것이 종종 바람직합니다. 예를 들어, 여러 JV 곡선이 주어졌을 때 장치의 전하 캐리어 이동도와 재결합 속도를 결정하고자 할 수 있습니다. 전통적으로 이는 OghmaNano와 같은 물리 기반 모델을 데이터에 피팅하여 달성합니다 (이는 피팅 튜토리얼에 설명되어 있습니다). 이 접근법의 단점은 단일 데이터셋을 피팅하는 데도 시간이 많이 걸릴 수 있으며, 여러 데이터셋을 분석해야 할 경우 난이도가 크게 증가한다는 점입니다. 피팅 과정은 복잡하며, 일반적으로 수치 시뮬레이션에 대한 상당한 전문 지식과 많은 수작업 개입이 필요합니다. 결과적으로, 상세한 장치 피팅은 커뮤니티의 비교적 소수의 사용자만 수행합니다.
보다 현대적인 접근 방식은 머신러닝을 사용하는 것입니다. 단일 JV 곡선을 직접 피팅하는 대신, 먼저 장치 구조를 나타내는 시뮬레이션을 구성합니다. 개별 전기 매개변수를 최적화하는 대신, 이 장치의 수천 개 복사본을 무작위로 선택된 매개변수 값으로 생성합니다. 이러한 각 인스턴스를 가상 장치라고 합니다. 그런 다음 OghmaNano와 같은 시뮬레이션 프로그램을 사용하여 각 가상 장치에 대한 JV 곡선을 생성하고, JV 곡선과 그에 대응하는 전기 매개변수로 구성된 데이터셋을 생성합니다. 이 데이터는 JV 특성으로부터 전기 매개변수를 직접 예측하는 머신러닝 모델을 학습시키는 데 사용할 수 있습니다. 이 프레임워크에서 OghmaNano는 전기 매개변수를 시뮬레이션된 실험 데이터로 매핑하는 정방향 변환 역할을 하며, 머신러닝 모델은 역변환을 제공합니다. 일단 학습되면, 이 모델은 실제 장치로부터 재료 매개변수를 추출하는 데 적용할 수 있습니다.
이 접근법의 핵심 장점은 머신러닝 모델이 한 번 학습되면 사용자가 수치 시뮬레이션의 전문가가 아니어도 실험 데이터로부터 수 초 내에 재료 매개변수를 추출할 수 있다는 점입니다. 그러나 이 방법의 성공은 대규모의 고품질 학습 데이터셋 생성에 결정적으로 의존합니다. OghmaNano를 사용하여 이러한 데이터셋을 구성하는 과정은 다음 페이지들에서 설명됩니다.
2. 예제 열기
이 페이지에서 설명하는 예제는 메인 창의 New simulation 버튼을 통해 접근할 수 있습니다. 이 버튼을 누르면 ??에 표시된 New simulation 브라우저가 열립니다.
사용 가능한 시뮬레이션 카테고리 목록에서 Machine learning을 더블 클릭하여 머신러닝 예제 목록을 표시합니다 (??). PM6:Y6 ML example을 선택하면 이 장에서 설명하는 장치와 워크플로에 해당하는 사전 구성된 시뮬레이션이 로드됩니다.
한 번 열리면, 이 시뮬레이션은 이 섹션 전체에서 사용되는 것과 동일한 장치 구조 및 자동화 구성을 제공하며, 추가 설정 없이도 머신러닝 학습 데이터를 직접 생성하는 데 사용할 수 있습니다.
3. 시뮬레이션 및 출력 벡터 정의
예제 시뮬레이션을 열면, 그림 ??에 표시된 메인 시뮬레이션 창이 나타납니다. 이 창에는 이 장 전체에서 사용되는 완전히 구성된 장치 구조가 표시됩니다. Automation 리본에는 파란색 원형 기호로 표시되는 Machine learning 아이콘이 보입니다. 이 아이콘을 클릭하면 그림 ??에 표시된 메인 머신러닝 제어 창이 열립니다. 이 창에서 머신러닝 학습 데이터의 생성이 구성되고 실행됩니다.
이 창의 주요 목적은 머신러닝 알고리즘 학습을 위한 대규모 데이터셋을 생성하는 것입니다. 이 예제에서 생성되는 데이터셋의 이름은 example입니다. 처음 표시되는 탭은 Simulations 탭이며, 각 가상 장치에 대해 수행되는 시뮬레이션 집합을 정의합니다. 이 경우 dark JV 곡선 하나와 0.0001 Suns에서 1.0 Suns까지의 광 강도를 갖는 아홉 개의 illuminated JV 곡선이 시뮬레이션됩니다. 개별 시뮬레이션은 Enabled 토글을 사용하여 활성화하거나 비활성화할 수 있습니다. Patch 열에서 \(light\_0.0001\) 항목의 Edit 버튼을 클릭하면, ??에 표시된 Patch window가 열립니다.
Patch window의 목적은 가상 시뮬레이션 내부의 매개변수를 수정하는 것입니다. 이 예제에서는 동일한 기본 장치 구조를 사용하여 서로 다른 조명 조건에서 여러 JV 곡선을 생성합니다. 이를 위해 각 시뮬레이션마다 광 강도를 독립적으로 조정해야 합니다. \(light\_0.0001\)에 대한 patch 창을 열면, 조명 강도를 제어하는 시뮬레이션 매개변수 optical/light/Psun이 \(0.0001\)로 설정되어 있음을 볼 수 있습니다. dark 시뮬레이션의 경우 동일한 매개변수는 \(0.0\)로 설정됩니다. 이와 같이 여러 실험 조건을 하나의 기본 시뮬레이션을 사용하여 일관되게 시뮬레이션할 수 있습니다.
Vectors 창은 완료된 시뮬레이션으로부터 어떤 데이터를 추출하여 머신러닝 입력 벡터를 구성할지 정의합니다. 이 예제에서는 시뮬레이션된 전류–전압 특성을 포함하는 파일 \(jv.dat\)로부터 −2.0 V와 1.4 V 사이의 데이터 포인트를 추출합니다. 시간 영역 시뮬레이션의 경우 사용자는 대신 \(time\_i.csv\) 또는 다른 적절한 출력 파일로부터 데이터를 추출할 수 있습니다. 각 입력 벡터를 구성하는 데 사용되는 포인트 수는 사용자가 선택합니다. 더 긴 벡터는 학습의 계산 비용을 증가시키지만 JV 곡선의 더 자세한 특징을 포착할 수 있습니다.
4. 무작위 변수 정의
다음 단계는 어떤 모델 매개변수를 무작위화할지 정의하는 것입니다. 이는 메인 머신러닝 창의 Random variables 탭을 사용하여 수행합니다. 테이블에는 다섯 개의 열이 있습니다. Enabled 열은 해당 매개변수가 무작위화 과정에 포함되는지 여부를 결정합니다. Variable 열은 어떤 시뮬레이션 매개변수가 변화하는지를 지정합니다. Min 및 Max 열은 매개변수 범위의 하한과 상한을 정의하고, Random function 열은 값이 선형 분포 또는 로그 분포에서 추출되는지를 지정합니다.
여러 자릿수 범위를 가지는 매개변수에는 로그 분포를 권장하며, 비교적 좁은 범위에서 변화하는 매개변수에는 선형 분포가 적절합니다. 로그 분포를 사용하면 로그 스케일에서 보았을 때 값이 균등하게 샘플링되며, 범위의 상단에 몰리지 않습니다. 예를 들어 적절한 선형 매개변수는 Urbach 에너지이며, 이는 일반적으로 30에서 150 meV 사이에서 변화합니다. 반대로 트랩 밀도는 \(1 \times 10^{15}\,\mathrm{m^{-3}}\)에서 \(1 \times 10^{25}\,\mathrm{m^{-3}}\)까지 변화할 수 있으므로 로그 샘플링에 잘 맞습니다.
5. 시뮬레이션 수 정의
시뮬레이션 구성이 완료되면, 다음 단계는 무작위화된 매개변수를 갖는 몇 개의 가상 장치를 생성할지 결정하는 것입니다. Settings window를 열면 (참조 18.6) 두 개의 매개변수, Simulations per archive (\(N_{\mathrm{sim}}\))와 Number of archives (\(N_{\mathrm{arc}}\))를 사용하여 이를 제어할 수 있습니다. 생성되는 가상 장치의 총 개수는 \(N_{\mathrm{sim}} \times N_{\mathrm{arc}}\)로 주어집니다.
시뮬레이션 결과는 archives라고 하는 ZIP 파일에 기록되며, 각 archive에는 \(N_{\mathrm{sim}}\)개의 가상 장치가 포함됩니다. 여기 표시된 예제에서는 \(N_{\mathrm{sim}} \times N_{\mathrm{arc}} = 3000\)개의 가상 장치가 생성되어 100개의 archive 파일에 저장됩니다. 이 예제에서는 각 가상 장치가 하나의 dark JV 시뮬레이션과 아홉 개의 illuminated JV 시뮬레이션으로 구성된다는 점을 주의해야 합니다. 그 결과 총 출력 파일 수는 매우 빠르게 증가할 수 있습니다.
이를 관리하기 위해 데이터 생성은 배치 단위로 수행됩니다. \(N_{\mathrm{sim}}\)개의 시뮬레이션 그룹이 생성되어 OghmaNano에 의해 실행된 후, 하나의 archive에 기록되고, 이 과정이 \(N_{\mathrm{arc}}\)개의 archive가 생성될 때까지 반복됩니다. 이 접근 방식은 프로세스가 중단될 경우 현재 생성 중인 archive에만 데이터 손실을 제한하며, 파일 전송을 단순화하고 손상에 대한 강건성을 향상시킵니다. 시뮬레이션 실행은 사용 가능한 모든 CPU 코어에 걸쳐 병렬화되며, archive 생성은 단일 코어에서 수행됩니다.
6. 데이터셋 생성기 실행
구성이 완료되면, 메인 Machine learning 창에서 Run generator 버튼을 누르면 (18.2) 데이터셋 생성 프로세스가 시작됩니다. OghmaNano는 그 후 각 가상 장치에 대해 정의된 시뮬레이션을 실행하기 시작합니다. 프로세스가 완료되면, 시뮬레이션 디렉터리에 example이라는 디렉터리가 나타나며, 이는 18.8의 왼쪽에 표시되어 있습니다. 이 예제의 목적상 실행 시간을 줄이기 위해 Simulations per archive는 10으로, Number of archives는 3으로 설정했습니다.
시뮬레이션 중 발생한 오류는 모두 errors.dat 파일에 기록됩니다. archive0.zip을 열면 archive의 내부 구조를 볼 수 있으며, 이는 18.8의 오른쪽에 표시되어 있습니다. 각 archive는 각각 하나의 가상 장치에 해당하는 디렉터리들의 모음을 포함합니다.
이러한 디렉터리들은 무작위 16자리 16진수 식별자를 사용하여 이름이 붙습니다. 각 디렉터리에는 하나의 가상 장치에 대한 완전한 시뮬레이션 집합이 포함되며, 이 예제에서는 하나의 dark JV 시뮬레이션과 아홉 개의 illuminated JV 시뮬레이션이 포함됩니다. 이러한 디렉터리 중 하나의 내용은 18.10의 왼쪽에 표시되어 있습니다. 개별 시뮬레이션 디렉터리를 열면 (18.10, 오른쪽) sim.json 파일과 시뮬레이션된 전류–전압 특성을 포함하는 jv.dat 파일을 포함한 완전한 OghmaNano 시뮬레이션이 나타납니다. 광학 출력 및 cache 파일과 같은 추가 데이터도 존재할 수 있습니다.
대규모 머신러닝 데이터셋을 생성할 때는 불필요한 출력을 최소화할 것을 강력히 권장합니다. 총 디스크 사용량이 매우 빠르게 증가할 수 있기 때문입니다. 이는 시뮬레이션이 필수적인 출력 데이터만 생성하도록 구성함으로써 달성할 수 있습니다. 데이터셋 생성은 배치 단위로 수행되며, 시뮬레이션은 사용 가능한 모든 CPU 코어에서 병렬로 실행되고, archive 생성은 단일 코어에서 처리됩니다.
이 설명용 예제에서는 세 개의 archive만 생성됩니다. 그러나 일반적인 production run에서는 보통 약 200개의 archive를 생성하며, 각 archive에는 약 200개의 가상 장치가 포함됩니다.
위 예제에서는 archive가 세 개뿐이지만 일반적인 시뮬레이션 실행에서는 최대 200개의 archive가 있을 수 있으며 각 archive마다 200개의 시뮬레이션이 포함됩니다.
7. 결과를 단일 파일로 컴파일
시뮬레이션이 완료되면, 원시 OghmaNano 출력은 머신러닝 모델 학습에 적합한 단일 vectors 파일로 변환되어야 합니다. 메인 Machine learning 창에서 Build vectors 아이콘을 클릭하면 (18.2) OghmaNano는 각 가상 장치 디렉터리를 열고, 요청된 출력을 추출하여, 하나의 vectors.json 파일로 컴파일합니다. 이 파일의 예는 18.11에 표시되어 있습니다.
벡터 파일은 감독 학습에 필요한 모든 정보를 포함하는 JSON 문서입니다. 각
가상 장치는 별도의 항목으로 나타납니다. 예를 들어,
2cbd08c0fd7eb406이라는 레이블이 붙은 항목(3행)은 params 섹션 아래에
해당 가상 장치에 대해 무작위로 선택된 전기 매개변수를 포함합니다. 그 다음에는 dark JV 벡터(19행)와
0.0001 Suns에서의 illuminated JV 벡터(22행)와 같은 추출된 입력 벡터가 이어집니다.
각 벡터의 수치 단위는 추출된 원본 파일로부터 직접 상속됩니다. 이 예제에서 벡터는
전압의 함수로 전류 밀도를 저장하는 jv.dat에서 가져오므로, 벡터 값의 단위는
\(A\,m^{-2}\)입니다. 입력 벡터 뒤에는 편의를 위해
추가적인 스칼라 출력(예: PCE)이 저장됩니다.
생성된 모든 가상 장치마다 이 파일에는 하나의 항목이 존재합니다. 일단 vectors.json이 생성되면, 이를 원하는 머신러닝 워크플로를 위한 학습 데이터셋으로 사용할 수 있습니다. 일부 사용자는 데이터를 CSV로 변환한 후 TensorFlow로 가져오는 것이 더 쉽다고 느끼며, 이는 표준 Python 라이브러리를 사용하여 수행할 수 있습니다.
8. 데이터셋에서 머신러닝으로
앞선 섹션들에서는 OghmaNano를 사용하여 JSON 형식의 완전한 머신러닝 데이터셋을 생성하는 방법을 설명했습니다. 이 시점에서 데이터 생성 파이프라인은 완료됩니다. 각 가상 장치에 대해 파일에는 무작위로 선택된 모델 매개변수와 입력 벡터로 인코딩된 해당 시뮬레이션 출력이 함께 포함됩니다.
다음 단계는 이 데이터를 사용자가 선택한 머신러닝 프레임워크로 가져오는 것입니다.
실제로 이는 일반적으로 vectors.json 파일을 읽고 이를
CSV와 같은 표 형식으로 변환하는 작업을 포함하며, 이후 학습, 검증 및 테스트에 사용할 수 있습니다.
이 변환은 표준 스크립팅 도구(예: Python)를 사용하여 간단히 수행할 수 있습니다.
변환이 완료되면, 이 데이터는 TensorFlow, PyTorch 또는 유사한 라이브러리와 같은 머신러닝 프레임워크를 사용하여 구현된 신경망 또는 기타 회귀 모델을 학습시키는 데 사용할 수 있습니다. 이 시점 이후 네트워크 아키텍처, 손실 함수 및 학습 전략의 선택은 응용 분야에 따라 다르며 OghmaNano와는 독립적입니다.
이와 같이 OghmaNano는 물리적으로 일관된 학습 데이터를 생성하기 위한 완전하고 자동화된 파이프라인을 제공하며, 그 이후의 머신러닝 모델 개발 및 최적화는 전적으로 사용자의 제어 하에 남겨둡니다.