這篇文章主要介紹TensorFlow神經(jīng)網(wǎng)絡(luò)優(yōu)化策略的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
站在用戶的角度思考問題,與客戶深入溝通,找到岳塘網(wǎng)站設(shè)計與岳塘網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋岳塘地區(qū)。在神經(jīng)網(wǎng)絡(luò)模型優(yōu)化的過程中,會遇到許多問題,比如如何設(shè)置學(xué)習(xí)率的問題,我們可通過指數(shù)衰減的方式讓模型在訓(xùn)練初期快速接近較優(yōu)解,在訓(xùn)練后期穩(wěn)定進入最優(yōu)解區(qū)域;針對過擬合問題,通過正則化的方法加以應(yīng)對;滑動平均模型可以讓最終得到的模型在未知數(shù)據(jù)上表現(xiàn)的更加健壯。
一、學(xué)習(xí)率的設(shè)置
學(xué)習(xí)率設(shè)置既不能過大,也不能過小。TensorFlow提供了一種更加靈活的學(xué)習(xí)率設(shè)置方法——指數(shù)衰減法。該方法實現(xiàn)了指數(shù)衰減學(xué)習(xí)率,先使用較大的學(xué)習(xí)率來快速得到一個比較優(yōu)的解,然后隨著迭代的繼續(xù)逐步減小學(xué)習(xí)率,使得模型在訓(xùn)練后期更加穩(wěn)定,緩慢平滑得達到最優(yōu)值。
tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate,staircase=False, name=None)
該函數(shù)會指數(shù)級減小學(xué)習(xí)率,實現(xiàn)每輪實際優(yōu)化時的衰減后的學(xué)習(xí)率decayed_learning_rate = learning_rate * decay_rate ^ (global_step /decay_steps),learning_rate為設(shè)定的出事學(xué)習(xí)率,decay_rate為衰減系數(shù),decay_steps為衰減速度。如下圖,參數(shù)staircase=False時,學(xué)習(xí)率變化趨勢為淺色部分;staircase=True時為深色部分,使得學(xué)習(xí)率變化為階梯函數(shù)(staircase function),這種設(shè)置的常用應(yīng)用場景是每完整地過完一遍訓(xùn)練數(shù)據(jù),學(xué)習(xí)率就減小一次。
使用示例:learning_rate =tf.train.exponential_decay(starter_learning_rate, global_step, 100000, 0.96,staircase=True)。
二、過擬合問題
1. 過擬合問題及其解決方法
所謂過擬合問題,指的是當一個模型過于復(fù)雜后,它可以很好地記憶每一個訓(xùn)練數(shù)據(jù)中隨機噪聲的部分而忘記了要去學(xué)習(xí)訓(xùn)練數(shù)據(jù)中通用的趨勢。
為了避免過擬合問題,常用的方法是正則化(Regularization),思想是在損失函數(shù)中加入刻畫模型復(fù)雜程度的指標,將優(yōu)化目標定義為J(θ)+λR(w) ,其中R(w)刻畫的是模型的復(fù)雜程度,包括了權(quán)重項w不包括偏置項b,λ表示模型復(fù)雜損失在總損失中的比例。一般來說模型復(fù)雜度只由權(quán)重w決定。常用的刻畫模型復(fù)雜度的函數(shù)R(w)有兩種,一種是L1正則化:
另一種是L2正則化:
無論哪種正則化方式,基本思想都是希望通過限制權(quán)重的大小,使得模型不能任意擬合訓(xùn)練數(shù)據(jù)中的隨機噪音。區(qū)別:L1正則化會讓參數(shù)變得更稀疏,L2則不會,所謂參數(shù)變得更稀疏是指會有更多的參數(shù)變?yōu)?,可達到類似特征選取的功能。實踐中,也可以將L1正則化和L2正則化同時使用:
2. 過擬合問題的TensorFlow解決方案
loss =tf.reduce_mean(tf.square(y_ - y) + tf.contrib.layers.l2_regularizer(lambda)(w)
以上就是一個含L2正則化項的損失函數(shù)。第一部分是均方誤差損失函數(shù),第二部分就是正則化項。lambda參數(shù)表示正則化項的權(quán)重,也就是J(θ)+λR(w)中的λ,w為需要計算正則化損失的參數(shù)。tf.contrib.layers.l2_regularize()函數(shù)可以計算給定參數(shù)的L2正則化項,類似地,tf.contrib.layers.l1_regularizer()可以就是那給定參數(shù)的L1正則化項。
# 比較L1正則化和L2正則化函數(shù)的作用效果 w = tf.constant([[1.0, -2.0], [-3.0, 4.0]]) with tf.Session() as sess: # 0.5*(|1|+|-2|+|-3|+|4|=5.0) print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(w))) # 5.0 # 0.5*[(1+4+9+16)/2]=7.5 TensorFlow會將L2正則化項除以2使得求導(dǎo)的結(jié)果更簡潔 print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(w))) # 7.5
當神經(jīng)網(wǎng)絡(luò)的參數(shù)增多以后,上面的定義損失函數(shù)的方式會導(dǎo)致loss的定義式很長,可讀性差,另外當網(wǎng)絡(luò)結(jié)構(gòu)復(fù)雜后定義網(wǎng)絡(luò)結(jié)構(gòu)的部分和計算損失函數(shù)的部分可能不在同一個函數(shù)中,通過變量方式計算損失函數(shù)就不方便了。為解決此問題,可以使用TensorFlow中提供的集合(collection)。具體實現(xiàn)見代碼部分。
tf.add_to_collection()將變量加入至指定集合中;tf.get_collection()返回一個列表,存儲著這個集合中的元素。
三、滑動平均模型
另一個使模型在測試數(shù)據(jù)上更健壯(robust)滑動平均模型。在采用隨機梯度下降算法訓(xùn)練神經(jīng)網(wǎng)絡(luò)時,使用滑動平均模型在很多應(yīng)用中可提高最終模型在測試數(shù)據(jù)上的表現(xiàn),GradientDescent和Momentum方式的訓(xùn)練都能夠從ExponentialMovingAverage方法中獲益。
在TensorFlow中提供的tf.train.ExponentialMovingAverage是一個類class,來實現(xiàn)滑動平均模型。初始化tf.train.ExponentialMovingAverage類對象時,須指定衰減率decay和用于動態(tài)控制衰減率的參數(shù)num_updates。tf.train.ExponentialMovingAverage對每一個變量維護一個影子變量(shadow variable),該影子變量的初始值就是相應(yīng)變量的初始值,每次變量更新時,shadow_variable =decay * shadow_variable + (1 - decay) * variable。從公式中可看出,decay決定了模型更新的速度,decay越大模型越趨于穩(wěn)定,實際應(yīng)用中decay一般設(shè)置為接近1的數(shù)。num_updates默認是None,若設(shè)置了,則衰減率按min(decay, (1 +num_updates) / (10 + num_updates))計算。
tf.train.ExponentialMovingAverage對象的apply方法返回一個對var_list進行更新滑動平均的操作,var_list必須是list的Variable或Tensor,該操作執(zhí)行會更新var_list的影子變量shadowvariable。average方法可獲取滑動平均后變量的取值。
四、代碼呈現(xiàn)
1. 復(fù)雜神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)權(quán)重L2正則化方法
import tensorflow as tf ''''' # 比較L1正則化和L2正則化函數(shù)的作用效果 w = tf.constant([[1.0, -2.0], [-3.0, 4.0]]) with tf.Session() as sess: # 0.5*(|1|+|-2|+|-3|+|4|=5.0) print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(w))) # 5.0 # 0.5*[(1+4+9+16)/2]=7.5 TensorFlow會將L2正則化項除以2使得求導(dǎo)的結(jié)果更簡潔 print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(w))) # 7.5 ''' # 復(fù)雜神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)權(quán)重L2正則化方法 # 定義各層的權(quán)重,并將該權(quán)重的L2正則化項加入至名稱為‘losses'的集合 def get_weight(shape, lambda1): var = tf.Variable(tf.random_normal(shape), dtype=tf.float32) tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambda1)(var)) return var x = tf.placeholder(tf.float32, (None, 2)) y_ = tf.placeholder(tf.float32, (None, 1)) layer_dimension = [2,10,5,3,1] # 定義了神經(jīng)網(wǎng)絡(luò)每層的節(jié)點數(shù) n_layers = len(layer_dimension) current_layer = x # 將當前層設(shè)置為輸入層 in_dimension = layer_dimension[0] # 通過循環(huán)生成一個5層全連接的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu) for i in range(1,n_layers): out_dimension = layer_dimension[i] weight = get_weight([in_dimension,out_dimension], 0.003) bias = tf.Variable(tf.constant(0.1, shape=[out_dimension])) current_layer = tf.nn.relu(tf.matmul(current_layer, weight) + bias) in_dimension = layer_dimension[i] mse_loss = tf.reduce_mean(tf.square(y_ - current_layer)) tf.add_to_collection('losses', mse_loss) loss = tf.add_n(tf.get_collection('losses')) # 包含所有參數(shù)正則化項的損失函數(shù)
2. tf.train.ExponentialMovingAverage使用樣例
import tensorflow as tf # tf.train.ExponentialMovingAverage使用樣例 v1 = tf.Variable(0, dtype=tf.float32) step = tf.Variable(0, trainable=False) # 此處step模擬神經(jīng)網(wǎng)絡(luò)迭代的輪數(shù) # 定義一個滑動平均的類對象,初始化衰減率decay=0.99,用于動態(tài)控制衰減率的參數(shù)num_updates ema = tf.train.ExponentialMovingAverage(0.99, num_updates=step) # apply方法返回一個對var_list進行更新滑動平均的操作,var_list必須是list的Variable或Tensor # 該操作執(zhí)行會更新var_list的影子變量shadow variable maintain_averages_op = ema.apply(var_list=[v1]) with tf.Session() as sess: init_op = tf.global_variables_initializer() sess.run(init_op) # average方法可獲取滑動平均后變量的取值 print(sess.run([v1, ema.average(v1)])) # [0.0, 0.0] sess.run(tf.assign(v1, 5)) # min{0.99, (1+step)(10+step)=0.1}=0.1 # 更新v1的滑動平均值為 0.1*0.0+0.9*5=4.5 sess.run(maintain_averages_op) print(sess.run([v1, ema.average(v1)])) # [5.0, 4.5] sess.run(tf.assign(step, 10000)) sess.run(tf.assign(v1, 10)) # min{0.99, (1+step)(10+step)=0.999}=0.99 # 更新v1的滑動平均值為 0.99*4.5+0.01*10=4.555 sess.run(maintain_averages_op) print(sess.run([v1, ema.average(v1)])) # [10.0, 4.5549998] # 更新v1的滑動平均值為 0.99*4.555+0.01*10=4.60945 sess.run(maintain_averages_op) print(sess.run([v1, ema.average(v1)])) # [10.0, 4.6094499]
以上是“TensorFlow神經(jīng)網(wǎng)絡(luò)優(yōu)化策略的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。