低维参数子空间损失景观近似库

loss-landscapes的Python项目详细描述


损失情况

损失情况是一个pytorch库,用于近似神经网络损失函数和其他相关指标, 在模型参数空间的低维子空间中。图书馆制作可视化产品 如可视化神经网络的丢失情况中所见 更简单,有助于分析神经网络损失景观的几何结构。

此库不提供打印工具,允许用户定义应如何打印数据。其他 不支持深度学习框架,尽管计划使用TensorFlow版本Loss Landscapes tf。 未来的版本。

注意:此库处于早期开发阶段。bug实际上是肯定的,而且api是不稳定的。不要使用 生产代码中的这个库。对于原型制作和研究,请始终使用库的最新版本。

<H2>1。什么是损失景观?

l:parameters->;实数是一个损失函数,它将模型参数空间中的一个点映射到 实数。对于具有n参数的神经网络,损失函数l接受n维输入。我们 可以将损失情况定义为所有点的所有n+1-维度点(param,l(param))。 参数空间中的参数。例如,以下图片,摘自Li等人(2018)的论文,链接 上面,提供了二维参数空间上损失函数的可视表示 喜欢:

当然,真正的机器学习模型有很多参数远远大于2,所以 这个模型实际上从来不是二维的。因为我们不能打印出超过两个维度的视觉效果, 我们不能指望看到损失景观的"真实"形状。相反,许多技术 存在用于将参数空间缩减为一个或两个维度,包括维度缩减技术 像主成分分析一样,把自己限制在整个参数空间的一个子空间。更多细节, 阅读李等人的论文。

<H2>2。基本示例:参数子空间中的监督损失

对于损失情况最简单的用例是估计子空间中有监督损失函数的值 一个神经网络的参数空间。所讨论的子空间可以是点、线或平面(这些子空间 可以有意义地可视化)。假设用户训练了一个监督学习模型,类型为torch.nn.module, 在由样本x和标签y组成的数据集上,通过最小化一些损失函数。用户现在希望 生成与第1节中的曲面图相似的曲面图。

具体如下:

metric=Loss(loss_function,X,y)landscape=random_plane(model,metric,normalize='filter')

如上面的例子所示,损失情况中的两个核心概念是度量参数子空间。这个 后者定义要考虑的参数空间的部分,而前者定义在哪个数量上计算 参数空间中的每个考虑点,以及如何计算。在上面的例子中,我们定义了一个 在数据x和标签y上,并指示丢失景观在随机生成的平面子空间中对其求值。

这将返回一个损失值的二维数组,用户可以以任何理想的方式绘制该数组。例子 用户可能使用此类型数据的可视化效果如下所示。

查看examples目录中的Jupyter笔记本,了解更多可能的深入示例。

<H2>3。指标和自定义指标

loss-landscapes库可以在参数子空间中的点集合处计算任何感兴趣的数量, 不仅仅是损失。这是使用一个度量来实现的:一个应用预先确定的函数的可调用对象, 例如一个具有特定输入和输出集的交叉熵损失。损失景观模型度量 包中包含许多涵盖常见用例的度量,例如loss(评估损失 函数),loss gradient(计算损耗的梯度w.r.t.模型参数) PrincipalCurvatureEvaluator(计算损失函数的主曲率)等。

此外,用户可以通过子类化metric来添加自定义度量。以图书馆为例 对于torch型号,丢失的实现:

classMetric(abc.ABC):""" A quantity that can be computed given a model or an agent. """def__init__(self):super().__init__()@abc.abstractmethoddef__call__(self,model_wrapper:ModelWrapper):passclassLoss(Metric):""" Computes a specified loss function over specified input-output pairs. """def__init__(self,loss_fn,inputs:torch.Tensor,target:torch.Tensor):super().__init__()self.loss_fn=loss_fnself.inputs=inputsself.target=targetdef__call__(self,model_wrapper:ModelWrapper)->float:returnself.loss_fn(model_wrapper.forward(self.inputs),self.target).item()

用户可以以类似的方式创建自定义的度量值。一个复杂的问题是 \u call\uu方法的设计目的是接受一个模型包装器而不是一个模型作为输入。这个类是内部的 并存在于库中,以便于处理用户可能通过的无数不同模型 对函数的输入,例如loss_landscales.planar_interpolation()。用户只需知道 modelwrapper是一个可调用的对象,可用于调用给定输入上的模型(参见call fn 下一节中modelinterface类的参数)。该类还提供了一个get_model()方法 如果用户希望执行更复杂的操作,则会公开对基础模型的引用。 关于它,

总之,度量抽象增加了很大的灵活性。量度定义了什么数量 依赖于模型参数,用户有兴趣评估,以及如何评估。用户可以定义, 例如,计算强化学习代理的预期回报的估计值的度量。

<H2>4。更复杂的模型

在一个简单的有监督的学习模型的一般情况下,如上面的小节所示,客户端代码调用函数 例如loss_landscales.linear_interpolation并将类型为torch.nn.module的pytorch模块作为参数传递

对于更复杂的情况,例如当用户希望将损失情况作为 模型参数,或rl代理的预期返回环境,用户必须指定到丢失环境 库如何与模型(或更一般的代理)交互。这是通过使用 modelwrapper对象,它隐藏模型或代理的实现细节。一般用途,图书馆 提供loss\u landscales.model\u interface.model\u wrapper模块中的generalmodelwrapper

假设用户希望估计某个rl代理的预期回报,该代理提供代理.act(观察) 动作选择方法。然后,第2节中的示例如下:

metric=ExpectedReturnMetric(env,n_samples)agent_wrapper=GeneralModelWrapper(agent,[agent.q_function,agent.policy],lambdaagent,x:agent.act(x))landscape=random_plane(agent_wrapper,metric,normalize='filter')
<H2>5。WIP:连接路径、鞍点和轨迹跟踪

一些功能目前正在开发中,但尚未完成。

近年来的一些论文表明,神经网络的损失景观主要由 鞍点的扩散,好的解决方案是不如说是大的低损耗高原 "井底"点,对于足够高维的网络,参数空间中的低损耗路径可以 几乎在任意一对极小值之间。在未来,损耗环境库将具有 在损耗环境中寻找这种低损耗连接路径的算法实现,以及 便于研究鞍点。

一些轨迹跟踪功能也在考虑之中,不过目前还不清楚这是什么 实际上应该是,因为优化轨迹是由用户的训练循环隐式跟踪的。任何度量 沿着优化轨迹,可以使用库来跟踪,例如ignite 对于Pythorch。

<H2>6。支持其他DL库

loss-landscapes库最初设计为对正在使用的dl框架不可知。但是, 越来越多的用例覆盖了维护原始库不可知的设计 给代码增加了太多的复杂性。

TensorFlow版本的"损失景观TF"计划在未来推出。

<H2>7。安装和使用

pypi上提供了这个包。使用pip install loss landscapes安装。要使用库,请按如下方式导入:

importloss_landscapesimportloss_landscapes.metrics

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
与ReentrantLock相比,java ReentrantReadWriteLock的性能非常差   java如何使用Maven Android Studio正确导入?   安卓将ADB添加到我的Java PC应用程序   反射Java getDeclaredConstructor失败,来自JUnit的NoSuchMethodException   JSP上siteedit标记库的java替代   JavaSpring环境概要文件和JPA   java中是否有一个类似于StringBuilder的类,唯一的区别是它具有固定的长度?   JavaMathContext。小数点32 vs MathContext。小数点64,使用哪一个,为什么?   java使用spring在Ibm Websphere MQ中实现重试逻辑   java调用SpriteBatch。开始()和结束()   java有一种从文本中读取文本的方法。文件,并将其设置为pom中的maven属性。xml专家?   java让sitemesh使用struts2   Java Swing:在现有窗口上定位对话框   使用带有MemSql的JPA本机查询的java Select json列