如何设置和跟踪权重衰减?

问题描述 投票:0回答:1

设置权重衰减的准则是什么(如l2罚则)--主要是,我如何做到 轨道 是否在整个训练中 "发挥作用"?即重量是否真的在衰减,以及 多少,相比之下,没有l2惩罚)。)

python tensorflow keras deep-learning
1个回答
2
投票

一个常见的方法是 "尝试一个数值范围,看看什么是有效的"--但它的缺陷是缺乏 正交性; l2=2e-4 在网络中可能效果最好 X但不是网络 Y. 一个变通的办法是引导重量衰减的方式。子网 方式。(1)分组层(如? Conv1D 栈&amp。LSTMs分别),(2)设置目标权重规范,(3)跟踪。

(1): 看 此处同样的论点和建议的权重值将不适用于convs--因此需要进行各种分组

(2): 一个声音选项是: l2-常态 的权重矩阵进行正则化;然后就是哪个 轴心 来计算它与。面向特征提取的方法是选择 频道轴 (最后一个在Keras中),得到一个长度=通道特征数的向量,所以每个元素都是一个通道的l2-norm。

(3): l2-norm向量可以迭代地追加到一个列表中,也可以或许将其meanmax作为更简略的汇总统计--然后在训练结束时绘制。

下图所示的一个完整的例子;关键函数。weights_norm,在底部给出,取自于 见RNN. 我还建议 Keras AdamW 以改善重量衰减。

enter image description here

解释:

  • wd=2e-3 衰减输出层强于 2e-4,但不是输入,说明与瓶颈层存在平衡互动。
  • wd=2e-3 产量 差异较小 相对于重量规范而言 2e-4
  • 输出信念层的规范增长,即使是随着 2e-3,表明向产出的梯度更强
  • 探讨行为与 BatchNormalization 附加

代码& 解释;以下是做。

  1. 火车和轨道进度

    • 制作虚拟模型& 数据,选择 n_batcheswd (L2罚款)
    • 设置列车循环,选择 n_epochs
    • 创建 l2_stats 追踪进度
    • 在每次列车迭代时,计算 weights_norm() 并附于 l2_stats
  2. 预处理进度数据,以便绘图

    • 获取重量衰减的权重名称;包括非衰减的在 omit_names
    • l2_stats 便于附加到,但必须转换为 np.ndarray 适当的色调;拆开包装,以便 .shape == (n_epochs, n_layers, n_weights, n_batches) -> (n_rows, n_cols, hists_per_subplot). 请注意,这要求每层跟踪的权重矩阵数量相同。
  3. 情节

    • 明确设置 xlimsylim 互相比较 wd 价值观
    • 默认计算两个统计。np.mean (橙色),和 np.max. 后者也是Keras的处理方式。maxnorm 权重正则化。
import numpy as np
import tensorflow as tf
import random

np.random.seed(1)
random.seed(2)
tf.compat.v1.set_random_seed(3)

from keras.layers import Input, Conv1D
from keras.models import Model
from keras.regularizers import l2

from see_rnn import weights_norm, features_hist_v2

########### Model & data funcs ################################################
def make_model(batch_shape, layer_kw={}):
    """Conv1D autoencoder"""
    dim = batch_shape[-1]
    bdim = dim // 2

    ipt = Input(batch_shape=batch_shape)
    x   = Conv1D(dim,  8, activation='relu',   **layer_kw)(ipt)
    x   = Conv1D(bdim, 1, activation='relu',   **layer_kw)(x)  # bottleneck
    out = Conv1D(dim,  8, activation='linear', **layer_kw)(x)

    model = Model(ipt, out)
    model.compile('adam', 'mse')
    return model

def make_data(batch_shape, n_batches):
    X = Y = np.random.randn(n_batches, *batch_shape)
    return X, Y

########### Train setup #######################################################
batch_shape = (32, 100, 64)
n_epochs = 5
n_batches = 200
wd = 2e-3
layer_kw = dict(padding='same', kernel_regularizer=l2(wd))

model = make_model(batch_shape, layer_kw)
X, Y  = make_data(batch_shape, n_batches)

## Train ####################
l2_stats = {}
for epoch in range(n_epochs):
    l2_stats[epoch] = {}
    for i, (x, y) in enumerate(zip(X, Y)):
        model.train_on_batch(x, y)
        print(end='.')

        verbose = bool(i == len(X) - 1)  # if last epoch iter, print last results
        if verbose:
            print()
        l2_stats[epoch] = weights_norm(model, [1, 3], l2_stats[epoch],
                                       omit_names='bias', verbose=verbose)
    print("Epoch", epoch + 1, "finished")
    print()

########### Preprocess funcs ##################################################
def _get_weight_names(model, layer_names, omit_names):
    weight_names= []
    for name in layer_names:
        layer = model.get_layer(name=name)
        for w in layer.weights:
            if not any(to_omit in w.name for to_omit in omit_names):
                weight_names.append(w.name)
    return weight_names

def _merge_layers_and_weights(l2_stats):
    stats_merged = []
    for stats in l2_stats.values():
        x = np.array(list(stats.values()))  # (layers, weights, stats, batches)
        x = x.reshape(-1, *x.shape[2:])     # (layers-weights, stats, batches)
        stats_merged.append(x)
    return stats_merged  # (epochs, layer-weights, stats, batches)

########### Plot setup ########################################################
ylim = 5
xlims = (.4, 1.2)
omit_names = 'bias'
suptitle = "wd={:.0e}".format(wd).replace('0', '')
side_annot = "EP"
configs = {'side_annot': dict(xy=(.9, .9))}

layer_names = list(l2_stats[0].keys())
weight_names = _get_weight_names(model, layer_names, omit_names)
stats_merged = _merge_layers_and_weights(l2_stats)

## Plot ########
features_hist_v2(stats_merged, colnames=weight_names, title=suptitle,
                 xlims=xlims, ylim=ylim, side_annot=side_annot, 
                 pad_xticks=True, configs=configs)
© www.soinside.com 2019 - 2024. All rights reserved.