一次性掌握機器學習基礎知識脈絡 | 公開課筆記
來源 | AI科技大本營線上公開課
嘉賓 | 張相於
整理 | suiling
本次公開課AI科技大本營邀請到了阿里巴巴的高階演算法專家張相於,他將從資料的概率分佈開始介紹機器學習核心概念之間的有機關係,幫助大家建立知識脈絡,做到知識的有機吸收。同時,講解機器學習的元知識,介紹系統性持續學習的方法和技巧。最後介紹演算法工程落地能力的入門和提高,避免只會演算法不會落地的尷尬。當然,隨手推薦一波獨特有效的學習資料不在話下。
回放地址:https://edu.csdn.net/huiyiCourse/detail/860
以下是公開課內容整理
我們這次分享的題目叫做《機器學習第二次入門》。我先簡單自我介紹一下,我現在在做演算法工作,在阿里做高階演算法專家,主要關注的領域是在推薦系統、機器學習、金融風控這些方面。
本次分享包括三個內容,先講一下機器學習的知識脈絡,這是我們這次分享的核心內容。第二點是工程能力。現在網路上有很多機器學習入門的材料,所以本次課程中會稍微提一下。最後,會相對深入地推薦一些內容、資料,會給大家介紹一些書的特點,不是簡單拉個單子,我覺得拉單子這個東西可能大家也會迷失在其中。
機器學習的知識脈絡
下面我們看第一個章節——機器學習的知識脈絡。為什麼叫做第二次入門?第一次入門大家可能會是這樣一種狀態:想從事機器學習行業,你會去找一些視訊或者是學習材料,一上來可能就會給你一些常用的模型,跟一些實用的demo這方面的東西。這些東西對於上手是非常有用的,也是一個必經之路,但是往往會忽視一些比較靠下的基礎理論知識。這就會導致有的同學會很困惑,感覺機器學習的理論點特別多,知識特別多,好像永遠也學不完的樣子。但其實這背後是有一些規律的。今天我們會從其中一個角度進行分析,它只是一部分的知識脈絡,希望能給大家開啟一個新的視角,對於你持續地去學習,去更深入地掌握知識是有好處的。
首先,我們看這樣一個問題,你如何能把一棵樹上的所有葉子都抓在手裡面,或者所有的葉子都把它收起來?
第一種方式,我用一個不好的比喻來講,有點像狗熊抓樹葉一樣,因為有個詞叫“狗熊掰棒子”大家都知道,什麼叫狗熊抓樹葉?就是樹葉落一地,我就一片一片去撿,但是這個其實效率很低的。因為在你看來它們就是一些沒有區別的葉子,在那兒一個勁地撿。但是還有種方式——倒過來去抓這個葉子,從根上去抓,大家都知道《水滸傳》裡有魯智深倒拔垂楊柳,從根上到枝幹上,然後倒著這麼去走,其實是能夠提綱挈領地去抓住所有的葉子。是這樣一個比喻。
那麼反過來,我們看機器學習現在很熱的一個知識,怎麼能夠去學好機器學習知識?有一個很常見的辦法,我經常建議大家去翻一下演算法比賽,此前有則新聞,Kaggle 上面一個最年輕的 Grandmaster 誕生了,他是一個高中生,他自學了三年演算法的知識,他一下子就變成了 Grandmaster。這個是實踐的一個很好的方式。
但是從另外一個角度來講,如果你想比較深入地去研究這個東西,想走得比較遠,建議你還是能夠把基礎先連根拔起,能夠了解它整個的知識脈絡和知識系統,對於後面的學習非常有好。
樹葉丟掉還會長出來,但是根沒有你就完蛋了,這是什麼意思?對於我們學習一些知識來講,其實大家應當會有這種感受,就是我學一個知識點可能過一段時間忘掉了,如果你的學習不成體系的話就會這樣子,有點像現在很多所謂碎片化閱讀什麼的,但其實不是所有的知識都適合碎片化閱讀,有的東西它還是適合系統化地去學習。如果你係統化地學習之後,有的東西忘掉其實不是很大的問題,還是可以很容易地把它撿回來,因為你知道它在什麼位置。有的如果你腦子裡面沒有這個系統的話,你就會覺得所有的點就是一個一個點,不是很好地聯絡起來。這就是我們講這門課的一個動機。
首先我們來看一下這個概念,統計學習。現在最火的概念叫人工智慧,但是其實也有一些比較冷靜、客觀、低調的大神批判說你們這根本不是人工智慧,其實就是機器學習。機器學習,其實可以再上升一點說機器學習大部分其實都還是統計學習。統計學習是什麼?統計學習其實就是基於大量的資料,說得直白點就是學出一套規則來。它的核心其實就是擬合資料,特別簡單,如果你看一些基礎理論書的話,機器學習就是擬合資料。
擬合資料一般來講有兩種套路,就是說首先你有一堆資料,就是所謂的觀察,你有一堆資料,然後你想知道它背後究竟是一個什麼分佈,這個東西就是生成式模型,生成式模型你可以理解為它就是一個上帝視角,你學好了之後它就是一個上帝視角。比如說 100 萬個點,任何一個點它的生成概率是多大,這就是統計學習裡面最基礎的一個概念,就是概率分佈,也就是說這個資料究竟是由它的,我看到它的 population,它真實的生成概率是什麼樣子,這就是生成式模型。生成式模型我們一般會把它拆成 X 和 Y,x就是一些特徵變數,y就是你觀測到的結果,比如說一些標籤,會通常拆成這樣一個形式,就是y的概率乘以y下面看到x概率。
生成式模型雖然很牛逼,它是一個上帝視角的東西,但是很多時候你會發現好像也不是百分之百地需要這個東西,因為絕大部分情況下我們的問題,像課前交流時候有的同學也說了,絕大多數的問題其實它就是一個監督問題,就是一個分類問題,在這些場景下面我其實不需要真的知道它的聯合分佈是什麼東西,我只需要知道一個判別概率,一個條件概率就知道了,也就是說在知道 X 的情況下,Y 有多大的概率。比如說我們常用的點選率模型,點選的概率有多大,核心想知道的是這樣一個問題。所以說就有另外一種擬合方式,就是判別式模型,就是我最終想擬合出來的東西是這樣一個概率。
我們要擬合資料,第一個概念就是假設集合。假設集合決定了我要以什麼概率函式的形式去擬合這個資料,也就是說我們選一個什麼樣的函式的樣子,通俗一點說長什麼樣子來去擬合它。舉個例子,比如說我們如果是擬合條件的話,我用一個邏輯迴歸,其實你預設了一個思想你選擇這個假設集合就是長這個樣子。就是1除以1加e的-x次方這樣一個東西。這是你的假設集合。
假設集合選出來之後,我們先不講怎麼去得到這個假設集合裡面的具體東西,因為你的流程其實就是一步步地選,我先選出假設集合來,然後我再從假設集合裡面再選一個具體的東西出來,就有點像我們經常學的那種抓球,有兩個袋子,一個袋子裡面是紅球,一個袋子裡面是藍球,然後我再從這兩個袋子裡面決定選出哪個袋子來,然後再從那個袋子裡面拿出一個球來。其實機器學習從最高的角度去看就是這樣一個東西,所以說第一步你是選這個假設集合是什麼,然後在假設集合內部,我們等會兒再講,其實後面的學習過程就是從假設集合裡面再挑出一個球出來。
我們在優化之前,在得到模型之前,都需要做一件事情,就是先要知道怎麼樣判斷擬合得好不好。我很推崇的一句話,就是說“你如果不能衡量一個事情,你是沒辦法改進它的”,這個其實不僅適用於數學或者什麼,其實整個在工作中也會有這樣的問題。你想做一件事情,一定要先有目標,沒有這個目標就不能說這件事做成沒做成,做好沒做好。所以我們首先要去引入幾個概念,怎樣評判我從假設集合裡面選出的一個東西來,它是一個好的假設還是一個不好的假設。
這裡面首先第一個概念就是我怎麼衡量它的分類能力?為了更好地解講這個問題,我們把它侷限到一個分類問題上的話,那麼最直接衡量分類能力,最概括的那個指標叫做 VC Dimension。VC Dimension這個我相信大家很多人都見過,好像也是面試裡面特別喜歡考的一個知識,但是我之所以把它放在這個地方講,就是讓大家知道,VC Dimension 它是一個什麼位置,為什麼要出現這個概念?因為這個概念它不是從天上蹦下來的,它不是從石頭裡面蹦出來的,我突然就說我需要一個 VC Dimension,它不是這樣的,它一定是在衡量一個什麼東西。
VC dimension 衡量的是什麼?它衡量的是假設集合的好壞,它不是在衡量一個具體的假設。剛才有同學說假設集合就是演算法,你可以理解為假設集合就是模型。比如說邏輯迴歸它是一個模型,它就是一個假設集合。這個 VC Dimension 它衡量的就是邏輯迴歸在某一方面能力怎麼樣,或者是決策樹在某一方面能力怎麼樣,它還沒有到評估說具體某一個擬合出來的模型好不好。
VC Dimension 什麼含義?有的同學可能看過,這裡簡單說一下。它其實講的是特別簡單的事情,VC Dimension 如果是 N 的話,就代表我給你 N 個點,然後把這 N 個點,每個點都有兩種選擇,比如說是紅藍兩種顏色,我對這些點做任意的著色,你這個模型都能夠分出這兩種顏色來,就是紅的還是藍的。這裡面有一個典型的,比如說一個線性模型,它的 VC Dimension 是什麼?線性模型的 VC Dimension 就是 N+1,N就是它的維數,大家可以想像一個特別簡單的場景,一個二維平面上的直線,它的VC Dimension 就是 3,為什麼?因為你對於任意三個點,你隨便在腦子裡面畫上三個點,隨便給它著色,紅的,上面是紅的,下面是藍的,你都可以畫一條線,把這個紅藍區分開。所以它的 VC Dimension 是可以到 3 的。但是 4 個 OK 嗎?你找出四個點來,你對它任意著色,它一定會找到一種情況,是一條直線分不開的,沒有辦法說直線的一邊就是紅色,一邊全是藍色。所以說 VC Dimension就是這樣一個東西,它是衡量一個假設集合的一個分辨能力。
有了 VC Dimension 我們就知道了一個假設集合的好壞,那麼 VC Dimension 是不是越大越好?比如說我剛才說線性模型的 VC Dimension是 N+1,我們是不是要找一個無限大的 VC Dimension,這樣一個假設集合就是最好的?其實並不是的,因為無限大的 VC Dimension 就代表著你會擬合得非常嚴重。所以說我們引入第二個概念就是 error。
Error 在機器學習裡面,基礎概念裡面它是一個比較複雜的概念,它是三個東西組成的,一個叫 bias,一個叫 variance,一個叫 noise。我們先說一下 noise, noise 是什麼東西?noise 是噪音,噪音在機器學習裡面它的概念就是說,這個噪音你可以認為這個模型再怎麼牛逼,它都分不出來的點,這就是噪音。
舉一個例子,比如我們的樣本集裡有兩條樣本,兩條樣本的特徵是完全一樣,比如 10 個特徵,每個特徵上取值都是一樣的,但是第一個樣本它是一個正例,第二個樣本它是一個負例。這種情況你說你該給這兩個點分什麼例?如果都判成正例,一定會有一個是錯的,如果都判成負例,一定也會有一個是錯的。這個就是 noise,這就不是你模型能決定的東西。noise 叫做irreducible error,就是不可約錯誤,就是模型再怎麼牛逼你都幹不掉,這是noise。
除了 noise 它剩下的兩部分叫做 reducible error,也就是 bias+variance這兩個東西。所以說我們後面會講,小孩子才分對錯,大人只看bias和variance。我覺得在機器學習裡面它的核心就是在平衡這兩個點。
關於 bias 和 variance,其實很多同學都看過,我也面試過一些同學,大家對這個東西多少都知道一點,但是其實大部分同學都是一知半解,都不是特別地懂這個東西,好像都能說出來,bias 好像是說它準不準,然後 variance 是說它的方差大不大,但是這個 bias 和 variance具體它是怎麼算出來的?其實很多同學沒有很深刻地理解,在這裡我們對這個東西做一個解釋。
因為大家知道在概率裡面,你看到 bias 和 variance 第一個想到的是什麼東西?一定是概率裡面的 bias 和 variance,舉個最簡單的,比如說有一組隨機概率分佈的點,你會算它的 variance,variance 就是方差,這個是很好理解的。但是,在機器學習裡面它的 variance 指的是什麼?
我們看一下這個公式。最上面這個就是 reducible error。它本身是一個期望,大家看到期望會想到什麼?期望其實指是一個概率分佈的期望,如果期望不好理解的話你就理解成平均數。它既然涉及到平均數、平均值,它一定就要涉及到好多個點,對好多個點算均值才有含義。
就是這個方括號裡面這個玩意兒,,那麼 Eout 指的是什麼?就是在測試集上面的評估結果,這個應該相對好理解,也就是說你訓練一個模型,然後在 Eout 上面去評估。這個Eout指的就是你在測試集上的一個結果。那個 g 是什麼?就是你的假設集合。比如簡單講,我就選了一個邏輯迴歸,這就是邏輯迴歸,我要訓練邏輯迴歸了。右上角這個 D 指的是資料集,就是選定一個一個訓練資料集,我在這個資料集上訓練出一個結果來,然後在我的測試集上評估,就得到了Eout裡面的一個點。然後 out 集上得到的好多點就是這個 Eout。然後再對 D 做平均數,取好多好多個資料集,我在每個上面訓練一個結果,然後在測試集上評估一下,然後得到一個結果。這就是這個東西的來源。
所以說現在第一概念就是 bias 和 variance 它的基礎單位都是資料集,然後要算這個資料集上面的誤差,就是這個 error,叫 reducible Error。然後下面這個可以先不用關注它是怎麼出來的,然後它通過兩步計算,就把這個error 分成了兩個部分,大家可以看到左下角這個部分和右下角這個部分,這兩個東西其實就是 bias 和 variance。右邊這個是什麼?我解釋一下,就是g bar,g 的平均值,x 這個,它其實指的是你在所有資料集上估的那個模型再取一個平均。比如說我有 10 個資料集,我估出 10 個結果來,我最終預測結果就把這 10 個模型的預測結果平均一下,這是g bar 的含義。然後f(x) 特別好理解,f(x) 就是原始函式,就是原始真實的那個函式,假設它有一個真實的函式。這個東西它就是 bias。
左邊這個就是它的 variance。variance 是什麼?你可以看到 bias 它是沒有外面這個E的,它是不用算均值的,但是為什麼 variance 需要算?因為variance 是概率裡面一個基礎概念,就是你需要把好多點去取方差。所以說它的計算方式就是說用在每一個集合上估出來的結果減去這個平均函式估出來的結果,然後看每一個集合,它其實衡量的是在每個資料集上估出來的結果和你平均結果是一個平均誤差,這個東西就是 variance。所以說我希望通過這段講解讓大家能夠知道 bias 和 variance 它倆究竟指的是什麼,大家說起來好像都知道,一個是衡量偏差的,一個是衡量方差的,但是偏差和方差是什麼?它就是這兩個含義。
下面這個圖,它是有兩個組成部分。左邊是個特別簡單的圖,它表示的是什麼含義?它表示這個H是我的假設空間,是這樣一個圓圈,裡面只有一個點,因為這是一個極端情況,就是說我的假設空間裡面只有一個點。我舉個例子,什麼叫只有一個點?就是說估出我的模型,就是 g(x)=1,就是不管你給我什麼資料,我的模型就是這個結果,然後我對你所有的結果都預測,不管你給我什麼特徵我就預測 y 值=1,就是這樣一個模型,其實特別傻的一個模型。這個模型它的variance是多少?它的variance是0,為什麼它的variance是 0?它的方差為什麼是 0?因為你不論給它什麼資料集,它估的結果都是一樣的,並且和平均結果是一樣的,因為你所有的結果都是一樣的,那一平均自然也是一樣的。所以說它的方差是 0。
那麼它的偏差是什麼?大家可以看到右邊有個 f 這個小圓點,這個點和這個f中間的差距這個就是偏差。所以說這個模型的方差特別低,它就是 0,你不可能比這個更低,因為方差帶平方的,所以方差不可能比這個更低了。所以這就是一個極端的 case,它的方差是 0,它的偏差一般來說會非常大。任何 x 給的y都等於 1,那你自然不會得到一個好的結果了。
右邊這個它是一個反向的例子,就是說它的假設空間點特別多,然後這裡面有一個點,顏色偏淺的一個點。右邊這個圖是什麼含義?就是說假設空間特別多的點,真實的點,真實的那個 f(x) 是右邊這個顏色不太一樣的點,大家應該能夠分辨出來。那麼這個集合你可以看到它的方差會非常大,因為什麼?它每一個黑點都代表著我給你一個資料集,你給我估一個 g 出來。我給你100 個資料集你就估出 100 個 g 來,這 100 個 g 各不相同,所以它的方差會很大。但是它的偏差有可能會比較小,就是陰影部分覆蓋住的這些黑點,它的平均點大概率其實是在顏色不一樣的點附近,所以它的偏差有可能會比較低,但是它的方差是非常大的。
這裡核心想讓大家 get 的一個點是什麼?就是在說機器學習模型的偏差和方差的時候,它的核心元素是一個點,這個點是怎麼得到的?就是在一個資料集上估出來的結果。這個資料集,因為我剛才講的是實際中的情況,理論上你是從總的那個樣本中抽的,就是我知道真實分佈,然後我抽 100 個點,再抽 100 個點,每抽一次就得到一個資料集點,就得到這個公式裡面的一個D,後面的偏差和方差其實都是對這個 D 來講的。
Eout 其實就是 g(D) 減去 f(x) 得來的。這個公式是不是看著很眼熟?這就是平均展開,a 減 b 的平方等於a 的平方加 b 的平方減去 2ab。然後為什麼到下一個等號了?它減去g bar x平方,加了一個 g bar x 平方,然後就出來這個東西了。後面這個又根據這個平方差公式然後得到了這個圖。
這個公式中,這個 Eout 其實就是你的 g(D)減去 f(x) 得來的。這個公式你不是看著很眼熟嗎?這就是平均展開,a 減 b 的平方等於 a 的平方加 b 的平方減去 2ab。然後為什麼到下一個等號了?它減去 g 一半 x 平方,加了一個 g 一半 x 平方,然後就出來這個東西了。後面這個又根據這個平方差公式然後弄了這個圖。
然後再從直觀的去理解一下這個圖。這是四種情況,四種情況分別代表了高和低的方差、偏差的點。先看左上角這個點,這是最牛逼的點,它有很低的偏差,還有很低的方差。偏差低大家很好理解,就是預測準確率特別好。那為什麼關注方差要低?方差低就代表著你在任意一個資料集上得到的結果都特別接近在所有資料集上得到的結果,這是一個保證。這是一個什麼保證?就是說在沒有辦法得到全部資料集的情況下,只得到了部分資料集。在這個上面的結果和在所有資料集上得到的結果不會差特別多,是這樣一個保證,這就是方差,這就是穩定的問題。
然後最不理想的情況是什麼?就是右下角這個情況——偏差又大,方差又大,那這個模型就沒什麼用了,既估不準,而且在不同的資料集上跳得還特別厲害。值得關注的是左下角這個點,左下角這個點叫做 High bias、Low variance。其實這種點看著好像離圓心挺遠的,偏差不大好。但實際上這種點在實際中很多時候也是有用的,因為它有一個保證,有一個穩定性保證。如果你關注的是一個趨勢的話,這樣的資料集其實也是ok的,因為你知道它穩定地離你的圓心就是這麼遠,但是你不管拿什麼資料它都是這麼遠,所以這種模型也是ok的。
然後看右上角這個點,可以看到它散得非常厲害,它的方差很高,它的偏差還是比較低的,這種點看起來好像也蠻好,但實際情況中這種模型不是特別好的點,因為你根本不知道你某個資料集能對映到哪個點上去,它沒有一個保證。所以我們在現實中其實很多情況下,我們後面會講這個東西和演算法能力,和正常化是有關係的。就是為了要,不管你準不準先不說,你不要太散,在工業中應用我們還是很注重穩定性的。
這個大家下去可以再去理解一下,我們後面推薦的書裡也會講這個東西。
然後我們就講到交叉驗證,剛才講這個 bias variance,可能有的同學會講這個東西也就是面試會考一考,實際中好像也沒有什麼用處。我們下面講一下它在實際中有什麼用處。它的實際用處就是交叉驗證,為什麼做交叉驗證?交叉驗證的方法我就不重複了,大家應該知道,就是說你把資料分成 k 份,每次留一份出去,剩下的訓練,你可以預測,然後把結果拿起來,然後去評估一下。但有沒有想過你這麼評估,評估的是什麼東西?你評估的是什麼東西?其實你評估的就是 bias 和 variance 的一個拆分,它就是 bias 和variance 拆解的一個直接應用。
流程我這兒簡單寫了一下,就是將資料劃分為 k 份,每次留出一份作為測試,其餘作為訓練,記得到的誤差為 ei,ei 就是第 i 份的,你把第 i 份去做測試的時候得到的誤差,然後就得到了k份測試結果。你的 bias 是什麼?就是每一份誤差的一個均值,這個很好理解,這就是你的 bias。你的 variance 是什麼?把這 k 個誤差當做 k 個點,用統計學的方法算一下它們的方差,這就是它的 variance,這就能很好地評估你這個模型在這個資料集上它的穩定性如何,它的偏差如何,這就是這種方差、偏差分解在實際中的一個最典型的應用。
可能有的同學經常用交叉驗證,但其實對它的深層次含義沒有過太多的考慮,今天就給大家建立這樣一種聯絡,其實是解決了兩個問題,一是偏差、方差的分解究竟在現實中有什麼用;二是反過來,這個交叉驗證它的理論知識是什麼,做這樣一件事情它的意義是什麼。
其實如果你不關注穩定性的話,你就直接再一個資料集上做一個測試就ok了,你得到的 bias 如果資料量大也是準的,但是你如果不劃成k份,你做交叉驗證你就沒法知道它的穩定性是多少,我覺得這個應該說得比較清楚。
在上一步我們已經建立了一個方法,就是說我怎麼評估一組模型的好壞?但是剛才我們經歷了是如何評估一個假設集合的好壞,接下來還要想辦法去評估具體一個模型,比如我們選定了一個袋子,下面從袋子裡面選球,這個球的好壞怎麼去評估。所以說第一步需要考慮的,我們這個reducible一共不就兩步嗎,一個bias,一個variance,我們如何減少bias?在考慮如何減少bias之前,首先要考慮如何評價bias,還是剛才那個理念,在改進它之前先要考慮好如何評價它。所以說我們在日常生活中用的怎麼評價bias,其實就是各種損失函式,你的loss function方程是什麼?剛才有同學說Cross Entropy。定義出來然後去優化它,這是我們後面會講的一個優化方法。
那麼如何減少 variance?就是正則化,這裡面就有一個延伸問題,就是常用的正則化方法,比如說 L2 正則、L1 正則,L1 正則很暴力,就把一些它認為沒有用的幹掉了,L2 正則它是限制一些引數的大小。這裡面其實可以有個問題給大家想想,為什麼限制引數的大小以及限制引數的數量就可以減少variance?這個問題其實和我剛才講的從假設集合那個角度去考慮它是有關係的,我們剛才有一個比較極端的圖,我們再回去看一下。它左邊是一個極端小的假設集合,右邊是極端大的一個假設集合,從一個很粗的角度去理解,就會發現這個假設集合裡面的東西如果特別少的話,它的穩定性就特別好。因為一共可選的就一個,極端情況下,那當然很穩定了。但是如果你可選的東西特別特別多,那你的東西自然就不會很穩定。所以說我們提供一個特別粗,這不是一個理論證明的角度去理解它。
那麼引數數量越少,取值越被限制,它的變化的可能性就越少,那麼它自然也就越穩定。所以說這就是正則化為什麼能夠約束 variance,為什麼能夠起到穩定模型的一種理解角度,其實就是我要減少你的假設集合的大小,不能讓你像孫猴子一樣到處跑,那你就不穩定了,我這次抓你在五指山,下次抓你上西天了,那就不好。把你放在一個籠子裡,這個籠子就這麼一畝見方,怎麼抓你也不會跑出這個東西里頭,所以它就是減少模型複雜度。模型複雜度其實特別簡單,就是引數越少,取值範圍越小,這個東西就越好。
那麼定義就是這麼一個定義方法。比如說在樹模型裡面可能就不是說引數大小,那可能就是剪枝。剪枝是幹什麼?剪枝其實也不是讓你跑太遠。比如每一層 2 分裂,每一層 2 分裂,就分裂很多很多,但是就不讓你分裂那麼多,因為分裂得越多,代表著越能生出很多不同種類的數來,當然就飄得很厲害了,這次抓你在這兒,下次抓你在那兒。所以說讓你穩定,就能減少方差。
優化方法,其實好多時候偏差和方差是在一起優化的,後面會講到。
OK,講到這兒,我們又往前走了一步,我們又知道了具體,我們剛才講的如何衡量損失,如何衡量一個 error,現在我們又知道了如何分別去衡量它倆,如何分別去衡量這兩個東西。
我已經定義好的假設集的好壞,又建立了定義一個模型的好壞,我們怎麼去得到一個比較好的東西?最理想的方法就是所謂的解析解,就是我們上學時候學的比如說二次方程、三次方程。這裡舉一個例子,就是最小二乘法。如果資料量不是很大的話,其實可以一步,單變數的一個線性模型的話,你可以一步就算出它的模型它的解來,它的 β0 就等於這個東西,它的 β1 就等於這個東西。但是這個東西太美好了,大部分情況下是得不到的。所以說我們還有一種方法,現在用得更多的方法,就是一個梯度法,尤其到了神經網路這一塊,感覺可能都是梯度到處走。梯度法的核心思想就是開局一個點,後面全靠挪,我就空降把你扔到一個點上,然後你就去找我究竟應該去哪裡。
它的核心思想就是我每走一步我都要比上一步更接近目標,它就是這麼一個思想,就是一個很樸素的思想,但是當它大規模推廣開以後會有非常好的效果。
我們選講一個,就是大家最常用的梯度下降的方法。梯度下降其實也是一個很直觀的方法,但是還是這樣,如果再深究一句為什麼梯度下降?可能我們還是需要再有一點點比較深入的想法,一些深入的理解在裡頭。
首先第一步,我們是有這樣一個結果,θ0,θ 是我們的引數,就是你要估的引數,就是權重,最簡單的理解。我們可以把它做一個約等於。這個東西是什麼?這個東西其實就是泰勒展開,就是最簡單的泰勒展開,也就是它在 x0附近的泰勒展開,就是 f(x0) 加上 θ 減去 θ0 乘以它的一個梯度,你看這個梯度開始出現了,這是它第一次限時。到這一步你看沒有建立梯度,我為什麼要往梯度的負方向走這樣一個概念。然後做一個變換,把右邊這個 θ 減去 θ0 變換成 n 乘以 v,因為 θ 減去 θ0 是一個向量,一個向量把它取標準化,v 是標準向量,標準向量是什麼?就是它的模等於1的這樣一個向量,然後n把它常數提出來,成了這樣一個形式。
然後我再做一個變換,把 f(θ) 減去 f(θ0),然後就等於右邊這個東西。大家看到最後有個小於 0,小於 0 是什麼意思?我要要求 f(x) 減去 f0,我們剛才講的開局一個點,後期全靠挪,但是有一個要求,必須每一步挪都比上一步更接近最優值。所以 f(x) 代表的是什麼?f(x) 代表的就是誤差,代表你的損失函式,loss 當然越小越好,損失越小越好,所以 f(x) 減去 f(x0) 我要求它是小於 0 的。所以說到這一步你可以怎麼理解?就是 θ0 是我當前點,是我當前這組引數,就是開局這個點,你空降到一個點了。然後你下一步走的這個 θ,我就一個要求,希望你要比我的 θ0 導致的誤差數要低,就是一個非常樸素的要求。然後我們把右邊這個約一下,把這個常數幹掉,就變成了v乘以這個梯度小於 0 了。
ok,下一步就是比較神奇的事情發生了,v 和後面這個梯度你看著它嚇唬人,但是它本身也是個向量,如果你是一維它就是一個常數,如果是多維的、高維的它就是個向量。
那麼我怎麼樣要求它乘它小於 0?。我們說回這個向量相乘,向量相乘小於 0 的條件是什麼?向量相乘和餘弦是有非常緊密關係的,簡單來講,兩個向量的夾角如果大於90度,它們倆向量相乘就小於 0,如果是小於 90 度就是大於 0 了。所以說我要求小於 0,我還要求你小於 0 得越厲害越好,就代表我這一步走得比你原來更接近最優值,更小,小得更厲害,那我就要你們去反向。比如說如果A是你的梯度的話,那我的v一定要是 B 方向,它倆乘起來這個值是最小的,對應的是 f(θ) 減去 f(θ0) 最小。然後再經過一些常數的變化,就得到這樣一個結果。
如果我們不考慮常數的話,那麼v就等於負的 f(θ0) 的梯度,負梯度方向。然後由於 v 是單位向量,所以我要除一個它的模。後面再把這個n加回來,因為常數和常數是可以合併的,θ 就變成 θ0 減去這個東西,這個其實就是非常地樸素。有的同學說 learning rate 要變化,是要變化,learning rate 反映在哪裡?反映在這個常數裡面,為什麼要 learning rate?這是另一個小的知識點,learning rate 其實是梯度下降能夠成立的一個基本原則。learning rate 如果太大,步子邁太大,它的展開就不成立,它的展開的前提是在 x0 附近的一個展開,如果步子太大你就已經不是附近了,而且learning rate 還有比較多的因素在裡面,但是作為今天入門課程裡面就不講了。
所以你看到雖然是負梯度方向,是一個看起來很直覺,因為很多老師都會給你講比喻,就像爬山一樣,往這個山的梯度的負方向走就對了,它很好直觀理解。但是你如果真的想深刻地理解它為什麼,還是要把它掰開了揉碎了去看一看。所以這個流程,我們給大家介紹最簡單的一個梯度下降的怎麼來的,就是從它的泰勒展開,一步一步。其中就兩個核心點,一個是它的梯度,一個就是負方向,就是兩個向量相反的方向是乘積最小的,負向最小的。ok,這就是一個優化方法。
優化方法有了之後你能夠得到什麼?優化方法有了以後你就能得到你夢寐以求的模型了,經過剛才那麼一長串,優化完了,你就會得到具體的引數,w1 是多少,w2 是多少,到這兒就完了,模型就出來了。但是完了嗎?其實還沒有完,為什麼?還有個決策理論在裡頭,決策理論是什麼東西?我舉一個簡單的例子。
模型擬合不是最終目的,擬合出模型來就像你買一個東西,你最終是要用它的。模型講一個最簡單的應用,它有兩種應用,一種是排序,一種是分類,比如說排序典型的 learning to rank 大家都在用,分類不用說,你做反欺詐,這是好人這是壞人。
這裡面就有一個問題,為什麼要按照 CTR 的高低排序,從高到低,為什麼從高到低排序?肯定要從高到低排,要不然還能從低到高排?這裡面大家的直覺是對的,因為很多數學理論用了就用了,它和直覺是一樣的,這是非常好的一件事情。還有比如說分類,為什麼書上就講分類閾值設為 0.5,這又是一個什麼意思?其實背後都是有更深刻的理論在裡頭。
比如說,其實大家可以簡單算算就可以得到一個結果,就是按照CTR從高到低排序,它得到的結果是期望總點選數是最大的。如果說你的目標就是期望總點選數,那麼你就按 CTR 排序,它從高到低排就是這個結果,它得到的就是期望總點選數是最大的,這就對齊了你的一個目標。
分類閾值對應的是一個什麼概念?就是一個稍微複雜一點的理論,叫做貝葉斯決策理論的其中一部分,我們這裡給大家簡單介紹一下。
左邊是公式,右邊是圖。我們做一個分類模型,設一個閾值,一定會有錯,我把閾值設為 0.5,我肯定會有分錯的,有的把應該是正的分成負的,應該是負的分成正的。右邊這個圖裡大家可以看到有紅色的一部分,右下角還有一個灰色的部分,這分別你可以理解為代表是兩類錯誤,一類錯誤是原來是正的你分成了負的,一類錯誤是應該是負的你分成了正的。
我們可以稍微看一眼左邊這個 P(error),就是錯誤概率是什麼?這兩邊面積加起來,積分積起來。那麼我自然就要想,那怎麼能把錯誤最小化?那麼對應到這個圖上來講,就是想要這個面積是最小的,我們先不管理論了,就是紅色面積加灰色面積要得到最小。大家動用一下你的空間想象能力你就會發現,這有個小三角,兩條線中間夾了個小三角,這個東西我要讓它更小。你發現這個線往左移一移,紅色面積再往左走一走,走到這個交叉點這兒,你會發現這個時候它面積最小。這個時候對應的是什麼?就是你把上面這個面積就幹掉了,上面這個面積是什麼?其實就是 reducible error,我們剛才講了半天,說 bias、variance,其實對應的就是這個東西,就對應到了你的reducible error。那麼你的模型如果把 reducible error 幹到最低,那你模型的Error就是最低的,你的error就只有下面這兩片小的面積。
所以說每一個分類閾值其實就對應了這樣一條豎直的線,你把它插在這個地方你就變為會有兩個 error 出現,如果你插在最中間這條線上,其實就是對應的 0.5 的分類閾值,0.5 的分類閾值對應的就是這條線。那麼這個對應的其實是一個什麼含義?它對應的含義是,把正例分錯和負例分錯,我付出的代價是一樣的。但是如果說,比如說你在一些 case 裡面,你把正例分成負例代價會非常嚴重。所以說你每個分的閾值對應的都是這上面的一條線,一條豎線,0.5 對應的就是交叉的這個線,在這個計算公式下面。如果你把閾值往高了提,紅色面積增大,灰色面積減小,那就是某一類錯誤會增大,某一類錯誤會減小。就是如果 0.5 的分類閾值對應的就是它倆的代價是相等的,犯第一類錯誤和犯第二類錯誤都可以接受,同等代價,但是很多場景,比如金融場景,寧可誤殺一個不能放過一個,這時候就不是 0.5 的分類閾值了,左邊這個複雜的公式就需要發生一個變化,會得到的就是另外一個結論。
這就是從模型得到決策的一個東西,因為貝葉斯這個決策理論稍微有一點複雜,尤其是貝葉斯錯誤率這個概念。
這個時候建立了決策理論,建立了模型,訓練出模型來,拿它去做決策。其實到這個時候,一條相對完整的脈絡就有了。我其實就是把剛才講的這些東西串了一遍。我們要知道問題的本質是資料擬合,然後需要出一個假設集合,比如說這就是大家經常問的,面試時候問的,給你一個問題你怎麼解?你用邏輯迴歸,還是決策樹?其實就在問假設集合是什麼。怎麼評估假設集合的好壞?其實就是說假設集合的好壞是 VC 維和偏差方差分解。這就是為什麼我們經常說線性模型非常好?因為它特別穩定,其實就是說它的方差特別低。
這個東西怎麼對映到現實的應用中?那就是交叉驗證,交叉驗證不僅能夠得到誤差,還能夠得到你的方差,就是在不同資料集上面去跑,得到一個什麼結果。我們還知道了一點,就是說方差低的一個最大的實惠,就是說有一個保證,保證你不管怎麼樣得到一個資料集,它的評估結果都和你得到所有資料集的評估結果相差不會太多,這是非常好的一個性質。
然後我們又知道了怎麼在一個模型裡面具體地衡量方差和偏差,那就是定義損失函式來衡量偏差,用智慧化的方法來控制方差。那麼就知道了正則化究竟是來幹什麼的,然後我還簡單聊了一下為什麼控制引數的個數和引數的取值,以及樹的深度的這些東西能夠起到減少方差的作用,因為它限制了假設集合的資料。你在這兒建立好了評價指標之後,終於可以去優化它了,那就有了各種優化方法,比如說基於梯度的方法,還有一些基於置信域的方法等等,我們就不展開了。
得到模型之後,你要拿它去用,無論是去做排序,還是做分類,拿它用的時候背後一定會有一個思想、原則在裡頭,就是為什麼這麼做閾值?我為什麼從高到低排序?有很多這樣的思想在裡頭。
到這裡就建立了一個從最初拿到資料的假設開始,一直到最終決策這樣一個鏈條。可以這麼講,就是你在機器學習中遇到的絕大部分的知識點都可以對映到這個鏈條當中的某一個環節。這是為什麼我們今天要從這個維度去講這些事情。
有了這個鏈條之後,還是之前強調的那一點,你能夠系統化地去學習一個東西。那麼這裡介紹幾點,就是如何構建你自己的知識網路。
第一,一定要謹慎對待“狗熊掰棒子式”的學習,因為特別容易忘,就是理解不深刻,總是東一個點西一個點,你沒有辦法建立這個知識點之間的有機聯絡。說遠點就談到碎片化閱讀這件事,碎片化閱讀我覺得它不適合所有的領域,包括機器學習你可以碎片化閱讀,但前提是什麼?你一定要建立起一個相對完整的知識體系,然後再在裡面,碎片化閱讀是什麼?就是貼葉子,枝幹已經有了,我這兒貼一個葉子,那兒貼一個葉子,慢慢的就有了這整個的知識體系了。
第二,MVP式擴充套件學習法。MVP 有的同學知道,就是最小可行產品。就是建立一個最小的可行的機器學習體系,比如我剛才講的,你只知道一種學習演算法,你就先只學邏輯迴歸,然後圍繞邏輯迴歸你把我剛才那條鏈條你都打通了,就構造出了一個 MVP 版的東西。它有點像什麼?有點像大家上高中數學的時候,老師講題,數學老師一般他會先講一個最簡單,根據定義最直觀好理解的做法,讓所有同學都能理解,然後他才會講一個所謂的高階做法,讓這些所謂的尖子生有一個取巧的辦法去做。這裡面其實也是一樣,一定要首先建立一個 MVP 的鏈條,麻雀雖小五臟俱全的這樣一個鏈條,然後再針對性地去補充,比如說你發現我只會一個模型不行,我去學模型,但是這時候你知道,它是落在了假設集合裡頭,我去補充模型。然後補充模型的時候就會講,我這個模型它的 bias 怎麼樣,variance 怎麼樣,它的優化方法是什麼。然後你看到比如說梯度下降它是個優化方法,比如置信域也是個優化方法,你就能知道你每個知識點落在什麼地方去了。
第三,看到新知識,擴充套件到對應的位置,不要讓它落單。比較忌諱你學零散的知識點,但是不能讓它落到某一個具體的系統位置裡面去。
就是這樣一些學習方法,有的同學在新學這個行業的時候,會感覺知識點特別多,感覺學不完的樣子。事實確實也學不完,但是一定要知道自己學的是哪一塊知識,然後也知道自己哪強哪塊弱,不至於看到什麼東西都想學。這就是自己的一個知識網路。
演算法工程能力入門
後面簡單說一下工程的問題。因為我之前在校招面試的時候,聊過一些東西,就是一些學生朋友把這個簡歷上寫得其實還蠻漂亮的,就是模型各方面都懂,但是讓大家寫一些題的時候,確實容易會差一點。一些簡單的,都談不上是演算法題目,一些簡單的面試題目都寫得不是特別好。然後也有同學在公眾號後臺問我怎麼學演算法這些東西。其實我相信大家學演算法的能力是很強的,你有這個驅動力,但是工程方面還是要加強。
這裡放了一張圖,這個圖是一個特別簡單的圖。上面那個圖可以說你的計劃從 A 到 B,騎著小車過去,下面是現實,你會發現好多好多坑。這其實代表一定程度上代表演算法工程師的一個窘境。一開始你覺得我學會模型了,我理論學得挺明白的,就可以走上人生巔峰了。但其實你會發現你真的到工作中做的時候,這些東西坑非常多,你一落地會有很多東西需要去加強,需要去夯實。
工程能力是很大的一個概念,它是非常大的一個概念,因為我是做演算法策略多一點,但是我也會接觸不同工程的東西,所以從我的角度去跟大家分享一下這個概念。它分兩方面,一方面是所謂的離線工程,它的核心內涵是什麼?就是支援快速、可維護、可規模化、可擴充套件的實現演算法。可能一開始你到一個公司,領導交給你這個小資料做一個模型,這算第一步,工程化,但是後面如果你是在一個業務快速增長的環節上,它一定會快速地需要很多模型在裡面,會加很多的特徵,加很多的樣本,加很多的問題在裡頭,所以就要求快速、可維護、可規模化、可擴充套件地去做很多問題。具體可能需要你做一些資料流的 pipeline,還要求你有一些邏輯抽象複用能力,最重要的還需要一個 Debug 能力。
資料流 pipeline 這塊其實現在工具也比較多,像 Spark 上面有很多實現比較好的東西,相當於牛人已經給你實現出很多東西來了,可以現成去用。
抽象邏輯複用能力,它和你做不做演算法沒有關係,這是一個工程師的基本素養,包括這個 Debug 能力是一個工程師的基本素養。
我覺得這方面有的同學如果純學理論,可能對這塊有點過於不重視了,但是在現實中如果抽象複用能力不夠的話,你會發現你每天都在寫一樣的東西。然後 Debug 能力不足那就更不用說了,尤其越複雜的模型,你結構不對,那你很難去除錯到一個合理的結果。這塊能力我還是希望,尤其是在校的同學,你一定要加強你的基礎程式設計能力,一定要知道演算法工程師他是一個偏正短語,他的核心詞還是工程師,他的核心還是工程師,你一定要是一個合格的工程師,你才能是一個演算法工程師,一定不能只看演算法倆字,不看工程師,只看演算法那叫研究員。
工程能力講的是線上工程能力,比如我們做一個模型它是要上線的,尤其比如推薦,可能需要一個線上實時的API去預測,那麼它的核心訴求是什麼?支援一個高效、高可用、穩定、可擴充套件地提供服務,企業裡面都是這樣一些要求,你要實時預測&訓練服務、實時資料讀取&更新、離線線上資料同步等等這些東西,這些也都是工程的同學需要去做的。但是作為一個演算法同學,你為什麼也要適當去了解這些東西?因為畢竟他要上線的是你做的東西,如果你做這個東西的時候完全不考慮說對方怎麼去用,其實問題到時候還會有很多反過來去報復你的。
離線和線上的考慮會有很大的不一樣,典型的有些分歧比如計算量,離線我們習慣於批量的計算,你算很大量的東西都沒關係,線上的話它會每次只算一條,它會對這方面要求比較高。還有複雜性、擴充套件性,要求其實都不一樣。離線的問題出了問題怎麼都好說,但是線上出了問題就很難講了。
這裡給大家一個簡單的建議,如何鍛鍊工程能力?
第一,勤奮+懶惰。勤奮是指你一定要勤於動手,看 paper,看演算法,但是一定要勤於動手。懶惰指的是什麼?就是不能太勤於動手,要做適當的抽象,適當的複用。因為我曾經有一些同學就是特別勤奮,100 個重複的任務他真的就提交 100 次,他沒有想辦法去做一些抽象,做一些複用,這個就是太勤奮了,作為工程師一定要有一定的懶惰,然後去抽象它。所以思考要勤奮,動手要適當地懶惰。
實踐其實特別簡單就是用自己的真實資料設計一個真實的場景,然後自己搭建一個流程,然後給自己不斷地加戲,演自己的對手戲,去不斷地鍛鍊。
這裡舉一個例子,比如線上工程,這個其實大家都可以去做,你是學生,你是做演算法,都可以去做這樣一個實驗。比如你去獲得一箇中等以上規模資料集,比如說你去爬一堆垃圾郵件資料集,這個網上還是蠻好獲取的。然後你離線隨便拿什麼東西訓練一個模型都ok。然後你嘗試著搭建一個線上服務,它要求什麼?我用郵件 ID 去請求,然後你去返回給我它是垃圾郵件的概率。這裡面涉及到什麼技術點?如何實時獲取特徵?因為你傳的是 ID,你需要實時獲取特徵。你得到特徵以後如何去獲取實時的權重?然後你如何去計算實時的概率?這些問題你在離線做的時候,可能調一個包就完成了,但是你線上做的時候,很多事情都是需要你自己去做的,你自己把這個東西從頭到尾做一遍,哪怕你就做一個小 demo,你就知道了我做這些東西需要考慮什麼點。那麼你在以後和工程同學配合的時候,你就知道你應該如何更好地去服務他,去配合他。
如果你覺得這個太小意思了,我做得很爽,那麼你再給自己加一點戲。比如說使用多種型別的特徵型別,比如有標籤類的,有向量類的,有統計量,你看一下你還能不能很好地實時地去處理它。然後你再引入很多特徵工程的方法,特徵交叉、按類細分等等,你看還能不能處理好它。然後再模擬一個高併發的請求環境,比如前面都處理得特別好,那很棒,但是你會發現,一次請求1秒鐘,太慢了,模擬高併發請求,服務還扛不扛得住?發現扛不住了,你看瓶頸在哪裡,如何做優化。這其實是一個很好的例子,如果是在校學生的話,你可以有充足的時間去實現這樣一個東西,來去打磨一下你的工程能力,其實你也可以找找感覺,我究竟喜歡做工程還是喜歡做模型。樂趣其實是不同的,大家也不要覺得現在這個世界上只有演算法工程師值錢,其實根本不是,後臺工程師也非常值錢。
今天知識點的分享基本就到這兒了,後面推薦一些資料。
第一個資料,有的同學已經知道了,就是 Learning from Data,其實我第一部分知識脈絡很大一部分都是從這本書裡去引入出來的,中文課程叫《機器學習基石》,英文也有一門課程,是一個加州理工的老師上的,非常地不錯。它重點是介紹一些基礎概念,比如說我這裡面沒有講可學習性,學習的可行性,VC 維,訓練和測試的關係等等。如果說模型是果實的話,其實基礎真的就是枝幹,特別適合作為第一次學習的一個課程和課本。這本書可能不會有很多人去推薦給你,但是我推薦你去看一下這本書,也不是很厚。
下一本書,也是很著名的一本書,這本書的中文翻譯應該叫《統計學習概論》,但是你搜 ISLR 估計就能搜到這本書。它是更重要的一本書,有人翻譯成《統計學習要素》,Elements of Statistical Learning 這本書的一個實踐應用版,它更好地平衡了實踐和應用之間的關係,它以實踐為目的,並且加以適量的理論講解。這本書中文版叫《統計學習導論》,大家可以去找一下。這本書有很多統計學角度的講解,反正我個人是比較喜歡這種角度的講解,它更深入理論層次或者更直達它的核心,我覺得非常有趣,能夠幫助你更深入地理解模型。我此前在 CSDN 上其實錄過一期這本書的課程,有興趣的同學在我的公眾號上回復這四個字母 ISLR 去獲取這些資料,有一些中文的和英文的學習資料。這本書還是非常推薦,如果你只讀一本上手型別的書,這本書更好。剛才那本書更多的是基礎理論的講解,這本書會有很多實際的講解,還有很多資料集和例子,非常地好。
下邊也是我重磅推薦的一本書,叫 ALL of Statistics,它沒有中譯本,你可以理解為它叫全部的統計學,但是你看它副標題是統計推論的一門簡練課程,是一個很精煉的課程,它其實是統計學的非常經典的一本教材,我也是偶然看到的,但是後來發現其實在國外還是蠻流行的一本教材,也就是二三百頁,簡短、全面,並且非常實用。剛才有的同學說我的概率都忘光了,我的統計都忘光了,你特別適合拿這本書來補補課,快速地能夠把一些東西補起來,然後還很適合做案邊參考,就放在你的手邊,有什麼問題,概念忘掉了,你就把這本書拿出來看一下。非常好的一本參考。
在課程最開始有人問我,說有沒有第一次入門的?其實我當時沒有想到這個問題,我就給這個分享起了這樣一個名字。但是這次分享的源頭應該是我去年在《程式設計師》上發表過這樣一篇文章,就是如何成為一名機器學習演算法工程師。它更實用,它會從模型、方法、工具的角度去切入,還有一些行業的角度去切入。我覺得它不能代替本次分享的內容,本次分享更多的是基礎脈絡的一些角度,這篇文章更多的是偏實踐,如果你把這方面內容掌握了,你去做一份工作還是沒有太大問題的。
QA環節
問:1.梯度下降和最小二乘在優化演算法模型時的實踐區別。
答:區別在於剛才講的最小二乘法那個例子它是一個解析解,它需要把所有的資料灌進去算一個式子出來的,但是在絕大部分情況下,這個資料量太大了,沒有辦法算出來。梯度下降它的好處是,尤其是現在比較流行的隨機梯度下降,它每次只取一小部分資料,在記憶體裡面是放得下的。所以說,我覺得更多的是一個實用性的區別。
問:2.MVP 流可以很快地掌握一種機器學習演算法,但在實際應用中某種演算法的效果不是最理想,可能有利於學習,但是難以解決問題。現在好多分類演算法模型源源不斷,精度有高有低,對演算法的選擇有什麼更好的建議?
答:這其實還是一個蠻典型的問題,我的建議:第一步,你還是從簡單模型做起,簡單模型不僅是說它簡單好用,關鍵它給你建立一個 base line,就是說你至少可以做到這個水平。其實它還有一個很好的點,就是它能夠證明你這個問題用機器學習能不能解。如果說你上一個線性模型或者說你上一個GBDT,這已經還算中等好的模型了,你發現對問題沒有任何幫助,那我覺得你現在就沒有必要去做機器學習模型。如果這個問題是一個機器學習可解的問題,那麼 GBDT 或者線性模型它一般都能夠取得一定的效果,然後你用一些深度的模型做,它肯定是有效果提升。但是如果你簡單模型或者中等複雜度模型,都一點效果沒有,那你這個模型,你這個問題大概率當前不是一個機器學習可解的問題,你可能需要從資料本身再去看一下這個問題是不是定義的不是特別好。
然後你在用簡單模型做這個問題的過程中,你對資料會有一個更好的認識,我的資料點是什麼,哪些特徵有用,這些東西對業務瞭解也是非常非常有用的。
問:3.偏差實際上針對整個樣本空間而言嗎?我們一般用什麼方法?
答:對,偏差是針對樣本空間而言,我們剛才那個式子它其實是一個概率的理論,因為它最起碼有個大意,它是個期望,就是說它是對所有資料集的偏差計算,但實際工作中我們還有個定律叫大數定律,就是說你的測試集只要足夠大,在它上面的估計結果是接近於真實的偏差結果的,所以說如果只是估計偏差的話,你取一個足夠大的測試集,一般來說效果是不錯的。
問:4.對於剛入門的人來說如何規劃學習路線,如何在較短的時間內掌握?
答:這個問題很好,也是我們這次想主要解決的問題,我覺得你需要從實踐和理論兩方面都需要去補充。理論的話可以看一下我今天推薦的第一本書和第二本書就夠了,而且第二本書看完,你的基本實踐能力我覺得也就差不多了,你再熟悉一門語言,熟悉一個工具庫的話,其實就不錯了,就可以上手了。
問:5.對於大資料開發人員有什麼比較好的建議和快速提升的方法?
答:快速提升,這個不好講,21 天學會機器學習,這個不是特別好講,我覺得還是不要太求快速,這是我個人建議,欲速則不達。如果只是想調個包,你想快速解決一個問題,其實可能還真的是可以蠻快速的,但是你如果想在這條路上走得比較遠的話,還是建議紮實一點,一步一個腳印,該學的東西最好都不要錯過,仔細地學一學。
問:6.正則化有什麼缺點?
答:正則化優點的反面就是它的缺點,它限制了方差,那麼它也會影響到偏差,因為它限制了搜尋空間,我們剛才講了一個核心概念,正則化其實是減少了你的假設集合空間,那麼一定程度它也就不讓你去所有的地方搜尋,如果最優解就是在某一個你不能搜尋的地方,那麼就搜不到它,就會影響偏差。
問:7.語言和演算法工程師有什麼直接聯絡嗎?
答:從理解演算法本身來說沒有聯絡,沒有太強聯絡,但是可能在應用方面會有一些聯絡,Python 可能用得多一點,Python 在演算法表達層面用得會多一點,比如說 TensorFlow,但是在內部執行的時候,其實蠻多還是用C++、JAVA 這種強勁的後臺語言去做的,因為這個東西畢竟效能會更好。
問:8.簡歷上比較看中什麼?
答:簡歷上最看中的是你做的專案做的是不是紮實,對於你機器學習的知識的廣度是一方面,但是更多的是你做的專案是不是真的做到位,還是隻是拿著 demo 程式碼跑了一遍 demo 的原型。
非常感謝大家。
(*本文為AI科技大本營原創文章,轉載請聯絡微信1092722531)
關於AI科技大本營線上公開課
AI科技大本營公開課是面向AI開發者、演算法工程師等IT從業人員及AI方向在校學生的系列免費課程。針對AI學習者實踐機會不足的痛點,我們特邀一線AI公司的技術負責人,將理論和實踐相結合,通過視訊直播+課件+答疑的形式打造了多門實踐類精品進階課程。
(本文為AI科技大本營原創文章,轉載請微信聯絡 1092722531)
精彩推薦
相關文章
- 基礎知識學習筆記筆記
- RxJava 學習筆記 -- 基礎知識RxJava筆記
- 機器學習基礎知識1機器學習
- 機器學習學習筆記——基本知識機器學習筆記
- 基於知識圖譜的人機對話系統 | 公開課筆記筆記
- C++基礎知識學習筆記(1)C++筆記
- C++基礎知識學習筆記(3)C++筆記
- GO 學習筆記 《1. 基礎知識》Go筆記
- Scikit-Learn 與 TensorFlow 機器學習實用指南學習筆記1 — 機器學習基礎知識簡介機器學習筆記
- Python學習筆記—day1—基礎知識Python筆記
- LiteOS學習筆記[01]-weharmonyos-基礎知識筆記
- Redis基礎知識(學習筆記3--Redlock)Redis筆記
- Redis基礎知識(學習筆記11--SDS)Redis筆記
- 資料庫學習筆記 - MySQL基礎知識資料庫筆記MySql
- 前端知識脈絡圖前端
- Redis基礎知識(學習筆記5--Redis Cluster)Redis筆記
- Redis基礎知識(學習筆記19--Redis Sentinel)Redis筆記
- 機器學習課程筆記機器學習筆記
- 圖解機器學* | 機器學*基礎知識圖解
- CAD學習筆記基礎課【圖層】筆記
- Redis基礎知識(學習筆記8--Redis命令(1))Redis筆記
- Redis基礎知識(學習筆記2--分散式鎖)Redis筆記分散式
- Redis基礎知識(學習筆記16--持久化 (2))Redis筆記持久化
- Redis基礎知識(學習筆記17--持久化 (3))Redis筆記持久化
- Redis基礎知識(學習筆記15--持久化 (1))Redis筆記持久化
- Redis基礎知識(學習筆記9--Redis命令(2))Redis筆記
- Redis基礎知識(學習筆記10--Redis命令(3))Redis筆記
- 技術分享 | Kubernetes 學習筆記之基礎知識篇筆記
- iOS開發學習筆記:基礎知識之代理模式之老王的故事iOS筆記模式
- Redis基礎知識(學習筆記22--分散式鎖 Redisson )Redis筆記分散式
- Redis基礎知識(學習筆記14--釋出/訂閱)Redis筆記
- Redis基礎知識(學習筆記18--主從叢集)Redis筆記
- Redis基礎知識(學習筆記1--五種基礎資料結構)Redis筆記資料結構
- vueX基礎知識點筆記Vue筆記
- sql基礎知識(筆記)(一)SQL筆記
- 麻省理工深度學習基礎公開課.ppt深度學習
- Android基礎知識學習Android
- React學習手記1--基礎知識React