微调的定义
迁移学习不是一种算法而是一种机器学习思想,应用到深度学习就是微调(Fine-tune)。通过修改预训练网络模型结构(如修改样本类别输出个数),选择性载入预训练网络模型权重(通常是载入除最后的全连接层的之前所有层,也叫瓶颈层。
再用自己的数据集重新训练模型就是微调的基本步骤。微调能够快速训练好一个模型,用相对较小的数据量,还能达到不错的结果。
但是哈工大的代码在这里就很有些问题了,首先,因为底层的语料是会变的,所以最底层的Word_layer和char_layer根据不同的语料和不同的数据量内接层数的权重是不一样的
???其实这里底层都是已经训练好了?因为token_embedder是在训练开始就已经弄好了?现在的思路可以是,使用已经训练好了的模型的上层,反而下层需要变化?
不对,因为前向计算的时候,也会涉及到token_embedder,所以一开始初始化的层的权重并不是最终的权重,所以我们应当如何fine_tune,难道是fine_tune整个网络么?还是要跳脱出源代码的束缚??
微调的一般方法
1.定义网络并且加载网络参数
首先定义自己的模型并且加载训练网络的模型和参数,定义自己模型的时候把想要用的层名字设置为何预训练模型一样的
加载与训练模型的参数到自己的模型并且设置学习率
但是这种一般的方法对于我们NLP来说不贴合,因为我们不是一个整体的模型不再变化,我们最终要得到的东西是,随着数据量的增大,模型在已有的数据和参数上继续的变化,我觉得更像是一种迭代式学习的方式
通常在迁移学习中,都是直接将最后一层的全连接层大小换成自己数据集类的大小,然后finetune,但是这样的精度并不能提升到最大。
博客地址:https://blog.csdn.net/xjcvip007/article/details/78583738
关于TensorFlow中的预训练模型:https://blog.csdn.net/gzj_1101/article/details/80299610
现在看的是ELMO的源代码:
https://github.com/allenai/bilm-tf/blob/master/bilm/training.py
这个代码写的明显就比哈工大的要好的多,一来是支持多GPU并行,这个设置了一个models数组,根据使用GPU的不同来划分不同的model和各种参数
# calculate the mean of each gradient across all GPUs
grads = average_gradients(tower_grads, options['batch_size'], options)
grads, norm_summary_ops = clip_grads(grads, options, True, global_step)
norm_summaries.extend(norm_summary_ops)
all models use the same parameters 所有的模型都是使用的一样的参数
源代码如何进行微调?
loader = tf.train.Saver()
loader.restore(sess, restart_ckpt_file)
就这两行就可以了?而且后面也没有用到loader这个变量
原来哈工大源代码里的第一层知识Word embedding层,这该怎么改呢?