ELMO --微调功能实现

微调的定义

迁移学习不是一种算法而是一种机器学习思想,应用到深度学习就是微调(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层,这该怎么改呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容