← На главную Воспоминания

Суббота, 21 Октября 2023

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

Задача - максимальный сигнал с минимальным шумом.

Нейронные сети бывают широкие(много нейронов в одном слое) и бывают глубокие(много слоев)

model = keras.Sequential([
    layers.Dense(16, activation='relu'),
    layers.Dense(1),
])

wider = keras.Sequential([
    layers.Dense(32, activation='relu'),
    layers.Dense(1),
])

deeper = keras.Sequential([
    layers.Dense(16, activation='relu'),
    layers.Dense(16, activation='relu'),
    layers.Dense(1),
])
</pre>
<p>Чтобы сеть не переобучалась, можно применить раннюю остановку. Если будет расти потеря на валидационной выборке, обучение остановиться</p>
<pre>
    from tensorflow.keras.callbacks import EarlyStopping
    
    early_stopping = EarlyStopping(
        min_delta=0.001, # minimium amount of change to count as an improvement
        patience=20, # how many epochs to wait before stopping
        restore_best_weights=True,
    )

history = model.fit(
    X_train, y_train,
    validation_data=(X_valid, y_valid),
    batch_size=256,
    epochs=500,
    callbacks=[early_stopping], # put your callbacks in a list
    verbose=0,  # turn off training log
)

Изучил Dropout and Batch Normalization

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

keras.Sequential([
    # ...
    layers.Dropout(rate=0.3), # apply 30% dropout to the next layer
    layers.Dense(16),
    # ...
])

Batch Normalization - когда значения из произвольной цифры конвертируются в значение от нуля до единицы. Можно применять к входным иксам, номжно применять между слоями к выходу нейрона

# пример с дропаутом и нормализацией
from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Dense(1024, activation='relu', input_shape=[11]),
    layers.Dropout(0.3),
    layers.BatchNormalization(),
    layers.Dense(1024, activation='relu'),
    layers.Dropout(0.3),
    layers.BatchNormalization(),
    layers.Dense(1024, activation='relu'),
    layers.Dropout(0.3),
    layers.BatchNormalization(),
    layers.Dense(1),
]) 

Начал изучать задачу бинарной классификации