學(xué)習(xí)bert過程中的思考,少走彎路

向AI轉(zhuǎn)型的程序員都關(guān)注了這個(gè)號???
機(jī)器學(xué)習(xí)AI算法工程?? 公眾號:datayx
最近參加了一個(gè)nlp的比賽,做文本情感分類的。發(fā)現(xiàn)傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的效果的確趕不上bert。就研究了一下bert。其實(shí)真正運(yùn)行bert的操作非常簡單。但因?yàn)檎也坏浇坛淘谧畛踹€是走了很多彎路的。
但在走彎路的同時(shí)我覺得我學(xué)到了很多之前不知道的東西,就用這篇博文記錄一下。我覺得這些思考和收獲讓我對模型的理解和使用水平都提高了一個(gè)層次。甚至我后面跑起來bert很大程度上也要?dú)w功于這期間對模型理解的提升。
這篇博文的內(nèi)容都不僅適用于bert。
防止神經(jīng)網(wǎng)絡(luò)模型過擬合的兩種基本方法
1.dropout
dropout就是在訓(xùn)練的時(shí)候隨機(jī)的使一部分神經(jīng)元凍結(jié)
代碼實(shí)現(xiàn)可以像這樣:

2.正則化
正則化相當(dāng)于一個(gè)懲罰項(xiàng),可以防止模型變得過于復(fù)雜。
1)L0范數(shù)
L0范數(shù)是指參數(shù)矩陣W中含有零元素的個(gè)數(shù),L0范數(shù)限制了參數(shù)的個(gè)數(shù)不會(huì)過多,這也就簡化了模型,當(dāng)然也就能防止過擬合。
2)L1范數(shù)
L1范數(shù)是參數(shù)矩陣W中元素的絕對值之和,L1范數(shù)相對于L0范數(shù)不同點(diǎn)在于,L0范數(shù)求解是NP問題,而L1范數(shù)是L0范數(shù)的最優(yōu)凸近似,求解較為容易。L1常被稱為LASSO.
3)L2范數(shù)
L2范數(shù)是參數(shù)矩陣W中元素的平方之和,這使得參數(shù)矩陣中的元素更稀疏,與前兩個(gè)范數(shù)不同的是,它不會(huì)讓參數(shù)變?yōu)?,而是使得參數(shù)大部分都接近于0。L1追求稀疏化,從而丟棄了一部分特征(參數(shù)為0),而L2范數(shù)只是使參數(shù)盡可能為0,保留了特征。L2被稱為Rigde.
模型融合
忽然發(fā)現(xiàn)keras的代碼真的好用,我之前以為keras的模型都必須先定義好,然后整個(gè)compile,其實(shí)不是,做好的模型也可以接層,比如這樣:

第一個(gè)model就是封裝好的albert模型,這樣就對albert加了一層隨即遮擋,一層GRU,一層前饋,一層歸一和最后的一個(gè)輸出層。
輸出的歸一化
有一段時(shí)間我的模型出了這樣一個(gè)問題,就是他的預(yù)測類別都會(huì)是同一個(gè)值。為什么會(huì)有這個(gè)問題呢?
先來看一看常用的輸出層激活函數(shù):sigmoid和softmax的圖像

softmax的:

對于(-∞,-5]∪[5,+∞)的大部分?jǐn)?shù)據(jù),他們的值都會(huì)非常的趨近0/1,所以要是數(shù)據(jù)不至于大部分分布在這些沒有區(qū)分度的區(qū)域,我們要把數(shù)據(jù)全都?xì)w約到中間有區(qū)分度的部分。即在輸出層前:

按道理說是這樣的,后來我發(fā)現(xiàn)我的錯(cuò)誤其實(shí)是因?yàn)橐粋€(gè)維度錯(cuò)誤。。。
低學(xué)習(xí)率
優(yōu)化器的學(xué)習(xí)率最好低一點(diǎn),我現(xiàn)在一般設(shè)(1e-5)。

我們都知道模型的訓(xùn)練是一個(gè)梯度下降求極值的過程。
圖1就是低學(xué)習(xí)率的情況,圖2就是學(xué)習(xí)率比較高的情況。
較高的學(xué)習(xí)率可能導(dǎo)致梯度下降時(shí)步長過大,無法準(zhǔn)確達(dá)到極值。
所以優(yōu)化器一般設(shè)置低學(xué)習(xí)率。
finetune
fine-tune是遷移學(xué)習(xí)中的一個(gè)概念。bert就可以看作是一種遷移學(xué)習(xí)。
遷移學(xué)習(xí)就是先用一些通用數(shù)據(jù)進(jìn)行訓(xùn)練,再根據(jù)實(shí)際任務(wù)進(jìn)行單獨(dú)的訓(xùn)練。
比如bert,bert就是google用維基的中文語料進(jìn)行的預(yù)訓(xùn)練產(chǎn)生的模型。
(就是bert里的那個(gè)非常大的ckpt文件)
然后我們在要用的時(shí)候再根據(jù)自己的任務(wù)對模型進(jìn)行針對性的訓(xùn)練(fine-tune),讓它執(zhí)行針對性的任務(wù)。
我的理解是預(yù)訓(xùn)練的時(shí)候應(yīng)該是要凍結(jié)輸出層的,只訓(xùn)練中間層,類似于構(gòu)造生成詞向量的過程。然后我們fine-tune的時(shí)候主要是對輸出層進(jìn)行訓(xùn)練,道理類似于根據(jù)已有的詞向量構(gòu)造預(yù)測的過程。
閱讀過本文的人還看了以下文章:
TensorFlow 2.0深度學(xué)習(xí)案例實(shí)戰(zhàn)
基于40萬表格數(shù)據(jù)集TableBank,用MaskRCNN做表格檢測
《基于深度學(xué)習(xí)的自然語言處理》中/英PDF
Deep Learning 中文版初版-周志華團(tuán)隊(duì)
【全套視頻課】最全的目標(biāo)檢測算法系列講解,通俗易懂!
《美團(tuán)機(jī)器學(xué)習(xí)實(shí)踐》_美團(tuán)算法團(tuán)隊(duì).pdf
《深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn)》高清中文PDF+源碼
python就業(yè)班學(xué)習(xí)視頻,從入門到實(shí)戰(zhàn)項(xiàng)目
2019最新《PyTorch自然語言處理》英、中文版PDF+源碼
《21個(gè)項(xiàng)目玩轉(zhuǎn)深度學(xué)習(xí):基于TensorFlow的實(shí)踐詳解》完整版PDF+附書代碼
《深度學(xué)習(xí)之pytorch》pdf+附書源碼
PyTorch深度學(xué)習(xí)快速實(shí)戰(zhàn)入門《pytorch-handbook》
【下載】豆瓣評分8.1,《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):基于Scikit-Learn和TensorFlow》
《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》PDF+完整源碼
汽車行業(yè)完整知識圖譜項(xiàng)目實(shí)戰(zhàn)視頻(全23課)
李沐大神開源《動(dòng)手學(xué)深度學(xué)習(xí)》,加州伯克利深度學(xué)習(xí)(2019春)教材
筆記、代碼清晰易懂!李航《統(tǒng)計(jì)學(xué)習(xí)方法》最新資源全套!
《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》最新2018版中英PDF+源碼
將機(jī)器學(xué)習(xí)模型部署為REST API
FashionAI服裝屬性標(biāo)簽圖像識別Top1-5方案分享
重要開源!CNN-RNN-CTC 實(shí)現(xiàn)手寫漢字識別
同樣是機(jī)器學(xué)習(xí)算法工程師,你的面試為什么過不了?
前海征信大數(shù)據(jù)算法:風(fēng)險(xiǎn)概率預(yù)測
【Keras】完整實(shí)現(xiàn)‘交通標(biāo)志’分類、‘票據(jù)’分類兩個(gè)項(xiàng)目,讓你掌握深度學(xué)習(xí)圖像分類
VGG16遷移學(xué)習(xí),實(shí)現(xiàn)醫(yī)學(xué)圖像識別分類工程項(xiàng)目
特征工程(二) :文本數(shù)據(jù)的展開、過濾和分塊
如何利用全新的決策樹集成級聯(lián)結(jié)構(gòu)gcForest做特征工程并打分?
Machine Learning Yearning 中文翻譯稿
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
python+flask搭建CNN在線識別手寫中文網(wǎng)站
中科院Kaggle全球文本匹配競賽華人第1名團(tuán)隊(duì)-深度學(xué)習(xí)與特征工程
不斷更新資源
深度學(xué)習(xí)、機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、python
?搜索公眾號添加:?datayx??
機(jī)大數(shù)據(jù)技術(shù)與機(jī)器學(xué)習(xí)工程
?搜索公眾號添加:?datanlp
長按圖片,識別二維碼
