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