進擊的 TensorFlow
AI
(Artificial Intelligence)人工智能及機器學習(Machine Learning)最近大熱,Google - Deep Mind的AlphaGo踢館人類所向披靡,最終宣布正式進入智能時代1.0。我們今天也來體驗學習一下Google的人工智能項目。
1. Jeff Dean
老傳統,我們先來看看這位Google TensoFlow的主要負責人,在加州山景城除了拉里佩奇Larry Page和布林Sergey Brin,Google數一數二,被用來打造下一代Google核心大腦的(Google Brain)的頭號人物Jeff Dean。
列一下大神的大作,顫抖一下吧:
-
Google MapReduce
-
Google BigTable
-
Google Spanner
-
Google AdSense
-
Google Translate
-
Google Brain
-
LevelDB
-
TensorFlow
夠重量級了吧,說其影響了第三代互聯網及第四代也不夸張,開啟了互聯網大數據及人工智能時代。
Jeff Dean于2009年當選美國工程院院士。
2. Artificial Neural Networks, ANNs
在開始介紹TensorFlow之前我們先看一個TensorFlow的Online Playground,在線神經網絡(Artificial Neural Networks,ANNs)!
http://playground.tensorflow.org
神經網絡(NNs)主要模仿動物神經網絡,進行分布式并行算法的數學模型。
神經網絡最大的魔力,在于不需要用各種特征用來輸入給機器學習系統,如上圖事例,只需要輸入最基本的x1, x2, 只要給予足夠多層的神經網絡和神經元,神經網絡會自己組合出 最有用 的特征。
總體來說,神將網絡需要大量神經元(節點)及:
-
每個神經元可以通過輸出/激勵函數(Activation Function)來計算來自其它相鄰神經元的加權輸入值
-
計算模型可以依靠大量數據訓練
-
成本函數(Cost Function):定量評估對于給定輸入值的輸出結果離正確值的偏移,用于評估計算的精準
-
學習算法(Learning Algorithm):根據Cost Function的結果,自學,糾錯
-
有了上述的核心,就有點智能感覺了,可以計算評估,并且可以遞歸自我學習。
3. TensorFlow Overview
TensorFlow是Google研發的第二代人工智能學習系統。官網描述,TensorFlow? 是一個采用數據流圖(data flow graphs),用于數值計算的開源軟件庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯系的多維數據數組,即張量(tensor)。
Tensor即張量,N維數組,Flow代表基于數據流圖的計算,TensorFlow的計算就是張量從圖的一端流動到另一端的并行計算。
張量:
TensorFlow架構靈活,可做到多平臺并行計算,如臺式機,服務器,云端,移動設備等,同時又可以充分發揮多核CPU或者GPU的強大并行計算能力。
CPU v.s. GPU
科普一下CPU與GPU的差別吧,為什么GPU會在深度學習時代又火了起來。
設計架構:
可以看出CPU的設計目標是處理不同數據類型,支持大量邏輯判斷,分之跳轉及中斷處理;而GPU則誕生于目標處理大量圖形圖像(游戲),即大規模類型統一,相互依賴的數據,同時不需要被打斷的純計算環境,所以在架構設計上,GPU采用了數量眾多的計算單元和超長流水線,僅保留簡單控制邏輯,甚至省去了Cache。
所以,GPU天生具備大規模精良并發計算能力,而CPU的計算能力則只是很小一部分。大多數臺式機甚至包括服務器,其CPU多核也沒有超過2位數,每個核也包含了大量緩存及邏輯運算單元;GPU則稱之為重核,如512核甚至上千之多。CPU被稱之為Latency Oriented Cores, 而GPU則稱之為Throughput Oriented Cores。
所以,不難看出為什么在深度學習領域,GPU為何能炙手可熱,GPU最適合:
-
計算密集型程序(Compute-Intensive),其大部分時間花在寄存器,幾乎沒有延時,而內存及SSD的延時則不可同日而語(達上百倍,千倍差異)
-
并行計算程序,上百核同時做同樣事情
有了上述的鋪墊,不能看出對于Tensor張量的計算處理,GPU簡直是張量計算的天堂。
TensorFlow特征
TensorFlow并不是一個嚴格的神經網絡,只要你可以抽象為數據流圖,便可以使用TensorFlow來構建計算。
TensorFlow用C++來編寫,目前版本提供的API相對低階,確實是C/C++風格,任君打造。當然也提供暴露了深度學習中流行的Python接口,及其它Google自己的Go, Java, Lua, Javascript, R等。
開源神器
Goolge近年來突然意識到開源的威力,趕緊跟上。
官網當然是官言,其實在這個互聯網,深度學習時代,除了秀肌肉,研發產品,占領市場,最重要的是占領程序員,程序員是未來世界的締造者,通過開源直接輸出核心思想到程序員大腦,甚至讓程序員反向輸入。
4. 機器學習之-MNIST
接下來正式展開TensorFlow的介紹,注意,其中涉及大量數學,請自行腦補。
簡單來說,機器學習即通過經驗自動改進的算法程序。
MNIST
MNIST則為機器學習領域的一個經典問題,解決28*28像素的灰度手寫數字圖片識別,數字范圍0-9,即人類的3-4歲左右水平,別小看。
人類的視覺系統是一大奇跡,我們可以毫秒級別輕易識別上述手寫數字為5041,而我們的大腦則通過視覺皮層V1的包含1.4億個神經元及與其他視覺皮層V2,V3,V4,V5構成數百億神經元網絡 - 超級計算機。
所謂學習,必然有學習的教程,官網提供了大概6萬多訓練圖片,5千圖片用語迭代驗證及另外1萬圖片用語最終測試。
MNIST的數據集可以從官網下載Yann LeCun's website, 此人目前就職于非死book。
Softmax Regression模型
數字如何和向量掛鉤?又如何TensorFlow?
顯然,對于上述28*28像素的圖片,我們可以用數組表示,展成向量即, 28*28=784。
整個算法我們把MNIST分成兩個數據集,圖片訓練數據集 xs ,每個圖片對應標簽 ys 。
所以在MNIST訓練集 xs 中,張量為[60000, 784],第一個維度索引圖片6w張訓練圖片,第二個維度則索引像素點28*28,在此張量的每個元素都表示某個像素的強度介于0-1之間:
而其對應的標簽 ys 數據集是介于0-9的數字,為了簡化這里使用了“one-hot vectors”。
one-hot即只有一位編碼有效,如使用n位狀態寄存器來對n個狀態編碼,任意時候只有其中一位有效。
在MNIST標簽數據集中,我們用10維向量來表示某0-9的數字,如數字n(0-9)表示只有在第n維為數字1,其余維度都是0,如數字0,表示為:
[1,0,0,0,0,0,0,0,0,0]。
:warning: : 官網貌似寫成11維,多了個0,所以眾多copy模式也copyright。
這樣,MNIST數據集標簽組成一個[60000,10]的數字矩陣。
好了,有了上述的數據結構抽象,接下來整體算法就是要得出給定圖片代表每個數字的概率,如模型推算一張包含9的圖片代表數字9的概率為80%,而判斷它代表數字8的概率為5%(上半部分小圓),給予其他數字更小概率值。
Softmax模型可以用來給不同對象分配概率,通常分為兩步:
-
對圖片像素值進行加權求和,如果這個像素具有很強證據證明這張圖片不屬于該類,則權值為負數,相反則為正數。
上圖紅色表示正,藍色表示負數。
-
偏置量(bias),用于排除干擾
則圖片x代表數字i的evidence表示為:
其中,wi為權重,bi為i的偏置量,j 代表給定圖片 x 的像素索引用于像素求和。然后用softmax函數可以把這些證據轉換成概率 y:
概率論登場,把softmax轉換為, normalize的概率值,
上述見證了數學建模功力,把給定的線性函數轉換為10個數字的概率分布,通常這種轉換通過把輸入值當成冪指數求值,再正則化處理。冪運算則對應假設模型中的權重值,softmax的正則化使得總權重為1,即有效概率分布。
上述過程用圖像化來描述的話:
數學抽象處理:
整理向量,用線性代數的矩陣乘法與向量相加:
在解釋一下上面的 softmax 函數,
softmax function is a generalization of logistic function that maps a length-p vector of real values to a length-K vector of values.
看了數學公式,應該會比較清楚了,是該元素的對數值,與所有元素對數值和的比值。其實softmax regression是一個將目標變量分成k類的算法,建模使用的是多項式分布。
再說透徹點,max針對兩個輸入,a和b,且a>b,則max則返回a;而softmax則考慮到了樣本的概率權重來返回(避免壟斷市場)。
如果考慮特殊的僅分兩類的邏輯回歸,則退化為伯努利分布,
下圖舉例說明softmax,以3個輸入為例:
數學真是神奇的東西,不愧為眾科學之魁寶,金字塔之尖。
各位程序大牛如果頭暈,可以直接忽略,對于學數學分析的各位,請自行點贊。
5. 神經網絡
官網給出的算法對于比較熟悉神經網絡,softmax regression, 或者手寫數字識別算法的可能比較簡單,我們在稍微回顧梳理一下。
Sigmoid神經元
AI的智能體現在自動學習,對于神經網絡如何引入學習算法則至關重要。
通過引入人工神經元sigmoid神經元,對于細微調整它的權重和偏移,只會很細小的影響輸出結果,從而達到抗干擾,不斷學習過程。
sigmoid:
其本質是一個階躍函數step的平滑版本:
平滑處理:
其平滑度其實是微積分中的偏導數,對于權重微調,對于輸出的微小改變:
神經網絡體系
有了神經元,接下來引入神經網絡。同樣,對于上述數字識別,如識別數字9,網絡設計的自然方式是把圖像像素強度編碼作為輸入進入神經元,而每一個輸入值則介于0-1的強度,輸出則根據某一閥值,如輸出值大于0.5則表示神經網絡分析該數字為9,否則不是。
如下圖所示,我們引入三層神經網絡:
按照我們上文給出的28*28像素784作為左邊的輸入神經元,最右邊則為輸出的判斷結果,而中間的隱藏層則主要通過計算判斷,可以引入檢測像素的重疊。
梯度下降學習算法
梯度下降算法是一個用于最優化的算法,求解無約束優化問題。梯度下降法的計算過程就是沿梯度下降的方向求解極小值,通常用負梯度方向為搜索方向,接近目標值,步長越小,前進越慢。
如上圖梯度下降算法通過不斷計算梯度?C?C,然后向著梯度相反的方向小步移動的方式讓小球不斷順著坡面滑向谷底。為了充分發揮作用,我們通常選擇一個足夠小的學習率。
6. 數字識別算法
數字識別算法有很多種,如官網用到的加權法,簡單的如灰度法,精度較高的如向量機等。
灰度法:
這個算法比較簡單易懂,準確率較低,只有22%左右。大體思路是,直接根據提供像素的黑白強度,如2比1有更多的像素,所以2比1圖像灰度更暗。所以,我們可以用訓練數據來計算每個數字的平均暗度值。對于一張新圖,我們就計算這張圖有多暗,然后根據那個數字的平均暗度值和這張圖的暗度值最接近,來猜測這張圖是什么數字。
加權法(weighing evidence):
對于給定模版的像素進行重加權,而其它像素則輕加權,從而快速進行判斷。為了并行計算,可以把一個圖分解成4個神經元分別并行計算判斷,如果4神經元都一起被觸發,則給出判斷結論,如我們判斷0:
其他一些經典算法大家可以自行研究,下面列出了一些精準度排名算法:
7. TensorFlow數字識別實現
實現回歸模型
官網使用極為簡潔的代碼:
import tensorflow as tf
import input_data
mnist=input_data.read_data_sets(" MNIST_data /", one_hot=True
x = tf.placeholder(" float ", [ None , 784])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn. softmax (tf.matmul(x,W) + b)
x和w都只是一個占位符,可以在TensorFlow運行某一計算時根據該占位符輸入具體的值。
最后一行代碼把向量化后的圖片x和權重矩陣W相乘(matmul),加上偏置b,然后計算每個分類的softmax概率值。
成本函數-交叉熵
在機器學習中,通常需要定義指標來表示一個模型的成效,這個指標稱為成本(cost)或損失(loss)。
交叉熵(cross-entropy)作為一種常見成本函數。
交叉熵是用來衡量我們的預測用于描述真相的低效性。具體數學公式及原理,請自行科普吧。
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
注:機器學習及AI其實設計大量的數學推論,神經網絡,這正是我華人的強項啊,希望華人可以在這個領域有所建樹。
AI及TensorFlow的神奇之處,它會在學習中根據計算圖,使用反向傳播算法來預測估計目標最小化成本值,并用我們的優化算法不斷演進以降低成本。
train_step = tf.train. GradientDescentOptimizer (0.01).minimize(cross_entropy)
其實就是我們上文提到的梯度下降算法。而TensorFlow的妙用就是,它在后臺我們提供的計算圖中,添加隱藏計算神經元,實現反向傳播算法及梯度下降算法。
訓練模式
接下啦就是啟動session,開啟10000訓練模式:
sess = tf.Session()
sess.run(init)
for i in range(10000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
TensorFlow也提供了訓練過程可視化,可以查看即時數據情況, TensorBoard。
8. 深度學習
神經網絡中的權重和偏移是自動發現的,這些參數都是通過學習自動獲得的。神經網絡通過一系列的多層次結構抽象,把復雜問題逐步簡化抽象,其中靠前的結構層響應簡單問題,后層則響應復雜問題,多層的神經網絡即深度神經網絡。
總結
AI及神經網絡,深度學習博大精深,設計非常多的專業知識,甚至考驗數學功底。
我們拋磚引玉,入門了解。
來自:http://mp.weixin.qq.com/s/MVK6NJrNLnCZPT7eekBebA