深度神经网络的简单显着性测试。
项目描述
deep-significance:深度神经网络的简单和更好的重要性测试
内容
- :interrobang: 为什么
- :inbox_tray: 安装
- :bookmark: 例子
- :mortar_board: 引用
- :medal_sports: 致谢
- :people_holding_hands: 使用深刻意义的论文
- :books: 参考书目
:interrobang: 为什么?
尽管深度学习在最近十年中经历了惊人的增长,但很大一部分实验证据并没有得到统计假设检验的支持。相反,结论通常是基于单一的绩效分数得出的。
这是有问题的:神经网络显示高度非凸损失表面(Li et al., 2018),它们的性能取决于发现的特定超参数,或像 Dropout 掩码这样的随机因素,使得架构之间的比较更加困难。基于仅比较几个分数的(平均值),我们通常无法得出一种模型类型或算法优于另一种的结论。这会危及该领域的进步,因为看似偶然的成功可能会使从业者误入歧途。
例如,Narang 等人最近对自然语言处理的研究。(2021) 发现对变压器提出的许多修改实际上并没有提高性能。众所周知,类似的问题也困扰着其他领域,例如强化学习 (Henderson et al., 2018) 和计算机视觉 (Borji, 2017)。
为了帮助缓解这个问题,这个包为显着性测试提供了经过全面测试的有用功能的重新实现:
- 统计显着性检验,例如几乎随机顺序 (del Barrio et al, 2017; Dror et al., 2019)、bootstrap (Efron & Tibshirani, 1994) 和排列随机化 (Noreen, 1989)。
- 数据集中多重性的 Bonferroni 校正方法 (Bonferroni, 1936)。
- Bootstrap power analysis (Yuan & Hayashi, 2003) 和其他函数来确定正确的样本量。
所有功能都经过全面测试,并且与常见的深度学习数据结构兼容,例如 PyTorch / Tensorflow 张量以及 NumPy 和 Jax 数组。有关用法的示例,请参阅 此处的文档、示例部分中的场景或演示 Jupyter 笔记本。
:inbox_tray: 安装
pip
可以通过运行简单地安装该软件包
pip3 install deepsig
另一种选择是克隆存储库并在本地安装包:
git clone https://github.com/Kaleidophon/deep-significance.git
cd deep-significance
pip3 install -e .
警告:像这样安装,移动克隆存储库时导入将失败。
:bookmark: 例子
tl;dr:aso()
用于比较两个模型的分数。如果返回eps_min < 0.5
,则 A 优于 B。 越低
eps_min
,结果越有信心(我们建议与实验结果一起检查eps_min < 0.2
并记录)。eps_min
:warning: 只有一组超参数和一个测试集的测试模型将能够保证在所有设置中的优越性。请参阅一般建议和其他说明。
在下文中,我们将列出三个场景,描述 ML 从业者的常见用例以及如何相应地应用此包中实现的方法。有关统计假设检验的介绍,请参阅此博客文章等资源以获得一般概述或Dror 等人。(2018)针对特定于 NLP 的观点。
我们假设我们有两组要比较的分数,$\mathbb{S} \mathbb{A}$ 和 $\mathbb{S} \mathbb{B}$,例如通过运行两个模型 $\ mathbb{A}$ 和 $\mathbb{B}$ 多次使用不同的随机种子。然后我们可以根据收集到的观察结果定义一个单边检验统计量 $\delta(\mathbb{S} \mathbb{A}, \mathbb{S} \mathbb{B})$。这种测试统计的一个例子是观察手段的差异。然后我们制定以下零假设:
$$ H_0: \delta(\mathbb{S} \mathbb{A}, \mathbb{S} \mathbb{B}) \le 0 $$
这意味着我们实际上假设了与我们期望的情况相反的情况,即 $\mathbb{A}$ 并不比 $\mathbb{B}$ 好,但同样好或更差,正如检验统计量的值所表明的那样. 通常,目标是使用 SST 拒绝这个零假设。 p值测试是 SST 领域的一种常客方法。它引入了数据的概念,如果我们要使用相同的条件再次重复我们的实验,我们将使用上标 $\text{rep}$ 来编写这些数据,以便将它们与我们实际观察到的分数区分开来(Gelman et等人,2021)。然后,我们将p值定义为在原假设下,使用重复观察的检验统计量大于或等于观察到的测试统计:
$$ p(\delta(\mathbb{S} \mathbb{A}^\text{rep}, \mathbb{S} \mathbb{B}^\text{rep}) \ge \delta(\mathbb{S } \mathbb{A}, \mathbb{S} \mathbb{B})|H_0) $$
我们可以将这个表达式解释如下:假设 $\mathbb{A}$ 不比 $\mathbb{B}$ 好,测试假设 $\delta$ 是从相应的统计分布中得出的。那么观察到的检验统计量 $\delta(\mathbb{S} \mathbb{A}, \mathbb{S} \mathbb{B})$ 是如何适应这里的呢?这就是 $p$-value 所表达的:当概率高时,$\delta(\mathbb{S} \mathbb{A}, \mathbb{S} \mathbb{B})$ 与我们的一致在原假设下预期,所以我们不能拒绝原假设,或者换句话说,我们 \emph{cannot} 得出结论 $\mathbb{A}$ 优于 $\mathbb{B}$。如果概率很低,这意味着观察到的 $\delta(\mathbb{S}, \mathbb{S}_\mathbb{B})$ 在原假设下是不太可能的,相反的情况更有可能 -即它可能大于 - 并且我们得出结论 $\mathbb{A}$ 确实优于 $\mathbb{B}$。请注意,$p$-value 并不表示原假设是否为真。为了决定是否拒绝原假设,我们通常确定一个阈值 - 显着性水平 $\alpha$,通常设置为 0.05 - p值必须低于该阈值。然而,有人认为更好的做法是报告p- 价值与结果并没有将结果划分为显着和非显着(Wasserstein 等人,2019 年)。
间奏曲:几乎随机顺序 - 深度神经网络更好的显着性测试
深度神经网络是高度非线性模型,其性能高度依赖于超参数、随机种子和其他(随机)因素。因此,在多次运行中比较两个模型的均值可能不足以确定模型 A 是否优于 B。事实上,即使汇总更多统计数据(如标准差、最小值或最大值)也可能不足以做出决定。出于这个原因,德尔巴里奥等人。(2017) 和 Dror 等人。(2019) 引入了几乎随机顺序(ASO),这是一种比较两个分数分布的测试。
它建立在随机顺序的概念之上:我们可以比较两个分布,并 通过比较它们的累积分布函数来声明一个随机占优:
在这里,A 的 CDF 用红色给出,B 用绿色给出。如果 A 的 CDF 每 $x$ 都低于 B,我们知道算法 A 得分更高。然而,在实践中,这些情况很少如此明确(例如,假设两个正态分布具有相同的均值但不同的方差)。出于这个原因,德尔巴里奥等人。(2017) 和 Dror 等人。(2019) 通过量化随机顺序被违反的程度(红色区域)来考虑几乎随机优势的概念:
ASO 返回一个值 $\epsilon_\text{min}$,它表示(上限)违反随机顺序的数量。如果 $\epsilon_\text{min} < \tau$(其中 \tau 为 0.5 或更小),A 在更多情况下随机优于 B,反之亦然,则相应的算法可以被声明为优越的。我们还可以将 $\epsilon_\text{min}$ 解释为置信度分数。它越低,我们就越能确定 A 优于 B。注意:ASO 不计算 p 值。相反,原假设表示为
$$ H_0: \epsilon_\text{min} \ge \tau $$
如果我们想对 ASO 的结果更有信心,我们还可以将拒绝阈值设置为低于 0.5(参见本节的讨论)。此外,显着性水平 $\alpha$ 在运行 ASO 时被确定为输入参数,并积极影响生成的 $\epsilon_\text{min}$。
场景 1 - 比较两个模型的多次运行
在最简单的场景中,我们从数据集上的模型 A 和基线 B 中检索到一组分数,这些分数源于使用不同种子运行的各种模型。我们想测试我们的模型 A 是否比 B 更好(更高的分数 = 更好)——我们现在可以简单地应用 ASO 测试:
import numpy as np
from deepsig import aso
seed = 1234
np.random.seed(seed)
# Simulate scores
N = 5 # Number of random seeds
my_model_scores = np.random.normal(loc=0.9, scale=0.8, size=N)
baseline_scores = np.random.normal(loc=0, scale=1, size=N)
min_eps = aso(my_model_scores, baseline_scores, seed=seed) # min_eps = 0.225, so A is better
请注意,ASO不对分数的分布做出任何假设。这意味着我们可以将它应用于任何类型的测试指标,只要更高的分数表示更好的性能(将 ASO 应用于较低分数表示更好的性能的情况,只需将您的分数乘以 -1,然后再将它们输入函数)。提供的模型运行分数越多,测试就越可靠,因此请尝试从尽可能多的运行中收集分数,以自信地拒绝原假设。
场景 2 - 比较跨数据集的多次运行
在跨数据集比较模型时,我们为每个数据集制定一个零假设。但是,我们必须确保不要陷入多重比较问题:简而言之,我们在 A 和 B 之间进行的比较越多,就越有可能意外拒绝零假设。这就是为什么我们必须通过将其除以比较次数来相应地调整我们的显着性阈值 $\alpha$,这对应于 Bonferroni 校正 (Bonferroni et al., 1936):
import numpy as np
from deepsig import aso
seed = 1234
np.random.seed(seed)
# Simulate scores for three datasets
M = 3 # Number of datasets
N = 5 # Number of random seeds
my_model_scores_per_dataset = [np.random.normal(loc=0.3, scale=0.8, size=N) for _ in range(M)]
baseline_scores_per_dataset = [np.random.normal(loc=0, scale=1, size=N) for _ in range(M)]
# epsilon_min values with Bonferroni correction
eps_min = [aso(a, b, confidence_level=0.95, num_comparisons=M, seed=seed) for a, b in zip(my_model_scores_per_dataset, baseline_scores_per_dataset)]
# eps_min = [0.006370113450148568, 0.6534772728574852, 0.0]
场景 3 - 比较样本级别的分数
在前面的示例中,我们假设我们根据每次运行的性能比较两种算法 A 和 B,即我们在每个随机种子中运行每个算法一次,并在我们的测试集上准确获得一个分数。然而,在某些情况下,我们希望根据测试集中每个点的分数来比较两种算法。如果我们每个模型只使用一个种子,那么这种情况相当于场景 1。但是如果我们也想每个模型使用多个种子怎么办?
在这种情况下,我们可以对 A 和 B 之间的分数分布进行成对比较,并相应地使用 Bonferroni 校正:
from itertools import product
import numpy as np
from deepsig import aso
seed = 1234
np.random.seed(seed)
# Simulate scores for three datasets
M = 40 # Number of data points
N = 3 # Number of random seeds
my_model_scored_samples_per_run = [np.random.normal(loc=0.3, scale=0.8, size=M) for _ in range(N)]
baseline_scored_samples_per_run = [np.random.normal(loc=0, scale=1, size=M) for _ in range(N)]
pairs = list(product(my_model_scored_samples_per_run, baseline_scored_samples_per_run))
# epsilon_min values with Bonferroni correction
eps_min = [aso(a, b, confidence_level=0.95, num_comparisons=len(pairs), seed=seed) for a, b in pairs]
# eps_min = [0.3831678636198528, 0.07194780234194881, 0.9152792807128325, 0.5273463008857844, 0.14946944524461184, 1.0,
# 0.6099543280369378, 0.22387448804041898, 1.0]
场景 4 - 比较两个以上的模型
同样,在比较多个模型时(现在再次基于每个种子),我们可以使用与前面示例类似的方法。例如,对于三个模型,我们可以创建一个 $3 \times 3$ 矩阵并用相应的 $\epsilon_\text{min}$ 值填充条目。
该包multi_aso()
正是为此目的实现了该功能。它具有与 相同的论点aso()
,但有一些不同。首先,该函数接受一个scores
参数,它可以是列表列表(分数),或者嵌套的 NumPy 数组或 Tensorflow / PyTorch / Jax 张量或字典(稍后会详细介绍)。让我们看一个例子:
import numpy as np
from deepsig import multi_aso
seed = 1234
np.random.seed(seed)
N = 5 # Number of random seeds
M = 3 # Number of different models / algorithms
# Simulate different model scores by sampling from normal distributions with increasing means
# Here, we will sample from N(0.1, 0.8), N(0.15, 0.8), N(0.2, 0.8)
my_models_scores = np.array([np.random.normal(loc=loc, scale=0.8, size=N) for loc in np.arange(0.1, 0.1 + 0.05 * M, step=0.05)])
eps_min = multi_aso(my_models_scores, confidence_level=0.95, seed=seed)
# eps_min =
# array([[1. , 0.92621655, 1. ],
# [1. , 1. , 1. ],
# [0.82081635, 0.73048716, 1. ]])
在示例中,eps_min
现在是一个矩阵,包含所有模型对之间的 $\epsilon_\text{min}$ 得分(对于同一模型,默认设置为 1)。矩阵总是被读取为 ASO(row, column)。
该函数默认应用 bonferroni 校正进行多重比较,但可以使用 关闭此功能use_bonferroni=False
。
最后,当scores
参数是字典并且使用 调用函数时return_df=True
,生成的矩阵以 a 形式给出以pandas.DataFrame
提高可读性:
import numpy as np
from deepsig import multi_aso
seed = 1234
np.random.seed(seed)
N = 5 # Number of random seeds
M = 3 # Number of different models / algorithms
# Same setup as above, but use a dict for scores
my_models_scores = {
f"model {i+1}": np.random.normal(loc=loc, scale=0.8, size=N)
for i, loc in enumerate(np.arange(0.1, 0.1 + 0.05 * M, step=0.05))
}
# my_model_scores = {
# "model 1": array([...]),
# "model 2": array([...]),
# ...
# }
eps_min = multi_aso(my_models_scores, confidence_level=0.95, return_df=True, seed=seed)
# This is now a DataFrame!
# eps_min =
# model 1 model 2 model 3
# model 1 1.000000 0.926217 1.0
# model 2 1.000000 1.000000 1.0
# model 3 0.820816 0.730487 1.0
:newspaper: 如何报告结果
使用 ASO 时,必须报告两个重要细节,即置信度 $\alpha$ 和 $\epsilon_\text{min}$ 分数。下面列出了一些示例片段报告方案 1 和 4 的结果:
Using ASO with a confidence level $\alpha = 0.05$, we found the score distribution of algorithm A based on three
random seeds to be stochastically dominant over B ($\epsilon_\text{min} = 0$).
We compared all pairs of models based on five random seeds each using ASO with a confidence level of
$\alpha = 0.05$ (before adjusting for all pair-wise comparisons using the Bonferroni correction). Almost stochastic
dominance ($\epsilon_\text{min} < \tau$ with $\tau = 0.2$) is indicated in table X.
:control_knobs: 样本大小
很难确定当前收集的分数集是否足够大以允许进行可靠的显着性检验,或者是否需要更多分数。出于这个原因,deep-significance
还实现了帮助决定是否收集更多样本的功能。
首先,它包含Bootstrap 功率分析(Yuan & Hayashi,2003):给定一组分数,它给所有分数一个统一的提升,以创建一个人工的第二个样本。然后,分析使用两个样本的自举版本进行重复分析,并将它们与显着性检验进行比较。理想情况下,这应该会产生一个显着的结果:如果重新采样的原始样本和提升的样本之间的差异不显着,则原始样本的方差太大。然后分析返回产生显着结果的比较百分比。如果数字太低,则应收集更多分数并将其添加到样本中。
分析的结果是统计功效:功效越高,成为 II 类错误牺牲品的风险越小 - 错误地接受原假设的概率,而实际上它应该被拒绝。通常,建议使用 ~ 0.8 的幂(尽管有时在机器学习设置中很难实现)。
该功能可以通过以下方式使用:
import numpy as np
from deepsig import bootstrap_power_analysis
scores = np.random.normal(loc=0, scale=20, size=5) # Create too small of a sample with high variance
power = bootstrap_power_analysis(scores, show_progress=False) # 0.081, way too low
scores2 = np.random.normal(loc=0, scale=20, size=50) # Let's collect more samples
power2 = bootstrap_power_analysis(scores2, show_progress=False) # Better power with 0.2556
默认情况下,bootstrap_power_analysis()
使用单侧 Welch t 检验。但是,这可以通过将函数传递给significance_test
参数来修改,该参数期望一个函数采用两组分数并返回一个 p 值。
其次,如果正在使用几乎随机顺序测试 (ASO),则可以使用第二个函数。ASO 使用自举估计两个样本的违规率。然而,鉴于我们只有有限数量的样本,该估计必然存在一些不确定性。使用更多样本会降低不确定性并使估计更严格。可以使用以下函数计算收集更多样本增加紧密度的程度:
import numpy as np
from deepsig import aso_uncertainty_reduction
scores1 = np.random.normal(loc=0, scale=0.3, size=5) # First sample with five scores
scores2 = np.random.normal(loc=0.2, scale=5, size=3) # Second sample with three scores
red1 = aso_uncertainty_reduction(m_old=len(scores1), n_old=len(scores2), m_new=5, n_new=5) # 1.1547005383792515
red2 = aso_uncertainty_reduction(m_old=len(scores1), n_old=len(scores2), m_new=7, n_new=3) # 1.0583005244258363
# Adding two runs to scores1 increases tightness of estimate by 1.15
# But adding two runs to scores2 only increases tightness by 1.06! So spending two more runs on scores1 is better
:sparkles: 其他功能
:rocket: 对于不耐烦的人:多线程的 ASO
等待所有引导迭代完成可能会让人感到乏味,尤其是在进行许多比较时。因此,ASO 支持joblib
通过num_jobs
参数使用多线程。
from deepsig import aso
import numpy as np
from timeit import timeit
a = np.random.normal(size=1000)
b = np.random.normal(size=1000)
print(timeit(lambda: aso(a, b, num_jobs=1, show_progress=False), number=5)) # 616.2249192680001
print(timeit(lambda: aso(a, b, num_jobs=4, show_progress=False), number=5)) # 208.05637107000007
如果您想选择设备上可能的最大作业数,您可以设置num_jobs=-1
:
print(timeit(lambda: aso(a, b, num_jobs=-1, show_progress=False), number=5)) # 187.26257274800003
:electric_plug: 与 PyTorch、Tensorflow、Jax 和 Numpy 的兼容性
此包中实现的所有测试也可以将 PyTorch / Tensorflow 张量和 Jax 或 NumPy 数组作为参数:
from deepsig import aso
import torch
a = torch.randn(5, 1)
b = torch.randn(5, 1)
aso(a, b) # It just works!
:woman_farmer: 为可复制性播下种子
为了保证可复制性,两者都aso()
作为multi_aso()
参数提供seed
。这甚至在使用多个作业时也有效!
:game_die: 排列和引导测试
如果您对 ASO 持怀疑态度并想恢复到良好的旧忠实测试,这个包还实现了配对引导和排列随机化测试。请注意,正如下一节中所讨论的,这些检验的统计功效低于 ASO。此外,还可以使用 找到使用 p 值进行 Bonferroni 校正的函数from deepsig import bonferroni_correction
。
import numpy as np
from deepsig import bootstrap_test, permutation_test
a = np.random.normal(loc=0.8, size=10)
b = np.random.normal(size=10)
print(permutation_test(a, b)) # 0.16183816183816183
print(bootstrap_test(a, b)) # 0.103
一般建议和其他说明
-
自然地,CDF 是由真实分布构建的
scores_a
并且scores_b
只能是真实分布的近似值。因此,应该收集尽可能多的分数,尤其是在运行之间的差异很大的情况下。如果只有一次运行可用,则可以选择像场景 3 中那样比较样本分数分布,但比较多次运行 总是更可取的。理想情况下,即使每个模型使用不同的超参数集,也应该获得分数。因为这在实践中通常是不可行的,Bouthilier 等人。(2020) 建议在运行之间改变所有其他变化来源, 以获得对“真实”性能的最可靠估计,例如数据混洗、权重初始化等。 -
num_bootstrap_iterations
可以降低速度来提高速度aso()
。但是,不建议这样做,因为测试结果也会变得不那么准确。从技术上讲,$\epsilon_\text{min}$ 是一个上限,随着样本数量和引导迭代次数的增加而变得更加严格(del Barrio 等人,2017 年)。num_jobs
因此,总是首选增加作业的数量。 -
虽然我们可以声明一个具有 $\epsilon_\text{min} < 0.5$ 的随机优势模型,但我们发现这具有相对较高的 I 类错误(误报)。我们论文中的测试表明,在不同场景之间进行 I 型和 II 型错误交易的更有用的阈值可能是 $\tau = 0.2$。
-
Bootstrap 和排列随机化都是非参数测试,即它们不对我们的测试指标的分布做出任何假设。然而,它们的统计能力不同,它被定义为在 A 和 B 之间存在差异的情况下拒绝原假设的概率。换句话说,测试越强大,它越不保守,并且越能接受A 和 B 之间的差异较小。因此,如果知道分布或找出正态性检验的原因(例如 Anderson-Darling 或 Shapiro-Wilk),则像 Student's 或 Welch's t 检验这样的参数检验比 bootstrap 或排列更可取-随机化。但是,由于这些测试在 为什么?,ASO 仍然是更好的选择。
:mortar_board: 引用
一般使用这个包,请引用以下内容:
@article{ulmer2022deep,
title={deep-significance-Easy and Meaningful Statistical Significance Testing in the Age of Neural Networks},
author={Ulmer, Dennis and Hardmeier, Christian and Frellsen, Jes},
journal={arXiv preprint arXiv:2204.06815},
year={2022}
}
如果使用ASO测试viaaso()
或者`multi_aso,请引用原作:
@inproceedings{dror2019deep,
author = {Rotem Dror and
Segev Shlomov and
Roi Reichart},
editor = {Anna Korhonen and
David R. Traum and
Llu{\'{\i}}s M{\`{a}}rquez},
title = {Deep Dominance - How to Properly Compare Deep Neural Models},
booktitle = {Proceedings of the 57th Conference of the Association for Computational
Linguistics, {ACL} 2019, Florence, Italy, July 28- August 2, 2019,
Volume 1: Long Papers},
pages = {2773--2785},
publisher = {Association for Computational Linguistics},
year = {2019},
url = {https://doi.org/10.18653/v1/p19-1266},
doi = {10.18653/v1/p19-1266},
timestamp = {Tue, 28 Jan 2020 10:27:52 +0100},
}
@incollection{del2018optimal,
title={An optimal transportation approach for assessing almost stochastic order},
author={Del Barrio, Eustasio and Cuesta-Albertos, Juan A and Matr{\'a}n, Carlos},
booktitle={The Mathematics of the Uncertain},
pages={33--44},
year={2018},
publisher={Springer}
}
例如,你可以写
In order to compare models, we use the Almost Stochastic Order test \citep{del2018optimal, dror2019deep} as
implemented by \citet{ulmer2022deep}.
:medal_sports: 致谢
这个包是在哥本哈根 IT 大学NLPnorth 小组的讨论中创建的,我要感谢其成员的反馈。此存储库中的代码基于Rotem Dror 的多个存储库位于多个位置,即 this、this 和this。还要感谢她亲自回答问题并为此包的实施和文档提供反馈。
此项目中使用的提交消息模板可以在这里找到。使用readme2latex渲染内联乳胶方程。
:people_holding_hands: 使用深刻意义的论文
在自述文件的最后一部分,我想参考已经使用deep-significance
. 如果您想在此处添加您的工作,请打开问题或拉取请求!
- “从蒙面语言建模到翻译:非英语辅助任务提高零样本口语理解”(van der Groot 等人,2021 年)
- “制图主动学习”(Zhang & Plank,2021)
- “SkillSpan:从英语招聘信息中提取硬技能和软技能”(Zhang 等人,2022a)
- “关系提取是什么意思?数据集调查和科学关系分类研究”(Bassignana & Plank,2022 年)
- “KOMPETENCER:通过远程监督和迁移学习对丹麦职位发布进行细粒度技能分类”(Zhang 等人,2022b)
:books: 参考书目
Del Barrio、Eustasio、Juan A. Cuesta-Albertos 和 Carlos Matrán。“一种评估几乎随机顺序的最佳运输方法。” 不确定的数学。施普林格,湛,2018。33-44。
邦费罗尼,卡罗。“Teoria statistica delle classi e calcolo delle probabilita”。Pubblicazioni del R Istituto Superiore di Scienze Economiche e Commericiali di Firenze 8 (1936): 3-62。
博尔吉,阿里。“计算机视觉的负面结果:一种观点。” 图像和视觉计算 69(2018):1-8。
布希利尔、泽维尔等人。“考虑机器学习基准的差异。” 机器学习和系统论文集 3 (2021)。
Dror、Rotem 等人。“在自然语言处理中测试统计显着性的搭便车指南。” 计算语言学协会第 56 届年会论文集(第 1 卷:长篇论文)。2018 年。
Dror、Rotem、Shlomov、Segev 和 Reichart、Roi。“深度优势——如何正确比较深度神经模型。” 计算语言学协会第 57 届年会论文集。2019 年。
埃夫隆、布拉德利和罗伯特 J. Tibshirani。“引导程序的介绍。” CRC 出版社,1994 年。
安德鲁·格尔曼、约翰·B·卡林、哈尔·S·斯特恩、大卫·B·邓森、Aki Vehtari、唐纳德·B·鲁宾、约翰·卡林、哈尔·斯特恩、唐纳德·鲁宾和大卫·邓森。贝叶斯数据分析第三版,2021。
亨德森、彼得等人。“重要的深度强化学习。” AAAI 人工智能会议论文集。卷。32. 2018 年第 1 号。
郝丽、郑旭、加文·泰勒、克里斯托夫·斯图德、汤姆·戈德斯坦。“可视化神经网络的损失情况。” NeurIPS 2018:6391-6401
纳朗、夏兰等人。“Transformer 修改是否跨实现和应用程序转移?” arXiv 预印本 arXiv:2102.11972 (2021)。
Noreen, Eric W. “假设检验的计算机密集型方法:介绍。” 纽约威利 (1989)。
罗纳德 L Wasserstein、艾伦 L Schirm 和 Nicole A Lazar。迈向超越“p<0.05”的世界,2019
袁克海和林健太郎。“基于协方差结构模型的三个测试统计量的推理和功率分析的引导方法。” 英国数学和统计心理学杂志 56.1 (2003): 93-110。