私と、モデル内のトレーニング不能なパラメーターの定義を理解する必要がある人々のために明確にできますか?
たとえば、独自のモデルを構築している間、その値はデフォルトで0ですが、インセプションモデルを使用する場合、0ではなく何かになります。その背後にある理由は何でしょうか。
事前にご説明いただきありがとうございます。
訓練不可能なパラメータは非常に幅広いテーマです。簡単な例は、特定のNNモデルとそのアーキテクチャのケースを検討することです。
Kerasでネットワーク定義を既にセットアップしており、アーキテクチャが256->500->500->1
。この定義に基づいて、2つの隠れ層(それぞれ500ノード)と256の入力を持つ回帰モデル(1つの出力)があるようです。
モデルの1つのトレーニング不可能なパラメーターは、たとえば、非表示レイヤーの数自体(2)です。その他は、各非表示レイヤーのノード(この場合は500)、または個々のレイヤーのノードで、レイヤーごとに1つのパラメーターとレイヤーの数自体を指定できます。
トレーニングデータでその値を最適化することはできません。トレーニングアルゴリズム(逆伝播など)はweightsを最適化および更新するため、これらのパラメーターは「トレーニング不可」です。ここで実際のトレーニング可能なパラメーターであるネットワーク(通常、接続に応じて数千)。トレーニングデータをそのまま使用しても、これらのトレーニング不可能なパラメーターを決定することはできません。
ただしこれは、numberHiddenLayers
がまったくトレーニング可能でないという意味ではなく、このモデルおよびその実装では、トレーニングが不可能であることを意味するだけです。 numberHiddenLayers
をトレーニング可能にすることができます;最も簡単な方法は別のMLアルゴリズムを定義することです。このモデルは入力としてこのモデルを取り、numberHiddenLayers
のいくつかの値でトレーニングします。最適な値は、他のものよりも優れたモデルで得られ、したがってnumberHiddenLayers
変数を最適化します。
言い換えると、モデルのトレーニング不可パラメーターは、トレーニング中に更新および最適化されず、定義する必要があるパラメーターですa Priori、または入力として渡されます。
ケラスでは、トレーニング不可パラメーター(model.summary()
に示すように)は、逆伝播によるトレーニング中に更新されない重みの数を意味します。
トレーニングできないウェイトには主に2つのタイプがあります。
重みは、操作を実行するネットワーク内の値であり、必要に応じて調整できます。バックプロパゲーションアルゴリズムは、重みを最後に低いエラーに向かって変更します。
デフォルトでは、kerasモデルのすべての重みはトレーニング可能です。
レイヤーを作成すると、内部で独自のウェイトが作成され、トレーニング可能になります。 (逆伝播アルゴリズムはこれらの重みを更新します)
それらをトレーニング不能にすると、アルゴリズムはこれらの重みを更新しなくなります。これは、たとえば、Sobelフィルターなどの特定のフィルターを持つ畳み込みレイヤーが必要な場合などに便利です。トレーニングでこの操作を変更したくないので、これらの重み/フィルターは一定に保つ必要があります。
ウェイトをトレーニング不能にしたい理由は他にもたくさんあります。
パラメータの変更:
ウェイトがトレーニング可能かどうかを判断するには、モデルからレイヤーを取得してtrainable
を設定します。
model.get_layer(layerName).trainable = False #or True
これはコンパイルの前に行う必要があります。
他の回答ではカバーできない詳細がいくつかあります。
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
_________________________________________________________________
これで、すべてのパラメーターがトレーニング可能になり、トレーニング不可能なパラメーターはゼロになりました。しかし、訓練可能なパラメーターと訓練不可能なパラメーターの両方を持つレイヤーもあります。1つの例は、テスト時間中に使用するためにアクティベーションの平均と標準偏差が保存される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
フラグの影響を受けません。
ネットワークのいずれかのレイヤーをフリーズすると、明らかになります。そのフリーズしたレイヤー上のすべてのパラメーターは、トレーニング不可になります。一方、ゼロからネットワークを設計する場合、いくつかのトレーニング不可能なパラメータも含まれる場合があります。たとえば、バッチ正規化レイヤーには4つのパラメーターがあります。
[gamma weights, beta weights, moving_mean, moving_variance]
それらの最初の2つは訓練可能ですが、最後の2つは訓練できません。そのため、バッチ正規化レイヤーは、おそらくカスタムネットワークにトレーニング不可能なパラメーターがある理由です。