机器学习
本章介绍如何使用 OghmaNano 生成机器学习数据集。通常你会生成这些 数据集,然后使用外部软件(例如 https://www.tensorflow.org)来 执行学习/预测。
生成 ML 数据集
引言
人们经常希望使用建模从一组数据中提取器件的物理参数。例如,你 可能有一组 JV 曲线,并希望为该器件提取载流子迁移率与复合速率。 传统做法是将一个模型(例如 OghmaNano)拟合到该数据集(这在 章节 [sec:fitting] 中描述)。其 缺点是拟合一个数据集可能需要相当长的时间;此外,当 你有多个数据集时,挑战会非常大。拟合过程很复杂,并且需要一位 在仿真方面经验丰富、且有足够耐心的专家来完成。这就是为什么将器件 模型拟合到实验数据通常只由社区中的一小部分人来完成的原因。
对此问题更现代的方法是使用机器学习。采用该方法时,与其尝试拟合 单条 JV 曲线,不如搭建一个代表器件结构的仿真。然而,与其将 单个电学参数拟合到数据集,不如生成该器件的成千上万份拷贝,但 其电学参数随机选择。这些器件中的每一个都称为 虚拟器件。 随后使用诸如 OghmaNano 之类的仿真程序为每个虚拟器件生成 JV 曲线。 因此,用户将获得 JV 曲线以及每个 虚拟器件 对应的电学参数。 该数据集随后可用于训练一个机器学习模型,使其能够从 JV 曲线预测电学参数。于是,OghmaNano 充当前向变换,将电学参数变换为模拟的 实验数据,然后机器学习充当反向变换,用于反向还原该仿真 过程。训练完成后,该模型即可用于从真实器件中提取材料参数。
该方法的优点是,一旦机器学习算法训练完成,它就可以在数秒内从器件中提取材料 参数,而且用户无需成为仿真专家即可使用训练好的 网络。然而,要使该方法奏效,关键在于生成一个用于训练机器 学习模型的大规模数据集。该过程在以下页面中描述。
生成机器学习数据集
本节假设你已在层编辑器中正确配置了器件层结构。不过,如果 你希望从一个预先配置的仿真开始,你可以在新建仿真 窗口中的 ML Example 下找到该示例。图 18.1 显示了已配置器件的主窗口,在自动化 功能区中你会看到一个 机器学习 图标,其外观类似一个蓝色圆形。如果点击它, 将打开主机器学习窗口,如图 18.2 所示。
该窗口的主要目的是构建用于训练机器学习算法的大型数据集。我们正在生成的数据 集名为 example。你当前看到打开的第一个选项卡名为 Simulations。在该选项卡中定义你希望对每个 虚拟器件 执行的仿真。 在本例中,我们将模拟一条暗态曲线以及 9 条光照曲线,其光强在 0.0001 Suns 到 1.0 Suns 之间变化。该 仿真可通过将 Enabled 设为 off 来禁用。如果点击 Patch 列中行 \(light\_0.0001\) 的 Edit 按钮,将出现图 18.3 所示的 Patch window。
Patch window 的作用是在虚拟仿真中更改参数。例如在我们的 情况下,我们希望模拟一条暗态 JV 曲线以及九种不同的光强,因此对于这些 仿真,光强必须被正确调整。如果打开 \(light\_0.0001\) 的 patch window,你会看到仿真变量 optical/light/Psun(其 控制光强)被设置为 \(0.0001\)。如果打开 dark 的 patch window,你会看到 optical/light/Psun 的值被设置为 \(0.0\)。通过这种方式,使用同一个基础仿真即可对不同 条件下的多个实验进行仿真。
如果现在点击图 18.2 中行 \(light\_0.0001\) 的 Vectors 列里的 Edit button,将出现 vectors window,如图 18.4 所示。
vectors window 用于定义从完成的仿真中提取哪些数据作为机器 学习输入向量。在本例中,我们从文件 \(jv.dat\) 中提取 -2.0 到 1.4 V 之间的数据点,该文件包含电流电压曲线。如果模拟的是时域 测量,可能希望从 \(time\_i.csv\) 文件或其他合适的文件中提取若干时间点。用于形成向量的数据点数量是任意的,由用户决定。 更长的输入向量会使机器学习过程更慢,但可能捕获更多 JV 曲线的特征。
下一步是设置希望随机化哪些变量,这在主机器学习窗口的 Random variables 选项卡中完成。该窗口有五列;第一列(Enabled) 指示是否使用该随机变量;第二列(Variable)设置要更改的变量;第三 列(Min)设置随机值允许的最小值;第四列(Max)设置随机值允许的最大 值;最后一列(Random function)指示随机变量应在对数或线性尺度上选择。 对于跨越多个数量级的变量推荐使用对数尺度,而如果变量跨度约为一个数量级则推荐使用 线性尺度。对数分布可确保在对数尺度上观察时,整个范围内的数值选择呈均匀分布。线性参数的示例是 Urbach 能量,因为它通常在 30 到 150 meV 之间变化;对数变量的示例是陷阱密度,因为它通常可在 \(1 \times 10^{15} m^{-3} - 1 \times 10^{25} m^{-3}\) 之间变化。
一旦仿真设置完成,现在就需要考虑要生成多少个具有随机化 参数的虚拟器件。如果打开 Settings window,见图 18.6,即可配置生成多少个 虚拟 器件。这由两个参数控制,Simulations per archive(\(N_{sim}\))与 Number of archives(\(N_{arc}\))。 这两个数相乘给出生成的虚拟器件总数。生成的 仿真结果会保存到名为 archives 的 zip 文件中,每个 archive 将包含 \(N_{sim}\) 个仿真。因此在此处所示示例中,我们将生成 \(N_{sim}*N_{arc}\) 3000 个虚拟器件,分布在 100 个 zip 文件中。需要注意的是, 在我们的示例中,每个虚拟器件将包含一个暗态 JV 曲线仿真以及 9 个光照仿真。因此 生成的文件数量会很快变得非常大。为防止成为问题,仿真以批处理方式运行, 首先生成并运行 \(N_{sim}\) 个仿真(由 OghmaNano 执行),然后存入一个 zip archive,直到生成 \(N_{arc}\) 个 archive。 这样,如果生成过程被中断,你只会丢失当前正在生成的 archive 的内容。 将数据集分割成这样也更便于复制文件,并且更能抵抗损坏。 数据生成将使用你机器上的所有 CPU 核心运行,而 archive 生成只会在一个 核心上运行。
如果现在在主 Machine learning window 图 18.2 中按下 Run generator 按钮,OghamNano 将开始生成仿真。完成后,你的 仿真目录中将出现一个名为 example 的目录,见图 18.8 左侧。[注:为节省时间,本例中 Simulations per archive 设为 10, Number of archives 设为 3]。errors.dat 文件将包含仿真期间产生的任何错误。 如果打开 archive0.zip,你将看到图 18.8 右侧所示内容。
这些目录中的每一个都以一个随机的 16 位十六进制数命名,每个目录包含一个 虚拟器件 的完整 仿真集合。因此在我们的情况中,每个目录将包含一个暗态仿真 与九个光照仿真。其中一个目录的内容如图 18.10 左侧所示。如果打开 其中一个文件,可见图 18.10 右侧,可以看到它包含一个完整的 OghamNano 仿真。那里有 sim.json 文件以及包含仿真期间生成的 JV 曲线的 jv.dat 文件。该目录 还包含一些额外数据,包括光学输出与一个缓存文件。建议在生成这些文件时尽量最小化 输出,否则磁盘上的总大小会非常大,这可以通过将 所有输出详细程度选项设置为最小输出来实现。
![]() |
![]() |
在以上示例中我们只有三个 archive,但在正常的仿真运行中,可能有多达 200 个 archive,每个 archive 中包含 200 个仿真。一旦仿真完成,就需要将这些原始 OghmaNano 仿真转换为供机器学习算法使用的 vectors 文件。如果在主机器学习窗口中点击 Build vectors 图标 18.2,OghamNano 将打开每个虚拟仿真并将其编译到一个 vectors 文件中。vectors 文件如图 18.11 所示。
![]() |
![]() |
该 vectors 文件是一个 json 文件,包含训练机器学习算法所需的全部数据。数据集中的每个 虚拟器件 在文件中都有一段内容。例如在该图中,我们正在查看与器件 2cbd08c0fd7eb406(第 3 行)相关的段落,我们可以在 params 标题下看到为该器件随机选择了哪些电学参数。随后是表示暗态 JV 曲线的向量(第 19 行)以及在 0.0001 Suns 下光照 JV 曲线的向量(第 22 行)。在该示例中,这些数值以 \(Am^{-2}\) 表示,但它们始终与其提取来源文件的单位一致。 因此在本例中,jv.dat 包含电压(Volts)与 \(Am^{-2}\) 的关系,因此向量的数值单位为 \(Am^{-2}\)。之后会转储关键器件参数(例如 PCE)。 该文件中将为每个生成的虚拟器件提供一条记录。一旦你得到该文件,就可以将其输入到你选择的 机器学习算法中。一些用户报告称,如果先将该数据转换为 CSV 文件,再输入到 tensorflow 会更容易,这可以使用标准 Python 库完成。
设置机器学习算法来 处理数据
以上部分描述了如何生成机器学习数据集。设置算法本身是一个 独立的大主题。不过,在 https://www.tensorflow.org/ 上有许多很好的示例。



