【问题标题】:What is the difference between partial fit and warm start?部分贴合和热启动有什么区别?
【发布时间】:2016-10-29 08:55:52
【问题描述】:

上下文

我正在使用 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 被设置时,_fitself.coef_ 调用 _partial_fit

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

问题

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

我是否遗漏了一些明显的东西?任何帮助表示赞赏!

【问题讨论】:

    标签: python python-2.7 machine-learning scikit-learn


    【解决方案1】:

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

    关于相同的功能。是的,部分拟合将使用 self.coef_,因为它仍然需要获取一些值以在训练期间更新。而对于空的 coef_init,我们只需将零值放入 self.coef_ 并进入下一步的训练。

    说明。

    第一次开始: 无论如何(有或没有热启动)。我们将在零系数上进行训练,但结果是我们将保存系数的平均值。

    N+1 开始:

    热启动。我们将通过 _allocate_parameter_mem 方法检查我们之前的系数并将其用于训练。结果保存了我们的平均系数。

    没有热启动。我们将输入零系数(作为第一个开始)并进入训练步骤。结果,我们仍然会将平均系数写入内存。

    【讨论】:

      【解决方案2】:

      我不知道被动攻击者,但至少在使用 SGDRegressor 时,partial_fit 仅适用于 1 个时期,而 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]
      

      【讨论】:

        【解决方案3】:

        首先我们来看看.fit().partial_fit()的区别。

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

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

        如果.fit().partial_fit() 都将被使用一次,则没有区别。

        warm_start只能用在.fit(),它会让你从之前的fit()的协同效应开始学习。现在听起来可能类似于partial_fit() 的目的,但推荐的方式是partial_fit()。可以多次使用相同的增量数据执行partial_fit(),以改善学习。

        【讨论】:

          【解决方案4】:

          如果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
          

          【讨论】:

            猜你喜欢
            • 2021-12-05
            • 2020-08-30
            • 2012-07-25
            • 2010-11-06
            • 2020-09-10
            • 2011-03-02
            • 2021-06-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多