1
為什么要學(xué)原理和公式推導(dǎo)
1)
現(xiàn)成的算法庫、學(xué)習(xí)框架。
數(shù)據(jù)輸入工具、框架中,
用幾行代碼指定模型的類型和參數(shù),
就能自動計算出結(jié)果。
2)
機器學(xué)習(xí)的原理和數(shù)學(xué)推導(dǎo)一定要學(xué)!
工具就像是武器,只是學(xué)會了這種武器最基本的招式和套路。
而理論學(xué)習(xí)即策略學(xué)習(xí),工具的活用,拆開綜合用,還有設(shè)計新工具
3)
我們將學(xué)到:
算法庫的安裝+庫函數(shù)的調(diào)用;
數(shù)據(jù)的 I/O 轉(zhuǎn)換。
會安裝幾個支持庫
會調(diào)幾個接口
4)
?DSAT 都 Fix 不了???
再多投入幾倍資源也達(dá)不到 95%——干脆直接用 Rule-Base 來解決?
……
ML/DL
新框架/工具/模型/算法
?TensorFlow?
?Caffe?
分類器
邏輯回歸
換成 RNN
5)
用這個譜聚類做數(shù)據(jù)預(yù)處理,歸根到底不還是利用詞袋模型算詞頻,
比直接計算 tf-idf 做排序能好多少呢?
6)
模型特質(zhì)
適用場景
數(shù)據(jù)匹配
算力和時間的消耗;
框架對軟硬件的需求和并行化的力度;
7)
針對技術(shù)需求,提供高質(zhì)量模型。
針對業(yè)務(wù)需求,提供高質(zhì)量的解決方案。
8)
優(yōu)化模型
選特征、調(diào)超參、換模型,
9)
?指標(biāo)有哪些,如何計算?
是怎么工作的?
超參數(shù)?
特征選取有哪些原則、方法可運用?
他們完全有可能針對具體業(yè)務(wù)問題,構(gòu)造出目標(biāo)函數(shù),甚至開發(fā)出符合自身軟硬件資源特點的求解算法。
?Google 一下 Best Practice
必須具備理論基礎(chǔ)和數(shù)學(xué)層面的建模能力才行。
————————————————
2
了解一件事是如何運行的,明晰事物發(fā)展的客觀規(guī)律,知道從最簡單的原理學(xué)著手逐層推進,比從一個已經(jīng)很復(fù)雜的狀態(tài)入手,一下子糾纏在各種不得要領(lǐng)的細(xì)節(jié)中要高效得多。
大多數(shù)人最常用的思維模型是 KV Pair,有些人似乎終身只有這一種思維模型。
對于原因和結(jié)果的關(guān)系,多數(shù)人根本沒想過去探究其轉(zhuǎn)換模型,而直接默認(rèn)是線性關(guān)系。
線性回歸模型:選定一些特征,針對每個特征獨立打分,最終加權(quán)求和(例如大學(xué)排名之類)。
問題待以后會回答:如何驗證打分
我分享出來只是想說明:學(xué)習(xí)機器學(xué)習(xí)原理和公式推導(dǎo),并非只是做一些無聊的數(shù)字變換。很可能由此為我們打開一扇窗,讓我們從新的角度看待世界,并為日常的思考過程提供更加可量化的方法。
3
以模型為驅(qū)動,了解“機器學(xué)習(xí)”的本質(zhì)
我選擇了幾種經(jīng)典模型
(例如:線性回歸、邏輯回歸、
決策樹、支持向量機、條件隨機場、
K 均值等),作為入門的進階。
一定要搞清楚其
問題域、模型函數(shù)、目標(biāo)函數(shù)、訓(xùn)練算法……潛入到數(shù)學(xué)公式推導(dǎo)的層面,
對每一步的公式變換和對應(yīng)的物理意義有所理解,然后再去實踐。
這一個個的模型,就是機器學(xué)習(xí)的“肌肉”,我們要通過觀察學(xué)習(xí)這一塊塊肌肉,
以其為載體來了解機器學(xué)習(xí)的核心——將事物轉(zhuǎn)化為數(shù)值,將關(guān)系、變換轉(zhuǎn)化為運算,以事實(數(shù)據(jù))為依據(jù),以規(guī)章(算法)為準(zhǔn)繩,通過計算來掌握事物的客觀規(guī)律(模型)。
要知道,這些經(jīng)典模型固然經(jīng)典,但是到了實際應(yīng)用中,它們并非神圣不可改變。也不是說機器學(xué)習(xí)就僅限于這些經(jīng)典模型。
只有掌握了機器學(xué)習(xí)精髓的人,才可能靈活運用現(xiàn)有模型去解決實際問題,甚至進一步針對具體問題得出自己的模型和算法。
反復(fù)學(xué)習(xí),從記憶到掌握
當(dāng)然,達(dá)到這種程度并非一蹴而就,總要從最簡單的模型開始。
。
多學(xué)幾遍,從頭到尾掌握整件事情的邏輯,知
掌握了事物內(nèi)在的邏輯,再去記憶,就容易多了。
學(xué)習(xí)標(biāo)準(zhǔn)設(shè)置得不必太高,比如可以這樣:
第一遍學(xué),只要求自己能完全掌握機器學(xué)習(xí)數(shù)據(jù)、模型、算法相互作用的基本關(guān)系,訓(xùn)練過程和評價標(biāo)準(zhǔn)。具體的模型,掌握最簡單的線性回歸就可以。
只要從頭到尾掌握了第一個模型,做到:能夠從模型函數(shù)開始推導(dǎo)出目標(biāo)函數(shù),再用梯度下降算法求解,用(偽)代碼實現(xiàn)梯度下降求解過程。
第一遍學(xué)習(xí)掌握一個模型;第二遍學(xué)習(xí)就不難掌握2-3個模型;第三遍就有可能掌握本課列出的大部分模型………如此由易到難,螺旋式推進。
對于一些本身就比較復(fù)雜的數(shù)學(xué)模型,比如條件隨機場、隱馬爾科夫這類涉及場論和勢函數(shù)的模型,如果直接入手,往往會卡在模型函數(shù)本身上。但是當(dāng)有了前面幾個模型的基礎(chǔ),了解了更抽象層面的原理,掌握起來就容易多了。
數(shù)學(xué)需要多精深?
。如果數(shù)學(xué)工具實在掌握得太少,最起碼也要讀懂一組公式推導(dǎo)中的第一個和最后一個式子:
讀懂它們都針對哪些變量進行了怎么樣的運算;
這些變量和運算的物理意義是什么;
第一個式子是對哪種真實場景的數(shù)學(xué)描述;
最后推導(dǎo)的結(jié)果又具備怎樣的特征。
enter image description here
兩條路徑反芻數(shù)學(xué)知識
所以,同學(xué)們應(yīng)力求理解每一步推導(dǎo)過程。
如果有可能,可以事先復(fù)習(xí)一下大學(xué)本科的高數(shù)(數(shù)學(xué)分析)、概率統(tǒng)計和線性代數(shù)?;蛘?,在學(xué)習(xí)模型的過程中,一旦遇到了數(shù)學(xué)上的阻礙,就回頭去查找相應(yīng)知識。
很多數(shù)學(xué)問題,之所以讓人頭大,其實并不是真的有多難,而是符號系統(tǒng)比較復(fù)雜,運算繁復(fù),或者運算所表達(dá)的物理意義多樣。
很多時候造成困擾是因為想不起來這里用到什么定理,哪個公式,或者這樣操作表達(dá)的含義是什么。
如果把常用的細(xì)小知識點都記錄下來,按主題整理成速查手冊(小字典),需要用的時候快速查找對應(yīng)的知識點,這樣我們的“機器學(xué)習(xí)”學(xué)習(xí)之路就順暢不少。
下面兩個是我自己制作的例子,供大家參考:
機器學(xué)習(xí)常用微積分知識速查手冊
機器學(xué)習(xí)常用線性代數(shù)知識速查手冊
日常學(xué)習(xí) Tips
記錄
準(zhǔn)備一個筆記本,紙質(zhì)版或電子版均可。有什么發(fā)現(xiàn)、感想、疑問、經(jīng)驗等等,全都記下來。
如果是對某個話題、題目有比較完整的想法,最好能夠及時整理成文,至少記錄下要點。
隔一段時間把筆記整理一下,把分散的點滴整理成塊,一點點填充自己的“思維地圖”。
分享
知識技能這種東西,學(xué)了,就得“炫耀”——把學(xué)習(xí)到的新知識、理論、方法,分享給更多的人。
如此一來,倒逼自己整理體系、記憶要點。這可以說是與人方便自己方便的最佳實例。
把自己的感想、體會、經(jīng)驗分享出來的同時,也鍛煉了自己的邏輯思維能力和歸納總結(jié)能力。一舉多得,何樂而不為?
以上談到的關(guān)聯(lián)、記錄、分享的內(nèi)容,大家都可以通過社群內(nèi)的學(xué)習(xí)筆記來提交。我會挑選優(yōu)秀的內(nèi)容進行點評和回復(fù)。
4
第04課:為什么要學(xué) Python 以及如何學(xué) Python
理解原理——涉及動手實踐
去訓(xùn)練一個模型,測試一些數(shù)據(jù),編寫一個算法
那些公式、函數(shù)、算法才能真的在頭腦中留下印象。
Python 是一種說人話的語言
開發(fā)者不需要關(guān)注底層;
不用自己費心照顧存儲、網(wǎng)絡(luò)等資源。
處理大量非結(jié)構(gòu)化數(shù)據(jù)
Python 的動態(tài)類型設(shè)計正好
語法簡單直觀,
表達(dá)形式一致。
Python 的設(shè)計理念就是讓不同的人所用的表達(dá)形式一致。
容易讀懂,容易整合。
直接運行。
一條條語句可以直接作為命令行運行
大量機器學(xué)習(xí)支持庫
研究人員和數(shù)據(jù)科學(xué)家,編程語言本身于他們而言僅僅是一種工具。
作為回報,他們向 Python 反哺了大量用于數(shù)據(jù)處理和機器學(xué)習(xí)的支持庫。
?NumPy 和 sklearn(scikit-learn)。
TensorFlow、Caffe 之類的深度學(xué)習(xí)框架,主體都是用 Python 來實現(xiàn),提供的原生接口也是 Python。
怎么學(xué) Python
買書當(dāng)然可以,不過不是必須,特別是,當(dāng)你學(xué)習(xí)編程的目的是要訓(xùn)練機器學(xué)習(xí)模型的時候。
個人認(rèn)為,
閱讀官網(wǎng)文檔或中文版教程
https://docs.python.org/3.7/tutorial/index.html
https://docs.python.org/3.7/index.html,
并在實踐中通過 Stack Overflow 直接查找所需實現(xiàn)問題的 Solution,
可能是比讀書更好的學(xué)習(xí)編程語言的方法。
推薦這本:由 Eric Matthes 撰寫的《Python 編程從入門到實踐》。
不管買不買書,下面的過程都差不多。個人建議按照下面的順序入手 Python。
(1)安裝 Python 運行環(huán)境。
就選 Python 3吧。
第一步,在你的系統(tǒng)上安裝好 Python 3。
(2)編寫第一個 Python 程序:“Hello world”。
雖然有效代碼只有:print(”hello world”)。
但注意,你需要嘗試至少三種不同的運行方法:
在命令行直接運行;
編寫一個 Python 文件,將 print hello world 封裝為一個函數(shù),通過 main 函數(shù)調(diào)用它來運行;
編寫一個 class,將 print hello world 封裝為一個 method,通過 main 函數(shù)創(chuàng)建 class 實例來運行 method。
(3)編寫一個或者多個復(fù)雜點的程序,用(2)中第2種或第3種方式執(zhí)行。
具體程序的功能可以自己定義,目的是借此了解下面這些概念:數(shù)據(jù)類型、變量、函數(shù)、參數(shù)、返回值、調(diào)用、遞歸……
學(xué)習(xí)流程控制:順序、條件、循環(huán)。
搞清幾種不同類型:array、list、dict、set 的用法。
在這個過程中,學(xué)習(xí)什么是靜態(tài)類型、什么是動態(tài)類型、什么是強類型、什么是弱類型,這些不同設(shè)計的目的和應(yīng)用場景分別是什么。
如果你實在不知道寫什么程序好,那就寫寫 binary search 和 quick sorting 吧。并順便嘗試一下遞歸和非遞歸的不同實現(xiàn)。
——這塊聽不懂
(4)編寫程序練習(xí)文件讀寫,文件和目錄操作。
如果使用支持庫封裝好的模型算法,
把數(shù)據(jù)在文件和各種類型的變量之間導(dǎo)來導(dǎo)去。
(所以務(wù)必學(xué)會將 tsv、csv 之類的文件讀入 array、list、dict 等結(jié)構(gòu)
以及將這些變量打印到文本文件中的方法。)——不會
(5)開始寫第一個機器學(xué)習(xí)程序。
(首先 import numpy 和 sklearn。
之前當(dāng)然要安裝這兩個支持庫,
一般安裝支持庫使用 apt-get 或者 pip,可以根據(jù)需要選用。)——不會
其次,找一個模型,比如 Logistic Regression,
網(wǎng)絡(luò)搜索該模型訓(xùn)練和測試的 Example Code,運行后看結(jié)果,
并閱讀 Example Code(下面是個例子)。
? ? from numpy import *?
? ? from sklearn.datasets import load_iris? ? # import datasets?
? ? # load the dataset: iris?
? ? iris = load_iris()?
? ? samples = iris.data?
? ? #print samples?
? ? target = iris.target?
? ? # import the LogisticRegression?
? ? from sklearn.linear_model import LogisticRegression?
? ? classifier = LogisticRegression()? # 使用類,參數(shù)全是默認(rèn)的?
? ? classifier.fit(samples, target)? # 訓(xùn)練數(shù)據(jù)來學(xué)習(xí),不需要返回值?
? ? x = classifier.predict(array([5, 3, 5, 2.5]).reshape(1,-1))? # 測試數(shù)據(jù),分類返回標(biāo)記?
? ? print x?
一則學(xué)習(xí) sklearn 和 Numpy 庫函數(shù)的調(diào)用,
一方面對 LR 有個感性認(rèn)識?!欢?/p>
(6)自己設(shè)置一個實際問題,并準(zhǔn)備數(shù)據(jù)。修改(5)的程序,用自己的數(shù)據(jù)訓(xùn)練并測試模型。
——懂也不懂以前
(7)逐行解讀(6)中調(diào)用的 sklearn 函數(shù)的實現(xiàn)代碼,
結(jié)合該模型的原理,對比印證,徹底搞懂一個算法的實現(xiàn)細(xì)則。
——同上
比如例子中的:classifier.fit() 和 classifier.predict()。
(8)不依賴 sklearn,自己動手實現(xiàn)一個訓(xùn)練 LR 模型的算法。
完成上面這些步驟后,你算是可以用 Python 輔助學(xué)習(xí)機器學(xué)習(xí)基礎(chǔ)知識了。
以上就是緒論部分需要學(xué)習(xí)的內(nèi)容,不知道同學(xué)們通過這兩天是否對為什么學(xué)習(xí)和怎么學(xué)習(xí)有了更深的理解?請把你的心得和問題通過學(xué)習(xí)筆記提交出來吧,我們一起研究,共同進步。