機器學習是人工智能時代對於開發者而言,最核心也是最近的領域。機器學習看上去是比較深,比較複雜的後端開發技術,被算法工程師緊緊掌控着,前端開發者難道不能涉足嗎?咱們真的要錯過嗎?若是我是前端開發者,如何入門機器學習?要學 python 嗎?我不會怎麼辦?本期 Robust 我就帶你來聊一聊機器學習。html
網易雲音樂:點擊播放前端
求打賞🙇若是你以爲 Robust 這樣一檔技術類的談話節目還不錯,但願我繼續作下去,不妨打賞支持。你能夠掃描本文下方的二維碼打賞,也能夠加我微信後紅包打賞。python
- 什麼是人工智能?
簡單的講,是要用信息技術模擬人的天然行爲,以輔助人類完成某些工做。
它包含哪些內容?最起碼:a 感覺系統(傳感器技術)b 認知系統(天然語言處理 (NLP),深度神經網絡)c 決策系統(深度學習)d 響應系統(機器人技術)
- 什麼是機器學習?
咱們如今講機器學習,實際就是講基於神經網絡的深度學習。它是人工智能的認知決策的核心內容。
- 目前已經實現的領域有哪些?
圖像識別、自動駕駛、智能語音(同聲傳譯)、搜索、藝術創做、醫學診斷、玩遊戲
語言中提到的搜索引擎 magi.com/
- 機器學習基本上能夠分爲三個類別: 監督學習、非監督學習和強化學習。
- 對於前端同窗(非數學專業)而言,如何用更簡單的語言描述機器學習中遇到的複雜概念?
對於複雜概念而言,它的本質是對具體描述的抽象。它之因此難懂,是由於抽象程度高。咱們要作的,就是還原它的具體,咱們先忘記這些概念,去搞明白抽象背後的具體描述。一個概念,能夠用不一樣的具體描述與之對應,咱們就用本身平常生活中最接近本身的具體事件去描述,在沒有概念的狀況下,咱們也能知道,這個概念是在描述一件什麼事。當咱們反覆用囉裏八嗦的具體描述去闡釋一個東西時,咱們天然而然,就會有強烈願望用一個簡單的概念去描述它,這個時候,咱們再來看,就會發現原來這個概念就是這麼回事。
- 那麼咱們如何用簡單語言來描述「監督學習」這個概念呢?
它的本質就是概括法。
簡單的說,你首先須要一堆數據【給定數據集,也被稱爲訓練集】,這些數據都是客觀事實。其次,你須要有一個訓練算法,經過這個算法,找出這一堆數據的內在聯繫(通常用一個函數來表示),這個東西就是訓練的結果,也就是咱們常聽見的模型。【訓練階段】最後,利用這個模型,去預測一個新給的參數所帶來的結果。【推理階段】
其中,訓練算法是關鍵。它存在性能問題,爲何呢?這和機器學習的範式(概括法)有關。機器學習和咱們以往尋找最優解的模式不一樣。咱們之前尋找一個最優解,考慮的是運算最短路徑和準確性,也就是在保證必定能找到最優解的狀況下,用最少的運算次數找到最優解。
而機器學習皆然不一樣,它的預設是沒有基本規則前提下的概括方法,所以,經過機器學習找到最優解不是精確的,而是近似的,至於運算的次數,要看運氣,但通常而言,都是將全部可能遍歷一邊。咱們傳統的一些思考方法,都是有預設和前提的,好比說,找出一組數中,最小的值。用傳統算法,咱們在「找出最小值」這個目標下,能夠先將這些值進行分組,每組最小的再比,或者經過冒泡算法之類的進行排序,總之,咱們很明確知道不一樣值之間它們存在的大小關係。
可是,機器學習的前提是,它不知道兩個值誰大誰小。你須要先讓它學習,好比說,1和2,它事先不知道1和2誰大誰小,你須要告訴它,你能夠先告訴它這麼一個集合[[1, 2], [8, 199], [5, 92], [43, 1993], [234, 93582], …],而後告訴它每個數組第一個值比第二個值小。這個集合就是訓練集。它能夠經過這個集合學習到 a-b<0 的時候,表示a比b小。而這個 a-b<0 就是它的訓練結果,未來遇到任何兩個數,它都能知道這兩個數誰大誰小。有了這個誰大誰小的前提,才能進行後面的「找出最小值」的算法。
那麼怎麼進行訓練呢?這裏就涉及到「成本函數」「神經網絡」等等概念。
- 什麼是成本函數?
訓練的本質,實際上就是求函數的係數的過程。好比,咱們初中學習的一元二次方程,y=ax^2+bx+c,這個一元二次方程能夠運用到的地方實在太多太多了。好比經典的案例是「波特蘭的房價」,一套房子大概能賣多少錢呢?假設它受三個因素影響:地理位置a,房子大小b,採光c。那麼咱們咱們怎麼知道 a, b, c 分別是多少呢?初中求一元二次方程告訴咱們,須要給咱們三組x, y,而後代來代去,最後算出 a, b, c。
機器學習的訓練過程當中,沒有求一元二次方程這麼高的智慧,它能幹啥呢?它只能幹最蠢的事,你須要先知道三套或以上的房子的實際價格,也就是知道三個以上 [x, y] 把全部的a, b, c可能的值,一個一個的代入到方程中,而後計算出 x, y,而後去看,當前代入的 a, b, c 算出來的 x, y 是否和這三個 [x, y] 都匹配,若是找到一組 a, b, c 正好讓方程知足三個 [x, y],那麼說明這一組 a, b, c 就是咱們要找的解。
機器學習就是這麼蠢。
那麼什麼是成本函數呢?如今,把上面這個房價問題抽象成座標軸中的數學問題。三套已知房價就是平面座標軸上的3個點。接下來,機器學習假設a的範圍是[0, 100], b的範圍是[0, 50],c的範圍[0, 10],這裏是先假設,假如再這個範圍沒找到,咱們再擴大範圍。A, b, c 的組合就有50000種可能,也就是在座標系裏面,能夠畫出50000條拋物線。那麼哪一條拋物線纔是咱們要的呢?就是去看這些拋物線和已經畫出來的那三個點。靠的最近的,就是那一條。怎麼靠的最近呢?在x 相同的狀況下,點的y值減去拋物線上的y值最小,三個點都這麼去計算,固然,爲了不正負號問題,還能夠相減以後求絕對值,這三個絕對值相加最小的那一條拋物線,就是咱們要找的拋物線了。而這個算法,最終會變成一個 f(a, b, c) 的函數,而這個函數,就是成本函數。
成本函數,決定了此次訓練過程的性能,也就是要花多少時間才能找到正確的 a,b,c,這個過程,運氣很差的,可能比挖礦還要慢。
- 什麼是神經網絡呢?
咱們如今所說的神經網絡,多半是指深度神經網絡。深度學習就是指基於深度神經網絡的機器學習。神經網絡和深度神經網絡就是程度上的不一樣,本質同樣。
神經網絡和人腦神經元網絡同樣,每個神經元都有本身處理信息的能力,經過樹突接收信息,經過軸突輸出信息。接收的信息可能來自另一個神經元輸出的信息。
在深度神經網絡中,這些神經元被分層,每一層所負責的工做不同,每一層能夠包含多個神經元。每一層輸出的信息,能夠被下一層的任何神經元接收,這個根據須要來處理。
核心就在於,每個神經元所包含的算法,以及這個神經元所得出結果的權重。算法工程師在編程時,實際上就是在幹這件事,首先安排一個什麼樣的神經網絡,其次,給網絡中的每個神經元加入算法和權重,而後找一大堆訓練集,運行這個網絡。
回到咱們上面的房價問題。咱們用窮舉 a, b, c 的方法實在是太笨了。咱們把這個窮舉過程改成用神經網絡來處理的過程。咱們如今建立一個2層的神經網絡。對於輸入而言,地理位置的權重最大,房子大小權重居中,採光條件權重最小。第一層網絡要解決一件事,就是將訓練集中的全部房子之間,a, b, c 的關係轉化爲某個特殊邏輯關係,這個邏輯關係雖然是從已知的這些訓練數據中來,可是和訓練數據已經徹底沒有關係了,從輸入到輸出這個過程,被稱爲「激活」。
第二層網絡要幹一件事,就是將咱們上面找到的邏輯關係再次進行運算,獲得特定邏輯和房價之間的關係。
至於中間的激活函數是什麼,咱們就不去糾結了,這是算法工程師要寫的東西。
最終的效果是,經過這個兩層的神經網絡,咱們減小了找到 a, b, c 的時間,同時提升了準確率。
- 什麼是激活函數?
在上面提到的過程當中,原始輸入值在輸出以後,爲了方便下一層網絡使用,咱們都要對這些不規則的結果值,進行歸一化,通常都是將這些值轉化爲 [0,1] 或者 [-1, 1] 之間的小數,這樣,咱們能夠很是容易的對兩個值進行觀察和處理,而不用考慮不規則的數之間帶來的差別。而負責這個轉化過程的算法被稱爲「激活函數」,激活函數的主要做用,其實是將非線性的數轉化爲線性的,也就是咱們常常聽到的「線性變換」。
目前最常被提到的激活函數有 sigmoid, tanh, relu.
- 什麼是模型?
說白了,模型就是訓練結果。也就是最前面,找出二元一次方程係數後,把這個二元一次方程固定下來。另一我的在要預測另一套房子的時候,就不須要本身再去訓練,而是直接拿你訓練的模型,也就是這個二元一次方程,傳入對應的x,獲得y就結束了。
訓練算法是獲得模型的關鍵。前面說過,機器學習不是追求最準確,而是近似。因此,就有一個算法調優的過程,也就是以更小的代價,獲得更靠近準確值的 a, b, c 的過程。算法工程師的功力,實際上就在算法調優(發明或改進算法)的能力上。
- 什麼是卷積神經網絡(CNN)?
首先,什麼是卷積?中文翻譯的好,它包含「卷」和「積」,積就是相乘,卷就是相加且有反覆接二連三的意思。卷積就是將要素值相乘,而後將乘積相加的過程,相加多少次由計算目的決定。不過,在相加過程當中,實際上有一個衰變過程,也就是說,前面的乘積,在後續的相加過程當中,會衰變,對權重的影響不如最新的積帶來的效果大。它的本質,實際上,就是加權疊加,經過加權疊加,咱們能夠找到權重突出的要素。這也是卷積被應用到神經網絡中的緣由之一。
那麼什麼是卷積神經網絡呢?深度神經網絡有不少層組成,每一層內包含不少神經元,層與層之間有前後順序。在衆多神經網絡中間,有這麼一種神經網絡,裏面包含了一個特殊的層,這個層的主要做用是對輸入值進行分組後相乘,而後經過激活函數進行歸一化,並且,這個神經網絡很奇怪,這個特殊層有連續好多個,只是裏面的參數有稍微的調整。這種就是卷積神經網絡,而這個特殊層就是卷積層。固然,這裏是一個縮減化的,實際上,在卷積神經網絡中,連續重複的不是隻有卷積層,而是多個層,通常包括:卷積層、線性整流層(也就是上面提到的激活函數)、池化層(衰減做用,以獲得維度更小的特徵)。而這些重複的層結束以後,還會有一個全鏈接層,將卷積結果作最終的整合,獲得最終的結果。
卷積神經網絡在圖像識別上取得了很是大的成功。咱們簡單說一下,圖像的本質是像素的組合。對圖像識別,實際上就是對圖像中事物到已有知識庫中進行匹配的過程。怎麼在卷積中作呢?首先,將圖片像素RGB分別取出,並經過補充的方式,獲得一個3的整數倍長寬的正方形。如今有一個濾波器(一個3x3的01矩陣),將原始R層切分爲3x3的網格,每一格拿出來和濾波器每一個位置相乘,而後將全部位置相加,就獲得一個值,而後將全部格子相乘相加獲得的值組成一個新的矩陣,並經過激活函數,將上面的值歸一化。按照上面的方法,再進行一次濾波相乘相加。如此反覆幾回,就能夠獲得一個通過歸一化的很小矩陣,從而表達R層在某一個特徵(濾波器所表達的這個特徵)上的值。已一樣的道理,再作其餘層其餘特徵的卷積。最終在全鏈接層對這些特徵值進行分類匹配,找出這張圖片是車仍是貓的可能性各自多大。
- 分類的重要性
對樣本進行分類,不管是監督學習(人爲給出分類),仍是非監督學習(人爲不給分類,只給出建立分類的方法),都極其重要。
機器學習的目標,是要作出決策。決策的依據是什麼?就是被預測的值被丟到哪個分類中。例如股票預測中,經過機器學習,得出3個分類,並對每個分類採起不一樣的操做建議。當你輸入新的一支股票時,它就能夠預測這支股票屬於不一樣分類的機率,而且你能夠經過最大機率的那個分類進行決策。
因此,機器學習的【推理階段】本質就是給目標進行分類的過程。而它進行分類的依據,就是來自【訓練階段】的結果,即模型。
- 前端開發者如何學習機器學習?
前端開發者最擅長的是應用開發,而非算法開發。因此,我以爲,要從應用開發開始,創建興趣。
Tensorflow.js 是谷歌開源的機器學習框架,使用 Tensorflow.js 可使用 js 做爲開發語言,進行機器學習的開發。對於這個框架而言,咱們其實能夠作兩件事:a 純做爲一個第三方開發庫,用來作應用開發;b 進行訓練開發,建立屬於本身的模型。
若是剛開始,咱們能夠不用它來作訓練,而是隻用一些已經公開的模型,來作應用開發。
它的官方網站是 tensorflow.google.cn/js 你能夠在官網上找到它的接口,固然,用於訓練的接口你能夠先無論,能夠先跟着官方的入門文章,掌握如何利用官方公開的模型,作一些小案例,好比如何識別手寫體數字等等。這段時間是疫情時期,你們都在家遠程辦公,長時間坐着會不會帶來健康問題,有一位騰訊的小夥伴突發其想,利用人體骨架模型寫了一個監控坐姿的小應用,你能夠經過 www.doverr.com/alarm/index… 訪問。其實裏面涉及的技術還挺多的,有興趣能夠本身去八一八。一樣是人體骨架模型,實際上,還有有其餘的用法,好比我想到一個點,就是經過對人體骨架的預測,來匹配背景音樂,這樣,可讓抖音背景音樂更匹配。
在使用 tensorflow.js 實現了一些應用以後,若是有興趣,就能夠學習它的訓練api,同時深刻去學習算法,編寫本身的神經網絡,建立本身的模型。
在小有成就感以後,就能夠從新回頭,開始去研究機器學習算法,甚至從新學習高數來提高本身的算法能力。
Robust 是一檔程序員的談話節目,聊一聊編程,聊一聊科技。你能夠在這裏收聽往期全部節目。若是你喜歡歡迎收藏和打賞。程序員