本文記錄一些對深度學習的思考總結.意識流寫法,想到哪寫到哪,往後不按期更新補充.html
在沒有接觸深度學習的時候,以爲這是個很是高大上的技術,數學基礎要求很是多,上手門檻很是高.我想不少人和我有同樣的想法.這種對深度學習的印象,我想很大一部分來自鋪天蓋地的自媒體的有關AI的報道解讀,形成了一種深度學習,人工智能很是高大上的感受. 實際上媒體人沒有相關的理論基礎,甚至沒有工科背景,文章寫出來又要吸引人能帶流量,有時又不免誇大,各類名詞什麼神經網絡,人工智能,梯度爆炸,並行計算優化,對沒有接觸過相關技術的人來講,很容易形成一種很高大上很神祕的印象.網絡
其實,神經網絡並非什麼新鮮的東西,早幾十年就有了,卷積也不是什麼新鮮東西,在模式識別,圖像處理裏也早就應用普遍. 現現在,深度學習大紅大紫,仍是由於時代發展到了這個階段,算力的發展,芯片的發展,更快的gpu的出現,更好的計算優化技術,互聯網時代咱們有了大量的數據,這些都使得卷積神經網絡的訓練成爲可能,而不是僅僅在理論層面.大量的訓練數據,使得深度學習在不少業務領域有了更好的表現,尤爲是圖像處理方面。機器學習
先說結論:本質就尋找最合適的卷積核,最合適的特徵權重,最大限度擬合訓練樣本。本質是計算。函數
以圖像處理爲例,傳統的方法怎麼作的? 手工提取特徵 + 傳統機器學習. 深度學習怎麼作的?端到端的學習,再也不須要手工提取特徵了,本身學習特徵.
好比下面這幅圖,你很容易就認出來這是一隻貓.
學習
你有沒有想過,你的大腦是怎麼識別出來這是一隻貓的?經過眼睛,耳朵,嘴巴,尾巴,腿?仍是經過這些的組合?這裏的"耳朵,嘴巴,尾巴"等等就是所謂的"特徵"。雖然你並無意識到你的大腦通過了一系列複雜的運算,但它確實是通過了一系列複雜的運算,而後告訴你這是一個貓。只不過神經元的速度太快了,你意識不到而已.優化
對計算機而言,上面的圖就是一堆數字而已,好比800*600的圖,就是一個800*600*3的矩陣,爲了簡化表達,就用灰度圖來講吧,那就是800*600的矩陣,矩陣裏相應元素的值表明着像素值.固然"像素值"這個概念,也是咱們人爲賦予的,計算機纔不care什麼像素值不像素值,對它來講,就是個數字而已.google
那問題來了,什麼樣的數字表明"貓的眼睛",什麼樣的數字表明"貓的耳朵"?之前這個工做是手工去作的.如今是神經網絡自動去作的.
好比對連續5個像素,值爲1,34,67,89,213,我就認爲這5個像素表明貓頭,這個規則是我事先定義好的.(固然這是我瞎定義的,這5個像素固然不能表明貓頭)。手工去作的時候,你須要理解業務,好比識別車和識別貓,(1,34,67,89,213)在貓的圖片裏可能表明貓頭,在車子圖片裏可能表明車屁股,其含義是不一樣的.這就麻煩了,不一樣的領域,規則不一樣,並且,特徵工程就是他孃的玄學啊,特徵成千上萬,找也找不完,好的特徵和壞的特徵對最後的識別結果帶來的影響千差萬別,怎麼衡量該重點考慮哪一種特徵?.人工智能
而對深度學習來講,輸入就是一堆數字而已,它不懂數字表明的業務含義,它也不須要懂,它只要嘗試出最合適的卷積矩陣,使得loss最小就行,前面也說了,本質是計算。.net
這裏也能夠看到,傳統的方法和深度學習的方法,在思路上就是徹底兩種思路. 前者更看着規則的定義,也就是特徵的提取. 後者則更看重輸入的數據,只要你輸入的數據夠多,質量夠好,我就能自動提取出有效的特徵和權重.(固然,這個意義也是咱們人爲賦予的,學習出來的其實就是一堆數而已,咱們把他們稱之爲特徵,這個時候,他們再也不表明貓頭、耳朵等等了,可能就是一個點,一條線,肉眼看去已經沒法理解了,以下圖)
這也是前面提到的,深度學習之因此站到了歷史的臺前的兩大緣由之一:海量的數據。設計
如今就涉及到卷積的概念了.
爲何
這個卷積核能起到邊緣檢測的做用?想一想你是怎麼去判斷圖像邊緣的?若是給你一副純色圖,有邊緣嗎?
好比
顯然沒有啊。由於純色圖,矩陣的每個像素值都同樣的,因此分不出邊緣.看出來了吧,你經過判斷與周邊像素的差異來判斷是否是邊緣.差異越大越有多是邊緣.如今在看上面的卷積核,很清楚了吧,通過卷積運算(不懂卷積運算的,先看看置頂的那篇https://www.cnblogs.com/sdu20112013/p/10149529.html) .每個像素值x都變成了8*x + (-1)*周邊像素,即8*x -周邊像素。這可不就是在比較當前像素和周邊像素的差值嗎?因此卷積完的矩陣,繪圖繪製出來,就有了邊緣的效果.
按照這個思路,不難理解爲何不一樣的卷積核會有不一樣的效果了,也就是不一樣的特徵被咱們提取出來了.不少人設計好了不少卷積核,分別完成不一樣的功能.傳統的圖像處理,就是去使用這些卷積核,再配以規則,完成適配本身業務領域數據的特徵提取.
好,重點來了.上面說了,"邊緣"這個特徵被提取出來了,那對這個表明圖像邊緣的矩陣,叫matrix_a吧,繼續找一個卷積矩陣kenerl_a,對其作卷積,獲得matrix_b,這個martrix_b什麼意義呢?再對這個martrix_b作卷積,獲得martrix_c,這個martix_c又表明啥呢?答案是咱們不知道,像上面提到的,最終的矩陣繪製出來,可能已是一個點,一條線了,咱們已經沒法肉眼識別他們在現實世界的對應物體了.但並不表明這是無心義的,不一樣於貓的眼睛,耳朵等等這些高級特徵,這時候獲得的這些點啊線啊,已是很是抽象的低級特徵了.而圖片正是由這些大量的低級特徵組成的.
深度學習乾的啥事?就是尋找成千上萬的卷積核,獲得成千上萬的特徵,而後用分類也好,迴歸也罷,認爲咱們的目標=特徵權重*特徵之和.好比obj=0.3*feature1 + 0.5*feature2,obj=1表明貓,obj=2表明狗. 這樣拿到一個新的圖片,輸入給模型,模型經過卷積就計算出對應的feature1,feature2,而後計算obj,而後咱們就知道了這張圖是貓和狗.
固然,卷積核不是瞎找的,卷積核矩陣裏面的數字到底填幾,要是一個個瞎試,再牛逼的gpu,再牛逼的芯片也試不完啊.這裏面就涉及到損失函數定義,梯度降低了.
詳細的去看我機器學習的文章吧,不想看的就知道模型學習的過程裏,卷積核的值填什麼不是隨機亂填的,每次反向傳播更新卷積核的時候都是朝着讓loss更小,也就是讓模型更準確(所謂更準確,是針對你的訓練數據來講的,一樣的網絡結構,你機器上跑出來的模型的參數和別人跑出來的模型參數是不同的,若是大家的訓練數據不同的話)這樣一個目標去更新的就完了.
好比上圖的卷積核能夠識別右邊的曲線.道理也是很顯然的,上圖的卷積核的形狀就是相似咱們想要的曲線的形狀的.若是遇到相似形狀的圖像,卷積(對應位置像素值相乘再相加)以後獲得的數會很大,反之很小.這樣就把想要的形狀的曲線識別出來了.
大學的時候,學信號處理,每天就是各類傅里葉變換,徹底不知道有啥用.說實在的,大學的不少老師水平其實也不咋地,基本就是照本宣科,要麼放萬年不變的PPT,可能本身都不能深入理解,或者與產業界太脫離,徹底不講這些理論的現實應用.其實講清楚這些現實意義也沒那麼難麼.因此還在上學的同窗們,要好好學習啊,要好好學習啊,要好好學習啊,重要的事情說三遍,你如今覺得沒用的東西,不知道哪天就派上用場了.
如今回頭看,卷積不就是離散的傅里葉變換嗎. 從信號的角度理解卷積,卷積核不就是濾波器嗎,卷積覈對圖像的做用,不就是對圖像這種信號作濾波嗎.啥叫濾波,其實也就是特徵提取。
傅里葉變換將時域和空域信息-->轉換到頻域上. 對圖像處理而言,咱們處理的大部分時候是空域的信息.說人話就是空間信息,對單幀圖像而言,咱們卷積出來的特徵,點也好,線也罷,是一種形狀,是空間上的信息. 連續的圖像才存在這時間信息,多幀圖像是有聯繫的,好比視頻,時域信息就很重要了.
https://www.zhihu.com/question/20099543/answer/13971906
首先說說圖像頻率的物理意義。圖像能夠看作是一個定義爲二維平面上的信號,該信號的幅值對應於像素的灰度(對於彩色圖像則是RGB三個份量),若是咱們僅僅考慮圖像上某一行像素,則能夠將之視爲一個定義在一維空間上信號,這個信號在形式上與傳統的信號處理領域的時變信號是類似的。不過是一個是定義在空間域上的,而另外一個是定義在時間域上的。因此圖像的頻率又稱爲空間頻率,它反映了圖像的像素灰度在空間中變化的狀況。例如,一面牆壁的圖像,因爲灰度值分佈平坦,其低頻成分就較強,而高頻成分較弱;而對於國際象棋棋盤或者溝壑縱橫的衛星圖片這類具備快速空間變化的圖像來講,其高頻成分會相對較強,低頻則較弱(注意,是相對而言)。
先看CNN中全鏈接層參數是怎麼來的.參考https://zhuanlan.zhihu.com/p/33841176.
以VGG-16舉例,在VGG-16全鏈接層中,對224x224x3的輸入,最後一層卷積可得輸出爲7x7x512,如後層是一層含4096個神經元的FC,則可用卷積核爲7x7x512x4096的全局卷積來實現這一全鏈接運算過程。
這樣作會有什麼好處和問題?
好處和壞處是同樣的,就是去除掉位置信息的影響.主要看你處理的是什麼問題.對分類來講,咱們不關心位置,但願某種像素組合被識別爲某種特徵,咱們不在意這種像素組合在圖片矩陣的什麼位置出現,我都要能識別它,這時候就是好處.
可是對於圖像分割來講,就是壞處了.由於我須要知道位置信息.好比須要知道圖片裏的貓在左上角仍是右下角,這樣才能準確分割.因此分割模型會用卷積層替代掉全鏈接層.
在我寫這篇文章的時候,我作了一點google,想看看有沒有人寫過相似的主題,發現有2篇文章寫的很好,我也引用了部分圖,推薦之。