TensorFlow学习笔记之三(神经网络的优化)
文章目錄
- 1. 使用激活函數(shù)去線性化(為什么要用激活函數(shù))
- 實(shí)驗(yàn)證明線性模型的局限性
- 常用激活函數(shù)
- 2. 神經(jīng)網(wǎng)絡(luò)復(fù)雜度:用網(wǎng)絡(luò)層數(shù)和網(wǎng)絡(luò)參數(shù)的個(gè)數(shù)表示
- 3. 損失函數(shù)(loss):預(yù)測(cè)值(y)與已知答案(y_)的差距
- 均方誤差mse
- 交叉熵ce(Cross Entropy):表征兩個(gè)概率分布之間的距離
- 4. softmax()函數(shù):讓n分類(lèi)問(wèn)題的n個(gè)輸出(y1,y2, ...yn)滿足概率分布
- 5. 學(xué)習(xí)率(learning_rate):決定每次參數(shù)更新的幅度
- 6. 滑動(dòng)平均
- 7. 正則化
1. 使用激活函數(shù)去線性化(為什么要用激活函數(shù))
TensorFlow游樂(lè)場(chǎng):http://playground.tensorflow.org
對(duì)于上一篇的網(wǎng)絡(luò)TensorFlow筆記之二可以抽象為如下形式,
[y]=[a1,1a1,2a1,3]?[w1,1(2)w2,1(2)w2,1(2)]=[x1x2]?[w1,1(1)w1,2(1)w1,3(1)w2,1(1)w2,2(1)w2,3(1)]?[w1,1(2)w2,1(2)w2,1(2)]\begin{gathered} \begin{bmatrix} y \end{bmatrix} \end{gathered}=\begin{gathered} \begin{bmatrix} a_{1,1} & a_{1,2} & a_{1,3} \end{bmatrix} \end{gathered} *\begin{gathered} \begin{bmatrix} w^{(2)}_{1,1}\\w^{(2)}_{2,1}\\w^{(2)}_{2,1} \end{bmatrix} \end{gathered}= \begin{gathered} \begin{bmatrix} x_{1} & x_{2} \end{bmatrix} \end{gathered} *\begin{gathered} \begin{bmatrix} w^{(1)}_{1,1} & w^{(1)}_{1,2} & w^{(1)}_{1,3} \\ w^{(1)}_{2,1} & w^{(1)}_{2,2} & w^{(1)}_{2,3} \end{bmatrix} \end{gathered}* \begin{gathered} \begin{bmatrix} w^{(2)}_{1,1}\\w^{(2)}_{2,1}\\w^{(2)}_{2,1} \end{bmatrix} \end{gathered} [y?]?=[a1,1??a1,2??a1,3??]??????w1,1(2)?w2,1(2)?w2,1(2)???????=[x1??x2??]??[w1,1(1)?w2,1(1)??w1,2(1)?w2,2(1)??w1,3(1)?w2,3(1)??]??????w1,1(2)?w2,1(2)?w2,1(2)???????
其中,令:
W′=W(1)W(2)=[w1,1(1)w1,2(1)w1,3(1)w2,1(1)w2,2(1)w2,3(1)]?[w1,1(2)w2,1(2)w2,1(2)]=[w1′w2′]W^{'}=W^{(1)}W^{(2)}= \begin{gathered} \begin{bmatrix} w^{(1)}_{1,1} & w^{(1)}_{1,2} & w^{(1)}_{1,3} \\ w^{(1)}_{2,1} & w^{(1)}_{2,2} & w^{(1)}_{2,3} \end{bmatrix} \end{gathered}* \begin{gathered} \begin{bmatrix} w^{(2)}_{1,1}\\w^{(2)}_{2,1}\\w^{(2)}_{2,1} \end{bmatrix} \end{gathered}= \begin{gathered} \begin{bmatrix} w^{'}_{1}\\w^{'}_{2} \end{bmatrix} \end{gathered} W′=W(1)W(2)=[w1,1(1)?w2,1(1)??w1,2(1)?w2,2(1)??w1,3(1)?w2,3(1)??]??????w1,1(2)?w2,1(2)?w2,1(2)???????=[w1′?w2′??]?
這樣,就可以得出
[y]=[x1x2]?[w1′w2′]=w1′x1+w2′x2\begin{gathered} \begin{bmatrix} y \end{bmatrix} \end{gathered}= \begin{gathered} \begin{bmatrix} x_{1} & x_{2} \end{bmatrix} \end{gathered} * \begin{gathered} \begin{bmatrix} w^{'}_{1}\\w^{'}_{2} \end{bmatrix} \end{gathered}=w^{'}_{1}x_{1}+w^{'}_{2}x_{2} [y?]?=[x1??x2??]??[w1′?w2′??]?=w1′?x1?+w2′?x2?
可以看出,該網(wǎng)絡(luò)雖然有兩層,但是它在本質(zhì)上與單層神經(jīng)網(wǎng)絡(luò)沒(méi)有區(qū)別,因?yàn)樗梢员灰粋€(gè)單層網(wǎng)絡(luò)表示。由此可以推斷,如果只是每個(gè)神經(jīng)元只是單純的線性變換,多層的全連接網(wǎng)絡(luò)與單層的全連接網(wǎng)絡(luò)的表達(dá)能力沒(méi)有區(qū)別(通過(guò)矩陣運(yùn)算,最終都會(huì)變成一個(gè)矩陣)。它們最終都是y是關(guān)于x1和x2的一個(gè)線性模型,而且線性模型解決問(wèn)題的能力是有限的,這就是線性模型的最大局限性。
實(shí)驗(yàn)證明線性模型的局限性
本次實(shí)驗(yàn)在TensorFlow游樂(lè)場(chǎng)中進(jìn)行。
情景模擬:現(xiàn)在根據(jù)x1(零件長(zhǎng)度與平均長(zhǎng)度的差)和x2(零件質(zhì)量與平均質(zhì)量的差)來(lái)判斷一個(gè)零件是否合格(二分類(lèi)問(wèn)題)。因此,當(dāng)一個(gè)零件的長(zhǎng)度和質(zhì)量越接近平均值(x1和x2接近零),那么這個(gè)零件越可能合格。那么它可能呈現(xiàn)如下分布
圖中藍(lán)色的點(diǎn)代表合格的零件(x1和x2接近零)。黃色的點(diǎn)代表不合格的(x1或x2偏大)。
將激活函數(shù)選擇線性模型。訓(xùn)練100輪后
發(fā)現(xiàn)并不能很好的將零件區(qū)分開(kāi)來(lái)。
將激活函數(shù)選擇ReLu,訓(xùn)練100輪。
可以發(fā)現(xiàn)模型很好的將零件區(qū)分開(kāi)來(lái)了。
常用激活函數(shù)
2. 神經(jīng)網(wǎng)絡(luò)復(fù)雜度:用網(wǎng)絡(luò)層數(shù)和網(wǎng)絡(luò)參數(shù)的個(gè)數(shù)表示
由于輸入層只接受數(shù)據(jù),不做計(jì)算故輸入層不算層數(shù)。
3. 損失函數(shù)(loss):預(yù)測(cè)值(y)與已知答案(y_)的差距
網(wǎng)絡(luò)優(yōu)化目標(biāo):loss最小。
常用loss:
均方誤差mse
當(dāng)預(yù)測(cè)值(y)與已知答案(y_)越接近–>均方誤差MSE(y_, y)越接近0–>損失函數(shù)的值越小–模型預(yù)測(cè)效果越好
預(yù)測(cè)酸奶模型
# 預(yù)測(cè)import tensorflow as tf import numpy as npBATCH_SIZE = 8 seed = 23455# 基于seed產(chǎn)生隨機(jī)數(shù) rng = np.random.RandomState(seed=seed) X = rng.rand(32, 2) Y_ = [[x1+x2+(rng.rand()/10.0-0.05)] for (x1, x2) in X] Y = [[int(x0 + x1 <1)] for (x0, x1) in X]# 1、定義神經(jīng)網(wǎng)絡(luò)的輸入、參數(shù)和輸出,定義前向傳播過(guò)程 x = tf.placeholder(tf.float32,shape=(None, 2)) # 知道每組有兩個(gè)特征變量,但是不知道多少組,用None占位 y_ = tf.placeholder(tf.float32,shape=(None, 1)) # 存放真實(shí)的結(jié)果值,合格為1,w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))y = tf.matmul(x, w1)# 2、定義損失函數(shù)以及反向傳播方法 loss = tf.reduce_mean(tf.square(y-y_)) # 使用均方誤差計(jì)算loss train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss) # 學(xué)習(xí)率為0.001,并讓損失函數(shù)讓減小的方向優(yōu)化# 3、生成會(huì)話,訓(xùn)練STEPS輪 with tf.Session() as sess:# 3.1、初始化參數(shù)值init_op = tf.global_variables_initializer()sess.run(init_op)print("w1:\n", sess.run(w1))print("\n")# 3.2、訓(xùn)練模型STEPS = 30000for i in range(STEPS):# 3.2.1 每輪確定讀取數(shù)據(jù)集的游標(biāo)start = (i*BATCH_SIZE) % 32end = start + BATCH_SIZE# 3.2.2 喂入數(shù)據(jù),開(kāi)始訓(xùn)練sess.run(train_step, feed_dict={x: X[start:end], y_: Y_[start:end]})# 3.2.3 每500輪輸出一次loss值if i % 500 == 0:print("每500輪輸出一次w1的值\n")print(sess.run(w1), "\n")total_loss = sess.run(loss, feed_dict={x: X, y_: Y})print("After % dtraining step(s), cross entropy on all data is % g" % (i, total_loss))print("w1:\n", sess.run(w1))交叉熵ce(Cross Entropy):表征兩個(gè)概率分布之間的距離
H(y,y)=?Σy??logyH(y_,y) = -Σy_-*log y H(y,?y)=?Σy???logy
4. softmax()函數(shù):讓n分類(lèi)問(wèn)題的n個(gè)輸出(y1,y2, …yn)滿足概率分布
?xP(X=x)∈[0,1]且∑xP(X=x)=1softmax(y[]){\forall}x P(X = x) \in [0,1] 且 \sum_{x} P(X = x) =1 softmax(y[]) ?xP(X=x)∈[0,1]且x∑?P(X=x)=1softmax(y[])
前面已經(jīng)講過(guò),損失函數(shù)是用來(lái)衡量模型預(yù)測(cè)值與真實(shí)值之間的差值。即模型好壞的標(biāo)準(zhǔn)。一個(gè)模型越好,它的損失函數(shù)越小。因此,
神經(jīng)網(wǎng)絡(luò)的優(yōu)化=減小損失函數(shù)
5. 學(xué)習(xí)率(learning_rate):決定每次參數(shù)更新的幅度
wn+1=wn?learningratew_{n+1}=w_{n}-learning_rate wn+1?=wn??learningr?ate
6. 滑動(dòng)平均
滑動(dòng)平均(影子值):記錄了每個(gè)參數(shù)一段時(shí)間內(nèi)過(guò)往值得平均,增加了模型的泛化性。
針對(duì)所有的參數(shù):w和b(類(lèi)似給參數(shù)加了影子,參數(shù)變化,影子緩慢追隨)
影子初始值=參數(shù)初始值
影子(滑動(dòng)平均值) = 衰減率 * 影子 + (1-衰減率)* 參數(shù)
衰減率 = min{MOVING_AVERAGE_DECAY, (1+輪數(shù))/(10+輪數(shù))}
栗子:
MOVING_AVERAGE_DECAY(超參數(shù):訓(xùn)練之前設(shè)置的參數(shù))為0.99,
參數(shù)w1初始值為0
w1的滑動(dòng)平均初始值為0
輪數(shù)global_step=0
w1 = 1
w1滑動(dòng)平均值 = 0
衰減率 = min(0.99, 1/10)=0.1
w1滑動(dòng)平均值 = 0.1 * 0 +(1-0.1) *1 = 0.9
所以,第0輪過(guò)后,w1的滑動(dòng)平均值更新為0.9
global_step=100
w1 = 10
w1滑動(dòng)平均值 = 0.9
衰減率 = min(0.99, 101/110)=0.918
w1滑動(dòng)平均值 = 0.918 * 0.9 +(1-0.918) *10 = 0.8262 + 0.82 = 1.6482(誤差由于四舍五入引起)
7. 正則化
正則化的意義是為了防止過(guò)擬合。
總結(jié)
以上是生活随笔為你收集整理的TensorFlow学习笔记之三(神经网络的优化)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TensorFlow学习笔记之二(使用T
- 下一篇: WordPress上传大小限制问题