王小龍數學話題優秀回答者 數學,計算機視覺,圖形圖像處理收錄于 知乎周刊 、 編輯推薦 ?4320 人贊同神經網絡很萌的!0. 分類神經網絡最重要的用途是分類,為了讓大家對分類有個直觀的認識,咱們先看幾個例子:垃圾郵件識別:現在有一封電子郵件,把出現在里面的所有詞匯提取出來,送進一個機器里,機器需要判斷這封郵件是否是垃圾郵件。疾病判斷:病人到醫院去做了一大堆肝功、尿檢測驗,把測驗結果送進一個機器里,機器需要判斷這個病人是否得病,得的什么病。貓狗分類:有一大堆貓、狗照片,把每一張照片送進一個機器里,機器需要判斷這幅照片里的東西是貓還是狗。這種能自動對輸入的東西進行分類的機器,就叫做分類器。分類器的輸入是一個數值向量,叫做特征(向量)。在第一個例子里,分類器的輸入是一堆0、1值,表示字典里的每一個詞是否在郵件中出現,比如向量(1,1,0,0,0......)就表示這封郵件里只出現了兩個詞abandon和abnormal;第二個例子里,分類器的輸入是一堆化驗指標;第三個例子里,分類器的輸入是照片,假如每一張照片都是320*240像素的紅綠藍三通道彩色照片,那么分類器的輸入就是一個長度為320*240*3=230400的向量。分類器的輸出也是數值。第一個例子中,輸出1表示郵件是垃圾郵件,輸出0則說明郵件是正常郵件;第二個例子中,輸出0表示健康,輸出1表示有甲肝,輸出2表示有乙肝,輸出3表示有餅干等等;第三個例子中,輸出0表示圖片中是狗,輸出1表示是貓。分類器的目標就是讓正確分類的比例盡可能高。一般我們需要首先收集一些樣本,人為標記上正確分類結果,然后用這些標記好的數據訓練分類器,訓練好的分類器就可以在新來的特征向量上工作了。1. 神經元咱們假設分類器的輸入是通過某種途徑獲得的兩個值,輸出是0和1,比如分別代表貓和狗。現在有一些樣本:大家想想,最簡單地把這兩組特征向量分開的方法是啥?當然是在兩組數據中間畫一條豎直線,直線左邊是狗,右邊是貓,分類器就完成了。以后來了新的向量,凡是落在直線左邊的都是狗,落在右邊的都是貓。一條直線把平面一分為二,一個平面把三維空間一分為二,一個n-1維超平面把n維空間一分為二,兩邊分屬不同的兩類,這種分類器就叫做神經元。大家都知道平面上的直線方程是
,等式左邊大于零和小于零分別表示點
在直線的一側還是另一側,把這個式子推廣到n維空間里,直線的高維形式稱為超平面,它的方程是:
神經元就是當h大于0時輸出1,h小于0時輸出0這么一個模型,它的實質就是把特征空間一切兩半,認為兩瓣分別屬兩個類。你恐怕再也想不到比這更簡單的分類器了,它是McCulloch和Pitts在1943年想出來了。這個模型有點像人腦中的神經元:從多個感受器接受電信號
,進行處理(加權相加再偏移一點,即判斷輸入是否在某條直線
的一側),發出電信號(在正確的那側發出1,否則不發信號,可以認為是發出0),這就是它叫神經元的原因。當然,上面那幅圖我們是開了上帝視角才知道“一條豎直線能分開兩類”,在實際訓練神經元時,我們并不知道特征是怎么抱團的。神經元模型的一種學習方法稱為Hebb算法:先隨機選一條直線/平面/超平面,然后把樣本一個個拿過來,如果這條直線分錯了,說明這個點分錯邊了,就稍微把直線移動一點,讓它靠近這個樣本,爭取跨過這個樣本,讓它跑到直線正確的一側;如果直線分對了,它就暫時停下不動。因此訓練神經元的過程就是這條直線不斷在跳舞,最終跳到兩個類之間的豎直線位置。2. 神經網絡MP神經元有幾個顯著缺點。首先它把直線一側變為0,另一側變為1,這東西不可微,不利于數學分析。人們用一個和0-1階躍函數類似但是更平滑的函數Sigmoid函數來代替它(Sigmoid函數自帶一個尺度參數,可以控制神經元對離超平面距離不同的點的響應,這里忽略它),從此神經網絡的訓練就可以用梯度下降法來構造了,這就是有名的反向傳播算法。神經元的另一個缺點是:它只能切一刀!你給我說說一刀怎么能把下面這兩類分開吧。解決辦法是多層神經網絡,底層神經元的輸出是高層神經元的輸入。我們可以在中間橫著砍一刀,豎著砍一刀,然后把左上和右下的部分合在一起,與右上的左下部分分開;也可以圍著左上角的邊沿砍10刀把這一部分先挖出來,然后和右下角合并。每砍一刀,其實就是使用了一個神經元,把不同砍下的半平面做交、并等運算,就是把這些神經元的輸出當作輸入,后面再連接一個神經元。這個例子中特征的形狀稱為異或,這種情況一個神經元搞不定,但是兩層神經元就能正確對其進行分類。只要你能砍足夠多刀,把結果拼在一起,什么奇怪形狀的邊界神經網絡都能夠表示,所以說神經網絡在理論上可以表示很復雜的函數/空間分布。但是真實的神經網絡是否能擺動到正確的位置還要看網絡初始值設置、樣本容量和分布。神經網絡神奇的地方在于它的每一個組件非常簡單——把空間切一刀+某種激活函數(0-1階躍、sigmoid、max-pooling),但是可以一層一層級聯。輸入向量連到許多神經元上,這些神經元的輸出又連到一堆神經元上,這一過程可以重復很多次。這和人腦中的神經元很相似:每一個神經元都有一些神經元作為其輸入,又是另一些神經元的輸入,數值向量就像是電信號,在不同神經元之間傳導,每一個神經元只有滿足了某種條件才會發射信號到下一層神經元。當然,人腦比神經網絡模型復雜很多:人工神經網絡一般不存在環狀結構;人腦神經元的電信號不僅有強弱,還有時間緩急之分,就像莫爾斯電碼,在人工神經網絡里沒有這種復雜的信號模式。神經網絡的訓練依靠反向傳播算法:最開始輸入層輸入特征向量,網絡層層計算獲得輸出,輸出層發現輸出和正確的類號不一樣,這時它就讓最后一層神經元進行參數調整,最后一層神經元不僅自己調整參數,還會勒令連接它的倒數第二層神經元調整,層層往回退著調整。經過調整的網絡會在樣本上繼續測試,如果輸出還是老分錯,繼續來一輪回退調整,直到網絡輸出滿意為止。這很像中國的文藝體制,武媚娘傳奇劇組就是網絡中的一個神經元,最近剛剛調整了參數。3. 大型神經網絡我們不禁要想了,假如我們的這個網絡有10層神經元,第8層第2015個神經元,它有什么含義呢?我們知道它把第七層的一大堆神經元的輸出作為輸入,第七層的神經元又是以第六層的一大堆神經元做為輸入,那么這個特殊第八層的神經元,它會不會代表了某種抽象的概念?就好比你的大腦里有一大堆負責處理聲音、視覺、觸覺信號的神經元,它們對于不同的信息會發出不同的信號,那么會不會有這么一個神經元(或者神經元小集團),它收集這些信號,分析其是否符合某個抽象的概念,和其他負責更具體和更抽象概念的神經元進行交互。2012年多倫多大學的Krizhevsky等人構造了一個超大型卷積神經網絡[1],有9層,共65萬個神經元,6千萬個參數。網絡的輸入是圖片,輸出是1000個類,比如小蟲、美洲豹、救生船等等。這個模型的訓練需要海量圖片,它的分類準確率也完爆先前所有分類器。紐約大學的Zeiler和Fergusi[2]把這個網絡中某些神經元挑出來,把在其上響應特別大的那些輸入圖像放在一起,看它們有什么共同點。他們發現中間層的神經元響應了某些十分抽象的特征。第一層神經元主要負責識別顏色和簡單紋理第二層的一些神經元可以識別更加細化的紋理,比如布紋、刻度、葉紋。第三層的一些神經元負責感受黑夜里的黃色燭光、雞蛋黃、高光。第四層的一些神經元負責識別萌狗的臉、七星瓢蟲和一堆圓形物體的存在。第五層的一些神經元可以識別出花、圓形屋頂、鍵盤、鳥、黑眼圈動物。這里面的概念并不是整個網絡的輸出,是網絡中間層神經元的偏好,它們為后面的神經元服務。雖然每一個神經元都傻不拉幾的(只會切一刀),但是65萬個神經元能學到的東西還真是深邃呢。[1] Krizhevsky, A., Sutskever, I., & Hinton, G. E. (2012). Imagenet classification with deep convolutional neural networks. In Advances in neural information PRocessing systems (pp. 1097-1105).[2] Zeiler, M. D., & Fergus, R. (2013). Visualizing and understanding convolutional neural networks.arXiv preprint arXiv:1311.2901.編輯于 2015-01-05 215 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
YJango日本會津大學人機界面實驗室 博士在讀 語音識別/強…523 人贊同作者:YJango鏈接:超智能體專欄來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。YJango 的 Live -- 深層學習入門誤區gitbook閱讀請到:后面也有tensorflow的代碼部分。人工神經網絡 · 超智能體深層神經網絡 · 超智能體csdn閱讀請到:暫無代碼深層學習為何要“Deep”(上)深層學習為何要“Deep”(下)更新2017年1月4日文章Recurrent Layers——介紹1、神經網絡為什么可以用于識別 (已回答)深層學習為何要“Deep”(上)
2、神經網絡變深后我們獲得了什么 (已回答)深層學習為何要“Deep”(下)
深層學習開啟了人工智能的新時代。不論任何行業都害怕錯過這一時代浪潮,因而大批資金和人才爭相涌入。但深層學習卻以“黑箱”而聞名,不僅調參難,訓練難,“新型”網絡結構的論文又如雨后春筍般地涌現,使得對所有結構的掌握變成了不現實。我們缺少一個對深層學習合理的認識。本文就是通過對深層神經網絡驚人表現背后原因的思考,揭示設計一個神經網絡的本質,從而獲得一個對“如何設計網絡”的全局指導。
深層學習為何要“Deep”(上)一、基本變換:層神經網絡是由一層一層構建的,那么每層究竟在做什么?
數學式子:
,其中
是輸入向量,
是輸出向量,
是偏移向量,
是權重矩陣,
是激活函數。每一層僅僅是把輸入
經過如此簡單的操作得到
。數學理解:通過如下5種對輸入空間(輸入向量的集合)的操作,完成 輸入空間 ——> 輸出空間的變換 (矩陣的行空間到列空間)。 注:用“空間”二字的原因是被分類的并不是單個事物,而是一類事物。空間是指這類事物所有個體的集合。1. 升維/降維2. 放大/縮小3. 旋轉4. 平移5. “彎曲” 這5種操作中,1,2,3的操作由
完成,4的操作是由
完成,5的操作則是由
來實現。 (此處有動態圖5種空間操作,幫助理解)每層神經網絡的數學理解:用線性變換跟隨著非線性變化,將輸入空間投向另一個空間。
物理理解:對
情景:的理解就是通過組合形成新物質。
又符合了我們所處的世界都是非線性的特點。
是二維向量,維度是碳原子和氧原子的數量
,數值且定為
,若確定
是三維向量,就會形成如下網絡的形狀 (神經網絡的每個節點表示一個維度)。通過改變權重的值,可以獲得若干個不同物質。右側的節點數決定了想要獲得多少種不同的新物質。(矩陣的行數)1.如果權重W的數值如(1),那么網絡的輸出y? 就會是三個新物質,[二氧化碳,臭氧,一氧化碳]。
(1)2.也可以減少右側的一個節點,并改變權重W至(2),那么輸出
就會是兩個新物質,
。
(2)3.如果希望通過層網絡能夠從[C, O]空間轉變到
空間的話,那么網絡的學習過程就是將W的數值變成盡可能接近(1)的過程 。如果再加一層,就是通過組合
這三種基礎物質,形成若干更高層的物質。 4.重要的是這種組合思想,組合成的東西在神經網絡中并不需要有物理意義。
每層神經網絡的物理理解:通過現有的不同物質的組合形成新物質。
二、理解視角:現在我們知道了每一層的行為,但這種行為又是如何完成識別任務的呢?
數學視角:“線性可分”一維情景:以分類為例,當要分類正數、負數、零,三類的時候,一維空間的直線可以找到兩個超平面(比當前空間低一維的子空間。當前空間是直線的話,超平面就是點)分割這三類。但面對像分類奇數和偶數無法找到可以區分它們的點的時候,我們借助 x % 2(取余)的轉變,把x變換到另一個空間下來比較,從而分割。二維情景:平面的四個象限也是線性可分。但下圖的紅藍兩條線就無法找到一超平面去分割。 神經網絡的解決方法依舊是轉換到另外一個空間下,用的是所說的5種空間變換操作。比如下圖就是經過放大、平移、旋轉、扭曲原二維空間后,在三維空間下就可以成功找到一個超平面分割紅藍兩線 (同SVM的思路一樣)。 上面是一層神經網絡可以做到的,如果把當做新的輸入再次用這5種操作進行第二遍空間變換的話,網絡也就變為了二層。最終輸出是
。 設想網絡擁有很多層時,對原始輸入空間的“扭曲力”會大幅增加,如下圖,最終我們可以輕松找到一個超平面分割空間。當然也有如下圖失敗的時候,關鍵在于“如何扭曲空間”。所謂監督學習就是給予神經網絡網絡大量的訓練例子,讓網絡從訓練例子中學會如何變換空間。每一層的權重W就控制著如何變換空間,我們最終需要的也就是訓練好的神經網絡的所有層的權重矩陣。。這里有非常棒的可視化空間變換demo,一定要打開嘗試并感受這種扭曲過程。更多內容請看Neural Networks, Manifolds, and Topology。
上面的內容有三張動態圖,對于理解這種空間變化非常有幫助。由于知乎不支持動態圖,可以在gitbook深層學習為何要“deep”上感受那三張圖。一定一定要感受。
線性可分視角:神經網絡的學習就是學習如何利用矩陣的線性變換加激活函數的非線性變換,將原始輸入空間投向線性可分/稀疏的空間去分類/回歸。
增加節點數:增加維度,即增加線性轉換能力。增加層數:增加激活函數的次數,即增加非線性轉換次數。
物理視角:“物質組成”類比:回想上文由碳氧原子通過不同組合形成若干分子的例子。從分子層面繼續迭代這種組合思想,可以形成DNA,細胞,組織,器官,最終可以形成一個完整的人。繼續迭代還會有家庭,公司,國家等。這種現象在身邊隨處可見。并且原子的內部結構與太陽系又驚人的相似。不同層級之間都是以類似的幾種規則再不斷形成新物質。你也可能聽過分形學這三個字。可通過觀看從1米到150億光年來感受自然界這種層級現象的普遍性。人臉識別情景:我們可以模擬這種思想并應用在畫面識別上。由像素組成菱角再組成五官最后到不同的人臉。每一層代表不同的不同的物質層面 (如分子層)。而每層的W存儲著如何組合上一層的物質從而形成新物質。 如果我們完全掌握一架飛機是如何從分子開始一層一層形成的,拿到一堆分子后,我們就可以判斷他們是否可以以此形成方式,形成一架飛機。 附:Tensorflow playground展示了數據是如何“流動”的。物質組成視角:神經網絡的學習過程就是學習物質組成方式的過程。
增加節點數:增加同一層物質的種類,比如118個元素的原子層就有118個節點。增加層數:增加更多層級,比如分子層,原子層,器官層,并通過判斷更抽象的概念來識別物體。
按照上文在理解視角中所述的觀點,可以想出下面兩條理由關于為什么更深的網絡會更加容易識別,增加容納變異體(variation)(紅蘋果、綠蘋果)的能力、魯棒性(robust)。
數學視角:變異體(variation)很多的分類的任務需要高度非線性的分割曲線。不斷的利用那5種空間變換操作將原始輸入空間像“捏橡皮泥一樣”在高維空間下捏成更為線性可分/稀疏的形狀。 物理視角:通過對“抽象概念”的判斷來識別物體,而非細節。比如對“飛機”的判斷,即便人類自己也無法用語言或者若干條規則來解釋自己如何判斷一個飛機。因為人腦中真正判斷的不是是否“有機翼”、“能飛行”等細節現象,而是一個抽象概念。層數越深,這種概念就越抽象,所能涵蓋的變異體就越多,就可以容納戰斗機,客機等很多種不同種類的飛機。
三、神經網絡的訓練知道了神經網絡的學習過程就是學習控制著空間變換方式(物質組成方式)的權重矩陣后,接下來的問題就是如何學習每一層的權重矩陣W。
如何訓練:既然我們希望網絡的輸出盡可能的接近真正想要預測的值。那么就可以通過比較當前網絡的預測值和我們真正想要的目標值,再根據兩者的差異情況來更新每一層的權重矩陣(比如,如果網絡的預測值高了,就調整權重讓它預測低一些,不斷調整,直到能夠預測出目標值)。因此就需要先定義“如何比較預測值和目標值的差異”,這便是損失函數或目標函數(loss function or objective function),用于衡量預測值和目標值的差異的方程。loss function的輸出值(loss)越高表示差異性越大。那神經網絡的訓練就變成了盡可能的縮小loss的過程。 所用的方法是梯度下降(Gradient descent):通過使loss值向當前點對應梯度的反方向不斷移動,來降低loss。一次移動多少是由學習速率(learning rate)來控制的。
梯度下降的問題:然而使用梯度下降訓練神經網絡擁有兩個主要難題。
1、局部極小值梯度下降尋找的是loss function的局部極小值,而我們想要全局最小值。如下圖所示,我們希望loss值可以降低到右側深藍色的最低點,但loss有可能“卡”在左側的局部極小值中。 試圖解決“卡在局部極小值”問題的方法分兩大類:
調節步伐:調節學習速率,使每一次的更新“步伐”不同。常用方法有:
隨機梯度下降(Stochastic Gradient Descent (SGD):每次只更新一個樣本所計算的梯度
小批量梯度下降(Mini-batch gradient descent):每次更新若干樣本所計算的梯度的平均值動量(Momentum):不僅僅考慮當前樣本所計算的梯度;Nesterov動量(Nesterov Momentum):Momentum的改進Adagrad、RMSProp、Adadelta、Adam:這些方法都是訓練過程中依照規則降低學習速率,部分也綜合動量
優化起點:合理初始化權重(weights initialization)、預訓練網絡(pre-train),使網絡獲得一個較好的“起始點”,如最右側的起始點就比最左側的起始點要好。常用方法有:高斯分布初始權重(Gaussian distribution)、均勻分布初始權重(Uniform distribution)、Glorot 初始權重、He初始權、稀疏矩陣初始權重(sparse matrix)
2、梯度的計算機器學習所處理的數據都是高維數據,該如何快速計算梯度、而不是以年來計算。 其次如何更新隱藏層的權重? 解決方法是:計算圖:反向傳播算法這里的解釋留給非常棒的Computational Graphs: Backpropagation需要知道的是,反向傳播算法是求梯度的一種方法。如同快速傅里葉變換(FFT)的貢獻。 而計算圖的概念又使梯度的計算更加合理方便。
基本流程圖:下面就結合圖簡單瀏覽一下訓練和識別過程,并描述各個部分的作用。要結合圖解閱讀以下內容。但手機顯示的圖過小,最好用電腦打開。
收集訓練集(train data):也就是同時有input以及對應label的數據。每個數據叫做訓練樣本(sample)。label也叫target,也是機器學習中最貴的部分。上圖表示的是我的數據庫。假設input本別是x的維度是39,label的維度是48。設計網絡結構(architecture):確定層數、每一隱藏層的節點數和激活函數,以及輸出層的激活函數和損失函數。上圖用的是兩層隱藏層(最后一層是輸出層)。隱藏層所用激活函數a( )是ReLu,輸出層的激活函數是線性linear(也可看成是沒有激活函數)。隱藏層都是1000節點。損失函數L( )是用于比較距離MSE:mean((output - target)^2)。MSE越小表示預測效果越好。訓練過程就是不斷減小MSE的過程。到此所有數據的維度都已確定:
訓練數據:權重矩陣:
偏移向量:
網絡輸出:
數據預處理(preprocessing):將所有樣本的input和label處理成能夠使用神經網絡的數據,label的值域符合激活函數的值域。并簡單優化數據以便讓訓練易于收斂。比如中心化(mean subtraction)、歸一化(normlization)、主成分分析(PCA)、白化(whitening)。假設上圖的input和output全都經過了中心化和歸一化。
權重初始化(weights initialization):在訓練前不能為空,要初始化才能夠計算loss從而來降低。
初始化決定了loss在loss function中從哪個點開始作為起點訓練網絡。上圖用均勻分布初始權重(Uniform distribution)。
訓練網絡(training):訓練過程就是用訓練數據的input經過網絡計算出output,再和label計算出loss,再計算出gradients來更新weights的過程。
正向傳遞:,算當前網絡的預測值計算loss:
計算梯度:從loss開始反向傳播計算每個參數(parameters)對應的梯度(gradients)。這里用Stochastic Gradient Descent (SGD) 來計算梯度,即每次更新所計算的梯度都是從一個樣本計算出來的。傳統的方法Gradient Descent是正向傳遞所有樣本來計算梯度。SGD的方法來計算梯度的話,loss function的形狀如下圖所示會有變化,這樣在更新中就有可能“跳出”局部最小值。更新權重:這里用最簡單的方法來更新,即所有參數都
預測新值:訓練過所有樣本后,打亂樣本順序再次訓練若干次。訓練完畢后,當再來新的數據input,就可以利用訓練的網絡來預測了。這時的output就是效果很好的預測值了。下圖是一張實際值和預測值的三組對比圖。輸出數據是48維,這里只取1個維度來畫圖。藍色的是實際值,綠色的是實際值。最上方的是訓練數據的對比圖,而下方的兩行是神經網絡模型從未見過的數據預測對比圖。(不過這里用的是RNN,主要是為了讓大家感受一下效果)
注:此部分內容不是這篇文章的重點,但為了理解深層神經網絡,需要明白最基本的訓練過程。 若能理解訓練過程是通過梯度下降盡可能縮小loss的過程即可。 若有理解障礙,可以用python實踐一下從零開始訓練一個神經網絡,體會整個訓練過程。若有時間則可以再體會一下計算圖自動求梯度的方便利用TensorFlow。
四、結合Tensorflow playground理解5種空間操作和物質組成視角打開網頁后,總體來說,藍色代表正值,黃色代表負值。拿分類任務來分析。
數據:在二維平面內,若干點被標記成了兩種顏色。黃色,藍色,表示想要區分的兩類。你可以把平面內的任意點標記成任意顏色。網頁給你提供了4種規律。神經網絡會根據你給的數據訓練,再分類相同規律的點。輸入:在二維平面內,你想給網絡多少關于“點”的信息。從顏色就可以看出來,左邊是負,右邊是正,
表示此點的橫坐標值。同理,
表示此點的縱坐標值。
是關于橫坐標值的“拋物線”信息。你也可以給更多關于這個點的信息。給的越多,越容易被分開。連接線:表示權重,藍色表示用神經元的原始輸出,黃色表示用負輸出。深淺表示權重的絕對值大小。鼠標放在線上可以看到具體值。也可以更改。在(1)中,當把
輸出的一個權重改為-1時,
的形狀直接倒置了。不過還需要考慮激活函數。(1)中用的是linear。在(2)中,當換成sigmoid時,你會發現沒有黃色區域了。因為sigmoid的值域是(0,1)(1)(2)輸出:黃色背景顏色都被歸為黃點類,藍色背景顏色都被歸為藍點類。深淺表示可能性的強弱。上圖中所有在黃色背景顏色的點都會被分類為“黃點“,同理,藍色區域被分成藍點。在上面的分類分布圖中你可以看到每一層通過上一層信息的組合所形成的。權重(那些連接線)控制了“如何組合”。神經網絡的學習也就是從數據中學習那些權重。Tensorflow playground所表現出來的現象就是“在我文章里所寫的“物質組成思想”,這也是為什么我把Tensorflow playground放在了那一部分。不過你要是把Tensorflow的個名字拆開來看的話,是tensor(張量)的flow(流動)。Tensorflow playground的作者想要闡述的側重點是“張量如何流動”的。5種空間變換的理解:Tensorflow playground下沒有體現5種空間變換的理解。需要打開這個網站嘗試:ConvNetJS demo: Classify toy 2D data左側是原始輸入空間下的分類圖,右側是轉換后的高維空間下的扭曲圖。最終的扭曲效果是所有綠點都被扭曲到了一側,而所有紅點都被扭曲到了另一側。這樣就可以線性分割(用超平面(這里是一個平面)在中間分開兩類)深層學習為何要“Deep”(下)
雖然在gitbook上已有為何深層學習,但還是發一下照顧那些關注了超智能體,又只希望在知乎上看文章的小伙伴。近期由于期刊論文deadline將至(Winter is Coming),變體神經網絡(RNN,CNN等不同變體的統一理解)部分會在17號開始繼續寫。
神經網絡并不缺少新結構,但缺少一個該領域的
很多人在做神經網絡的實驗時會發現調節某些方式和結構會產生意想不到的結果。但就我個人而言,這些發現并不會讓我感到滿足。我更關心這些新發現到底告訴我們了什么,造成這些現象的背后原因是什么。我會更想要將新的網絡結構歸納到已有的體系當中。這也是我更多思考“為何深層學習有效”的原因。下面便是目前YJango關于這方面的見解。
深層神經網絡相比一般的統計學習擁有從數學的嚴謹中不會得出的關于物理世界的先驗知識(非貝葉斯先驗)。該內容也在Bengio大神的論文和演講中多次強調。大神也在Bay Area Deep Learning School 2016的Founda’ons and Challenges of Deep Learning pdf(這里也有視頻,需翻墻)中提到的distributed representations和compositionality兩點就是神經網絡和深層神經網絡高效的原因(若有時間,強烈建議看完演講再看該文)。雖然與大神的思考起點可能不同,但結論完全一致(看到Bengio大神的視頻時特別興奮)。下面就是結合例子分析: 1. 為什么神經網絡高效 2. 學習的本質是什么 3. 為什么深層神經網絡比淺層神經網絡更高效 4. 神經網絡在什么問題上不具備優勢
其他推薦讀物
Bengio Y. Learning deep architectures for AI[J]. Foundations and trends? in Machine Learning, 2009, 2(1): 1-127.Brahma P P, Wu D, She Y. Why Deep Learning Works: A Manifold Disentanglement Perspective[J]. 2015.Lin H W, Tegmark M. Why does deep and cheap learning work so well?[J]. arXiv preprint arXiv:1608.08225, 2016.Bengio Y, Courville A, Vincent P. Representation learning: A review and new perspectives[J]. IEEE transactions on pattern analysis and machine intelligence, 2013, 35(8): 1798-1828.Deep Learning textbook by Ian Goodfellow and Yoshua Bengio and Aaron CourvilleYJango的整個思考流程都圍繞減熵二字進行。之前在《熵與生命》和《生物學習》中討論過,生物要做的是降低環境的熵,將不確定狀態變為確定狀態。通常機器學習是優化損失函數,并用概率來衡量模型優劣。然而概率正是由于無法確定狀態才不得不用的衡量手段。生物真正想要的是沒有絲毫不確定性。
深層神經網絡在自然問題上更具優勢,因為它和生物學習一樣,是找回使熵增加的“物理關系”(知識,并非完全一樣),將變體(
)轉化回因素(
)附帶物理關系的形式,從源頭消除熵(假設每個因素只有兩種可能狀態)。這樣所有狀態間的關系可以被確定,要么肯定發生,要么絕不發生,也就無需用概率來衡量。因此下面定義的學習目標并非單純降低損失函數,而從確定關系的角度考慮。一個完美訓練好的模型就是兩個狀態空間內所有可能取值間的關系都被確定的模型。
學習目標:是確定(determine)兩個狀態空間內所有可能取值之間的關系,使得熵盡可能最低。
注:對熵不了解的朋友可以簡單記住,事件的狀態越確定,熵越小。如絕不發生(概率0)或肯定發生(概率為1)的事件熵小。而50%可能性事件的熵反而大。
為舉例說明,下面就一起考慮用神經網絡學習以下兩個集合的不同關聯(OR gate 和 XOR gate)。看看隨著網絡結構和關聯的改變,會產生什么不同情況。尤其是最后網絡變深時與淺層神經網絡的區別。
注:選擇這種XOR這種簡單關聯的初衷是輸入和輸出空間狀態的個數有限,易于分析變體個數和熵增的關系。
注:用“變體(variation)”是指同一類事物的不同形態,比如10張狗的圖片,雖然外貌各異,但都是狗。
問題描述:集合A有4個狀態,集合B有2個狀態。0和1只是用于表示不同狀態的符號,也可以用0,1,2,3表示。狀態也并不一定表示數字,可以表示任何物理意義。
方式1:記憶隨機變量X:可能取值是
隨機變量Y:可能取值是
注:隨機變量(大寫X)是將事件投射到實數的函數。用對應的實數表示事件。而小寫字母x表示對應該實數的事件發生了,是一個具體實例。
網絡結構:暫且不規定要學習的關聯是OR還是XOR,先建立一個沒有隱藏層,僅有一個輸入節點,一個輸出節點的神經網絡。表達式:,
表示sigmoid函數。(只要是非線性即可,relu是目前的主流)說明:下圖右側中的虛線表示的既不是神經網絡的鏈接,也不是函數中的映射,而是兩個空間中,所有可能值之間的關系(relation)。學習的目的是確定這些狀態的關系。比如當輸入00時,模型要嘗試告訴我們00到1的概率為0,00到0的概率為1,這樣熵
才會為零。
關系圖:左側是網絡結構,右側是狀態關系圖。輸入和輸出空間之間共有8個關系(非箭頭虛線表示關系)。除非這8個關系對模型來說都是相同的,否則用
表示
時的熵
就會增加。(
無法照顧到8個關系,若完美擬合一個關系,其余的關系就不準確)
注:這里YJango是
用表示
的縮寫。
數據量:極端假設,若用查找表來表示關系:需要用8個不同的
方式2:手工特征特征:空間A的4個狀態是由兩個0或1的狀態共同組成。我們可以觀察出來(計算機并不能),我們利用這種知識數據來記住想要擬合的
。
把A中的狀態分解開(disentangle)。分解成兩個獨立的子隨機變量
和
。也就是用二維向量表示輸入。
網絡結構:由于分成了二維特征,這次網絡結構的輸入需改成兩個節點。下圖中的上半部分是,利用人工知識
將隨機變量
無損轉變為
和
的共同表達(representation)。這時
和
一起形成網絡輸入。
注:k()旁邊的黑線(實線表示確定關系)并非是真正的神經網絡結構,只是方便理解,可以簡單想象成神經網絡轉變的。
表達式:
注:方便起見,
寫成了矩陣的表達形式
,其中
是標量,而
,
關系圖:由于
固定,只考慮下半部分的關系。因為這時用了兩條線
和
來共同對應關系。原本需要擬合的8個關系,現在變成了4個(兩個節點平攤)。同樣,除非右圖的4條紅色關系線對
來說相同,并且4條綠色關系線對
來說也相同,否則用
和
表示
時,一定會造成熵
增加。
注:下圖中左側是網絡結構圖。右側關系圖中,接觸的圓圈表示同一個節點的不同變體。分開的、并標注為不同顏色的圓圈表示不同節點,左右兩圖連線的顏色相互對應,如紅色的
需要表示右側的4條紅色關系線。
關聯1:下面和YJango確定想要學習的關聯(函數)。如果想學習的關聯是只取
或者
的值,那么該結構可以輕松用兩條線
和
來表達這4個關系(讓其中一條線的權重為0,另一條為1)。
關聯2:如果想學習的關聯是或門,真值表和實際訓練完的預測值對照如下。很接近,但有誤差。不過若要是分類的話,可以找到0.5這個超平面來分割。大于0.5的就是1,小于0.5的就是0,可以完美分開。
注:第一列是輸入,第二列是真實想要學習的輸出,第三列是訓練后的網絡預測值。
關聯3:如果想學習的關聯是異或門(XOR),真值表和實際訓練完的預測值對照如下。由于4條關系線無法用單個
表達,該網絡結構連XOR關聯的分類都無法分開。
數據量:學習這種關聯至少需4個不同的
方式3:加入隱藏層網絡結構1:現在直接把來擬合
。其中每個數據可以用于確定2條關系線。
和
作為輸入(用
,
表示),不考慮
。并且在網絡結構中加入一個擁有2個節點(node)隱藏層(用
和
表示)。表達式:
關系圖1:乍一看感覺關系更難確定了。原來還是只有8條關系線,現在又多了16條。但實際上所需要的數據量絲毫沒有改變。因為以下兩條先驗知識的成立。
注:下圖最右側是表示:當一個樣本進入網絡后,能對學習哪些關系線起到作用。
1. 并行:
和
的學習完全是獨立并行。這就是神經網絡的兩條固有先驗知識中的:并行:網絡可以同時確定
和
的關聯。也是Bengio大神所指的distributed representation。
注:有效的前提是所要學習的狀態空間的關聯是可以被拆分成并行的因素(factor)。
注:
就沒有并行一說,因為
是一個節點擁有兩個變體,而不是兩個獨立的因素。但是也可以把
拆開表示為one-hot-vector。這就是為什么分類時并非用一維向量表示狀態。更驗證了YJango在機器學習中對學習定義:學習是將變體拆成因素附帶關系的過程。
迭代:第二個先驗知識是:在學習
的同時,
和
也可以被學習。這就是神經網絡的兩條固有先驗知識中的:迭代:網絡可以在確定上一級的同時確定下一級的所有內容。也是Bengio大神所指的compositionality。
注:有效的前提是所要學習的空間的關聯是由上一級迭代形成的。所幸的是,我們所生活的世界幾乎都符合這個前提(有特殊反例)。
關聯:如果想學習的關聯是異或門(XOR),真值表和實際訓練完的預測值對照如下。
和
:期初若用兩條網絡連接表示
的16個關系可能,那么熵會很高。但用兩條線表示
的8個關系,模型的熵可以降到很低。下圖中
的輸出值對應紅色數字。
對應輸出值是由藍色數字表達。
數據量:如關系圖1中最右側圖所示,一個輸入[0,0]會被關聯到0。而這個數據可用于學習2+4個關系。也就是說網絡變深并不需要更多數據。
:這時再看
的關系,完全就是線性的。光靠觀察就能得出
的一個表達。
模型的熵
與用一條
所要擬合的關系數量有關。也就是說,
變體(variation)越少,擬合難度越低,熵越低。
網絡結構2:既然這樣,有4個變體,這次把節點增加到4。
關系圖2:與網絡結構1不同,增加到4個節點后,每個節點都可以完全沒有變體,只取一個值。想法很合理,但實際訓練時,模型不按照該方式工作。
注:太多顏色容易眼花。這里不再用顏色標注不同線之間的對應關系,但對應關系依然存在。
問題:因為會出現右圖的情況:只有兩個節點在工作(線的粗細表示權重大小)。和
的節點在濫竽充數。這就跟只有兩個節點時沒有太大別。原因是神經網絡的權重的初始化是隨機的,數據的輸入順序也是隨機的。這些隨機性使得權重更新的方向無法確定。
討論:網絡既然選擇這種方式來更新權重,是否一定程度上說明,用較少的節點就可以表示該關聯?并不是,原因在于日常生活中的關聯,我們無法獲得所有變體的數據。所得數據往往是很小的一部分。較少的節點可以表示這一小部分數據的關聯,但卻無法涵蓋所有變體情況。造成實際應用時效果不理想。
緩解:緩解的方式有L2正則化(L2 regularization):將每層權重矩陣的平方和作為懲罰。表達式:,
是懲罰的強弱,可以調節。除以2是為了求導方便(與后邊的平方抵消)。意義:當同一層的權重有個別值過高時,平方和就會增加。而模型在訓練中會降低該懲罰。產生的作用是使所有權重平攤任務,讓
都有值。以這樣的方式來使每個節點都工作,從而消除變體,可以緩解過擬合(overfitting)。例如:
具有一個隱藏層的神經網絡可以模擬任何函數,最糟的情況需要
個節點。
也叫Universal Approximation Theorem。但最糟的情況是輸入空間有多少個變體,就需要多少個節點。k表示獨立因素的變體個數,n表示獨立因素的個數。上述的例子中最糟的情況需要
個隱藏節點。而代價也是需要
個不同數據才可以完美擬合。
使用條件:淺層神經網絡可以分開幾乎所有自然界的關聯。因為神經網絡最初就是由于可移動的生物需要預測未來事件所進化而來的。所學習的關聯是過去狀態到未來狀態。如下圖,物理中的力也可以分離成兩個獨立的分力來研究。
但有一種不適用的情況:非函數。
實例:函數的定義是:每個輸入值對應唯一輸出值的對應關系。為什么這么定義函數?對應兩個以上的輸出值在數學上完全可以。但是在宏觀的世界發展中卻不常見。如下圖:
時間順流:不管從哪個起點開始,相同的一個狀態(不是維度)可以獨立發展到多個不同狀態(如氧原子可演變成氧分子和臭氧分子)。也就熱力學第二定律的自發性熵增:原始狀態通過物理關系,形成更多變體。
時間倒流:宏觀自然界中難以找到兩個以上的不同狀態共同收回到一個狀態的例子(如氧分子和臭氧分子無法合并成氧原子)。如果這個可以實現,熵就會自發性減少。也就不需要生物來消耗能量減熵。我們的房間會向整齊的狀態發展。但這違背熱力學第二定律。至少在我們的宏觀世界中,這種現象不常見。所以進化而來的神經網絡可以擬合任何函數,但在非函數上就沒有什么優勢。畢竟生物的預測是從過去狀態到未來狀態。也說明神經網絡并不違背無免費午餐定理。
實例:XOR門的輸入空間和輸出空間若互換位置,則神經網絡擬合出來的可能性就非常低(并非絕對無法擬合)。方式4:繼續加深淺層神經網絡可以模擬任何函數,但數據量的代價是無法接受的。深層解決了這個問題。相比淺層神經網絡,深層神經網絡可以用更少的數據量來學到更好的擬合。上面的例子很特殊。因為
,
,比較不出來。下面YJango就換一個例子,并比較深層神經網絡和淺層神經網絡的區別。
問題描述:空間
有8個可能狀態,空間
有2個可能狀態:
網絡結構:
淺層神經網絡:8節點隱藏層深層神經網絡:2節點隱藏層 + 3節點隱藏層深淺對比:
淺層神經網絡:假如說輸入3和輸出0對應。數據
只能用于學習一個節點(如
)前后的兩條關系線。完美學習該關聯需要所有8個變體。然而當變體數為
時,我們不可能獲得
個不同變體的數據,也失去了學習的意義。畢竟我們是要預測沒見過的數據。所以與其說這是學習,不如說這是強行記憶。好比一個學生做了100冊練習題,做過的題會解,遇到新題仍然不會。他不是學會了做題,而是記住了怎么特定的題。
深層神經網絡:如果只觀察輸入和輸出,看起來同樣需要8個不同的
訓練數據。但不同
之間有共用部分。比如說,在確定3和0關系時,也同時對所有共用
連接的其他變體進行確定。這樣就使得原本需要8個不同數據才能訓練好的關聯變成只需要3,4不同數據個就可以訓練好。(下圖關系線的粗細并非表示權重絕對值,而是共用度)
深層的前提:使用淺層神經網絡好比是用
解
,需要2個不同數據。而深層神經網絡好比用
解
,只需要一個數據。無免費午餐定理告訴我們,優化算法在一個任務上優秀,就一定會在其他任務上有缺陷,深層同樣滿足該定理。如果用
去解實際上有
的
,或者去解實際為
的關聯時,搜索效果只會更差。所以深層的前提是:
空間中的元素可以由
迭代發展而來的。換句話說
中的所有變體,都有共用根源
(root)。
我們的物理世界:幸運的是,我們的物理世界幾乎都滿足迭代的先驗知識。
實例:比如進化。不同動物都是變體,雖然大家現在的狀態各異,但在過去都有共同的祖先。實例:又如細胞分裂。八卦中的8個變體是由四象中4個變體的基礎上發展而來,而四象又是由太極的2個變體演變而來。很難不回想起“無極生太極,太極生兩儀,兩儀生四象,四象生八卦”。(向中國古人致敬,雖然不知道他們的原意)學習的過程是因素間的關系的拆分,關系的拆分是信息的回卷,信息的回卷是變體的消除,變體的消除是不確定性的縮減。
自然界兩個固有的先驗知識:
并行:新狀態是由若干舊狀態并行組合形成。
迭代:新狀態由已形成的狀態再次迭代形成。
為何深層學習:深層學習比淺層學習在解決結構問題上可用更少的數據學習到更好的關聯。
隨后的三篇文章正是用tensorflow實現上述討論的內容,以此作為零基礎實現深層學習的起點。
TensorFlow基本用法代碼演示LV1代碼演示LV2最后總結一下開篇的問題: 1. 為什么神經網絡高效:并行的先驗知識使得模型可用線性級數量的樣本學習指數級數量的變體 2. 學習的本質是什么:將變體拆分成因素和知識(Disentangle Factors of Variation)
稀疏表達:一個矩陣被拆分成了稀疏表達和字典。one hot vector:將因素用不同維度分開,避免彼此糾纏。 3. 為什么深層神經網絡比淺層神經網絡更高效:迭代組成的先驗知識使得樣本可用于幫助訓練其他共用同樣底層結構的樣本。 4. 神經網絡在什么問題上不具備優勢:不滿足并行與迭代先驗的任務 非函數:需要想辦法將問題轉化。非迭代(非結構):該層狀態不是由上層狀態構成的任務(如:很深的CNN因為有max pooling,信息會逐漸丟失。而residual network再次使得迭代的先驗滿足)到此我們討論完了神經網絡最基礎的,也是最重要的知識。在實際應用中仍會遇到很多問題(尤其是神經網絡對noise的克服更加巧妙)。隨后YJango會再和大家一起分析過深后會產生什么效果,并一步步引出設計神經網絡的本質。
編輯于 2017-01-05 31 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 申請轉載Peng Bo 稟臨科技 http://withablink.taobao.com 聯合創始人1046 人贊同最近 Google Tensorflow 做了一個非常直觀的神經網絡 playground。不夸張地說,現在每個人都可以在自己的瀏覽器里面直接“玩深度神經網絡”了。什么都不用說,自己玩玩就明白。地址是: A Neural Network Playground (可能要翻墻)如果不明白里面的 ReLU,L1 等等是什么,沒關系,在搜索引擎查一下都可以查到答案。代碼在 Github 上,有興趣的朋友可以去給它加 Dropout,Convolution,Pooling 之類。【UPDATE:對 AlphaGo 和圍棋人工智能有興趣的朋友,我最近在寫一個系列,介紹如何自制你的"AlphaGo",請點擊:知乎專欄】編輯于 2017-01-10 44 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
知乎用戶 謹言慎行!280 人贊同首先把題主給的鏈接看了一下,大致內容如下:你需要挑選芒果,你不知道什么樣的芒果最好吃,所以你就嘗遍了所有的芒果,然后自己總結出個大深黃色的比較好吃,以后再去買的時候,就可以直接挑選這種。那什么是機器學習呢,就是你讓機器“嘗”一遍所有芒果,當然,也假設它知道哪些好吃,讓機器去總結一套規律(個大深黃色),這就是機器學習。具體操作,就是你描述給機器每一個芒果的特征(顏色,大小,軟硬……),描述給機器其輸出(味道如何,是否好吃),剩下的就等機器去學習出一套規則。等等,那機器是怎么學習到這個規則(個大深黃色的好吃)的?沒錯,是通過機器學習算法。而題主所問的神經網絡,恰好就是一種機器學習算法!近些年來,由于深度學習概念的興起,神經網絡又成為了機器學習領域最熱門的研究方法。我相信當明確神經網絡是一種機器學習算法之后,就可以很輕易的給一個外行講清楚神經網絡到底是用來做什么的。可是神經網絡為什么可以完成這個功能呢?神經網絡就像一個剛開始學習東西的小孩子,開始認東西,作為一個大人(監督者),第一天,他看見一只京巴狗,你告訴他這是狗;第二天他看見一只波斯貓,他開心地說,這是狗,糾正他,這是貓;第三天,他看見一只蝴蝶犬,他又迷惑了,你告訴他這是狗……直到有一天,他可以分清任何一只貓或者狗。其實神經網絡最初得名,就是其在模擬人的大腦,把每一個節點當作一個神經元,這些“神經元”組成的網絡就是神經網絡。而由于計算機出色的計算能力和細節把握能力,在大數據的基礎上,神經網絡往往有比人更出色的表現。當然了,也可以把神經網絡當作一個黑箱子,只要告訴它輸入,輸出,他可以學到輸入與輸出的函數關系。神經網絡的理論基礎之一是三層的神經網絡可以逼近任意的函數,所以理論上,只要數據量夠大,“箱子容量”夠大(神經元數量),神經網絡就可以學到你要的東西。第一次回答問題,什么都想說,可能比較亂,有不對的地方,歡迎大家批評指正。發布于 2014-02-13 36 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
沈晟 心動網絡CTO,射手影音|射手網創始人,品…27 人贊同還好問題只是怎樣盡量簡單的解釋什么是神經網絡,否則還真不敢回答。學術圈比較喜歡用一些名詞術語,很容易對理解造成更多困惑。我只說一下個人的粗淺理解,希望對初入門的同學有幫助。可能存在疏漏和誤導,只能請大家充分利用自己的判斷力。----先放輕松態度,應該更便于理解神經網絡。神經網絡+深度學習中的很多理論方法已經存在很多年(大于10),并不是突然之間像魔術那樣出現而不可思議。最近開始吸引焦點,主要是因為可用的計算能力(CPU、GPU)的快速發展,讓海量矩陣乘法運算更容易被實驗、測試和驗證。例如,TensorFlow的出現,最大的意義,就是AI for everybody,讓「舊時王謝堂前燕,飛入尋常百姓家」。----如果嘗試強行一句話解釋深度學習神經網絡,我會這么總結:「通過堆積大量且多樣計算方法的函數計算式的計算單元(有關名詞:node/activation function/ReLU/...),并嘗試為這些計算單元建立大量的相互連接,同時為了有序有效我們通過分層使連接有次序并避免需要嘗試的連接數成冪指數上升,之后制定一個策略幫助整個神經網絡的計算評價嘗試的結果更好更可用或更壞更不可用(有關名詞:lose/cost/objective funtion/softmax/cross entropy), 在提供大量數據訓練神經網絡之后,神經網絡通過計算結果的評價策略,決定以什么樣的次序連接哪些計算單元的計算結果更值得被使用(有關名詞:強化連接),通過大量循環不同的連接方式找到評價最好的一些的連接計算單元的次序和權值,就此建立模型(計算式組合)可用于解決更多同類問題。」堆積大量計算單元(神經元)的最大的好處是什么呢。就是減輕設計(或者說supervise)的壓力。可以更少考慮應該怎樣去針對一個個很具體的feature細節(carefully engineered function)去解決,而是通過訓練來強化或弱化它們直接的連接,以一種自然選擇的方式淘汰和篩選,留下可用的解題模型。那么上面說的大量是多大呢。一個昨天看的一個論文,是用了65萬個。不過雖然訓練時需要很大的計算量,但是訓練的結果在使用時,就只需要很小的運算量了。就像迷宮有力地圖,再走一次時,就不會走那么多彎路了。----其實通過嘗試組合大量不同的算法,找到最適合解決問題的算法組合,訓練+強化理論,是機器學習一直都在做的。那么深度學習神經網絡的核心突破是什么,我認為主要是兩點:1、分層。這個最大的好處,是將計算單元之間需要嘗試的連接(組合)數量,控制可控的范圍。2、一些被發現很適合用來作為深度學習組件的計算單元函數,例如ReLU(When in doubt, ReLU)----最后推薦一個我覺得很好的入門資源:https://github.com/jtoy/awesome-tensorflow編輯于 2016-10-19 3 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
周筠兒童教育話題優秀回答者 虛晃一槍。535 人贊同早年讀電信系在職碩士時,選修了一門《人工神經網絡》課程,老師講得云山霧罩,我們聽得如夢似幻。雖然最后也考了80多分,但同學們相互間吐槽,都覺得這門課把人給學神經了!別人怎么樣我不知道,我反正是稀里糊涂的,沒弄清楚概念。今年,審讀吳軍老師的《數學之美》第二版,讀到這兩段話時,我笑了,原來我并不孤獨——
【 有不少專業術語乍一聽很唬人,“人工神經網絡”就屬于這一類,至少我第一次聽到這個詞就被唬住了。你想啊,在大家的印象當中,人們對人腦的結構都還根本沒有搞清楚,這就冒出來一個“人工的”神經網絡,似乎是在用計算機來模擬人腦。想到人腦的結構那么復雜,大家的第一反應一定是人工神經網絡肯定非常高深。如果我們有幸遇到一個好心同時又善于表達的科學家或教授,他愿意花一兩個小時的時間,深入淺出地把人工神經網絡的底細告訴你,你便會發現,“哦,原來是這么回事”。如果我們不幸遇到一個愛賣弄的人,他會很鄭重地告訴你“我在使用人工神經網絡”或者“我研究的課題是人工神經網絡”,然后就沒有下文了,如此,你除了對他肅然起敬外,不由得可能還會感到自卑。當然還有好心卻不善于表達的人試圖將這個概念給你講清楚,但是他用了一些更難懂的名詞,講得云山霧罩,最后你發現聽他講了好幾個小時,結果是更加糊涂了,你除了浪費時間外一無所獲,于是你得出一個結論:反正我這輩子不需要搞懂它了。
大家可別以為我是在說笑話,這些都是我的親身經歷。首先,我沒有遇到過一兩小時給我講懂的好心人,其次我遇到了一批在我前面賣弄的人,作為年輕人,總是希望把自己不明白的東西搞懂,于是我決定去旁聽一門課。不過,我聽了大約兩三次便不再去了,因為除了浪費時間,似乎我并沒得到什么收獲。好在我自己做研究暫時用不到它,也就不再關心了。后來在美國讀博士期間,我喜歡在睡覺前躺著看書,沒事兒就捧著幾本關于人工神經網絡的教科書在床上看,居然也看懂了。然后再用它做了兩三個項目,算是學會了。到這時回過頭來再看“人工神經網絡”,其實并不復雜,入門也不難,只是我走了彎路。——吳軍】
君子報仇,三十年不晚。大學畢業三十年后,吳老師在數學之美 (第二版) 里,單獨用一章講Google大腦和人工神經網絡,一抒當年的郁悶,也順便幫我解了氣:)
我把這一章的內容貼一部分在這里,希望對大家理解神經網絡的概念有幫助:
發布于 2015-01-05 55 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 申請轉載許鐵-巡洋艦科技 微信公眾號請關注chaoscruiser ,鐵哥個人…13 人贊同作者:許鐵-巡洋艦科技鏈接:知乎專欄來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
人工神經網絡的第一個里程碑是感知機perceptron, 這個名字其實有點誤導, 因為它根本上是做決策的。 一個感知機其實是對神經元最基本概念的模擬 ,都未必有多少網絡概念,他就是一個自動做決策的機器。
比如說你要決定今天出不出去看電影, 你要考慮3個因素, 一個是女朋友在不在, 一個是電影好不好看, 另一個是今天有沒有工作, 這三個因素每個人的權重都不同,有的人看重女朋友, 有的人看重工作,所以權重就不等, 最后每個人根據自己的權重做出0或1,去或不去, to be or not to be的決策。那么你怎么做呢? 你把三個要素按照它們需要的權重加和在一起, 在把這個分數送到一個叫sigmoid的門面前得到去或不去的決定, 工作原理如上圖。
比單層感知機更復雜的多層感知機-或者我們常說的深度網絡, 是進行數據處理和模式識別的利器。 深度神經網絡之所以能夠處理這些數據類型,主要是因為這些數據本身具有的復雜結構很適合被NN識別, 而人類不需要預先設計識別這些結構的函數而是任由網絡學習, D-CNN 深度卷積網絡能夠同時看到一個圖像從細節到抽象的結構,所以能夠抓住一些我們人類都說不出的細節。
DCNN 深度卷積網絡,信號在多級網絡里一級級傳遞, 從而使得從微觀到宏觀的特征都得到分辨 。 每一層神經元之間沒有相互連接。
而RNN- 反饋式神經網絡(每一層神經元之間有相互連接)則適合處理sequnce序列類的數據, 發現序列內部的時間結構。
RNN 之所以具有這個能力,就是因為網絡內部通過自反饋, 具有之前各個時間點的輸入信息, 因此它可以從無限久遠的歷史里推測系統的未來,RNN與之前的卷積網絡相比最大的特點是它包含了動力學特性,如果說卷積網絡是任意函數逼近器,那么RNN就是任意程序逼近器。 猶如包含某種工作記憶。用一個比喻來說, 就是RNN猶如一個寬闊的池塘寧靜的水面, 當你投入一個石子, 激起的漣漪會在水池里不停反射傳播, 這是對石頭進入那一時刻信息的保存, 如果之后在落入一個石頭, 那么它再度激起的漣漪會和之前的水波疊加作用, 形成更復雜的相互作用和紋樣。
RNN示意圖, 同層神經元之間有相互連接,從而使得歷史信息在網絡里向回聲一般交替傳遞
RNN 具有相互連接的反饋式神經網絡也是最接近生物組織神經網絡的人工神經網絡, 具有更多的未來潛力,只是它的訓練比feed forward network更復雜。
人工神經網絡的訓練就如同生物神經網絡的學習, 都是一個不停試錯并減少錯誤的原理, 不過人工神經網絡的方法更加簡單化, 比如gradient descent,就是說在參數空間里尋找使得錯誤減少最快的方法改進。
人工神經網絡對于生物神經網絡的奇妙之處在于, 它反過來啟迪了生物神經網絡是在干什么的,就好像費曼的那句話“ 你要想真正理解一個東西, 就造出一臺”。
發布于 2016-11-29 1 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利vczh 專業造輪子,拉黑搶前排。…637 人贊同1+1是多少?10!傻逼,是21+2是多少?37!傻逼,是31+3是多少?-5!傻逼,是4……1+1是多少?5!傻逼,是21+2是多少?14!傻逼,是31+3是多少?25!傻逼,是4……1+1是多少?2!傻逼,是21+2是多少?5!傻逼,是31+3是多少?8!傻逼,是4……1+1是多少?2!傻逼,是21+2是多少?3!傻逼,是31+3是多少?4!傻逼,是4……1+1是多少?2!傻逼,是21+2是多少?3!傻逼,是31+3是多少?4!傻逼,是4……========3年后========100+200是多少?300!發布于 2016-06-21 94 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
lee philip 神經網絡/自然語言處理55 人贊同補充一下@賈偉的答案訓練過程的那段,寫得比較像強化學習,神經網絡用到的方法大部分是有監督學習。我覺得故事應該是這樣。。。。你想讓神經網絡(簡稱神經)辨認貓和狗(算法類型為分類)。于是給它看一百萬只狗,和一百萬只貓,每只狗的腦門上都貼著“我是狗”的字條,貓則貼“我是貓”(使用標注數據)。神經同時看五十萬只禽獸,分四批看,并作出判斷(實現時用并行處理,使用mini-batch)。每個看到的貓或狗,如果判斷錯了,就修正自己的判斷標準(優化)。每看完這二百萬只禽獸算一輪,每學十輪就看一些之前完全沒見過的貓貓狗狗做出判斷(推廣性測試)。當神經刻苦學習貓狗知識的時候,你正在睡覺,一覺睡醒,發現神經一小時前判斷貓和狗比較準(次最優解),現在學太多反而判斷不準了(過擬合),于是你讓神經使用一小時前的標準(防止過擬合技巧之early-stopping)。這樣訓練過程就結束了。編輯于 2014-02-15 9 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
苗加加16 人贊同簡單:神經網絡就是通過模擬神經元的運動,獲得一個可以變形為任意形狀的任意維函數函數的形狀取決于你告訴他哪些點應該是這個函數應該盡量經過的關于形象和有趣。。實在是不擅長。。發布于 2014-02-13 2 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
胡昌振 學企管不做企管25 人贊同人工神經網絡算法的作用機理還是比較難理解,現在以一個例子來說明其原理。這個例子是關于人的識別技術的,在門禁系統,逃犯識別,各種驗證碼破譯,銀行預留印鑒簽名比對,機器人設計等領域都有比較好的應用前景,當然也可以用來做客戶數據的挖掘工作,比如建立一個能篩選滿足某種要求的客戶群的模型。機器識別人和我們人類識別人的機理大體相似,看到一個人也就是識別對象以后,我們首先提取其關鍵的外部特征比如身高,體形,面部特征,聲音等等。根據這些信息大腦迅速在內部尋找相關的記憶區間,有這個人的信息的話,這個人就是熟人,否則就是陌生人。人工神經網絡就是這種機理。假設上圖中X(1)代表我們為電腦輸入的人的面部特征,X(2)代表人的身高特征X(3)代表人的體形特征X(4)代表人的聲音特征W(1)W(2)W(3)W(4)分別代表四種特征的鏈接權重,這個權重非常重要,也是人工神經網絡起作用的核心變量。現在我們隨便找一個人阿貓站在電腦面前,電腦根據預設變量提取這個人的信息,阿貓面部怎么樣,身高多少,體形胖瘦,聲音有什么特征,鏈接權重初始值是隨機的,假設每一個W均是0.25,這時候電腦按這個公式自動計算,Y=X(1)*W(1)+X(2)*W(2)+X(3)*W(3)+X(4)*W(4)得出一個結果Y,這個Y要和一個門檻值(設為Q)進行比較,如果Y>Q,那么電腦就判定這個人是阿貓,否則判定不是阿貓.由于第一次計算電腦沒有經驗,所以結果是隨機的.一般我們設定是正確的,因為我們輸入的就是阿貓的身體數據啊.現在還是阿貓站在電腦面前,不過阿貓怕被電腦認出來,所以換了一件衣服,這個行為會影響阿貓的體形,也就是X(3)變了,那么最后計算的Y值也就變了,它和Q比較的結果隨即發生變化,這時候電腦的判斷失誤,它的結論是這個人不是阿貓.但是我們告訴它這個人就是阿貓,電腦就會追溯自己的判斷過程,到底是哪一步出錯了,結果發現原來阿貓體形X(3)這個體征的變化導致了其判斷失誤,很顯然,體形X(3)欺騙了它,這個屬性在人的識別中不是那么重要,電腦自動修改其權重W(3),第一次我對你是0.25的相信,現在我降低信任值,我0.10的相信你.修改了這個權重就意味著電腦通過學習認為體形在判斷一個人是否是自己認識的人的時候并不是那么重要.這就是機器學習的一個循環.我們可以要求阿貓再穿一雙高跟皮鞋改變一下身高這個屬性,讓電腦再一次進行學習,通過變換所有可能變換的外部特征,輪換讓電腦學習記憶,它就會記住阿貓這個人比較關鍵的特征,也就是沒有經過修改的特征.也就是電腦通過學習會總結出識別阿貓甚至任何一個人所依賴的關鍵特征.經過阿貓的訓練電腦,電腦已經非常聰明了,這時你在讓阿貓換身衣服或者換雙鞋站在電腦前面,電腦都可以迅速的判斷這個人就是阿貓.因為電腦已經不主要依據這些特征識別人了,通過改變衣服,身高騙不了它.當然,有時候如果電腦賴以判斷的阿貓關鍵特征發生變化,它也會判斷失誤.我們就不要要求這么高了,不要說電腦,就是人類也無能為力,你的一個好朋友你經過多次的識記肯定認識吧,但是他整了容你們在大街上邂逅.你可能覺得這個人聲音好熟悉,體形好熟悉,----都像自己一個朋友,就是臉長的不像.你不敢貿然上去搭訕吧(否定的判斷).因為我們判定一個人是否是自己的朋友的時候依靠的關鍵的特征就是面部特征,而他恰恰就是改變了這一特征.當然也存在我們把一個擁有和我們朋友足夠多相似特征的人判定為我們的朋友,這就是認錯人的現象了.這些問題電腦也會出現.不過這個算法還是有比較積極的意義的,實現了一定程度上的智能化.發布于 2015-01-06 8 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
羅杰12 人贊同從函數上來看,我覺得神經網絡是回歸方程的級聯疊加發布于 2014-05-28 2 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
毛毛林 選擇自己真正喜歡的12 人贊同曾經做過一個計算機識別美女的程序,效果渣到可以把鳳姐當作美女。 不過還是說說吧找二十個女性圖片正面照,做成標準格式(此處不展開)編程測量眼睛大小,寬度,鼻子大小,高度,寬度等等你認為可以衡量美女的特點作為自變量。然后自己給這二十個女性的美貌打分0至100。把自變量和因變量一一對應輸入計算機,讓計算機學習之后只要把未判定的圖片給計算機,計算機就會根據你的審美打分了(一秒鐘在一百個頭像中找到鳳姐發送約嗎我會亂說?)那么如何才能避開鳳姐找到范冰冰呢?1,增加學習樣本量,上萬為佳,越大越好2,換個算法,這也是神經網絡最核心的部分,或選擇合適的層數,做非線性變換等發布于 2015-01-05 8 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
馮某某 認識了一幫敢愛敢恨的人61 人贊同最近學習不確定優化攢了一些筆記,連著說一說也算總結一下。零基礎慎讀。結論:神經網絡是一個參數數量突破天際的回歸分析。%突然發現在做算法的眼睛里神經網絡就是模式識別。。----------------Part1 這些名字很帥的統計和優化方法是“粗暴的”通常來說,現在解決不確定優化問題。都會使用隨機模擬、神經元網絡和遺傳算法聯立的混合智能算法來求解。比如使目標變量的數學期望達到最優值的期望值模型,概率最優的可靠度模型(機會約束),還有我校Liu老師常提的隨即相關機會,就是你前幾個優化組合一下。其中隨機模擬是一個不確定問題不可少的輸入,遺傳算法用來調神經網絡的參數,神經網絡用來逼近現實。互相配合,解決問題。在我看來是及其簡單粗暴,不得已而為之的。只是用它們最干脆的思路,優化了最粗暴的方法。比方說,你能寫出一個事物期望值的顯示表達,那么對參變量求導就可以找到極大值點。當然有的時候不是很方便求出全局導數,那么梯度遞降、可行方向等規劃學方法和數值方法也大有可為。離散的最優值問題在凸區域上的解也是很方便就可以求出的,此所謂整數優化。這樣一看這個混合算法真是毫無必要呀,那我們為什么還要用它們呢?原因是因為這是通用方法。我來舉一個例子。整數優化,我們選取適當的函數把兩種變量聚為兩類。圖中有圈圈的是我們想區分的訓練集。這個時候我們需要找一個合適的評價使得他們分開。最方便的是取機器學習里常用的gauss核函數(數值隨距離中心點距離單調遞減的光滑函數RBF),那么有九個參數。(均值協方差)優化目標是對幾千個數聚類之后聚類結果中訓練集被識別的個數的兩倍與分出的非訓練集的元素的個數的差值。我們知道這個值兼顧一二類錯誤的重要性,又是一個明確的目標,當然它越大越好。這個時候常規的優化算法就很難找出這九個參數的最優值了。結果:畢竟經過一次聚類算法之后,中心點的位置是迭代的結果而完全不確定的。如果能在聚類之前就知道中心點的位置,那么還聚類干嘛呢?這個時候聚類這個操作就像黑盒子,是傳統優化問題極度依賴,卻表達不出的優化過程。輸入是幾千個點,輸出只是我之前說的評價函數,參數有九個,這時候不太好把他們看做神經元,因為我并沒有顯式的給出其激活函數,或者這里的激活函數實際上是相互耦合的,或者我沒有將每一個輸入都看做是均等的,所以不太好做一個典型的例子。我選取6個染色體(開始是對訓練集主成分分析的參數加上白噪聲),迭代一萬次之后,其9個參數依舊沒有收斂。而且對于參數極度敏感,gauss核的均值稍做變化,聚類結果可能就會均分整個樣本集,從而導致失敗。在這種情況下,我覺得,可能沒有比遺傳算法更好的調參數方法了。雖然其毫無道理,但由于其根基是遍歷,只是加了稍許隨機性,合理的選擇解,來使得收斂變快。所以不失為一個好方法。也許有人分析其收斂速度,但我覺得并不太必要。因為它并不好看。當我們開始考慮用遍歷求解一個問題的時候,我猜我們對其難度,對其解的形式,對其收斂性也不會有太好的判斷。這樣我們評估遺傳算法的復雜度時,肯定也是要因地制宜的。有些絕大部分信息我們都知道的問題,也許遺傳算法也不慢;有些從頭到尾都在拍腦袋的問題,遺傳算法也能用。Part2 神經網絡就是一個“超多參數的回歸分析”那么神經網絡到底是什么呢?【扯了那么多遺傳算法還沒有說正題】正如遺傳算法是遍歷所有參數選最優的過程,神經網絡大致也就是遍歷全部函數選最優的過程。盜圖:我們知道一些輸入和輸出的數據,想找出其中的數量關系。但又不是那么容易看出來,比如我們不像開普勒那樣一眼就能看出行星運動時半徑的立方和時間平方成反比。有時我們也不太在意具體的顯式表達,這個時候我們就說:你們看好了,這是一張已經訓練好的神經網,你想要知道你想求的函數值,那么你把輸入丟進去,然后把輸出抱走就好。雖然有的時候【絕大部分時候】,單論神經網絡,我們是可以把我們想求得函數展開成為顯式表達的,但是太難看了我們就不這么做。當然也許你會說這不就是擬合嗎? Indeed . 一般來說我們用來評價神經網絡的函數也就是用和擬合一樣的最小二乘和。神經網絡的參數(權重)也就可以看做一般回歸分析的參數。好,我們來看一下一般的線性回歸。
,一共兩個參數。我們把他們調到最優,可惜
還是只有0.3,不work。這個時候我們就想,會不會是
呢?一共三個參數,
到了0.5,然后你心里想,那我把原函數泰勒展開:-D,假設原函數足夠光滑,我們還是可以得到一個足夠好的解的。那么假設我們有一張神經網絡,有6個輸入神經元,15個隱層神經元,3個輸出神經元,我們大概有多少個參數呢?【這里跳過了神經網絡中權重和下一層的關系描述,包括激活函數,因為我覺得這畢竟不是神經網絡的教材】每個隱層都有一個linear的偏差,還有對應六個輸入的權重,這一層有105個參數,然后三個輸出神經元每個對16個權重參數,共有48個參數,加起來一共153個參數,( ⊙ o ⊙ ),你用153階泰勒展開逼近函數!老師,他作弊QAQ!【當然未必全都要變化道理就是這個道理,簡單粗暴。接下來就是些技巧了,借著計算機的東風,這些本來沒什么內涵的方法都放出了其絢麗的光芒。把樸素的枚舉法發揮到了極致。至于之后的選取光滑激活函數,比如常用的sigmoid,好做梯度遞降,或者直接簡單粗暴的按照下圖方法進行訓練網絡,都是可以的。Step1 隨機初始產生權重向量wStep2 通過交叉變異更新wStep3 算誤差函數Step4 算適應度,然后輪盤賭,Step5 重復2到5Step6 給出最優權重向量媽媽再也不用擔心我不會訓練神經網絡了,【手動再見】,激活函數怎么選貌似不是很要緊呀。【你再想想是這樣嗎?】為了滿足某些強迫癥,這里給出一個定理:具有一個或多個隱層的前向神經元網絡可以以任意精度畢竟任意連續函數。[手動不規范引用 2016]再看看我之前和泰勒展開的比較,想想魏爾施特拉斯定理,是不是也覺得可以接受了呢?我知道知乎這樣的長文,最后一般要貼個例子。借寶定老師書上的例子:至于神經網絡被一些人鼓吹的神奇特效,比如這里說的可以減小白噪聲。我只能表示我還需要學習一個。畢竟我沒有試過用153個參數去進行回歸分析,能不能消除白噪聲呀~對了,這里還要提一句,一般用153個參數回歸分析,總要用154個輸入對吧~但你看神經網絡,其實只要隨機生成一個權重,然后調幾圈就可以了【現實中確實可以不讓這些參數都變化,但我不是做算法或者計算機的,所以不太清楚計算機業界怎么做。我只是做優化的時候碰到了一些這樣的問題,自學了一下來吹牛而已】,感覺帥帥的呢~【不過這倒并不是黑點,只是說有些人亂用這些現代學習方法,拿來批判統計學;現代的這些學習方法,都是在大數據科學的要求下應運而生,也不是說其粗暴就是壞事,畢竟解決了很多新的以往無法解決的問題】不過搞機器學習的一天到晚過擬合過擬合。。我覺得這參數取多點還是有道理的。。不知道有沒有暴力增加神經元防止過擬合的方法。前面的高贊有一點我不是很能理解,我覺得神經網絡的多層隱層的含義可能確實有。。但是想分析其具體含義只能是看到啥說啥了。所以這樣將神經網絡說的和玄學一樣感覺不太好。------Appendix:聚類原理citation:
Liu B, Theory and Practice of Uncertain Programming, 3rd ed., http://orsc.edu.cn/
-----
pretty good...
有個答主舉了個例子拿20個樣本進去跑:-D
所以數學背景還是很重要
編輯于 2016-02-03 12 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利百得 對世界好奇6 人贊同建議提煉或者修改一下問題。我無法回答。LS各位的回答都不是簡單形象又有趣的,對于題目來說都是費力不討好的。題主對于“神經網絡是什么”這個命題舉出那個選芒果的例子,我認為又是文不對題的,后者應該是問題歸集和算法思路,雖然是研究神經網絡當中的必要基礎之一,但是它不是神經網絡的特異性問題,跟“神經網絡”以及“是什么”還是有非常大的距離。例如數學也是研究神經網絡當中的必要基礎之一……發布于 2014-05-07 添加評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
知乎用戶 我是機器鼓勵師10 人贊同用來逼近目標函數的模型。本質就這樣,聽不懂也沒必要懂了發布于 2015-01-05 添加評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
知乎用戶 誰知道呢10 人贊同寫的答案太長了,直逼本質。神經網絡算法,是對數據降維的過程。比如一個杯子有好多性狀,再比如說就3個,有把,圓柱形,上面開口。我們看到一個物體,分析有沒有這3個性狀。得出是不是1個杯子。3個性狀就3個維度,是不是個杯子,就1維。模擬人類的模式識別,需要第一個答案那樣的大型的神經網絡。算是人工智能的一部分。如果計算機能把人類的各個部分,都弄出來,人工智能也算走出來了。先決條件是首先要認識到人類的各個部分。模式識別算是一個部分。發布于 2015-01-05 1 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
江何 燕山風雨覆紫禁 百萬雄師入北京7 人贊同1 大多數情況下,神經網絡的目的就是把多維的輸入,經過處理以一維進行輸出。比如輸入一個28*28的圖像,輸出一個表示該圖像的類別的數字。2 單層神經網絡只能應付線性可分的情景; 多層神經網絡則可以任意擬合復雜的函數。3 神經網絡需要先進行訓練,再進行識別。相比其他的分類算法,神經網絡的特點就是訓練時間長而識別時間短。發布于 2015-09-05 1 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
陳丹 理工男+偽文青10 人贊同我也來試試講一講:神經網絡:文藝女vs理工男 - Candela - 知乎專欄發布于 2015-10-13 1 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
張鵬 土木僧,金牛座,第五型人格39 人贊同神經網絡是個黑箱子,有個入口有個出口,里面不知道都有啥。往入口扔進去個1+1,出口會扔出來個250,。去打黑箱子的屁屁,說不對,應該是2。不斷的往入口扔東西,打屁屁,給正確答案……突然黑箱子就學會加法了類似的,可以教會黑箱子加減乘除、解方程、游泳、打架,吹New B同樣,母箱子還可以教會公箱子怎么泡妞如果你想往入口扔上期雙色球中獎號碼,在出口不斷給出本期中獎號,那你就想多了。我試過,黑箱子學不會啊~~~發布于 2015-01-05 11 條評論 感謝 分享 收藏 ? 沒有幫助 ? 舉報 ? 作者保留權利
新聞熱點
疑難解答