如今做爲一個業餘機器學習愛好者,神經網絡博大精深,這裏我只敢淺談一下。這篇文章參考了不少大神們的分享,我添加了一些個人理解(私貨)。可能會有一些問題、不許確或者錯誤的地方,請你們多多包涵。php
人工智能在如今生活中運用很普遍,在抖音中也有不少應用場景。好比在「抖音天然」活動中,經過人工智能技術,抖音能夠高速精準地識別出視頻中的動植物。利用人工智能來識別物體就是當前一個不錯的解決方案。那麼神經網絡和人工智能的關係是什麼呢?神經網絡是機器學習中一種學習方案,而機器學習是人工智能中的一個分支,那麼什麼是人工智能呢?人工智能 (artificial intelligence,縮寫爲AI) 指創造並運用算法構建動態計算環境來模擬人類智能過程的基礎。人工智能的定義能夠分爲兩部分,即「人工」和「智能」。「人工」即由人設計,爲人創造、製造。關於什麼是「智能」,較有爭議性。html
function ArtificialIntelligenceAdd(a, b) {
return a + b
}
複製代碼
大佬們將人工智能定義爲「系統正確解釋外部數據,從這些數據中學習,並利用這些知識經過靈活地實現特定目標和任務的能力」。簡單來講,人工智能努力的目標是讓計算機像人類同樣思考和行動。目前來講機器學習在解決一些須要大量重複工做的場景中,有不錯的表現。前端
機器學習是一類從數據中自動分析得到規律,並利用規律對未知數據進行預測。因此對於機器學來講,最重要的就是兩方面:數據和學習方法。以下圖所示,深色部分表明的更多的是學習方法,淺色部分表明更多的是數據。二者的結合中就有機器學習,而深度學習是機器學習的子集。 當前機器學習的方法大致上分爲四種類型:監督學習、無監督學習、半監督學習和強化學習。git
從給定的訓練數據集中學習出一個函數,當新的數據到來時,能夠根據這個函數預測結果。監督學習的訓練集要求是包括輸入和輸出,也能夠說是特徵和目標。在監督學習的訓練集中的目標是由人標註的,也就是須要人在機器學習以前就先把每一個特徵都標記好正確的結果,正確的標準須要人訓練前定義好。github
x1 | x2 | x3(干擾信息) | y |
---|---|---|---|
1 | 3 | 11 | 4 |
2 | 6 | 12 | 8 |
7 | 1 | 13 | 8 |
3 | 3 | 14 | 6 |
在監督學習中,咱們須要在模型學習前就準好了數據,而且知道數據對應的基準真相(ground truth)。模型學習是要悟出來一個如何把輸入變成輸出的方法(函數)。監督學習極度依賴數據的可靠性。監督學習目前應用最爲普遍,由於目的性很明確,並且有大量的數據清洗師,所以在業界也落地最多而且最有效果。算法
和監督學習相似,從給定的訓練數據集中學習出一個函數,可是訓練集沒有人爲標註的結果,也就是沒有基準真相。想辦法讓機器本身探索出數據之間的關係。簡單來講就是找類似。編程
眼睛數量 | 足的數量 | 手的數量 | 耳朵數量 | 使用工具 | 刷抖音 | 動物 |
---|---|---|---|---|---|---|
2 | 2 | 2 | 2 | 1 | 1 | 人類 |
2 | 2 | 2 | 2 | 1 | 0 | 黑猩猩 |
2 | 4 | 0 | 2 | 0 | 0 | 貓 |
2 | 4 | 0 | 2 | 0 | 0 | 狗 |
2 | 0 | 0 | 2 | 0 | 0 | 鯉魚 |
2 | 0 | 0 | 2 | 0 | 0 | 鯽魚 |
若是根據上面的數據分類,明顯可得第一二個數據比較相近,第三四數據比較相近,第五六數據比較相近。聚類的無監督學習就是根據這種數據,經過一些方法,不須要人爲的標註基準真相,就能夠作到聚合分類的做用。好比仍是上面的例子中,假設機器總結出來的規律是:把每一個特徵的值加起來,總和就是分類的結果。經過觀察結果能夠發現,差值大於 2 就基本不算屬於一類。好比把小明(人類)的數據和他家旺財(狗)的數據根據這個方法帶入一下,就會推導出這兩組數據不屬於同一類。而黑猩猩又介於人類和貓狗這一類之間。監督學習更像人爲先定好最終的目標的範圍,機器經過輸入數據給出一個範圍內的答案。無監督學習會相似經過機器幫人來發掘一些信息,在經過發掘的信息來進一步處理。更不嚴謹的來講就是監督學習是人教機器作事,無監督學習就是機器教人作事。markdown
半監督學習是有監督和無監督學習的組合,對訓練中的部分數據進行標記。也就是數據標記了,可是沒全標記。畢竟乾淨準確的數據標記是費時又費力的,所以經過結合一些標記好的數據和大量未標記的數據結合來讓模型學習,在很多狀況下能夠節省人力也能讓機器學明白。網絡
爲了達成目標,隨着環境的變更,而逐步調整其行爲,並評估每個行動以後所到的回饋是正向的或負向的。對比監督/無監督學習,監督/無監督學習像是一次性的輸入輸出行爲,而強化學習像是對於外界一系列變化的反饋,反饋通常是獎勵和懲罰。前端工程師
不論是監督學習、無監督學習仍是強化學習,總要有個具體的學習方法吧。人工神經網絡(Artificial Neural Network,ANN)就是目前最火也是相對最有效的學習方法。也是神經網絡的活躍和可塑性,促使了深度學習的誕生。
先回顧一下神經網絡的發展歷史。
這裏舉一個利用神經網絡作監督學習的例子。假設我統計了我 4 個周的體重和奶茶數量,想找一個出一個函數來表明出奶茶杯數和體重的關係,本身找太麻煩了,但願經過訓練機器找出一個 f(x) = wx + bf(x)=wx+b 這樣的公式簡單預測一下。x 就是每週的奶茶數量,也是訓練過程當中的輸入,也就是特徵。每週統計的體重就是基準真相。f(x)f(x)的結果是機器每次預測出來的體重。w 和 b 的值一開始都是隨機的,經過數次迭代,讓機器找到最合適的 w 和 b 值。
這個過程當中有 2 個問題:1. 怎麼知道訓練的結果好很差。2. 如何根據結果來矯正模型。
損失函數就是來反映模型訓練效果的方法。損失函數經過計算每輪預測結果和真實結果的差值來展現學習的成果。損失函數或簡單或複雜,只要有效反映出預測值和基準真相的差距便可,一個比較簡單的損失函數以下:
function simpleLossFun(prediction, groundtruth) {
return Math.abs(prediction - groundtruth);
}
複製代碼
機器(模型)在學習過程當中的目的只有一個,就是將損失值最小化。
如何來矯正模型就須要用到反向傳播。反向傳播就是用來計算梯度,基本上全部的優化算法都是在反向傳播算出梯度以後進行改進的。在這個例子中,矯正模型就是矯正 w 和 b 的數值,尤爲是 w 對 f(x)f(x)最爲重要。有效能體現 w 和 f(x)f(x)的關係就是對函數求導,\frac{\partial f(x)}{\partial x} = w'∂x∂f(x)=w′,求導經過極限的概念對 f(x)f(x)進行局部的線性逼近,w' 就反應了 f(x)f(x)在 x 這一點的變化率/梯度,借用大佬的話:
函數關於每一個變量的導數指明瞭整個表達式對於該變量的敏感程度。
這裏也能夠引入向量的角度來看待求導,經過求導得出的導數(梯度),w',表明了正負表明了變化的方向,導數的大小表明了變化的力度,經過調整 w 能夠影響到 w',也就影響了這一點上的向量的大小和方向,從而影響了整個線段的走向。同理也能夠帶入物理的角度,求導也是求瞬時速度,速度的大小和方向也隨 w 變化而變化。所以在咱們不修改 x,而能夠經過求得梯度 w',後續再根據 w' 來調整 w 來影響預測值,使 loss 的數值不斷下降。
單一特徵信息很難讓模型預測出正確的結果,通常須要多維度特徵信息。繼續咱們以前奶茶和體重的例子,我仍是想找出一個函數來預測我體重的變化的規律。我發現有時候我喝了多好杯奶茶,可是體重增加不明顯,有時候我不怎麼喝奶茶,可是體重仍是往上漲。我以爲可能會個人運動量,杯子大小,喝可樂的數量等等信息有關,這些信息以前的模型不知道,因此只根據奶茶數量預測的體重變化就不許。以前機器只考慮奶茶杯數一個特徵的 f(x) = wx + bf(x)=wx+b 換成神經網絡的圖,大概以下: 若是把這些新的信息都給機器,這些新信息每個對於模型都是一個新的特徵,若是咱們用以前的方法構建函數,就會變成:f(x_1, x_2, x_3, ...., x_n) = w_1x_1 + b_1 + w_2x_2 + b_2 + w_3x_3 + b_3 + .... + w_nx_n + b_nf(x1,x2,x3,....,xn)=w1x1+b1+w2x2+b2+w3x3+b3+....+wnxn+bn 這樣的多元函數在求導時能夠結合高斯消元法來作。換成神經網絡大概相似於 可是如狀況比這個還複雜呢(可能性很大)?光考慮單一組合(奶茶數量、可樂數量、運動量)等等已經不夠了呢?也許機器須要排列組合多種狀況,好比奶茶+可樂一組,運動量+寫代碼量一組,不一樣的組合之間結合怎麼一塊兒學習呢?方案也很簡單,就是套娃。在外面再套一層參數,經過這層參數來結合來融合各類狀況。 那麼模型的函數可能就變成了:f(x_1, x_2, x_3, ...., x_n) = w_{11}(w_1x_1 + b_1 + w_2x_2 + b_2 + w_3x_3 + b_3 + .... + w_nx_n + b_n) \\ \hspace{3cm}+ w_{12}(w_1x_1 + b_1 + w_2x_2 + b_2 + w_3x_3 + b_3 + .... + w_nx_n + b_n) \\ \hspace{3cm}+ .... \\ \hspace{3cm}+ w_{1n}(w_1x_1 + b_1 + w_2x_2 + b_2 + w_3x_3 + b_3 + .... + w_nx_n + b_n)f(x1,x2,x3,....,xn)=w11(w1x1+b1+w2x2+b2+w3x3+b3+....+wnxn+bn)+w12(w1x1+b1+w2x2+b2+w3x3+b3+....+wnxn+bn)+....+w1n(w1x1+b1+w2x2+b2+w3x3+b3+....+wnxn+bn)神經網絡就相似: 在求導的時候,因爲套了一層娃,這裏能夠根據求複合函數導數的鏈式法則引入中間函數,這個中間函數是 g_1(x_2, x_3, ...., x_n)g1(x2,x3,....,xn),讓 f(x_1,x_2, x_3, ...., x_n)f(x1,x2,x3,....,xn)變成 f(x_1, g_1)f(x1,g1),以此類推,咱們能夠對 g_{n-1}(x_n, g_n)gn−1(xn,gn)求道得出值,並一步一步向後把鏈條上全部節點的導數求出。借用 CS231N 的圖:
計算完每一個 weight 的梯度以後,咱們須要用梯度來更新參數。新的問題就是每次更新多少呢?這裏須要引入新的參數:學習率(learning rate)。(學習率 * 梯度) 就是每次模型中 weight 更新的大小。那麼又一個新的問題來了,學習率該怎麼設置呢? 左邊的狀況就是每次都只更新一點點,好比梯度的百萬分之一,這樣能夠是能夠,可是太費機器也太費時間。右邊的狀況是每次更新很大,這樣會致使錯過最佳答案,越錯越離譜。中間這樣每一輪培訓學習率都在遞減的狀況是最好的,因此須要再引入新的參數:衰減參數(decay)。衰減參數能夠是一個固定小數,好比 1/2,每一輪學習率都乘以衰減參數,達到一開始變化大,越到後面變化越小的效果。這樣真實的 weight 變化可能就是 w - (w' *lr* decay)。
模型的一輪培訓過程分爲 4 步
通常來講模型培訓的過程也是圍繞着 4 步。設計向前傳播的過程,設計 loss 函數,根據準確率來調整學習率,衰減參數,初始 weight 等。經過不斷循環上述 4 步驟 n 輪,模型最終擬合出來一個函數,這個函數就是咱們要的模型。
CS231n Convolutional Neural Networks for Visual Recognition機器學習維基百科CS231n 課程筆記翻譯:反向傳播筆記梯度降低法是如何運用到神經網絡中的卷積神經網絡 CNN 徹底指南終極版(一)前端工程師學人工智能人工神經網絡維基百科反向傳播算法維基百科回顧 NVIDIA 26 年發展歷程,持續創新纔是核心算法#03--詳解最小二乘法原理和代碼_tclxspy 的博客-CSDN 博客_最小二乘法代碼淺談高斯消元法的幾何意義 歡迎關注「 字節前端 ByteFE 」
簡歷投遞聯繫郵箱「tech@bytedance.com」