sigmoid的通俗理解

             今天研究了好久的sigmoid,把學習結果總結一下。git

sigmoid的二分類問題。
函數

首先咱們得有個樣本,好比書上的例子。經過人的體重和年齡,來預測血脂的高低。那麼數據形式就是[weight,age],血脂的高低用1和0表示,1表示高,0表示低。[1]或者[0]學習

100個樣本數據就是[[88,33],[78,25]......], 所對應的結果是[[1],[0].......], 意思是第一我的體重88,年齡33,血脂高(1);第二我的體重78,年齡25,血脂低(0)。優化

這100個樣本的體重和年齡用X表示,血脂高低用Y表示,若是X的分佈以下圖,那麼咱們就能夠找出一條能大概條例這些點的直線,那麼這條直線的函數是:F = W*X+B 。(F並不等於Y)blog

        此時,這條直線表明的並非真實數據。它只是經過100個樣本所推算出來,能粗略表明全部人的一個線性方程。(準確性要看樣本的大小,樣本越大,準確性越高;各個元素之間的相關性越強,準確性也越高)若是此時隨便給個新的X,就能夠算出它所對應的結果F。it

這個F,咱們都不知道它表明什麼,不重要,咱們暫時知道有這個值先。tensorflow

        如今輪到sigmoid出場了!循環

        sigmoid的做用是能夠把一堆值變成非線性的,它返回值是在0-1之間。當咱們將上面獲得的F傳入sigmoid中(a = tf.sigmoid(F)),sigmoid就會將F的值按照下圖的曲線得出a,a是在0-1之間的小數,包括0和1。若是a的值在0.5-1之間,表示血脂高,那麼a在0-0.5之間,就表示血脂低。咱們是否是直接從100個樣本的體重和年齡就能夠推算出他們的血脂高低了。對的!就是這樣子im

第一步:f=tf.matmul(w,x)+b 得出線性方程總結

第二步:y = tf.sigmoid(f) 將樣本分紅兩類,一類血脂高,一類血脂低。

        可是,這個推算出來的分類到底準不許?

        文章開頭有個數據Y,是100個樣本的血脂高低的真實數據。若是咱們推算出來的y和真實數據的Y是徹底同樣的,那準確率就是100%,若是有3個錯誤,那準確率就是97%,因此咱們要經過比較才知道準確率有多少。假設準確率只有56%,我能夠經過改變以前那條直線方程的w的值和b的值,獲得的F不同,sigmoid出來的值也不同,分類也會不一樣,讓它的準確率不斷提升,這就叫作優化。

       接下來怎麼比較?怎麼優化呢?

        tensorflow有個函數tf.nn.sigmoid_cross_entropy_with_logits(logits=logit,labels=label),這個函數常常用到的參數有兩個,一個logits,輸入的是未sigmoid的線性方程(F),另外一個是labels,這個是真實的數據Y。此函數先對參數logits作sigmoid運算,而後再把運算結果(y)與labels(Y)作交叉熵計算。交叉熵是指推算出來的分類結果(y)與真實數據的分類結果(Y)之間的差別,交叉熵的值越小,二者之間的差別越小。(交叉熵常常用來做損失函數)

       高潮來了!!要提升準確率,接近真實數據,是否是隻要讓交叉熵的值愈來愈小,就能夠了!bingo!!

        tensorflow裏面有個優化器Optimizer,優化器裏有個叫梯度降低優化器 tf.train.GradientDescentOptimizer(learn_rate).minimize(loss_fun) 。參數learn_rate是學習率,loss_fun就是要優化的損失函數。學習率本身定個值,如learn_rate=0.01。爲了方便理解,能夠理解爲調節w和b的值,每一次調節0.01,不是調一次就準確了,因此要不停的調,好比循環1000次,直到交叉熵的愈來愈小,最後穩定在一個值,也就是最小值。這樣是結果是最讓人滿意的,也叫作收斂。若是learn_rate過大,就會沒法收斂。(這次梯度暫不展開解釋)

      此時,咱們經過100個樣本訓練出來的模型就基本定型了。如何還想要繼續提升準確率,就要從樣本上入手。

相關文章
相關標籤/搜索