Tensorflow RNN文本生成:如何平衡培训/测试丢失与验证丢失?

Tensorflow RNN文本生成:如何平衡培训/测试丢失与验证丢失?,tensorflow,machine-learning,keras,nlp,recurrent-neural-network,Tensorflow,Machine Learning,Keras,Nlp,Recurrent Neural Network,我正在做一个简短的项目,其中包括实现一个用于文本生成的字符RNN。我的模型使用单个LSTM层,具有不同的单位(在50到500之间混乱),以0.2的速率退出,softmax激活。我正在使用RMSprop,学习率为0.01 我的问题是,我找不到一个好的方法来描述验证损失。我使用了0.3的验证分割,我发现验证损失在几个时期(可能2-5年左右)后开始变得恒定,而训练损失则不断减少验证损失在这类问题中有很大影响吗?模型的目的是生成新字符串,因此用其他字符串量化验证损失似乎。。。毫无意义 我很难真正找到最好

我正在做一个简短的项目,其中包括实现一个用于文本生成的字符RNN。我的模型使用单个LSTM层,具有不同的单位(在50到500之间混乱),以0.2的速率退出,softmax激活。我正在使用RMSprop,学习率为0.01

我的问题是,我找不到一个好的方法来描述验证损失。我使用了0.3的验证分割,我发现验证损失在几个时期(可能2-5年左右)后开始变得恒定,而训练损失则不断减少验证损失在这类问题中有很大影响吗?模型的目的是生成新字符串,因此用其他字符串量化验证损失似乎。。。毫无意义

我很难真正找到最好的模型,因为从质量上来说,我感觉到最好的模型训练的时间比验证损失停止变化所需的时间要多,但训练损失开始增加所需的时间也要少。我非常感谢您对这个问题的任何建议,以及关于RNN文本生成的一般建议,特别是关于退出和过度拟合的建议。谢谢

这是为每个时代拟合模型的代码。回调是一个自定义回调,只打印一些测试。我现在意识到历史是一个回调。历史['loss']可能是训练的损失,不是吗

for i in range(num_epochs):
    history_callback = model.fit(x, y,
          batch_size=128,
          epochs=1,
          callbacks=[print_callback],
          validation_split=0.3)
    loss_history.append(history_callback.history['loss'])
    validation_loss_history.append(history_callback.history['val_loss'])
我建立这个模型的目的不是从训练数据中复制句子,而是从我训练的相同分布中生成句子

  • history\u回调。history['loss']
    是培训损失,而
    history\u回调。history['val\u loss']
    是验证损失

  • 是的,
    Validation Loss
    在这类问题中很重要,因为你不想重复训练中给出的句子,而是想从训练数据中学习模式,并在看到新数据时生成新句子

  • 从您在问题中提到的信息和从评论中识别的见解(感谢Brian Bartoldson),可以理解您的模型是过度拟合的。除了
    提前停止
    退出
    之外,您还可以尝试下面提到的技术来缓解
    过度安装
    问题

  • 3.a
    Shuffle
    使用
    model.fit中的
    Shuffle=True
    对数据进行调整。代码如下所示

    3.b。使用
    经常性辍学
    。例如,如果在<代码>递归层(LSTM)中设置<代码>递归辍学< /代码>作为<代码> 0.2代码/代码>,则意味着它将只考虑<代码> 80%步<代码> > <代码>递归层(LSTM)

    3.c。使用
    正则化
    。您可以尝试
    l1正则化
    l1\u l2正则化
    以及
    LSTM
    层的参数、
    kernel\u正则化子
    recurrent\u正则化子
    bias\u正则化子

    使用
    洗牌
    提前停止
    反复退出
    正则化
    的示例代码如下所示:

    from tensorflow.keras.regularizers import l2
    from tensorflow.keras.models import Sequential
    
    model = Sequential()
    
    Regularizer = l2(0.001)
    
    model.add(tf.keras.layers.LSTM(units = 50, activation='relu',kernel_regularizer=Regularizer ,
        recurrent_regularizer=Regularizer , bias_regularizer=Regularizer , activity_regularizer=Regularizer, dropout=0.2, recurrent_dropout=0.3))
    
    callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=15)
    
    history_callback = model.fit(x, y,
              batch_size=128,
              epochs=1,
              callbacks=[print_callback, callback],
              validation_split=0.3, shuffle = True)
    

    希望这有帮助。学习愉快

    测试丢失持续减少?考虑在这2种方式澄清您的问题:1)包括一些实际或伪代码,显示您如何使用培训/测试/验证数据。2)为这个文本生成器添加关于您意图的详细信息:粗略地说,如果您希望您的模型能够很好地在您的训练数据中重复句子,那么您关心的是训练丢失,您不需要担心验证数据。或者,如果您希望您的模型能够很好地从与培训数据相同的分布中为看不见的数据生成文本,那么您希望获得尽可能高的验证精度。根据更新,您关心的是培训数据采样所来自的分布的性能(即,您希望泛化)。但是,根据您的问题,验证丢失似乎在某个点之后停止改变。这是正确的吗?如果它是正确的,那么你的模型的泛化(大约)与你训练的时间无关,因此你最好在到达验证损失平台时停止。验证损失在大约5个时期内降至一个常数,然后慢慢开始增加,所以我想我需要像你建议的那样提前停止。我对不同时期的训练损失和考试损失之间的区别感到困惑,所以我会澄清这一点。非常感谢。没问题!欢迎来到SO!另一方面,投票选出[1]条你认为有用的评论、问题和答案有助于其他人找到好信息,也是对贡献者的一种鼓励。[1]: