不可训练参数的定义是啥?
Posted
技术标签:
【中文标题】不可训练参数的定义是啥?【英文标题】:What is the definition of a non-trainable parameter?不可训练参数的定义是什么? 【发布时间】:2018-04-28 23:05:25 【问题描述】:模型中non-trainable参数的定义是什么?
例如,当您构建自己的模型时,它的默认值是 0,但是当您想使用初始模型时,它会变成其他东西而不是 0。这背后的原因是什么?
【问题讨论】:
【参考方案1】:在 keras 中,non-trainable 参数(如model.summary()
所示)是指在反向传播训练期间未更新的权重数。
不可训练的权重主要有两种:
您选择在训练时保持不变的那些。这意味着 keras 在训练期间根本不会更新这些权重。 类似于 BatchNormalization 层中的统计信息。它们用均值和方差进行了更新,但它们没有“经过反向传播训练”。权重是网络内部执行操作的值,可以调整以得到我们想要的结果。反向传播算法最终将权重更改为较低的误差。
默认情况下,keras 模型中的所有权重都是可训练的。
当您创建层时,它会在内部创建自己的权重并且它们是可训练的。 (反向传播算法会更新这些权重)
当您使它们无法训练时,算法将不再更新这些权重。这很有用,例如,当您想要一个具有特定过滤器的卷积层时,例如 Sobel 过滤器。你不希望训练改变这个操作,所以这些权重/过滤器应该保持不变。
还有很多其他原因可能导致您想让重量变得无法训练。
更改参数:
为了决定权重是否可训练,您从模型中获取层并设置trainable
:
model.get_layer(layerName).trainable = False #or True
这必须在编译之前完成。
【讨论】:
''还有很多其他原因可能会导致无法训练重量。'' 如果您愿意解释一下,这些是什么? 例如,您可能有一个“预训练模型”,您知道它运行良好并且不想更改。您可能正在训练 GAN,并且一次只工作一侧。确实有很多创造性的原因,这取决于你想要什么。 首先谢谢你,但是如果使用预训练模型时性能提高了怎么办【参考方案2】:有些细节是其他答案没有涵盖的。
在 Keras 中,不可训练的参数是没有使用梯度下降训练的参数。这也是由每一层中的trainable
参数控制的,例如:
from keras.layers import *
from keras.models import *
model = Sequential()
model.add(Dense(10, trainable=False, input_shape=(100,)))
model.summary()
这会打印 0 个可训练参数和 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
标志的影响。
【讨论】:
这实际上是这个问题的正确答案,因为作者问为什么 Inception 模型中的某些参数总是“不可训练”,即使您将所有层都设置为可训练。答案是 batchnorm 层的均值/方差参数。 数字“20”从何而来?我问是因为一直在 tensorflow.keras.layers.experimental 中使用 preprocessing.Normalization。在这里,当我使用一个输入 ([None,1]) 时,我在摘要中得到 3 个不可训练的参数。但是,当我使用 9 个输入 ([None,9]) 时,我得到 19 个不可训练的参数。请参阅此处的完整示例:link 第一种情况的 3 和第二种情况的 9 来自哪里?似乎类似于输入* 2 + 1,但我想更详细地了解它们的含义以及如何计算。非常感谢。 @uom0 来自我的回答“20 个不可训练参数对应于在测试期间使用的激活的计算平均值和标准差”这对应于 BatchNormalization 层的不可训练参数,请注意,其他层以不同方式计算这些参数。【参考方案3】:不可训练的参数是一个相当广泛的主题。一个简单的例子是考虑任何特定 NN 模型及其架构的情况。
假设我们已经在 Keras 中设置了您的网络定义,并且您的架构类似于 256->500->500->1
。根据这个定义,我们似乎有一个回归模型(一个输出),有两个隐藏层(每个 500 个节点)和一个 256 个输入。
模型的一个不可训练参数是,例如,隐藏层本身的数量 (2)。其他可能是每个隐藏层上的节点(在这种情况下为 500 个),甚至是每个单独层上的节点,每层给你一个参数加上层本身的数量。
这些参数是“不可训练的”,因为您无法使用训练数据优化其值。训练算法(如反向传播)将优化和更新 权重 em> ,它们是此处实际可训练的参数(通常为数千,取决于您的连接)。您的训练数据无法帮助您确定那些不可训练的参数。
然而,这并不意味着numberHiddenLayers
根本不可训练,它只是意味着在这个模型 及其实现中我们无法这样做。 我们可以让numberHiddenLayers
可训练;最简单的方法是定义另一种 ML 算法,该算法将此模型作为输入,并使用多个 numberHiddenLayers
值对其进行训练。使用优于其他模型的模型获得最佳值,从而优化numberHiddenLayers
变量。
换句话说,模型的不可训练参数是那些在训练期间不会更新和优化的参数,它们必须先验定义,或作为输入传递。
【讨论】:
我相信这里有一个混淆......网络拓扑和诸如此类(学习率,辍学率等)不是“不可训练的参数”;它们被称为“超参数”。在训练期间使用训练集自动优化参数(使用梯度下降)。超参数是手动优化的(使用工程师大脑),并使用开发集进行评估。 关于原始问题,我相信“不可训练的参数”例如是在 BatchNorm 层中计算的平均值“mu”和标准差“sigma”,而参数“gamma”和“ beta' 是可训练的参数。总而言之:“可训练参数”是根据其梯度(误差/损失/成本相对于参数的导数)修改值的参数,而“不可训练参数”是未根据其优化值的参数到他们的梯度。 感谢@JulienREINAULD 的反馈,如果您想添加一些内容,我相信还有很多空间可以回答 :) 根据您的定义,超参数也是不可训练的(除非您设计你的算法来训练它们)。【参考方案4】:很明显,如果您冻结网络的任何层。该冻结层上的所有参数都变为不可训练。另一方面,如果你从头开始设计你的网络,它也可能有一些不可训练的参数。例如批标准化层有 4 个参数:
[gamma weights, beta weights, moving_mean, moving_variance]
前两个是可训练的,但后两个不是。因此,批量标准化层很可能是您的自定义网络具有不可训练参数的原因。
【讨论】:
以上是关于不可训练参数的定义是啥?的主要内容,如果未能解决你的问题,请参考以下文章