低维参数子空间损失景观近似库
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
笔记本,了解更多可能的深入示例。
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()
方法
如果用户希望执行更复杂的操作,则会公开对基础模型的引用。
关于它,
总之,度量
抽象增加了很大的灵活性。量度定义了什么数量
依赖于模型参数,用户有兴趣评估,以及如何评估。用户可以定义,
例如,计算强化学习代理的预期回报的估计值的度量。
在一个简单的有监督的学习模型的一般情况下,如上面的小节所示,客户端代码调用函数
例如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