深度学习(22)神经网络与全连接层五: 误差计算
深度學習(22)神經網絡與全連接層五: 誤差計算
- 1. MSE
- 2. Entropy(熵)
- 3. Cross Entropy
- 4. Binary Classification
- 5. Single output(單一輸出)
- 6. Classification(多分類問題)
- 7. Categorical Cross Entropy(交叉熵計算)
- 8. Why not MSE?
- 9. Number Stability
- 附錄: 關于信息熵的思考
Outline
- MSE
- Cross Entropy Loss
- Hinge Loss
∑imax?(0,1?yi?hθ(xi))∑_imax?(0,1-y_i*h_θ (x_i))i∑?max?(0,1?yi??hθ?(xi?))
1. MSE
- loss=1N∑(y?out)2loss=\frac{1}{N} ∑(y-out)^2loss=N1?∑(y?out)2
- L2?norm=∑(y?out)2L_{2-norm}=\sqrt{∑(y-out)^2 }L2?norm?=∑(y?out)2?
(a)y = tf.constant([1, 2, 3, 0, 2]): 創建Label(標簽)值集y;
(b)y = tf.one_hot(y, depth=4): 將y進行one-hot編碼; depth=4代表一共有5位編碼;
(c)y = cast(y, dtype=tf.float32): 將y的數據類型轉換為float32,以便能和out進行數學運算;
(d)out = tf.random.normal([5, 4]): 創建輸出值(即預測值)集out;
(e)loss1 = tf.reduce_mean(tf.square(y-out)): 利用loss=1N∑(y?out)2loss=\frac{1}{N} ∑(y-out)^2loss=N1?∑(y?out)2計算損失值loss;
(f)loss2 = yf.square(tf.norm(y-out))/(5*4): 利用L2?norm=∑(y?out)2L_{2-norm}=\sqrt{∑(y-out)^2 }L2?norm?=∑(y?out)2?,即二范數計算損失值losslossloss;
(g)loss3 = tf.reduce_mean(tf.losses.MSE(y, out)): 利用MSE函數計算損失值losslossloss;
注: 這里返回的值并不是一個標量,而是一個shape=[b]的Tensor。
2. Entropy(熵)
- Uncertainty
不確定性 - measure of surprise
“驚喜度”的數值。熵值越低,“驚喜度”越高; 熵值越高,“驚喜度越低”; - lower entropy →\to→ more info
更低的熵值 →\to→ 更多的信息;
Entropy=?∑iP(i)log?P(i)Entropy=-∑_iP(i)\log{P(i)}Entropy=?i∑?P(i)logP(i)
ClaudeShannonClaude\ ShannonClaude?Shannon
Lottery
(a)a = tf.fill([4], 0.25): 創建一個shape=[4],元素值都為0.25的Tensor;
(b)a*tf.math.log(a)/tf.math.log(2.): 因為TensorFlow2中沒有log?2n\log_2nlog2?n的API,只有log?en\log_enloge?n,而entropy使用的是log?2n\log_2{n}log2?n,所以根據:
log?ealog?eb=log?ba\frac{\log_ea}{\log_eb}=\log_baloge?bloge?a?=logb?a
可得:
log?ealog?e2=log?2a\frac{\log_ea}{\log_e2}=\log_2aloge?2loge?a?=log2?a
那么a*tf.math.log(a)/tf.math.log(2.)就為a?log?2aa*\log_2aa?log2?a;
(c)-tf.reduce_sum(a*tf.math.log(a)/tf.math.log(2.)): 求其entropy值,即:
Entropy=?∑iP(i)log?P(i)Entropy=-∑_iP(i)\log{P(i)}Entropy=?i∑?P(i)logP(i)
可以看到其熵值為2,較大,那么其“驚喜度”較小,我們能從中獲得的信息也較少;
(d)a = tf.([0.1, 0.1, 0.1, 0.7]): 如果輸入值為[0.1, 0.1, 0.1, 0.7],計算其熵值為1.3567796,那么其“驚喜度”較熵為2時8大,我們能從中獲得的信息也較熵為2時多;
(e)a = tf.([0.01, 0.01, 0.01, 0.97]): 如果輸入值為[0.01, 0.01, 0.01, 0.97],計算其熵值為0.24194098,那么其“驚喜度”較熵為1.3567796時大,我們能從中獲得的信息也較熵為1.3567796時多;
3. Cross Entropy
H(p,q)=?∑p(x)log?q(x)H(p,q)=-∑p(x)\log{q(x)}H(p,q)=?∑p(x)logq(x)
H(p,q)=H(p)+DKL(p∣q)H(p,q)=H(p)+D_{KL}(p|q)H(p,q)=H(p)+DKL?(p∣q)
其中,DKL(p∣q)D_{KL}(p|q)DKL?(p∣q)為散度,是衡量ppp和qqq之間的距離的標準; 當p=qp=qp=q時,DKL(p│q)=0D_{KL}(p│q)=0DKL?(p│q)=0;
- for p=qp=qp=q
- Minima: H(p,q)=H(p)H(p,q)=H(p)H(p,q)=H(p)
- for ppp: one-hot encoding
- h(p:[0,1,0])=?1log?1=0h(p:[0,1,0])=-1\log1=0h(p:[0,1,0])=?1log1=0
- H([0,1,0],[p0,p1,p2])=0+DKL(p│q)=?1log?q1H([0,1,0],[p_0,p_1,p_2 ])=0+D_{KL}(p│q)=-1\log{q_1}H([0,1,0],[p0?,p1?,p2?])=0+DKL?(p│q)=?1logq1?
- 注: 這里“1”是指ppp的one-hot編碼中只有1個1,其余都是0; q1q_1q1?是指如果當前節點label值為i的話,那么在iii號節點輸出的概率就為q1q_1q1?,即p(y=i│x)p(y=i│x)p(y=i│x),也就是說,當p(y=i│x)=1p(y=i│x)=1p(y=i│x)=1時,預測值就等于標簽值;
這里也能看出如果預測值[p0,p1,p2][p_0,p_1,p_2][p0?,p1?,p2?]與真實值(標簽值)[0,1,0][0,1,0][0,1,0]相等的話,那么其交叉熵值為0,否則就會退化為DKL(p│q)D_{KL}(p│q)DKL?(p│q); 所以我們將交叉熵作為losslossloss的優化目標是完全合理的。
4. Binary Classification
Two cases
(a) 多個輸出(判斷目標屬于哪類)
- outoutout:
- p(y=0∣x)p(y=0|x)p(y=0∣x)
- p(y=1∣x)p(y=1|x)p(y=1∣x)
(b) 單一輸出(判斷目標是否屬于一類)
- outoutout:
- p(y=1│x)p(y=1│x)p(y=1│x)
5. Single output(單一輸出)
這里模型的輸出(即outoutout)為目標是貓的概率(即p(cat)p(cat)p(cat));
H(P,Q)=?P(cat)log?Q(cat)?(1?P(cat))log??(1?Q(cat))H(P,Q)=-P(cat)\log{Q(cat)}-(1-P(cat))\log?{(1-Q(cat))}H(P,Q)=?P(cat)logQ(cat)?(1?P(cat))log?(1?Q(cat))
P(dog)=(1?P(cat))P(dog)=(1-P(cat))P(dog)=(1?P(cat))
H(P,Q)=?∑i=(cat,dog)P(i)log?Q(i)=?P(cat)log?Q(cat)?P(dog)log?Q(dog)=?(ylog?(p)+(1?y)log??(1?p))H(P,Q)=-∑_{i=(cat,dog)}P(i)\log{Q(i)} \\ =-P(cat)\log{Q(cat)}-P(dog)\log{Q(dog)} \\ =-(y\log{(p)}+(1-y)\log?{(1-p)})H(P,Q)=?i=(cat,dog)∑?P(i)logQ(i)=?P(cat)logQ(cat)?P(dog)logQ(dog)=?(ylog(p)+(1?y)log?(1?p))
如果y(cat)=1y(cat)=1y(cat)=1,H(P,Q)=?log?(p)H(P,Q)=-\log{(p)}H(P,Q)=?log(p);
如果y(cat)=0y(cat)=0y(cat)=0,H(P,Q)=?log?(1?p)H(P,Q)=- \log{(1-p)}H(P,Q)=?log(1?p);
6. Classification(多分類問題)
- H([0,1,0],[p0,p1,p2])=0+DKL(p│q)=?1log?q1H([0,1,0],[p_0,p_1,p_2 ])=0+D_{KL} (p│q)=-1\log{q_1}H([0,1,0],[p0?,p1?,p2?])=0+DKL?(p│q)=?1logq1?
也就是說,如果輸入值的標簽為x=1x=1x=1的話,那么輸出值為1的節點(output[1]output[1]output[1])的q1=?log??(y=1∣x)q_1=-\log?{(y=1|x)}q1?=?log?(y=1∣x); q1q_1q1?越大,越接近1,那么交叉熵H([0,1,0],[p0,p1,p2])H([0,1,0],[p_0,p_1,p_2 ])H([0,1,0],[p0?,p1?,p2?])就越接近0;
例子:
P1=[10000]P_1=[1 \quad 0\quad 0 \quad0 \quad 0]P1?=[10000]
- Q1=[0.40.30.050.050.2]Q_1=[0.4 \quad0.3 \quad 0.05\quad 0.05 \quad 0.2]Q1?=[0.40.30.050.050.2]
當Q1Q_1Q1?的置信度并不是很高時(0.4與0.3相差不明顯),其交叉熵:
H(P1,Q1)=?∑iP1(i)log?Q1(i)=?(1log?0.4+0log?0.3+0log?0.05+0log?0.05+0log?0.2)=?log?0.4≈0.916H(P_1,Q_1 )=-∑_iP_1 (i)\log{Q_1 (i)} \\=-(1\log0.4+0\log0.3+0\log0.05+0\log0.05+0\log0.2) \\=-\log0.4 \\≈0.916H(P1?,Q1?)=?i∑?P1?(i)logQ1?(i)=?(1log0.4+0log0.3+0log0.05+0log0.05+0log0.2)=?log0.4≈0.916 - Q1=[0.980.01000.01]Q_1=[0.98 \quad 0.01\quad 0 \quad 0 \quad0.01]Q1?=[0.980.01000.01]
當Q1Q_1Q1?的置信度很高時(0.98明顯遠大于其它概率),其交叉熵:
H(P1,Q1)=?∑iP1(i)log?Q1(i)=?(1log?0.98+0log?0.01+0log?0+0log?0+0log?0.01)=?log?0.98≈0.02H(P_1,Q_1 )=-∑_iP_1 (i)\log{Q_1 (i)} \\=-(1\log0.98+0\log0.01+0\log0+0\log0+0\log0.01) \\=-\log0.98 \\≈0.02H(P1?,Q1?)=?i∑?P1?(i)logQ1?(i)=?(1log0.98+0log0.01+0log0+0log0+0log0.01)=?log0.98≈0.02
可以看到,經過優化后的losslossloss明顯更接近于0,分類更加明顯;
7. Categorical Cross Entropy(交叉熵計算)
(1) tf.losses.categorical_crossentropy([0, 1, 0, 0], [0.25, 0.25, 0.25, 0.25]): 交叉熵計算,預測正確,但其置信度不高,所以交叉熵較高,為1.3862944;
(2) tf.losses.categorical_crossentropy([0, 1, 0, 0], [0.1, 0.1, 0.7, 0.1]): 交叉熵計算,預測錯誤,所以交叉熵非常高,為2.3978953;
(3) tf.losses.categorical_crossentropy([0, 1, 0, 0], [0.1, 0.7, 0.1, 0.1]): 交叉熵計算,預測正確,其置信度較高,所以交叉熵較低,為0.35667497;
(4) tf.losses.categorical_crossentropy([0, 1, 0, 0], [0.01, 0.97, 0.01, 0.01]): 交叉熵計算,其置信度非常高,所以交叉熵非常低,為0.030459179;
不同的調用方法:
(5) criteno([0, 1, 0, 0], [0.1, 0.7, 0.1, 0.1]): criteno為BinaryCrossentropy類的實例,作用也是計算交叉熵;
(6) tf.losses.BinaryCrossentropy()([1], [0.1]): 表示計算交叉熵,其中第2個元素為1的概率為0.1,這個預測是錯誤的,所以其交叉熵很高;
(7) tf.losses.binary_crossentropy()([1], [0.1]): 作用與tf.losses.BinaryCrossentropy()([1], [0.1])一樣;
8. Why not MSE?
(1) sigmoid + MSE
- gradient vanish
如果使用sigmoid + MSE的更新方法,很容易出現梯度消失問題,即當值很大或者很小時,梯度為0,這樣的話更新會非常慢;
(2) converge slower
收斂速度更慢;
(3) However
- e.g. meta-learning
有些前沿學科,例如meta-learning,使用MSE更加科學。所以使用哪種損失函數計算方法取決于我們的應用,以及我們的經驗。
9. Number Stability
logits →\to→ CrossEntropy
為了數值穩定,需要設置參數: from_logits=True;
(1) tf.losses.categorical_crossentropy([0, 1], logits, from_logits=True): 這里要注意兩點,一是必須要將輸入進行one-hot編碼操作,即[0, 1],二是傳入的數據必須是logits,而不能是softmax處理過的數據,而且要設置參數from_logits=True,這樣做是為了防止出現數據不穩定的情況;
(2) tf.losses.categorical_crossentropy([0, 1], prob): 當然也可以經過softmax處理過的數據,即將prob傳入,也就是設置from_logits=False,但是不推薦這樣做,因為會出現數值不穩定的問題。
附錄: 關于信息熵的思考
作者:錢彥波
鏈接:link.
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
這個問題我覺得大家理解混淆了。。。
首先大家不要把信息熵理解成信息本身了,其實對信息熵來講(當然大家不要把這個直接當成熱力學的熵),其表示的是某一事件的不確定性,而信息的作用就是用于降低這種不確定性,其中輸入的信息量就等于該事件不確定性減少的大小,也就是熵減少的大小,所以熵本身不是對信息量的一個度量,而是對事件不確定性的一個度量,而熵減才是對信息量的度量。當然如果某個輸入的信息并沒有減少熵,那么說明輸入的可能是噪音。
下面我舉一個例子給大家來直觀的理解一下什么是信息熵和信息量。
首先我們需要想一下的我們應該怎么樣去度量一個屬性,比如質量我們用的是kG,長度我們用的是m,但是如果我們問你什么是1kg的時候,其實你會很迷茫,因為確實不知道什么樣才是1kg。其實不是說這個世界上原本就存在1kg,而是我們為了方便,比如規定了某一塊石頭的質量是1kg,而我們在度量其他物理質量的時候,就以這塊石頭為標準,比如一張桌子的質量等于30塊這樣石頭的質量,所以我們就說這張桌子的質量我30kg。
同樣的對于不確定性的度量也一樣,我們必須定義一個標準,從而對不確定性進行度量。那么這個不確定性怎么去定義呢?最簡單的,我們拋一枚硬幣,其可能產生兩種情況(一種正面,一面反面),如果我們把拋一枚硬幣產生等概率的兩種情況確定為不確定性的一個基本度量單位,那么我們就可以對其他的不確定性加以度量。比如小明在做選擇題的時候面臨A,B,C,D四種情況,那么這相當于拋了兩次硬幣,相同的如果我們面臨8種不確定性,那么我們就相當于拋了3次硬幣。這個時候我們會發現,如果在一次事件中可能出現n種情況,那么就相當于拋了以2為底n的對數次硬幣,即 次。現在我們把拋一枚硬幣產生兩種等概率的情況的不確定性定義為1bit,那么做選擇題目時候的不確定性就是2bit,以此類推。
但是現在又會產生一個問題,那就是對于有的情況下,比如有人告訴小明A,B,C,D中選擇A的概率為1/2,那這個時候概率發生了變化怎么辦呢?這種非等概率的情況下不確定性又該怎么度量呢?我們可以這么想,對于概率為1/2的等概率事件而言,其可能產生的是2種等概率情況,相當于拋一枚硬幣;對于概率為1/6的等概率事件而言,其可能產生的情況是6種等概率情況,相當于拋了 次硬幣。所以把每個可能概率取倒數就得到了可能產生幾種等概率情況,就可以用等概率的情況來計算了,最后再對得到的結果求期望,就可以得到最終的對不確定性的度量,即信息熵。在例子中當有人告訴小明選A的概率為1/2后,小明做這個選擇題面臨的不確定性就等于 =1.792bit,所以在這個例子中,有人告訴了小明A的概率為1/2的信息量就是2-1.792 = 0.208bit.
當然這里還有其他的信息量的單位,比如以自然對數e為底或者是以10為底,得到的單位也不同,分別是nat和Hart,但是理解都是一樣的。
所以信息熵本身不是衡量信息量的,而是對某一事件的不確定性的衡量,信息量的輸入導致熵減少,才是對信息量的衡量。大家謹記呀。
參考文獻:
[1] 龍良曲:《深度學習與TensorFlow2入門實戰》
[2] https://towardsdatascience.com/demystifying-cross-entropy-e80e3ad54a8
[3] https://www.zhihu.com/question/274997106
[4] https://ml-cheatsheet.readthedocs.io/en/latest/loss_functions.html
總結
以上是生活随笔為你收集整理的深度学习(22)神经网络与全连接层五: 误差计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何找出基金的分位点
- 下一篇: 深度学习(23)随机梯度下降一: 随机梯