華為ModelArts-Lab拓展試驗記錄(一)

      網(wǎng)友投稿 794 2025-04-03

      華為ModelArts-Lab拓展實驗記錄(一)


      在2019年7月至2019年12月期間,參加了華為云ModelArt訓練營活動,在ModelArt平臺上,做了一些AI實驗,現(xiàn)在整理一下資料,把我主要做的幾個拓展實驗內(nèi)容做了記錄,方便以后查閱,且分享給那些對使用華為云ModelArt開發(fā)有興趣的朋友。第一個拓展實驗就是訓練營第三期內(nèi)容的拓展,關于衰減率和優(yōu)化器的拓展實驗。

      1、概述

      華為ModelArts-Lab拓展試驗記錄(一)

      本次是華為ModelArts的拓展題目,主要是有兩個內(nèi)容:

      1、自己定義學習率衰減規(guī)律。使用LearningRateScheduler方法,自己定義學習率衰減。

      2、不同的優(yōu)化器都有不一樣的表現(xiàn)。可以嘗試用更多的輪數(shù)對比不同的優(yōu)化器,重新審視各個模型在訓練各個階段的表現(xiàn)。

      所以,本次試驗分為了兩個部分組成,分別在華為ModelArts平臺上分別進行,從最基礎的概念做以下做介紹。

      1.1 基礎方法的概念簡介

      學習衰減率:在訓練模型的時候,通常會遇到這種情況:我們平衡模型的訓練速度和損失(loss)后選擇了相對合適的學習率(learning rate),但是訓練集的損失下降到一定的程度后就不在下降了。學習率衰減(Learning rate decay)的想法來自于,若以一個固定的學習率進行訓練,很有可能在最優(yōu)點附近跳動,所以,需要設計一個函數(shù),讓學習率隨著訓練次數(shù)(N of epoch)的增加而衰減,收斂梯度下降的學習步長。

      早停法:為了防止深度學習神經(jīng)網(wǎng)絡在學習過程中的過擬合,當網(wǎng)絡在訓練集上表現(xiàn)越來越好,錯誤率越來越低的時候,實際上在某一刻,它在測試集的表現(xiàn)已經(jīng)開始變差。我們設計了一種方法,當驗證誤差沒有進一步改善時,算法就提前終止。這種策略被稱作早停(early stopping)。

      梯度下降優(yōu)化算法:梯度下降算法(Gradient Descent Optimization)是神經(jīng)網(wǎng)絡模型訓練最常用的優(yōu)化算法,其原理是利用導數(shù)反映的是函數(shù) f(x) 在 x軸上某一點處沿著 x軸正方向的變化率/變化趨勢,利用偏導數(shù)推導,使得負梯度方向不斷下降,逐步降低函數(shù)損失值,以此達到最優(yōu)點。主要有批量梯度下降(Batch Gradient Descent,BGD)、隨機梯度下降法(Stochastic Gradient Descent,SGD)和小批量梯度下降法(Mini-batch Gradient Descent,MBGD)。

      模型檢查點:保存模型并不限于在訓練之后,在訓練之中也需要保存,因為TensorFlow訓練模型時難免會出現(xiàn)中斷的情況。我們自然希望能夠將辛苦得到的中間參數(shù)保留下來,否則下次又要重新開始。這種在訓練中保存模型,習慣上稱之為保存檢查點(checkpoint)。

      1.2? 試驗環(huán)境

      本次試驗主要是在ModelArts上使用Notebook上使用python 語言進行代碼編輯和執(zhí)行,主要使用了Keras庫和框架。Keras是一個由Python編寫的開源人工神經(jīng)網(wǎng)絡庫,可以作為Tensorflow、Microsoft-CNTK和Theano的高階應用程序接口,進行深度學習模型的設計、調(diào)試、評估、應用和可視化。在實驗中,我參考了在線文檔:https://keras-cn.readthedocs.io/en/latest/。

      2、學習率衰減實驗

      實驗在不同條件和環(huán)境下,各種方式下,設計不同的學習衰減率,模型的表現(xiàn)。

      首先介紹 回調(diào)函數(shù)Callbacks,這個是keras 里面用來訓練時候,回調(diào)函數(shù)是一組在訓練的特定階段被調(diào)用的函數(shù)集,通過傳遞回調(diào)函數(shù)列表到模型的.fit()中,即可在給定的訓練階段調(diào)用該函數(shù)集中的函數(shù)。Keras的回調(diào)函數(shù)是一個類,keras.callbacks.CallbackList(callbacks=[], queue_length=10)。keras.callbacks.Callback(),這個用法,我們用時候定義好 callbacks 即可。

      重點是它的參數(shù)params:是字典,傳進去的參數(shù)都是字典方式,所以無論是學習率、早停還是模型檢查點,所以傳進去的參數(shù)位置可以任意,不會有問題。這個地方是Python 語言特有的代碼特色,要理解!!!

      2.1?LearningRateScheduler 和ReduceLROnPlateau

      這是兩個容易混淆的函數(shù),都是Keras里面的學習率的控制函數(shù)。

      1、ReduceLROnPlateau 是一個動態(tài)監(jiān)測的過程的學習率衰減函數(shù),當當評價指標不在提升時,減少學習率,可以設置一大堆參數(shù),進行控制。文檔位置:https://keras-cn.readthedocs.io/en/latest/legacy/other/callbacks/#reducelronplateau。

      2、LearningRateScheduler 是一個該回調(diào)函數(shù)是學習率調(diào)度器,它的參數(shù)是 schedule,它是個函數(shù),該函數(shù)以epoch號為參數(shù)(從0算起的整數(shù)),返回一個新學習率(浮點數(shù))。意思就是需要寫一個函數(shù),參數(shù)是epoch(學習輪數(shù)),返回值是一個學習率。文檔要看https://m.w3cschool.cn/tensorflow_python/tf_keras_callbacks_LearningRateScheduler.html。keras中文檔內(nèi)的描述少了一個verbose:int;當其為0時,保持安靜;當其為1時,表示更新消息。我們當然要設置為1。

      兩者區(qū)別么。。。ReduceLROnPlateau是被動執(zhí)行,根據(jù)你參數(shù)監(jiān)控的內(nèi)容,如果達到要求,就執(zhí)行你對學習率而設置衰減率。LearningRateScheduler是主動執(zhí)行,每一輪的學習率都是你設置的返回值 。ReduceLROnPlateau是被動觸發(fā)器,LearningRateScheduler是主動執(zhí)行函數(shù)。本次實驗主要采用LearningRateScheduler函數(shù)。

      2.2?LearningRateScheduler的 使用方式

      這種方式,主要是針對梯度下降的優(yōu)化算法,梯度下降算法有兩個重要的控制因子:一個是步長,由學習率控制;一個是方向,由梯度指定。 影響因素:

      1)學習率設置太小,需要花費過多的時間來收斂

      2)學習率設置較大,在最小值附近震蕩卻無法收斂到最小值

      3)進入局部極值點就收斂,沒有真正找到的最優(yōu)解

      4)停在鞍點處,不能夠在另一維度繼續(xù)下降

      LearningRateScheduler的 使用讓我們可以動態(tài)調(diào)整學習率,在不同的優(yōu)化階段能夠動態(tài)改變學習率,以得到更好的結果。制定不同策略,編寫各種函數(shù),動態(tài)改變學習率。

      LearningRateScheduler 函數(shù)返回的也是個字典類型數(shù)據(jù),可以直接在callbacks里使用。

      2.3 主要實驗過程代碼

      es?=?EarlyStopping(monitor='val_acc',?min_delta=0.001,?patience=5,?verbose=1,?mode='auto')? ????cp?=?ModelCheckpoint(filepath="./model/ckp_vgg16_dog_and_cat.h5",?monitor="val_acc",?verbose=1,?save_best_only=True,?mode="auto",?period=1)

      上面兩行代碼定義了 es(早停) 和 cp(檢查點),參數(shù)可以查手冊

      這里的模式選擇的是VGG16,VGG是一種卷積神經(jīng)網(wǎng)絡模型,可分為A,A-LRN,B,C,D,E共6個配置(ConvNet Configuration),其中以D,E兩種配置較為常用,分別稱為VGG16和VGG19。

      epochs?=?10?#總的循環(huán)次數(shù) ?def?step_decay(epoch): ????base_lrate?=?0.1?????#初始學習率 ????lrate?=?0.0001 ????if?mode?is?'power_decay': ????????decay_rate?=?0.8????#衰減率? ????????lrate?=?base_lrate?*?((1?-?math.float(epoch)?/?epochs)?**?decay_rate) ????if?mode?is?'linear_decay':??#線性衰減? ????????decay_rate?=?0.98????#衰減率? ????????lrate?=?1/(1?+?decay_rate?*?epoch)?*?base_lrate ????if?mode?is?'exponent_decay':??#指數(shù)衰減 ????????decay_rate?=?0.2????#衰減率 ????????lrate?=?base_lrate?*?math.pow(decay_rate,?(epoch?+?1)/epochs) ????if?mode?is?'cos_decay':?#余弦衰減 ????????min_lrate?=?0.001 ????????lrate?=?0.5?*?(base_lrate?-?min_lrate)?*?(1?+?math.cos(?epoch/epochs?*?3.14?))? ????return?lratemode?=?'linear_decay' ?lr?=?LearningRateScheduler(step_decay,?1)

      lr 學習率,采用了LearningRateScheduler函數(shù),設置參數(shù)。這里我實驗了4種不同的衰減方式,并且寫了衰減函數(shù)的代碼。

      以上是主要核心代碼,全部代碼鏈接地址。

      2.4 LearningRateScheduler函數(shù)在不同策略下的表現(xiàn)

      初始參數(shù)所得目標值與要求的最小值距離比較遠,隨著迭代次數(shù)增加,會越來越靠近最小值。學習率衰減的基本思想是學習率隨著訓練的進行逐漸衰減,即在開始的時候使用較大的學習率,加快靠近最小值的速度,在后來些時候用較小的學習率,提高穩(wěn)定性,避免因學習率太大跳過最小值,保證能夠收斂到最小值。

      本次實驗,訓練輪數(shù)為10輪,目的就是為了驗證LearningRateScheduler函數(shù)。

      線性衰減:最常用的方式,學習率隨著在每迭代 stepsize 次后減少 一定的量,隨著不斷的訓練,不斷重復該過程,學習率衰減的規(guī)律呈現(xiàn)線性分布。

      最后10輪后,準確率0.7左右,損失率0.5左右,整個過程很線性啊!

      指數(shù)衰減: 一種更加靈活的學習率設置方法,學習率呈現(xiàn)指數(shù)衰減,可以先用一個較大的學習率來快速得到一個比較優(yōu)的解,然后隨著迭代的繼續(xù)逐步減少學習率,使模型在訓練后期更加穩(wěn)定。最后10輪后,準確率0.75左右,損失率0.52左右,整個過程中間的擬合狀態(tài)不是很好,有較大的鋸齒波形。

      余弦衰減:余弦退火可以當做是學習率衰減的一種方式,在采用小批量隨機梯度下降(MBGD/SGD)算法時,神經(jīng)網(wǎng)絡應該越來越接近 Loss 值的全局最小值。當它逐漸接近這個最小值時,學習率應該變得更小來使得模型不會超調(diào)且盡可能接近這一點。余弦退火利用余弦函數(shù)來降低學習率,進而解決這個問題,我們也同樣訓練了10輪,最后結果,準確率 0.61 左右,損失率0.6 左右,并不太好。。。其實還是訓練輪數(shù)不夠的原因。

      3、不同優(yōu)化器,在各個模型在訓練各個階段的表現(xiàn)

      為了更加直觀反映問題,模型統(tǒng)一采用 VGG16,沒有早停和模型檢查點。

      3.1 SGD優(yōu)化器

      SGD指stochastic gradient descent,即隨機梯度下降。是梯度下降的batch版本。文檔見:https://keras-cn.readthedocs.io/en/latest/legacy/other/optimizers/#sgd。

      SGD就是每一次迭代計算mini-batch的梯度,然后對參數(shù)進行更新,是最常見的優(yōu)化方法了。

      1、原始SGD優(yōu)化器,這個就是最基礎的,什么優(yōu)化策略都沒有設置,裸奔。原始模式 36 輪訓練。結果準確率0.75左右,損失率0.5左右。主要代碼如下:

      epochs?=?36opt?=?keras.optimizers.SGD(lr=0.01,?momentum=0.0,?decay=0.0,?nesterov=False) ???model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])

      2、帶優(yōu)化的SGD優(yōu)化器,在以上基礎上做了優(yōu)化:增加了動量 momentum項,能夠在相關方向加速SGD,抑制振蕩,從而加快收斂。增加了nesterov項,能在梯度更新時做一個校正,避免前進太快,同時提高靈敏度。設置了decay,每次更新后的學習率衰減值。也是36輪,這樣下來結果好很多了,準確率0.93左右,損失率0.2左右。主要代碼如下:

      epochs?=?36opt?=?keras.optimizers.SGD(lr=0.01,?momentum=0.0,?decay=0.0,?nesterov=False) ????model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])

      3、調(diào)小學習率的帶優(yōu)化的SGD,在以上基礎上,調(diào)小了學習率。也是36輪,這樣下來結果就很慘淡,準確率0.61左右,損失率0.6左右,SGD對學習率的初始設置還是非常重要的。主要代碼如下:

      epochs?=?36opt?=?keras.optimizers.SGD(lr=0.0001,?decay=1e-6,?momentum=0.9,?nesterov=True) ????model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])

      3.2?優(yōu)化器 RMSprop

      RMSProp 算法旨在抑制梯度的鋸齒下降,但與動量相比, RMSProp 不需要手動配置學習率超參數(shù),由算法自動完成。 更重要的是,RMSProp 可以為每個參數(shù)選擇不同的學習率。這個算法可以對低頻的參數(shù)做較大的更新,對高頻的參數(shù)做較小的更新,一種自適應的算法,解決了梯度急速下降的問題。Adadelta 、Adagrad和RMSprop都算同一類的。這里用RMSprop做代表,做了36輪訓練。結果不錯,準確率0.93左右,損失率0.2左右。主要代碼如下:

      epochs?=?36opt?=?keras.optimizers.RMSprop(lr=0.0001,?rho=0.9,?epsilon=1e-06,?decay=1e-6) ????model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])

      3.3?優(yōu)化器 Adam

      Adam(Adaptive Moment Estimation)本質(zhì)上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態(tài)調(diào)整每個參數(shù)的學習率。Adam的優(yōu)點主要在于經(jīng)過偏置校正后,每一次迭代學習率都有個確定范圍,使得參數(shù)比較平穩(wěn)。Adam 是一種可以替代傳統(tǒng)隨機梯度下降過程的一階優(yōu)化算法,它能基于訓練數(shù)據(jù)迭代地更新神經(jīng)網(wǎng)絡權重,被廣泛使用。。。還有個3e-4的流程,它就是最流行的,也是個自動的算法。這里也同樣進行了36輪的算法。結果滿意,準確率0.94左右,損失率0.2左右。主要代碼如下:

      epochs?=?36opt?=?keras.optimizers.Adam(lr=0.0001,?decay=1e-6) ????model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])

      3.4?優(yōu)化器SGD的主動策略

      以上,自適應的Adam和RMSProp都表現(xiàn)不錯,盡管這些自適應算法有助于我們在復雜的損失函數(shù)上找到極小值點,但這還不夠。為了更好的達到目標,往往采取原始的SGD 加上人工策略的做法,這里都用到了LearningRateScheduler函數(shù)。

      SGDR:性能良好的舊版熱重啟 SGD,在訓練時,梯度下降算法可能陷入局部最小值,而不是全局最小值。梯度下降算法可以通過突然提高學習率,來 “跳出” 局部最小值并找到通向全局最小值的路徑。這種方法將余弦退火與熱重啟相結合,使用余弦函數(shù)作為周期函數(shù),并在每個周期最大值時重新開始學習速率。“熱重啟” 是因為學習率重新開始時并不是從頭開始的,而是由模型在最后一步收斂的參數(shù)決定的。可以看一下這張示意圖(來源于網(wǎng)上):

      這里,寫了個函數(shù),40輪,每10輪我重啟一次,開始一次新的余弦函數(shù),計算學習率。準確率0.76左右,損失率0.5左右,原因很簡單,我的訓練輪數(shù)不夠了,一般都要150輪到200輪。不過,可以在代碼中看到,圖的趨勢一直都是不斷改進,不斷提升準確率和降低損失率。網(wǎng)上的資料,論文顯示在150輪,這樣的方式可以達到和Adam一樣的水平。代碼如下:

      epochs?=?40loop?=?10def?step_decay(epoch): ????lrate?=?0.001 ????base_lrate?=?0.01?????#初始學習率 ????min_lrate?=?0.0001 ????lv?=?epoch?//?loop ????epoch?=?epoch?-?loop?*?lv ????lrate?=?0.5?*?(base_lrate?-?min_lrate)?*?(1?+?math.cos(?epoch/loop?*?3.14?))? ????return?lrateopt?=?keras.optimizers.SGD(lr=0.0001,?momentum=0.0,?decay=0.0,?nesterov=False)model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])lr?=?LearningRateScheduler(step_decay,?1)?callbacks?=?[lr]

      重點來了,我想效果好,又想訓練少,怎么辦,找了這個辦法。首先,有一種名為 LR Range Test 的技術。這個方法很簡單,你只需將模型和數(shù)據(jù)迭代幾次,把學習率初始值設置得比較小,然后在每次迭代后增加。你需要記錄學習率的每次損失并將它畫出。這里我寫了個學習率的函數(shù),跑了36輪,從最小學習率 1e-7 到最大學習率1,做了覆蓋和測試,代碼如下:

      #sdg?最大學習率測試loop?=?5epochs?=?36def?step_test(epoch): ????lrate?=?0.001 ????start_lrate?=?1e-7?????#初始學習率 ????lv?=??epoch?//?loop ????epoch?=?epoch%loop? ????lrate?=?math.pow(10,?lv)?*?start_lrate?+?math.pow(10,?lv)?*?start_lrate?*?1.6?*?epoch ????return?lrateopt?=?keras.optimizers.SGD(lr=0.0001,?momentum=0.0,?decay=0.0,?nesterov=False)model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])lr?=?LearningRateScheduler(step_test,?1)?callbacks?=?[lr]

      結果如上圖。

      我在自己訓練結果劃分了三個區(qū)域,針對學習率分別是過小,適合和過大。在適合區(qū)域中,選取了損失率最大值在31輪,31輪的學習率是0.1,就是我為了下面訓練選取的最大學習率。原理如下圖(來源于網(wǎng)上):

      一周期策略:循環(huán)學習率策略僅包含一個周期,因此稱作「一周期」策略。在一周期策略中,最大學習率被設置為 LR Range test 中可以找到的最高值,最小學習率比最大學習率小幾個數(shù)量級。最大值已經(jīng)找到就是0.1 ,最小值選取它的1/10,也在適合區(qū)域內(nèi)。這里我也寫了個自定義的學習率函數(shù),一個40輪,18輪是從低到高,18輪是從高至低,剩下4輪設置為略小于訓練周期的總數(shù),這樣循環(huán)結束后有殘余時間降低學習率,從而幫助模型穩(wěn)定下來。這里我略作修改,下降的18輪沒有走線性,而是余弦方式,最后4輪是指數(shù)下降。最后的代碼如下:

      #sdg?優(yōu)化器?手動速率epochs?=?40loop?=?18def?step_decay(epoch): ????lrate?=?0.01 ????max_lrate?=?0.1?????#初始學習率 ????min_lrate?=?0.01 ????lv?=?epoch?//?loop ????if?lv?is?0: ????????epoch?=?epoch?+?1 ????????lrate?=?max_lrate?/?loop?*?epoch ????if?lv?is?1: ????????epoch?=?epoch?-?loop?*?lv ????????lrate?=?0.5?*?(max_lrate?-?min_lrate?/?2?)?*?(?1.2?+?math.cos(?epoch/loop?*?3.14?))? ????if?lv?is?2: ????????drop?=?0.5 ????????epoch?=?epoch?-?loop?*?lv ????????lrate?=?min_lrate?*?math.pow(drop,?(1?+?epoch)/4) ????return?lrateopt?=?keras.optimizers.SGD(lr=0.0001,?momentum=0.0,?decay=0.0,?nesterov=False)model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])lr?=?LearningRateScheduler(step_decay,?1)?callbacks?=?[lr]

      最后結果:準確率0.93左右,損失率0.2左右。其實,還可以進一步優(yōu)化,作為實驗,結果已經(jīng)可以接受。

      3.5 結論

      一般情況下,使用「自適應方法」的Adam已經(jīng)普遍適用了。RMSProp和Adam這種自適應算法已經(jīng)很好了,但是以SGD和人工學習率策略結合的做法依然很重要,比自適應算法更有潛力。梯度下降是機器學習和深度學習中非常重要的優(yōu)化算法,而學習率是用好梯度下降法的關鍵。除了一些其他客觀的原因,學習率的設定是影響模型性能好壞的非常重要的因素,所以應該給予足夠的重視。

      人工智能

      版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。

      版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。

      上一篇:WPS表格辦公COMBIN 函數(shù)的用法(wps表格)
      下一篇:計算機電子表格(計算機電子表格怎么做)
      相關文章
      国产亚洲欧洲Aⅴ综合一区| 亚洲人成综合在线播放| 亚洲性色AV日韩在线观看| 亚洲成a人片在线观看中文!!! | 亚洲中文字幕精品久久| 亚洲三级视频在线| 久久亚洲熟女cc98cm| 亚洲香蕉免费有线视频| 亚洲综合自拍成人| 亚洲一区二区三区首页| 午夜亚洲www湿好大| 久久精品亚洲视频| 亚洲国产综合91精品麻豆| 亚洲成a人片77777老司机| 国产成人精品日本亚洲网站| 色噜噜亚洲精品中文字幕| 亚洲色无码一区二区三区| 中文字幕亚洲日韩无线码| 亚洲无人区一区二区三区| 亚洲日韩乱码中文无码蜜桃臀网站| 国产亚洲午夜高清国产拍精品| 日韩亚洲翔田千里在线| 亚洲成人影院在线观看| 亚洲成AV人网址| 一本色道久久综合亚洲精品高清| 亚洲欧洲精品成人久久奇米网| 亚洲欧洲精品成人久久奇米网 | 亚洲色图国产精品| 亚洲AV无码成人精品区在线观看 | 朝桐光亚洲专区在线中文字幕 | 亚洲日本国产综合高清| 亚洲色偷偷综合亚洲AV伊人蜜桃| 国产亚洲精aa成人网站| 亚洲国产精品无码久久久秋霞2| 亚洲AV伊人久久青青草原| 亚洲 欧洲 自拍 另类 校园| 亚洲欧洲国产成人精品| 亚洲VA中文字幕无码一二三区| 亚洲综合国产精品第一页| WWW国产亚洲精品久久麻豆| 亚洲人成网站18禁止一区|