什么是不可训练参数的定义?

44

什么是模型中的非训练参数

例如,在构建自己的模型时,默认情况下其值为0,但当您想使用Inception模型时,它会变成除0之外的其他值。这背后的原因是什么?

4个回答

47
在Keras中,不可训练参数(如model.summary()所示)是指在反向传播训练期间不会更新的权重数量
主要有两种类型的不可训练权重:
  • 当训练时你选择保持不变的权重。这意味着Keras在训练期间根本不会更新这些权重。
  • 像BatchNormalization层中的统计信息一样工作的权重。它们会随着均值和方差的变化而更新,但不会"通过反向传播进行训练"。
权重是网络内部执行操作并可以调整以得到我们想要的值的值。反向传播算法将调整权重以使错误率降低。
默认情况下,Keras模型中的所有权重都是可训练的。
当创建层时,它会在内部创建自己的权重,并且它们是可训练的(反向传播算法会更新这些权重)。
将它们设为不可训练时,算法将不再更新这些权重。例如,当您需要一个卷积层与特定滤波器(例如Sobel滤波器)时,您不希望训练更改此操作,因此应该保持这些权重/滤波器恒定。
还有很多其他原因可能需要使权重不可训练。
要更改参数,请从模型中取出层并设置trainable
model.get_layer(layerName).trainable = False #or True

编译之前必须完成此操作。


2
有很多其他原因可以让权重不可训练。如果您愿意解释一下,这些是什么? - WiLL_K
2
你可能已经有一个“预训练模型”,它已经被证明工作良好,而且你不想改变它。你可能正在训练一个GAN,并且只在一侧进行工作。这确实有很多创造性的原因,取决于你想要什么。 - Daniel Möller
首先感谢您,但是如果使用预训练模型能够提高性能怎么办? - WiLL_K
不可训练的变量是否参与其他可训练变量的反向传播?比如我有一个两层模型,第一层是可训练的,第二层是不可训练的。然后将第二层的输出与目标值进行比较以计算损失。在计算第一层的梯度时,会考虑第二层的操作吗?@HSRathore - David H. J.
1
@DavidH.J.,是的,当然。如果不通过“所有”层,就不可能达到结果。 - Daniel Möller
显示剩余2条评论

36

其他答案中没有涵盖的一些细节。

在Keras中,不可训练参数是不使用梯度下降进行训练的参数。这也由每个层中的trainable参数控制,例如:

from keras.layers import *
from keras.models import *
model = Sequential()
model.add(Dense(10, trainable=False, input_shape=(100,)))
model.summary()

这将打印零个可训练参数和1010个不可训练参数。

_________________________________________________________________    
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 10)                1010      
=================================================================
Total params: 1,010
Trainable params: 0
Non-trainable params: 1,010
_________________________________________________________________
现在,如果你使用 model.layers[0].trainable = True 将该层设置为可训练,那么它将打印出:
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 10)                1010      
=================================================================
Total params: 1,010
Trainable params: 1,010
Non-trainable params: 0
_________________________________________________________________

现在所有参数都可训练,且没有不可训练的参数。但也有一些层既有可训练的参数又有不可训练的参数,例如BatchNormalization层,在测试时存储激活的均值和标准差。一个例子:

model.add(BatchNormalization())
model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 10)                1010      
_________________________________________________________________
batch_normalization_1 (Batch (None, 10)                40        
=================================================================
Total params: 1,050
Trainable params: 1,030
Non-trainable params: 20
_________________________________________________________________

这种特定情况下的BatchNormalization总共有40个参数,其中20个可训练,另外20个不可训练。这20个不可训练的参数对应于用于测试期间的激活计算平均值和标准差,并且这些参数永远不会使用梯度下降进行训练,也不受trainable标志的影响。


3
这实际上是对这个问题的正确答案,因为作者问的是为什么Inception模型中的一些参数即使你将所有层设置为可训练,仍然始终是“不可训练”的。答案是批量归一化层的均值/方差参数。 - apatsekin
数字“20”来自哪里? 我问这个问题是因为我一直在使用tensorflow.keras.layers.experimental中的preprocessing.Normalization。在这里,当我使用一个输入([None,1])时,在摘要中得到3个不可训练参数。然而,当我使用九个输入([None,9])时,在摘要中得到19个不可训练参数。请参见完整的示例:链接 这3个参数对于第一个案例,第二个案例则是9个,似乎是类似于inputs*2+1,但我想更详细地了解它们的含义以及如何计算。非常感谢。 - uom0
1
从我的回答中可以看出,“这20个不可训练的参数对应于在测试时使用的激活的计算平均值和标准差”,这对应于BatchNormalization层的不可训练参数,注意其他层以不同的方式计算这些参数。 - Dr. Snoopy

29

非可训练参数是一个非常广泛的主题。一个简单的例子是考虑任何特定的NN模型及其架构。

假设我们已经在Keras中设置好了您的网络定义,您的架构类似于256->500->500->1。基于这个定义,我们似乎有一个回归模型(一个输出)和两个隐藏层(每个隐藏层有500个节点),输入为256。

您的模型中的一个非可训练参数是,例如,隐藏层数量本身(2)。其他可能是每个隐藏层的节点数(在这种情况下为500),甚至是每个单独层的节点数,使您每层有一个参数加上层数本身。

这些参数是“不可训练”的,因为您无法优化其值与您的训练数据。训练算法(如反向传播)将优化和更新您的网络的权重,这些实际上是可训练参数(通常数千个,具体取决于您的连接)。您的训练数据不能帮助您确定这些不可训练参数。

但是,这并不意味着numberHiddenLayers根本不可训练,这只意味着在这个模型及其实现中我们无法这样做。 我们可以使numberHiddenLayers可训练;最简单的方法是定义另一个ML算法,它以这个模型作为输入,并用numberHiddenLayers的多个值来对其进行训练。 最好的值是通过表现优于其他模型的模型获得的,从而优化了numberHiddenLayers变量。

换句话说,模型的非可训练参数是在训练过程中不会更新和优化的那些参数,并且必须在先验或作为输入时确定。


10
我认为这里有些混淆......网络拓扑结构以及学习率、丢失率等内容并不是“不可训练的参数”;它们被称为“超参数”。在训练过程中,使用训练集来自动优化参数(使用梯度下降)。 而超参数则需要手动进行优化(使用工程师的头脑),并使用开发集进行评估。 - Julien REINAULD
5
关于原问题,我认为“不可训练参数”例如在BatchNorm层中计算的平均值“mu”和标准差“sigma”,而参数“gamma”和“beta”是可训练参数。总之,“可训练参数”是指其值根据其梯度(相对于参数的误差/损失/成本导数)进行修改的参数,而“不可训练参数”是指其值不根据其梯度进行优化的参数。 - Julien REINAULD
感谢您的反馈@JulienREINAULD,我相信如果您觉得有需要添加什么内容,还有足够的空间可以添加更多答案 :) 根据您的定义,超参数也是不可训练的(除非您设计算法来对其进行训练)。 - DarkCygnus

3
很明显,如果您冻结网络的任何一层,则该冻结层上的所有参数都变为不可训练。另一方面,如果您从头设计网络,它可能也有一些不可训练的参数。例如,批量归一化层有4个参数,它们是;
[gamma权重、beta权重、移动平均值、移动方差]
其中前两个是可训练的,而后两个则不可训练。因此,批量归一化层很可能是您自定义网络具有不可训练参数的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接