ELMO --微調功能實現

微調的定義

遷移學習不是一種算法而是一種機器學習思想,應用到深度學習就是微調(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層,這該怎么改呢?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容