如今市面上的機器學習教程大多先學習數學基礎,而後學機器學習的數學算法,再創建機器學習的數學模型,再學習深度學習,再學習工程化,再考慮落地。這其中每一個環節都在快速發展,惟獨落地特別困難。咱們花費大量時間成本去學習以上內容,成本無疑是特別昂貴的。因此咱們不如先「盲人摸象」、「不求甚解」地探索下機器學習,淺嘗輒止。若是想到本身的應用場景,再學以至用,深刻探索。這無疑是使沉沒成本最低的決策。
本教程適合興趣普遍的人士增長本身知識的廣度,從應用的角度謹「使用」機器學習這款工具,是典型的黑盒思惟。這很是契合筆者的思惟方式,固然也是我我的的格局侷限。
本教程會淺顯易懂,讓你走的很快。但若是你想走的更遠還請學習數學。固然咱們也只是暫時放下數學,先構建本身的知識體系。程序員
先擡頭看路,找準適合本身的方向,再埋頭趕路,或深耕下去……算法
從手工到工業化再到人工智能,這是把人類從生產活動中逐漸解放的過程。用機器來幫助人們工做,一直是人類的美好願望。讓機器智能化,以此來代替人力作更智能問題,這能夠做爲人工智能的簡單解釋。
不少教程或者書籍把人工智能、機器學習、深度學習的關係解釋爲從屬關係,人工智能 > 機器學習 > 深度學習。這種解釋不錯,但卻沒法表示他們之間的更深層次的關係。
機器學習是經過數學方法在數據中尋找解釋,以此來實現人工智能的一種手段。而深度學習是參照神經系統在機器學習基礎上發展出的一種高級技巧。 它們之間是存在必定的依託關係、進化趨勢的。
狹義地講,傳統的機器學習是經過數學模型不斷求導來找出數據規律的過程。這其中數學模型的選擇尤其重要。隨着GPU、TPU等算力的發展,算法技術的進步,甚至出現了自動選模型、自動調參的技術。咱們能夠構建複雜的神經網絡結構,只要有足夠的算力支持,足夠的時間咱們能夠用深度學習處理很是複雜的任務。因此在代碼操做上,深度學習甚至比傳統的機器學習對程序員更友好、更易理解。咱們先學習傳統機器學習而非直接學習深度學習的好處是,咱們能夠經過對「黑盒」的拆箱來理解機器學習過程,掌握機器學習的概念,我會對其中應用的數學模型進行解釋。編程
咱們先來看一下人工智能產業鏈的結構,以下圖:數組
咱們能夠看到,機器學習的三大基石---算力、算法與數據。機器學習的發展離不開算法數學的進步,一樣離不開算力的發展。
在技術層面,機器學習在計算機視覺(CV, Computer Vision)和天然語言處理(NLP, Nature Language Processing)取得了關鍵的發展和應用。
算法分類上,機器學習分爲監督學習、非監督學習、半監督學習、強化學習等。網絡
所謂Garbage in, Garbage out(垃圾進,垃圾出)。數據是機器學習的重中之重。咱們須要花費大量的時間來處理數據,甚至佔到整個機器學習任務的90%以上。
好比數據處理過程當中的數據採集,若是咱們採樣的方式欠妥,就可能致使非表明性的數據集,這就致使了採樣誤差。
咱們的數據可能會有不少無效的數據,咱們須要剔除無效的數據,就叫作數據清洗。
咱們經過挖掘大量數據來發現不太明顯的規律,就稱做數據挖掘。架構
咱們以一款工業化流水線工具TFX爲例,看一下機器學習的技術流程。app
流程分爲數據輸入、數據驗證、特徵工程、訓練模型、驗證模型、應用良好模型和提供模型六個部分:機器學習
我想經過以上解釋,你們應該能夠對機器學習的實踐方法有了必定宏觀的瞭解。函數
咱們從宏觀角度看了機器學習的產業結構、工業化流程,你應該對你本身在機器學習的這些環節中有哪些發揮有了必定的把握。如今咱們把視角拉回到微觀層面,看看機器是如何學習的。工具
咱們以攝氏度轉換華氏度爲例。
傳統編程中,咱們要求得攝氏度和華氏度的關係,咱們必須找出公式:
$$ Fahrenheit = Celsius * 1.8 + 32 $$
而在對機器學習來講,咱們有大量的數據,卻須要找出關係。機器學習的過程就是不斷求導,以此來找出數學模型,來解釋規律的過程。
如圖所示,咱們有攝氏度數據0, 8, 15, 22, 38以及華氏度數據32, 46.4, 59, 71.6, 100.4,機器學習的過程就是找出公式的過程。
其中,攝氏度就是咱們的特徵,華氏度就是咱們的標籤,攝氏度與華氏度的關係就是實例。
藍色的部分表示咱們設置好數學函數,而後經過不斷的調整權重與誤差不斷地擬合數據,最終獲得能夠表示規律的模型的過程。
在上手代碼以前我默認你已經配置好了環境,掌握了Jupyter, Numpy, Pandas, Matplotlib的用法。若是你沒有掌握以上技能,請參考我寫的配套教程前置機器學習系列
import numpy as np import matplotlib.pyplot as plt celsius = [[-40], [-10], [ 0], [ 8], [15], [22], [ 38]] fahrenheit = [[-40], [ 14], [32], [46.4], [59], [71.6], [100.4]] plt.scatter(celsius,fahrenheit, c='red', label='real') plt.xlabel('celsius') plt.ylabel('fahrenheit') plt.legend() plt.grid(True) plt.title('real data') plt.show()
如上代碼所示,咱們準備攝氏度與華氏度的數據,而後經過matplotlib庫繪製圖像。
from sklearn.linear_model import LinearRegression lr = LinearRegression() lr.fit(celsius,fahrenheit)
咱們經過上方僅僅3行代碼就訓練了數據。LinearRegression
是scikit-learn包下的線性迴歸方法,是普通的最小二乘線性迴歸。而fit
就是擬合的意思,以此來訓練模型。
celsius_test = [[-50],[-30],[10],[20],[50],[70]] fahrenheit_test = lr.predict(celsius_test) plt.scatter(celsius,fahrenheit, c='red', label='real') plt.scatter(celsius_test,fahrenheit_test, c='orange', label='predicted') plt.xlabel('celsius') plt.ylabel('fahrenheit') plt.legend() plt.grid(True) plt.title('estimated vs real data') plt.show()
接下來咱們調用lr.predict(celsius_test)
方法來進行預測,以此來檢驗咱們的模型準確度。咱們經過下方圖像中黃色的點能夠看出,咱們的模型很是準確。
你就說這玩意簡單不簡單! 咳咳,別囂張,咱們好好玩。
既然都上手了,咱們也試一試深度學習代碼:
import tensorflow as tf import numpy as np # prepare data celsius_q = np.array([-40, -10, 0, 8, 15, 22, 38], dtype=float) fahrenheit_a = np.array([-40, 14, 32, 46.4, 59, 71.6, 100.4], dtype=float) # fit model model = tf.keras.Sequential([tf.keras.layers.Dense(units=1, input_shape=[1])]) model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(0.1)) history = model.fit(celsius_q, fahrenheit_a, epochs=500, verbose=False) print("Finished training the model") # print loss import matplotlib.pyplot as plt plt.xlabel('Epoch Number') plt.ylabel("Loss Magnitude") plt.plot(history.history['loss'])
咱們使用TensorFlow內置的Keras方法建立了1層的神經網絡,選擇了MSE損失函數以及Adam優化器,訓練了500代。
以下圖能夠看到,隨着代(epoch)數量的增長,損失函數的結果逐漸下降。
那麼什麼是損失函數呢?咱們在接下來的文章中一探究竟。感謝您的關注公衆號【caiyongji】與支持!