Что означает "не обучаемые параметры"?

Можете ли вы уточнить для меня и людей, которым необходимо понять определение не обучаемых параметров в модели?

Например, когда вы строите свою собственную модель, ее значение равно 0 по умолчанию, но если вы хотите использовать начальную модель, она становится чем-то другим, а не 0. В чем причина этого?

Спасибо за ваше разъяснение заранее.

Ответ 1

Не обучаемые параметры - довольно широкий предмет. Прямым примером является рассмотрение случая любой конкретной модели NN и ее архитектуры.

Предположим, что мы уже установили определение вашей сети в Keras, а ваша архитектура похожа на 256->500->500->1. Основываясь на этом определении, мы, похоже, имеем регрессионную модель (один вывод) с двумя скрытыми слоями (по 500 узлов каждый) и с входом 256.

Одними не обучаемыми параметрами вашей модели являются, например, количество скрытых слоев (2). Другими могут быть узлы на каждом скрытом слое (в этом случае 500) или даже узлы на каждом отдельном уровне, предоставляя вам один параметр на каждый слой плюс количество слоев.

Эти параметры являются "не обучаемыми", потому что вы не можете оптимизировать свою ценность с помощью данных обучения. Алгоритмы обучения (например, обратное распространение) будут оптимизировать и обновлять весы вашей сети, которые здесь являются фактическими обучаемыми параметрами (обычно несколько тысяч, в зависимости от ваших соединений). Ваши данные обучения не могут помочь вам определить те не обучаемые параметры.

Однако это не означает, что numberHiddenLayers вообще не является обучаемым, это означает только то, что в этой модели и ее реализации мы не можем этого сделать. Мы могли бы сделать numberHiddenLayers обучаемым; самым простым способом было бы определить другой ML-алгоритм, который принимает эту модель в качестве входных данных и обучает ее нескольким значениям numberHiddenLayers. Наилучшее значение получается с моделью, которая превосходит другие, тем самым оптимизируя переменную numberHiddenLayers.

Другими словами, не обучаемые параметры модели - это те, которые вы не будете обновлять и оптимизировать во время обучения, и которые должны быть определены априорно или переданы как входные данные.

Ответ 2

В keras, не обучаемые параметры (как показано в model.summary()) означает количество весов, которые не обновляются во время обучения с обратным распространением.

Есть в основном два типа не обучаемых гирь:

  • Те, которые вы выбрали, чтобы сохранить постоянными при обучении. Это означает, что керасы не будут обновлять эти веса во время тренировок вообще.
  • Те, которые работают как статистика в слоях BatchNormalization. Они обновлены со средним и дисперсией, но они не "обучены обратному распространению".

Веса - это значения внутри сети, которые выполняют операции и могут быть скорректированы в соответствии с тем, что мы хотим. Алгоритм обратного распространения изменяет веса в сторону меньшей ошибки в конце.

По умолчанию все веса в модели керас являются обучаемыми.

Когда вы создаете слои, он создает собственные веса, и они обучаемы. (Алгоритм обратного распространения обновит эти веса)

Когда вы сделаете их неисследуемыми, алгоритм больше не будет обновлять эти веса. Это полезно, например, когда вы хотите сверточный слой с определенным фильтром, например, фильтром Собеля. Вы не хотите, чтобы обучение изменило эту операцию, поэтому эти веса/фильтры должны быть постоянными.

Существует множество других причин, по которым вы можете захотеть сделать гири неиссякаемыми.


Изменение параметров:

Для принятия решения о гире обучаемая или нет, вы берете слои от модели и установить trainable:

model.get_layer(layerName).trainable = False #or True

Это должно быть сделано до компиляции.

Ответ 3

Есть некоторые детали, которые другие ответы не охватывают.

В Керасе необучаемые параметры - это те, которые не обучаются с использованием градиентного спуска. Это также контролируется 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 флаг.

Ответ 4

Понятно, что если вы заморозите любой слой сети. все параметры в этом замороженном слое становятся необучаемыми. С другой стороны, если вы разрабатываете свою сеть с нуля, она может иметь и некоторые необучаемые параметры. Например, слой пакетной нормализации имеет 4 параметра, которые являются;

[gamma weights, beta weights, moving_mean, moving_variance]

Первые два из них являются обучаемыми, а последние два - нет. Таким образом, уровень пакетной нормализации, вероятно, является причиной того, что ваша пользовательская сеть имеет необучаемые параметры.

Ответ 5

В каждой модели, которую мы определяем, есть параметры, а затем есть гиперпараметры. Параметры в основном состоят из весов и смещений, в то время как гиперпараметры состоят из количества фильтров, размера фильтра, частоты выпадения, скорости обучения и т.д.

Возвращаясь к вашему вопросу, в модели мы тренируем слои, чтобы уменьшить потери и оптимизировать параметры, сохраняя гиперпараметры постоянными. Таким образом, при обратном распространении, где мы применяем градиентный спуск или любой другой алгоритм оптимизации, мы обновляем весы и смещения после каждого шага обратного распространения.

Проще говоря, обучаемые параметры оптимизируются во время тренировки, в то время как необучаемые параметры не оптимизируются во время тренировки.