部分贴合和温暖起步有什么区别



上下文

我使用的是scikit库中的Passive Aggressor,不知道是使用热启动还是部分贴合。

迄今为止的努力

  1. 引用此线程讨论:

https://github.com/scikit-learn/scikit-learn/issues/1585

  1. 已完成_fit_partial_fit的scikit代码

我的观察

  1. _fit依次调用_partial_fit

  2. 当设置warm_start时,_fit使用self.coef_调用_partial_fit

  3. 当在没有coef_init参数的情况下调用_partial_fit并且设置了self.coef_时,它将继续使用self.coef_

问题

我觉得两者最终都提供了相同的功能。那么,它们之间的基本区别是什么呢?在哪种情况下,它们中的任何一种都会被使用?

我是不是遗漏了什么明显的东西?感谢您的帮助!

我不知道被动攻击者,但至少在使用SGD除法器时,partial_fit将只适用于一个历元,而fit将适用于多个历元(直到损失收敛或max_iter达到(。因此,当将新数据拟合到模型时,partial_fit只会朝着新数据校正模型一步,但对于fitwarm_start,它将表现为将旧数据和新数据组合在一起,并拟合模型一次,直到收敛。

示例:

from sklearn.linear_model import SGDRegressor
import numpy as np
np.random.seed(0)
X = np.linspace(-1, 1, num=50).reshape(-1, 1)
Y = (X * 1.5 + 2).reshape(50,)
modelFit = SGDRegressor(learning_rate="adaptive", eta0=0.01, random_state=0, verbose=1,
                     shuffle=True, max_iter=2000, tol=1e-3, warm_start=True)
modelPartialFit = SGDRegressor(learning_rate="adaptive", eta0=0.01, random_state=0, verbose=1,
                     shuffle=True, max_iter=2000, tol=1e-3, warm_start=False)
# first fit some data
modelFit.fit(X, Y)
modelPartialFit.fit(X, Y)
# for both: Convergence after 50 epochs, Norm: 1.46, NNZs: 1, Bias: 2.000027, T: 2500, Avg. loss: 0.000237
print(modelFit.coef_, modelPartialFit.coef_) # for both: [1.46303288]
# now fit new data (zeros)
newX = X
newY = 0 * Y
# fits only for 1 epoch, Norm: 1.23, NNZs: 1, Bias: 1.208630, T: 50, Avg. loss: 1.595492:
modelPartialFit.partial_fit(newX, newY)
# Convergence after 49 epochs, Norm: 0.04, NNZs: 1, Bias: 0.000077, T: 2450, Avg. loss: 0.000313:
modelFit.fit(newX, newY)
print(modelFit.coef_, modelPartialFit.coef_) # [0.04245779] vs. [1.22919864]
newX = np.reshape([2], (-1, 1))
print(modelFit.predict(newX), modelPartialFit.predict(newX)) # [0.08499296] vs. [3.66702685]

如果warm_start = False,则对.fit()的每次后续调用(在对.fit()partial_fit()的初始调用之后(都将重置模型的可训练参数以进行初始化。如果是warm_start = True,则对.fit()的每次后续调用(在对.fit()partial_fit()的初始调用之后(将保留上一次运行中模型的可训练参数的值,并在最初使用这些值。不管warm_start的值如何,每次对partial_fit()的调用都将保留上一次运行的模型参数,并在最初使用这些参数。

使用MLPRegressor:的示例

import sklearn.neural_network
import numpy as np
np.random.seed(0)
x = np.linspace(-1, 1, num=50).reshape(-1, 1)
y = (x * 1.5 + 2).reshape(50,)
cold_model = sklearn.neural_network.MLPRegressor(hidden_layer_sizes=(), warm_start=False, max_iter=1)
warm_model = sklearn.neural_network.MLPRegressor(hidden_layer_sizes=(), warm_start=True, max_iter=1)
cold_model.fit(x,y)
print cold_model.coefs_, cold_model.intercepts_
#[array([[0.17009494]])] [array([0.74643783])]
cold_model.fit(x,y)
print cold_model.coefs_, cold_model.intercepts_
#[array([[-0.60819342]])] [array([-1.21256186])]
#after second run of .fit(), values are completely different
#because they were re-initialised before doing the second run for the cold model
warm_model.fit(x,y)
print warm_model.coefs_, warm_model.intercepts_
#[array([[-1.39815616]])] [array([1.651504])]
warm_model.fit(x,y)
print warm_model.coefs_, warm_model.intercepts_
#[array([[-1.39715616]])] [array([1.652504])]
#this time with the warm model, params change relatively little, as params were
#not re-initialised during second call to .fit()
cold_model.partial_fit(x,y)
print cold_model.coefs_, cold_model.intercepts_
#[array([[-0.60719343]])] [array([-1.21156187])]
cold_model.partial_fit(x,y)
print cold_model.coefs_, cold_model.intercepts_
#[array([[-0.60619347]])] [array([-1.21056189])]
#with partial_fit(), params barely change even for cold model,
#as no re-initialisation occurs
warm_model.partial_fit(x,y)
print warm_model.coefs_, warm_model.intercepts_
#[array([[-1.39615617]])] [array([1.65350392])]
warm_model.partial_fit(x,y)
print warm_model.coefs_, warm_model.intercepts_
#[array([[-1.39515619]])] [array([1.65450372])]
#and of course the same goes for the warm model

首先,让我们看看.fit().partial_fit()之间的区别。

.fit()会让你从头开始训练。因此,您可以将其视为一个模型只能使用一次的选项。如果使用一组新数据再次调用.fit(),则模型将基于新数据构建,并且不会受到以前数据集的影响。

.partial_fit()将允许您使用增量数据更新模型。因此,此选项可以多次用于一个模型。当整个数据集无法加载到内存中时,这可能很有用,请参阅此处。

如果.fit().partial_fit()都要使用一次,那么没有什么区别。

warm_start只能在.fit()中使用,它可以让你从以前的fit()的效果开始学习。现在,它听起来可能与partial_fit()的目的相似,但推荐的方式是partial_fit()。可以用相同的增量数据做partial_fit()几次,以提高学习效果。

关于差异热启动它只是类的一个属性部分拟合它是此类的方法。这基本上是不同的事情。

关于相同的功能。是的,部分拟合将使用self.coeff_,因为它仍然需要获得一些值来更新训练期。对于空的coeff_init,我们只对self.coeff_设置零值,然后进入下一步的训练。

说明。

对于首次启动:不管怎样(有无热启动(。我们将在零系数上进行训练,但结果我们将保存系数的平均值。

N+1启动:

带暖启动。我们将通过方法_allocate_parameter_mem检查我们以前的系数,并将其进行训练。结果保存我们的平均系数。

没有热启动。我们将设置零系数(作为第一步(,然后进入训练步骤。结果,我们仍然会将平均系数写入内存。

相关内容

  • 没有找到相关文章

最新更新