從鍋爐工到AI專家(1)

序言

標題來自一個很著名的梗,原由是知乎上一個問題:《鍋爐設計轉行 AI,可行嗎?》,後來就延展出了不少相似的問句,什麼「快遞轉行AI可行嗎?」、「xxx轉行AI在線等挺急的」諸如此類。
其實知乎原文是個很嚴肅的問題,不少回答都詳盡、切題的給出了可行的方案。AI的門檻沒有不少人想象的那麼高,關鍵在於你是知足於只是看幾個概念就驚呼「人工智能將顛覆xxxx行業,xxxx人將失去工做」、「人工智能將會毀滅人類」,仍是你真的打算沉下心來學一些人工智能的知識,學習用另一種方法和視角瞭解這個世界。
因此本文其實也是一篇很嚴肅的文章,標題的本意只是想說本文從最基礎的概念講起,即便是非IT技術人員,也應當能看懂。至於網上氾濫的所謂0基礎學AI,我敢說,你也不該當相信纔對。
咱們都知道自從行業意識到人工智能的重要性以來,各大IT巨頭都紛紛發佈了本身的人工智能技術框架,其中Google發佈的TensorFlow算是發表比較早、通過屢次迭代也比較成熟的一個框架。目前碰到的問題是,不少人學習了TensorFlow,翻完了全部文檔,演練了全部的示例代碼,仍然感受對AI一頭霧水,不知道如何入手具體的工做。本文就試圖從最初講起,一開始徹底不涉及技術,逐漸在提出問題和解決問題的過程當中,將TensorFlow導入,讓讀者知道前因後果,從而能夠把人工智能應用到工做中,而且從思路上幫助非IT專業人士,優化本身的工做。html

人工智能

人工智能並非新事物,只是這兩年,特別是「阿爾法狗打敗人類」這個熱點事件以後才格外的火起來。IT行業和資本領域都屬於特別愛炒做概念的行業,隨着時間的流逝,有些概念保留了下來,有些則變得無人問津,但大多數,都是在喧囂事後,才逐漸的迴歸到本源。等待迴歸本源的時候,真正抓住核心和本質的人,纔能有機會走的更遠。
計算機最先發明出來,就有人給它起了一個名字叫「電腦」,實際上從那天開始人們就意識到,計算機是人腦的一個延伸,人們已經試圖用計算機實現原有人類智能才能解決的工做,這應當看作「人工智能」實踐的標誌性起源。
通過幾十年的發展,在人工智能方面的技術和理論發展愈來愈成熟,技術人員已經有了一整套系統和規範的方法來應對此類問題。這些方法,基本是對大量的數據集進行處理,總結和發現規律,並將這些規律應用到新的數據集上。前半部分相似於人的學習過程,後半部分相似於人使用學到的知識解決問題的過程。因此這個過程也被稱做「機器學習」,以及延伸而來的「深度學習」、「增強學習」、「遷移學習」等。因此「機器學習」,纔是當前「人工智能」熱之中的基本研究方向之一。python

現狀

試圖解釋AI領域的現狀實際上是一個比較不討好的事情,特別是在信息快餐化的時代,真假新聞都已經夠讓人崩潰了。聊天的時候,常常碰到說不了幾句就會被人打斷,隨後引用幾個聽起來很神奇,實際上漏洞百出的新聞標題來證實你不過是一無所知。
爲了簡化問題,這裏引用兩個概念來作一個澄清:程序員

  • 一個概念是「強人工智能」,是指人工智能可能具備人類完整的認知能力,能夠推理、感知,而且由於速度和容量方面的優點,未來必將超越人類達到無所不知、無所不能的「類神」的境地,這也是科幻小說的的主要模式之一。
  • 另外一個概念是「弱人工智能」,這也是當前業界主要的研究方向,弱人工智能不須要具備人類完整的認知能力,甚至是徹底不具備人類所擁有的感官認知能力,只須要在某個特定領域具有特定的能力就能夠。咱們當前所見到的「阿爾法狗」、「人臉識別」、「機器翻譯」等,都屬於這個領域。

這兩個概念,其實最先開始的時候是兩個互相爭執不下的觀點,一派認爲人工智能未來必將遠勝於人類,甚至取代人類,也就是「強人工智能」派;對應的則是認爲人工智能不可能取代人類,人工智能只能在某些領域發揮做用,最終依然會從屬和輔助人類,也就是「弱人工智能」派。咱們在這裏並沒打算涉及這兩派觀點的爭論,只是借用這兩個概念來講明當前人工智能的現狀。
那就是,在當前的技術狀況下,「弱人工智能」的發展興旺蓬勃,在不少領域已經遠遠的超過了人類,而且的確對該領域的從業人員產生了重大的影響,從技術、理念的革新,到人力資源的崗位轉移。
「強人工智能」的發展則應當說仍在探索中,離達到一個正常人基本智力水平的基本目標尚有很大差距,且遠遠尚未看獲得的、使人信服的技術出現。
關於「人工智能最終超過人類」的說法,我我的的觀點是比較悲觀的,即使從時間跨度上給出一個至關寬鬆的計劃表,人工智能想超過人類的難度也很是大。主要緣由來自於咱們都知道的《物種起源》,咱們知道人類生理方面的進化的主要模式是遺傳和變異,在精神方面中則是「傳承」和「發展」。這些「變異」或者「發展」其實主要的來源都是「犯錯」。有些犯錯是好的,加上環境的容許,這些犯過的「錯」保留下來,成爲新的知識。而有些錯則是致命的,即使其中有可取之處,但可能個體都沒法存續,更沒法發展和傳承。
而「機器」則很難或者說遠遠低於正常人類可能有的「犯錯」水平,從某種角度說,這正是人們喜歡用電腦的緣由之一,電腦不多犯錯,但也就此失去了不少「進化」的機會。
關於現狀,最後一個要說的是,如今人工智能這麼火,裏面有泡沫嗎?這一點我想引用比爾蓋茨在1999年達沃斯世界經濟論壇期間一個著名的回答,當時正是高科技泡沫的巔峯時期。蓋茨一次又一次地被記者們問到類似的問題:「蓋茨先生,如今的網絡股是泡沫股,對嗎?它們難道不是泡沫嗎?」最後,有點被激怒得蓋茨對記者們說:「他們固然是泡沫,但大家沒有問到點子上。泡沫給網絡行業帶來了不少新資本,這必將更快地推進創新。」算法

因此,其實我也認爲如今的「人工智能」以及「機器人」領域充斥着泡沫,但這同時也引起了全社會的關注和重視,從而推進了這個領域的快速進步,並持續的帶來新的人才、新的創新。可是對於有意願投資在這一行的人來講,你願不肯意踏踏實實的作事。即使不成功,也在技術上或者經驗上留下一些痕跡,纔是值得考慮的事情。編程

機器學習基本假設

好了,下面到了咱們的正課時間。
目前的機器學習已經有了多種被證實行之有效的算法,而這些算法都基於一個很重要的假設,那就是這個世界上全部的問題,都是能夠用數學來描述的。小到用電腦識別的一副照片,大到用11維空間來描述整個宇宙的弦論,都是有與之對應的數學模型的。經過數學模型來解決問題,大概是這樣一個流程:數據輸入 -> 數學公式 -> 結果
而在機器學習理論以前,咱們依賴電腦解決問題,則是經過: 數據輸入 -> 計算機程序 -> 結果
咱們都知道,全部數學公式,最終都是能夠對應轉化成計算機程序的,那這兩種方式區別在哪?咱們舉一個例子:
好比咱們能夠在屏幕上,顯示出 LOVE 這樣幾個字母,對電腦最簡單不過,高級語言就是一行命令。固然背後隱藏的就複雜了,要把這幾個字母經過光柵矢量化,而後經過顯卡的驅動,把字母的矢量點陣化,而後再繪製到屏幕上去。剛纔敘述的這個複雜的過程,都是由程序完成的,程序的主要組成部分是邏輯,雖然「邏輯」也是高等數學重要的一部分,但這裏說的「邏輯」更多的則是由人的思惟產生,至少首先要由程序員在大腦中先造成並幾經反覆、修正,而後仿照這個過程造成計算機的程序,這個過程更多的人自己的學習,而不是「機器學習」。
那麼這麼複雜的「字符」,用數學公式可能描述出來嗎?固然是能夠的,幾乎一切你想的到的東西,都是能夠用數學來描述的,這也是這一節開頭那個概念的由來。

更復雜一點,三維的圖形,也是同樣的:

你可能會說,不對啊,怎麼感受用數學的方式來畫出幾個字符,比原來在屏幕上顯示這幾個字符的方法麻煩多了?先別急,這裏的重點只是想告訴你,用數學方法解決問題同用單純程序解決問題的區別。機器學習不是萬能的,在不少領域,用傳統的程序解決會更容易。千萬不要成爲「只要手裏有個錘子,看全世界的問題都像是釘子」。但也有不少領域,用傳統的程序,可能根本作不到。網絡

總結一下,咱們假設一切問題都是能夠用數學來描述的,在不少大神已經發明的公式中找出適合這個問題的那一個,甚至本身改善或者從新研究、發現一個,而後把公式用計算機程序的方式描述出來,也就是算法,就能夠解決這個問題。引用某個演講中的一句話:音樂是感情的語言,數學是科學的語言。框架

一個最簡單的例子

咱們都知道,解決一個複雜的問題的方法,是把複雜的問題分解成一連串的簡單問題。一個高維數學問題若是想不明白,每每也是下降維度來思考。咱們下面先從一個最簡單的問題入手,來逐步導入機器學習的算法。
假設你在一個房屋中介工做,你手頭有不少房屋租售價格的信息,天天都會有不少客戶來諮詢你租房或者買房的事情,咱們假設是買房,常見的問題會是:在甲地,x平米的房子,多少錢能買下來?
根據需求咱們能夠列出一個公式:y = a * x + b(僅做示例,請忽略一些不合常理的地方)
這個公式裏,y表明咱們預測的房價,a是每平米的價格,x是平米數,b是稅、手續費等基本的固定費用。
我心中有些忐忑,我以爲會不會不少人都在笑,小學問題是吧?不要急,耐心看下去,「降維」思考,原本就是把複雜的問題簡單化。
好比在某個地區,咱們手頭有多套房屋信息,售價、面積咱們都知道,簡單把公式變換一下, a = (y-b)/x,把咱們手頭的信息代入進去,很容易就能算出來該地區每平米的單價。之後碰到客戶諮詢的時候,利用這個公式,咱們就能預測出來用戶想要的房子,大概須要多少錢買到。
太簡單了是吧?好像看不到什麼「機器學習」的東西在裏面啊?就是簡單的解方程嘛,雖然要求解的變量從「x」變成了「a」。
的確是這樣的, 機器學習根本的目的,就是解方程 。對於簡單的方程,好比剛纔的方程,由於只有兩個要求得的變量a和b,根據解方程的知識,咱們只要有兩組已知的x和y,就能夠準確的求出這個方程的解。彆扭一點的無非是咱們上學的時候習慣用x/y/z表明未知數,a/b/c表明常數。
如今反了過來,咱們手頭的數據集給出了x/y的值,原來的常數反而成了未知數。緣由是,求得這些常數並非目的,目的是利用這些常數,補全了公式,在之後咱們就能夠利用這個完整的公式和給定的x,去預測y的值。less

總結這一節:利用已知數據求解這些常數的過程,就是「機器學習」的過程;利用補全的公式,對新數據預測結果的過程,則是「人工智能」。這個公式則是咱們「機器學習」的工做重點:數學模型。機器學習

解方程

最簡單的方程能夠手工求解,就像上一節中房價的例子,只有兩個變量。並且房價嘛,常見的不過幾十平米、1、二百平米的數量級,小學畢業以後的水平,心算足夠了。
再複雜一點,有多個變量,就須要一些解方程的公式,或者也能夠叫算法。爲何會有多個變量?咱們上一節爲了簡化問題,只考慮了面積、稅費這些基本要素,一套房子,朝向、樓層、物業、學區等等,顯然都會成爲影響房價的因素。真得嚴謹考慮,這裏面可變的因素真的不少的。關於這些變量的問題,咱們留給下一節,這裏繼續說解方程的問題。
咱們知道,一般狀況下,多元方程,須要方程組來求解。有n個未知數,就要列出n個方程構成的方程組,而且利用n組已知的數據來解方程組得到答案。恐怕當未知數達到了四、5個,心算已經不夠了。好在當前已經有不少數學工具幫助咱們作這樣的事情。好比在斯坦福《機器學習》課程中,吳恩達教授使用Octave來全程講解機器學習。Octave是著名數學軟件MatLab的社區開源版本,若是沒有接觸過的讀者,你能夠把它理解成一個比較專業的大計算器,Octave長於數值計算(對應的還有Mathematica,長於符號計算),內置有本身的編程語言,在不少的機器學習場景中,研究人員都是利用這樣的軟件進行算法原型的研究和設計。驗證成功後,才由計算機方面的專家把公式轉換成計算機的編程語言,成爲算法。
下面舉一個五元一次方程組的例子:
(備註,這些內容,不須要你動手實驗,只是但願你延續並加深理解這個思路,明白是什麼和爲何就好,最終咱們確定會迴歸到TensorFlow的學習上。)編程語言

2a+b+c+d+e=6
a+2b+c+d+e=12
a+b+2c+d+e=24
a+b+c+2d+e=48
a+b+c+d+2e=96

僅是一個例子,這樣的方程你用手工解估計也很快啦,這裏用Octave演示一個有限元的方程組解法,大概這樣幾步:

  1. 首先規範化方程,讓每一行的方程左側,具備相同的變量數,沒有的變量用「0*變量」的形式來替代;右側,則是統一隻有1個常數,不是單一常數的,則要經過簡化,成爲僅有一個常數。好在咱們舉的例子很規範,沒有這樣的狀況。
  2. 在Octave中,把式子左側的全部係數提取出來,每一個方程式佔獨立一行,全部方程式造成一個「矩陣」,假設矩陣叫A。
  3. 在Octave中,把式子右側的常數輸入成爲另一個矩陣,由於只有一列,實際也能夠稱爲「向量」,咱們假設這個向量叫B。
  4. 使用Octave內置函數求解:ans=pinv(A)*B,此時獲得一個1維矩陣,也就是向量,每一行是一個未知數的解。a=-25;b=-19;c=-7;d=17;e=65。

    其實Octave對於解方程還提供了一個簡寫的方式:在Octave命令行直接鍵入 A \ B,也能夠獲得答案。
    (python也有對應的矩陣運算庫,也提供一樣的方程求解的功能,咱們到後面再說,就讓這第一部分保持一個寫給非IT專業人員的狀態吧。)
    注:在咱們後面將要學習的TensorFlow中,「矩陣」也稱爲張量(tensor)。處理過程是數據的流動(flow),這也是TensorFlow名稱的由來。但爲了描述語言更通用,之後咱們仍然稱爲矩陣。

總結一下這一節:

  • 簡單的方程有成熟的公式或者工具幫你解,但重點你確定意識到了,複雜方程這些方法就不靈了,這引出了機器學習的重點之一,就是如何解複雜的方程,咱們後續會講到。
  • 爲了應對新的AI問題,咱們可能須要研究新的機器學習算法。研究這些算法的工具是數學公式,研究數學公式的工具,Octave算一個,可能常常會用在新算法的原型研究。這只是指出一個學習的方向,至少如今,會走以前,先不用考慮跑的事情。固然也有不少數學專家,只研究公式和算法,歷來不進行TensorFlow編程和應用,Octave用的很熟練,這類用戶不是本文的重點。
  • 咱們手工計算一些方程,一般都是一組一組的數據逐個代入,這很容易理解。可是在大規模計算的時候,相似剛纔Octave這樣的作法,把數據集矩陣化纔是一般的模式,這樣能夠充分的利用計算機規模化和並行的優點,因此搞機器學習,矩陣運算不熟悉的,最好抽時間去補一下。

(待續...)

引文及參考

強人工智能
物種起源
弦論
octave
矩陣運算參考資料
斯坦福機器學習課程

(原創博文,謝絕一切商業轉載,我的轉載請註明出處。)

相關文章
相關標籤/搜索