引路人工智能
我接觸人工智能這個方向差不多也才一年的時間,對于很多大佬來說我連入門都不算,頂多屬于剛抬腳的水平。
不過我運氣比較好,上學期跟大四的一起參加校招,選擇了人工智能算法崗,現在已經成功入職安軟科技,做web標注平臺的后端django開發。
我身邊做人工智能這個方向的人也不少,我導師、項目組長、還有我們團隊的研究生,經常跟(聽)他們交流一些比較前沿的技術,耳濡目染的也會了解一些,雖然自己實力還不夠,但可以拿來跟大家分享一下。
好了,閑話就說這么多,接下來我們開始正題,人工智能這條路到底該怎么走,我只在我目前所處的高度和理解水平上給出一些建議,不一定全對,但我希望能給你們一些幫助。
其實人工智能也可以分為兩個方向,研究型和應用型。
應用型人工智能
先說應用型,這個方向主要是將專業的AI知識和技能應用于社會實踐,都說人工智能落地難,一個技術從實驗室到社會需要十年甚至二十年,應用型人工智能就是解決AI落地的“最后一公里”,從事一線生產的技術或專業。
也就是說,你可能并不會特別專業的知識,不會推公式不會求導,但你一樣能做出來很棒的人工智能方面的產品。
怎么做呢,借助于各大AI開放平臺,行業內的領頭企業,比如BATJ這些大廠,都會把自己的AI能力開放出來給開發者使用。
比如我們以百度AI開放平臺的圖像特效API為基礎,做一個人像動漫化的小Demo。
# encoding:utf-8import requests import base64''' 人像動漫化 '''request_url = "https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime" # 二進制方式打開圖片文件 f = open('4.png', 'rb') img = base64.b64encode(f.read())params = {"image": img} access_token = '****************************' request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response:print(response.json().keys())image = base64.b64decode(response.json()['image'])with open('5.png', 'wb') as fp:fp.write(image)
通過這個一個簡單的例子我們可以感受到,做應用型AI并沒有多么高的專業技術和數學的要求,你只需要會一些簡單的語法基礎和網絡請求就可以。
但這也有一個缺陷,一般接口都有調用量和QPS的限制,所以并不能無節制的使用,只能說自己玩玩,真的要想做成產品的話,你得跟百度合作,或者說,你得給錢。
還有一種應用型AI,是需要你懂一些人工智能的基礎,或者說是數學以及框架的基礎,然后你可以基于已有的模型最一些改進,或者叫優化,這個還有些競爭力,是從應用型人工智能轉研究型人工智能的必經之路,不過在這里我們不細講。
研究型人工智能
然后再來說研究型,顧名思義,這個方向就是搞學術研究的,也就是我們常說的算法,或者更底層一點叫數學,數學是宇宙萬物的本源嘛。
研究型人工智能做的是開創性的工作,比如我怎么預測一篇地區的房子價格,這是典型的線性回歸問題,或者我怎么做一個人臉識別的功能,這就要建立一個神經網絡了,這個網絡有多少層、選用什么激活函數、學習率的大小設置等等,都是需要研究的。
我們來舉個簡單的例子,講一個故事:
Alex經過一年的努力,終于拿到了美國波士頓麻省理工學院的研究生錄取通知書,在遠離家鄉的地方上學呢,Alex想在波士頓買一套房子,他手頭有一些積蓄,在網上找了幾套自己滿意的房子,但是又不敢相信網上的價格,人生地不熟的,Alex怕被宰,就從自己做數據分析的朋友Bachelor手里要到了過去幾年一些有關波士頓房價的資料。
| 1 | 60 | RL | 65.0 | 8450 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 2 | 2008 | WD | Normal | 208500 |
| 2 | 20 | RL | 80.0 | 9600 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 5 | 2007 | WD | Normal | 181500 |
| 3 | 60 | RL | 68.0 | 11250 | Pave | NaN | IR1 | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 9 | 2008 | WD | Normal | 223500 |
| 4 | 70 | RL | 60.0 | 9550 | Pave | NaN | IR1 | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 2 | 2006 | WD | Abnorml | 140000 |
| 5 | 60 | RL | 84.0 | 14260 | Pave | NaN | IR1 | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 12 | 2008 | WD | Normal | 250000 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1456 | 60 | RL | 62.0 | 7917 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 8 | 2007 | WD | Normal | 175000 |
| 1457 | 20 | RL | 85.0 | 13175 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | MnPrv | NaN | 0 | 2 | 2010 | WD | Normal | 210000 |
| 1458 | 70 | RL | 66.0 | 9042 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | GdPrv | Shed | 2500 | 5 | 2010 | WD | Normal | 266500 |
| 1459 | 20 | RL | 68.0 | 9717 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 4 | 2010 | WD | Normal | 142125 |
| 1460 | 20 | RL | 75.0 | 9937 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 6 | 2008 | WD | Normal | 147500 |
1460 rows × 81 columns
為了方便分析呢,我們先提取其中三個特征作為分析素材,分別是LotArea,表示房屋面積,TotalBsmtSF,表示地下室的總面積,SalePrice,表示的就是房價了。
| 8450 | 856 | 208500 |
| 9600 | 1262 | 181500 |
| 11250 | 920 | 223500 |
| 9550 | 756 | 140000 |
| 14260 | 1145 | 250000 |
| ... | ... | ... |
| 7917 | 953 | 175000 |
| 13175 | 1542 | 210000 |
| 9042 | 1152 | 266500 |
| 9717 | 1078 | 142125 |
| 9937 | 1256 | 147500 |
1460 rows × 3 columns
然后我們把數據重新整理一下(其實啥也沒干,就是換了個列名):
| 8450 | 856 | 208500 |
| 9600 | 1262 | 181500 |
| 11250 | 920 | 223500 |
| 9550 | 756 | 140000 |
| 14260 | 1145 | 250000 |
| ... | ... | ... |
| 7917 | 953 | 175000 |
| 13175 | 1542 | 210000 |
| 9042 | 1152 | 266500 |
| 9717 | 1078 | 142125 |
| 9937 | 1256 | 147500 |
1460 rows × 3 columns
看見x和y就感覺親切多了,接下來就是建立一個數學模型了,簡單的說就是找一個符合x1、x2與y關系的式子,這個簡單嘛,高中就學過的東西,待定系數法唄,只不過從一個x變成了x1、x2而已,那設兩個未知數不就可以了。
設:y=ax1+bx2y=ax_1+bx_2y=ax1?+bx2?
這公式那么一寫啊,瞅起來像是一個線性模型,簡單理解也就是一條線嘛。
再仔細一看,這條線還必須過原點,那就麻煩了,咱們還不能確定這個x1、x2跟y組成的函數圖像一定過原點,必須要經過原點這個限制可就太大了。
沒辦法,再加一個未知數吧,把方程改成y=ax1+bx2+cy=ax_1+bx_2+cy=ax1?+bx2?+c
這樣以來,在沒確定a、b、c之前,函數圖像可以是空間中任意的。
接下來就是把a、b、c確定下來了,只要它們三個確定下來就好辦了,把自己喜歡的房子的總面積和地下室的總面積直接代入x1、x2,不就能計算出來一個大概的房價y了么。
不過啊,x1、x2是咱們為了好分析從完整的數據集中抽取出來的,實際上x是很多的,所以我們需要讓方程更加通用:y=θ1x1+θ2x2+θ0y=θ_1x_1+θ_2x_2+θ_0y=θ1?x1?+θ2?x2?+θ0?
這樣,如果跟房價有關的x特征很多的話,就能把方程寫成矩陣相乘的形式了:
yθ(x)=θ0x0+θ1x1+θ2x2+...+θixi+...+θn?1xn?1+θnxn=∑i=0n=θTxy_\theta(x)=\theta_0x_0+\theta_1x_1+\theta_2x_2+...+\theta_ix_i+...+\theta_{n-1}x_{n-1}+\theta_nx_n=\sum_{i=0}^n=\theta^Txyθ?(x)=θ0?x0?+θ1?x1?+θ2?x2?+...+θi?xi?+...+θn?1?xn?1?+θn?xn?=i=0∑n?=θTx
這個θi阿,有個學名叫權重項,θ0x0呢,讓x0=1不就是之前寫的θ0。
也就是說,得在我的特征中再加一列x0的數據,值全部設置為1就行了。
我們現在的任務就是計算θi,假設最后我們綜合所有的數據算出來了θi,但是這個θi是為了擬合大部分的數據,所以按照θi計算出來的房價跟真實的房價之間還是有一定的差距的。
如果說根據我們這個方程計算出來的房價跟真實的房價相差無幾,那才是我們想要的結果,這樣我們輸入想要買的房子的x特征值,計算出來的房價y就越接近真實房價。
當然這是后話,現在咱們的目的是啥,就是讓通過咱們方程計算出來的房價跟真實的房價的差值越小越好嘛。
y(i)=θTxi+?iy_{(i)}=\theta^Tx_i+\epsilon_iy(i)?=θTxi?+?i?
對于每一套房子,y(i)表示真實的房價,通過θTxi計算出來的是模型預測房價,εi是預測房價跟真實房價之間的差距,當然εi有可能是正數也有可能是負數。
目的什么來著,讓差距越來越小對吧,也就是讓εi越來越小,當然這個越來越小是說差距越來越小,也就是絕對值越來越接近于0。
給方程移下項:
?i=y(i)?θTxi\epsilon_i=y_{(i)}-\theta^Tx_i?i?=y(i)??θTxi?
這時候咱們再來回顧一下阿,對于方程
y(i)=θTxi+?iy_{(i)}=\theta^Tx_i+\epsilon_iy(i)?=θTxi?+?i?
θTxi是待定系數,如果在坐標系表示的話是由x確定一個圖像。
當只有一個x的時候,圖像是一維的,也就是平面上的一條線;
當有兩個x的時候,圖像是二維的,也就是空間里的一個面;
當有更多x的時候,我是想象不出來了……
就拿只有兩個x舉例隨便畫一個圖像:
在這個圖像里,假設青綠色的那個平面表示的就是θTxi,真實房價y(i)在圖中表示的紅色的點。
這樣看就清晰了,目的是讓
?i=y(i)?θTxi\epsilon_i=y_{(i)}-\theta^Tx_i?i?=y(i)??θTxi?
的絕對值越小越好,表示在圖像上就是紅色的點越接近青藍色的平面越近越好。
這里要明確一個思想,真實房價是確定了,也就是y(i)、紅色的點是確定的,而青藍色的平面θTxi才是變動的,也就是說,在空間里,我們要移動平面來擬合點,找到哪一個平面到所有點的距離和最小。
這個預測房價與真實房價之間的距離,也就是誤差ε(i)是獨立同分布的,并且我們可以假設它服從均值為0方差為σ2的高斯分布。
這里突然間冒出來三個不熟悉的名詞,解釋一下啊:
獨立:各個樣本點之間是相互獨立的。也就是說,Alex去波士頓買房,跟Bachelor去波士頓買房,只要兩個人買的不是同一套房子,它們之間是沒有關系的,花多少錢只跟房屋的屬性和房東有關。
同分布:歷史數據的來源必須相同。Alex是想在波士頓買房,所以需要的是過去幾年波士頓的房價數據,如果拿得是紐約的房價數據,顯然是不符合需求的,建立的數學模型也不準確。
高斯分布:也就是正態分布,這是一種連續型隨機變量的概率密度函數。先來看一下正態分布的函數圖像:
為什么要用高斯分布?
其實我們一開始并不能確定誤差一定服從高斯分布,只不過根據前人的經驗,大多數誤差經過測量被證實都是服從高斯分布的,說明高斯分布對誤差假設來說是一種很好的模型。
在自然界與生產中,一些現象受到許多相互獨立的隨機因素的影響,也就是我們買房過程中的房屋面積和地下室面積,如果每個因素所產生的影響都很微小,總的影響可以看作是服從正態分布的。
在數學上,正態分布的概率密度函數:
f(x)=12πσe?(x?u)22σ2f(x)=\frac{1}{\sqrt{2π}\sigma}e^{\frac{-(x-u)^2}{2\sigma^2}}f(x)=2π?σ1?e2σ2?(x?u)2?
當u=0,σ=1時,正態分布稱為標準正態分布:
f(x)=12πe?x22f(x)=\frac{1}{\sqrt{2π}}e^{\frac{-x^2}{2}}f(x)=2π?1?e2?x2?
我們假設預測房價跟真實房價在大多數情況下都是差異不大的。
在我們的房價預測問題中,均值μ=0,所以可以把公式寫成:
f(x)=12πσe?x22σ2f(x)=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{x^2}{2\sigma^2}}f(x)=2π?σ1?e?2σ2x2?
之前所假設的是誤差ε(i)服從正態分布,所以ε(i)就是正態分布函數中的x,我們再把ε(i)代入到公式中:
f(ε(i))=12πσe?ε(i)22σ2f(ε_{(i)})=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{ε_{(i)}^2}{2\sigma^2}}f(ε(i)?)=2π?σ1?e?2σ2ε(i)2??
我們把之前推導出的結果
?i=y(i)?θTxi\epsilon_i=y_{(i)}-\theta^Tx_i?i?=y(i)??θTxi?
也就是預測房價與真實房價之間的差距,再代入到公式中:
f(y(i)?θTxi)=12πσe?(y(i)?θTxi)22σ2f(y_{(i)}-θ^Tx_i)=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}f(y(i)??θTxi?)=2π?σ1?e?2σ2(y(i)??θTxi?)2?
在這個公式中,y(i)表示的真實房價,是已知的,x(i)呢,是每間房子的特征,也就是房屋的面積和地下室的面積,也是已知的。
也就是說,整個公式中,只有θT是未知的。
這樣的話,咱們把自變量換一下,整成一個關于未知數θ的函數:
L(θ)=12πσe?(y(i)?θTxi)22σ2L(θ)=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}L(θ)=2π?σ1?e?2σ2(y(i)??θTxi?)2?
我們一開始的目的是想讓誤差ε(i)變小,在正態分布中,對于自變量x,絕對值越小,越接近于0,因變量的值越大。
好了,現在我們的目的進階了一下,讓L(θ)的值越大越好。
那么,怎么計算L(θ)的值呢?
我們不是有往年的波士頓房價資料么,把以前的一些資料全部代入進去不就行了。
代入一個,得到一個L(θ1),再代入一個得到一個L(θ2),然后一直代入,一直代入……
咱們是想讓建立的數學模型最好能夠擬合所有的樣本,也就是說,讓所有的L(θ)都最大。
現在把所有的L(θ)整合起來,做一個累乘:
L(θ)=∏i=1n12πσe?(y(i)?θTxi)22σ2L(θ)=\prod_{i=1}^{n}\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}L(θ)=i=1∏n?2π?σ1?e?2σ2(y(i)??θTxi?)2?
為什么要做累乘而不是累加呢?
這個其實跟數學有關,多個樣本之間的累乘依然保留原本的分布模式,并且會使常見的概率更常見,這個概率對所有的樣本關聯性更強。
舉個例子,假如說L(θi)={1,2,3,4,5,6,7,8,9},把所有的數累加起來,其結果sum_L(θi)=45,但是如果把所有的結果累乘起來,其結果ride_L(θi)=362880。
這個時候,如果缺了一個數7,那么sum_L(θi)’=38,ride_L(θi)’=51840,累乘的結果降低的更多,說明累乘的結果對每一個樣本的關聯性更大。
對于L(θ),它有一個學名叫似然函數,暫時不需要去深刻的理解似然函數的概念,咱現在的主要目的是買房。
現在得到了一個累乘的結果L(θ),但是累乘算起來比較麻煩,咱們可以把累乘轉換為累加,方法是對等式兩邊同時取對數:
lnL(θ)=ln∏i=1n12πσe?(y(i)?θTxi)22σ2ln^{L(θ)}=ln^{\prod_{i=1}^{n}\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}}lnL(θ)=ln∏i=1n?2π?σ1?e?2σ2(y(i)??θTxi?)2?
雖然轉換了,但是效果還是一樣的,只是通過累加來計算而已。
根據對數運算的性質,可以將累乘計算提到ln前邊,變成累加運算:
lnL(θ)=∑i=1nln12πσe?(y(i)?θTxi)22σ2ln^{L(θ)}=\sum_{i=1}^nln^{\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}}lnL(θ)=i=1∑n?ln2π?σ1?e?2σ2(y(i)??θTxi?)2?
再看一下右式ln運算的真數:
12πσe?(y(i)?θTxi)22σ2\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}2π?σ1?e?2σ2(y(i)??θTxi?)2?
這也是一個乘法運算,而且前一項
12πσ\frac{1}{\sqrt{2π}\sigma}2π?σ1?
是一個常數,后一項
e?(y(i)?θTxi)22σ2e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}e?2σ2(y(i)??θTxi?)2?
根據對數運算的性質可以消去e。
化簡一下,公式就變成了:
lnL(θ)=∑i=1n(ln12πσ+lne?(y(i)?θTxi)22σ2)ln^{L(θ)}=\sum_{i=1}^n(ln^{\frac{1}{\sqrt{2π}\sigma}}+ln^{e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}})lnL(θ)=i=1∑n?(ln2π?σ1?+lne?2σ2(y(i)??θTxi?)2?)
=∑i=1n(ln12πσ?(y(i)?θTxi)22σ2)=\sum_{i=1}^n(ln^{\frac{1}{\sqrt{2π}\sigma}}-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2})=i=1∑n?(ln2π?σ1??2σ2(y(i)??θTxi?)2?)
=∑i=1nln12πσ?∑i=1n(y(i)?θTxi)22σ2=\sum_{i=1}^nln^{\frac{1}{\sqrt{2π}\sigma}}-\sum_{i=1}^n\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}=i=1∑n?ln2π?σ1??i=1∑n?2σ2(y(i)??θTxi?)2?
之前我們分析過了,整個式子里只有θ𝑇是未知數,所以可以先把常數項能化簡的化簡,能提前的提前,將公式化簡為:
lnL(θ)=nln12πσ?12σ2∑i=1n(y(i)?θTxi)2ln^{L(θ)}=nln^{\frac{1}{\sqrt{2π}\sigma}}-{\frac{1}{2\sigma^2}}\sum_{i=1}^n{(y_{(i)}-θ^Tx_i)^2}lnL(θ)=nln2π?σ1??2σ21?i=1∑n?(y(i)??θTxi?)2
這時候再看一下公式的常數項:
nln12πσ和1σ2nln^{\frac{1}{\sqrt{2π}\sigma}}和{\frac{1}{\sigma^2}}nln2π?σ1?和σ21?
把1/2保留到變量項里,后續有用。
我們的目的是讓似然函數L(θ)越大越好,即讓lnL(θ)越大越好,也就是讓
12∑r=1n(y(i)?θTxi)2{\frac{1}{2}}\sum_{r=1}^n{(y_{(i)}-θ^Tx_i)^2}21?r=1∑n?(y(i)??θTxi?)2
越小越好。
寫成目標函數:
J(θ)=12∑r=1n(y(i)?θTxi)2J(θ)={\frac{1}{2}}\sum_{r=1}^n{(y_{(i)}-θ^Tx_i)^2}J(θ)=21?r=1∑n?(y(i)??θTxi?)2
你可能覺得,
y(i)?θTxiy_{(i)}-θ^Tx_iy(i)??θTxi?
這個式子不就是之前推導出來的么,整了那么一大圈,最后的出來的還是這個。
實則不然,現在要計算的是:J(θ)的最小值,
J(θ)=(y(i)?θTxi)2J(θ)=(y_{(i)}-θ^Tx_i)^2J(θ)=(y(i)??θTxi?)2
當x只有一維取值的時候,用高中的話講就是一個開口向上的二次函數,有最小值,怎么求呢?
求導,導數為0的時候取極值,極值中存在最值。
現在得到了目標函數:
J(θ)=12∑i=1n(y(i)?θTxi)2J(θ)={\frac{1}{2}}\sum_{i=1}^n{(y_{(i)}-θ^Tx_i)^2}J(θ)=21?i=1∑n?(y(i)??θTxi?)2
轉換成矩陣相乘的形式并化簡一下:
J(θ)=12(Xθ?y)T(Xθ?y)J(θ)={\frac{1}{2}}({Xθ-y})^T({Xθ-y})J(θ)=21?(Xθ?y)T(Xθ?y)
=12((Xθ)T?yT)(Xθ?y)={\frac{1}{2}}({{(Xθ)}^T-y^T})({Xθ-y})=21?((Xθ)T?yT)(Xθ?y)
=12(θTXT?yT)(Xθ?y)={\frac{1}{2}}({θ^TX^T-y^T})({Xθ-y})=21?(θTXT?yT)(Xθ?y)
=12(θTXTXθ?θTXTy?yTXθ+yTy)={\frac{1}{2}}(θ^TX^TXθ-θ^TX^Ty-y^TXθ+y^Ty)=21?(θTXTXθ?θTXTy?yTXθ+yTy)
咱們的未知數是θ,現在是一個關于θ的函數,對θ求導得:
J′(θ)=XTXθ?XTyJ'(θ)=X^TXθ-X^TyJ′(θ)=XTXθ?XTy
令J’(θ)=0得:
XTXθ?XTy=0X^TXθ-X^Ty=0XTXθ?XTy=0
XTXθ=XTyX^TXθ=X^TyXTXθ=XTy
θ=(XTX)?1XTyθ=(X^TX)^{-1}X^Tyθ=(XTX)?1XTy
現在,我們終于得到最終的θ了,為什么說最終了呢?X是已經獲得的房屋的數據,y是房價,都是已知的,直接代入就OK了。
通過這個例子我們可以看到,做研究型人工智能更多的是做數學方面的公式證明與推導,需要你有扎實的高等數學、線性代數和概率與統計的基礎,并且還要有一定的邏輯推理能力,所以,做研究型人工智能的入門年級至少是大二下學期或者大三才可以,除非你可以自學那三門數學功課,不然就算你去學也學不明白,看的云里霧里,不知其然也不知其所以然。
總結
- 上一篇: 144. Binary Tree Pre
- 下一篇: 2017\National _C_C++