微調的定義
遷移學習不是一種算法而是一種機器學習思想,應用到深度學習就是微調(Fine-tune)。通過修改預訓練網絡模型結構(如修改樣本類別輸出個數),選擇性載入預訓練網絡模型權重(通常是載入除最后的全連接層的之前所有層,也叫瓶頸層。
再用自己的數據集重新訓練模型就是微調的基本步驟。微調能夠快速訓練好一個模型,用相對較小的數據量,還能達到不錯的結果。
但是哈工大的代碼在這里就很有些問題了,首先,因為底層的語料是會變的,所以最底層的Word_layer和char_layer根據不同的語料和不同的數據量內接層數的權重是不一樣的
???其實這里底層都是已經訓練好了?因為token_embedder是在訓練開始就已經弄好了?現在的思路可以是,使用已經訓練好了的模型的上層,反而下層需要變化?
不對,因為前向計算的時候,也會涉及到token_embedder,所以一開始初始化的層的權重并不是最終的權重,所以我們應當如何fine_tune,難道是fine_tune整個網絡么?還是要跳脫出源代碼的束縛??
微調的一般方法
1.定義網絡并且加載網絡參數
首先定義自己的模型并且加載訓練網絡的模型和參數,定義自己模型的時候把想要用的層名字設置為何預訓練模型一樣的
加載與訓練模型的參數到自己的模型并且設置學習率
但是這種一般的方法對于我們NLP來說不貼合,因為我們不是一個整體的模型不再變化,我們最終要得到的東西是,隨著數據量的增大,模型在已有的數據和參數上繼續(xù)的變化,我覺得更像是一種迭代式學習的方式
通常在遷移學習中,都是直接將最后一層的全連接層大小換成自己數據集類的大小,然后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層,這該怎么改呢?