天天看點

人工智能算法綜述 (一)

  “那一些被認作常識的東西,是不是隻是時代的附屬品?從整個曆史的長河去看待,也許是一些莫名其妙或者殘忍至極的怪事而已”

                                                   

  2017-2018 這兩年因為一些爆炸式的AI應用,導緻又把公衆的視野轉向這個方向發展,自圖靈提出“圖靈測試”之後,AI已經爆發了兩次熱潮,相應的也跌入了兩次低谷,目前看應該是進入了第三次的熱潮,但是之後是迎來“奇點”,還是第三次低谷,尚不可知。

  強人工智能(也就是通用人工智能),或者說機器的自我意識,自然是一個終極目标,但是當我們朝着這個目标行進的時候,總會獲得一些小獎勵,這些小獎勵就是現在的弱人工智能,一些很實用的算法理論跟應用,雖然落地還有一些難度,但是整體趨于成熟,商用的應用已經開始遍地開花,短時間内将會引發全行業AI+,所有業務都會被AI重新整理一遍,當然有人會說一堆職業要消亡了,又有很多人要下崗了。但是也同樣會創造出更多的職業與崗位。而且自有人類以來,這件事我們也幹過不少次了(前三次工業革命),完全不用驚慌,曆史的車輪滾滾而行,總會丢下一部分人,又載上另外一部分人,時代就是逆水行舟,不進則退,總要保持學習,保持上進,保持饑渴。如果時代抛棄了你連一句再見也不說,那你就得趕緊加快腳步上去揍它一頓。

--------------(這看上去像一根線)--------------------

  閑話少說,為各位呈上各類流弊的算法簡介(通俗易懂的說明,具體細節不表),可能會有些地方講的不對,希望能得到一點友情提醒,我會立馬修正。

CNN:卷積神經網絡

  我在上一篇關于 tensorflow(谷歌開源AI架構)的踩坑日志有說過一點關于卷積神經網絡的基本原理。

  就是卷積層+N層神經網絡BP層(也叫全連結層) 關于 BP的原理我之前有寫過一篇了,翻回去看看就有了。

  那卷積層具體是什麼呢?很像是一個濾鏡層,我們知道實際上圖像是由每個像素點組成的矩陣,然後每個像素點又可以由 RGB 3原色的數值表示範圍是(0-255) 如果做一次灰階處理,那麼每個像素點就是由0-255的灰階數值表示。那圖像就等同于 一個 2維的 數字矩陣。 當然如果顔色想保留的話,不做灰階處理的話,RGB就等同于3個不同的矩陣,長寬是一樣的。裡面的數值不同而已。

  那我們回到卷積層,就是拿一個卷積核在這個矩陣上滾一遍(矩陣相乘)得出一個新的矩陣。卷積核也是一個小的2維矩陣,不同數值的卷積核,可以對這張圖檔提取的資訊不同,這就是圖像的特征, 比如說把一個專門提取豎線的卷積核在原始圖檔上滾一遍,就能獲得一個全部都是豎線的特征圖。如果我們要做一個竹子的識别器,肯定要用這個特征了。但是如果要做一個籃球的識别器,就用不上了,用或者不用,這是由BP層決定的。但是提取的工作還是要做的,但是怎麼決定卷積核應該是由什麼數值構成呢?随機! 因為這個算法比較通用,可以做成識别各種東西,是以卷積核應該是任意特征都能提取的,那隻要生成1000,1W ,或者1億個卷積核,每個都在這個圖像上滾一遍,就能提取1億種特征了。如果最後BP層隻用到其中一個特征就能識别竹子或者籃球。那豈不是非常浪費,是以卷積核的數量要根據識别複雜度而定。否則計算量很可怕。

  當然CNN裡面還有很多細節,比如池化層,歸一化,dropout 。

池化層也有幾種不同的方法,如果是求均值就是mean pooling,求最大值就是max pooling

池化就是降維比較好了解一點吧,為了減少計算量。

歸一化(Normalization,也叫規範化)是為了讓資料在網絡中傳輸的時候不要太大,或者太小,或者太稀疏。

  早前的一些歸一化方法 看這篇  《歸一化方法總結》 http://blog.csdn.net/junmuzi/article/details/48917361

後來google 有一篇論文講了另外一種方式 Batch Normalization http://blog.csdn.net/zhikangfu/article/details/53391840

聽說效果不錯。

dropout是指随機的把一些特征失效掉來訓練這個網絡,這樣泛化能力比較強。我自己實踐過一次,但是感覺訓練過程變得更久了,波動更大了。慎用。

全連結層的梯度下降方法也有很多種如:http://blog.csdn.net/xierhacker/article/details/53174558

這裡列了一些tensorflow 内置的一些梯度下降優化器 

GradientDescentOptimizer

AdagradOptimizer

MomentumOptimizer,

AdamOptimizer

CNN的算法裡面有很多參數要調,比如說網絡的層數,初始學習率,dropout的機率等等,這類統稱為超參數

有文章說現在很多CNN的工作都是很枯燥的調參數,因為訓練一次周期很長,超參數的調整又跟具體的要識别的東西相關性很強,比如說訓練10種類别,跟訓練1000種類别的網絡深度就是不同的,前面我寫踩坑日志的時候就犯了這個錯誤,拿一個很簡單的網絡去訓練很多種類,結果一直不收斂。loss很大。

當然關于調參數也有一些很實用的實踐性經驗分享,大家可以自行去找找。這裡我就不細說了。

雖然我們剛才說的都是圖像上的,但是文字跟音頻也可以轉化成這種輸入,類似說1*N的矩陣。

 ----------------------(這看上去跟第一根線沒什麼差別)----------------------

RL:強化學習(reinforcement learning)

關于RL的詳細内容可以看 Deepmind 的公開課

  這裡給大家分享一個B站帶中文字幕的視訊,每課100分鐘左右,總共10課,16個小時也能看完,不過因為相對比較晦澀,我建議是不要一次性看完,不然一臉懵逼的進去,一臉懵逼的出來。遇到不懂的就去問問,懂了再繼續看。 https://www.bilibili.com/video/av9831889/

強化學習核心的原理是:

  造一個agent(智能代理者)跟環境(state)互動(action)然後根據獲得的回報(reward)反複訓練後,這個agent可以在遇到任意的state時都能選擇最優的決策(action),這個最優的決策會在未來帶來最大化的reward。

RL解決的問題是連續決策問題,就是有一系列的決策之後才會獲得獎勵的現實問題。比方說某baby 3歲,暫且先叫A醬,A醬還不會拿杯子喝東西。我們知道最優政策就是

:靠近杯子,拿起來,倒進嘴巴裡。

但是她一開始的時候并不知道看到一個杯子在遠處,究竟是應該靠近,還是遠離。而且就算反複做了這2件事,也沒有一些立即獎勵給她(喝到東西)。是以說獎勵是滞後的,但是我們希望可以對動作的打分,根據分數的高低讓智能體選出最佳的決策,比方說 靠近杯子10分,遠離杯子-10分。如果每一步都有這樣的标量作為衡量标準的話,那麼她就可以知道要獲得獎勵的最優政策是什麼了,當然有些動作在不同的場景下會導緻不同的效果,是以這裡的打分要針對 state-action pair(不同狀态對應不同的動作) 評分。

是以RL的作用就是經過反複的訓練,為每對state-action  提供一個分數。這就Value based(基于分數的算法,其中的一種的RL算法實作方式)。

如果先假設 最終的獎勵分數是 100分。那麼究竟前一步應該配置設定多少分呢?然後前前一步又是多少?這裡就用到了貝爾曼方程

具體細節可以看這篇 http://blog.csdn.net/VictoriaW/article/details/78839929

人工智能算法綜述 (一)

s :state   

a:action

Q就是我上面講的分數。然後Qπ 指的就是最優政策下的分數函數。

P是指狀态s下決定某動作a之後 =》下一個狀态s的轉移機率。(比方說A醬雖然見到了杯子,然後她使用了動作a1(拿起來)但是不一定能夠成功,這裡有個轉移機率P)。

R是指立即獎勵。

人工智能算法綜述 (一)

指折扣率,是一個0-1的數,就是指未來的Q值對目前Q的影響有多少,如果是1的話就是100%影響。

這裡我們可以看到,目前的Q值是由兩部分組成,目前R值+下一個狀态的Q值。

假設 折扣率這裡是0.5,最終的獎勵分數是 100分。

反過來推導的話,A醬在喝到杯中物的時候 Q值等于R值,因為沒有下一個狀态了。在往前一個動作 (拿起杯子)因為隻有1個動作,而且立即獎勵R=0,是以Q值等于 0+ 0.5*100=50 。

然後再往前面一步,狀态1(見到杯子)的時候 選擇 (靠近),是以Q值 是 0+0.5*(0+ 0.5*100)=25 

這是我們通過已知最優政策然後用貝爾曼方程反推Q值,這樣便于了解Q值的含義。

雖然不知道最優政策,但是如果我們有一個所有狀态所有動作的 記錄Q值的表,隻要反複通過上面的過程推導就能知道這個大表的所有值,最終就能通過這個大表知道最優政策。

這就是Q-learning 算法的邏輯。

當然Q-learning是不實用的,因為如果state 跟action有非常多,這個表資料量要爆炸的。

是以後續又發展好多算法,我推薦讀一下DQN相關的算法。

RL很早很早就有了。

強化學習的曆史發展

  1. 1956年Bellman提出了動态規劃方法。
  2. 1977年Werbos提出隻适應動态規劃算法。
  3. 1988年sutton提出時間差分算法。
  4. 1992年Watkins 提出Q-learning 算法。
  5. 1994年rummery 提出Saras算法。
  6. 1996年Bersekas提出解決随機過程中優化控制的神經動态規劃方法。
  7. 2006年Kocsis提出了置信上限樹算法。
  8. 2009年kewis提出回報控制隻适應動态規劃算法。
  9. 2014年silver提出确定性政策梯度(Policy Gradents)算法。
  10. 2015年Google-deepmind 提出Deep-Q-Network算法。

因為alphaGo 就是基于RL的,主要用了蒙特卡羅樹搜尋算法 (MCTS)然後RL這兩年又被大神們推進了好多優化。

我摘一段放這裡說明一下實作RL算法的幾種類别:

  • Model-free:不嘗試去了解環境, 環境給什麼就是什麼,一步一步等待真實世界的回報, 再根據回報采取下一步行動。
  • Model-based:先了解真實世界是怎樣的, 并建立一個模型來模拟現實世界的回報,通過想象來預判斷接下來将要發生的所有情況,然後選擇這些想象情況中最好的那種,并依據這種情況來采取下一步的政策。它比 Model-free 多出了一個虛拟環境,還有想象力。
  • Policy based:通過感官分析所處的環境, 直接輸出下一步要采取的各種動作的機率, 然後根據機率采取行動。
  • Value based:輸出的是所有動作的價值, 根據最高價值來選動作,這類方法不能選取連續的動作。
  • Monte-carlo update:遊戲開始後, 要等待遊戲結束, 然後再總結這一回合中的所有轉折點, 再更新行為準則。
  • Temporal-difference update:在遊戲進行中每一步都在更新, 不用等待遊戲的結束, 這樣就能邊玩邊學習了。
  • On-policy:必須本人在場, 并且一定是本人邊玩邊學習。
  • Off-policy:可以選擇自己玩, 也可以選擇看着别人玩, 通過看别人玩來學習别人的行為準則。

 RL現階段比較實用的算法是:

DQN,DDPG, A3C,DPPO 等

之前有一篇deepmind 關于DQN混血的報道 

摘一張圖大家看看

人工智能算法綜述 (一)

 橫軸是訓練次數,縱軸是超過人類水準百分比,100%就是等同于平均的人類玩遊戲的水準,在57款雅達利遊戲中的平均表現。

2017-2018年 一些很有趣的開源應用示例,以及使用的算法

CNN :圖像識别 人臉識别 風格遷移

RL :alphaGO 遊戲代打 機器人控制 阿裡商品推薦系統  

GANs:風格遷移 草圖生成實體圖 貓臉轉狗臉  去掉圖像遮擋  年齡轉移   超分辨率

RNN  LSTM:翻譯模型,生成古詩,生成對聯,PSD生成HTML代碼

下一篇傳送門:人工智能算法綜述 (二)