作為一個數(shù)學(xué)系出身,半路出家開始搞機器學(xué)習(xí)的人,在學(xué)習(xí)機器學(xué)習(xí)的過程中自然踩了無數(shù)的坑,也走過很多本不該走的彎路。于是很想總結(jié)一份如何入門機器學(xué)習(xí)的資料,也算是為后來人做一點點微小的貢獻。
▌前言
在 2016 年 3 月,隨著 AlphaGo 打敗了李世乭,人工智能開始大規(guī)模的進入人們的視野。不僅是互聯(lián)網(wǎng)的工程師們很關(guān)注人工智能的發(fā)展,就連外面的吃瓜群眾也開始關(guān)注人工智能對日常生活的影響。隨著人臉識別能力的日益增強,個性化新聞推薦 App 的橫行天下,TensorFlow 等開源工具被更多的人所知曉,于是就有越來越多的人開始逐步的轉(zhuǎn)行到人工智能的領(lǐng)域,無論是計算機出身的后臺開發(fā)人員,電子通信等工程師,還是數(shù)學(xué)物理等傳統(tǒng)理科人士,都有人逐步開始轉(zhuǎn)行到機器學(xué)習(xí)的領(lǐng)域。
作為一個轉(zhuǎn)行的人,自然要介紹一下自己的專業(yè)背景。筆者在本科的時候的專業(yè)是數(shù)學(xué)與應(yīng)用數(shù)學(xué),外行人可以理解為基礎(chǔ)數(shù)學(xué)。在博士期間的研究方向是動力系統(tǒng)和分形幾何,所做的還是基礎(chǔ)數(shù)學(xué),和計算機的關(guān)系不大。
如果有人想了解筆者究竟在做什么科研的話,可以參考知乎文章“復(fù)動力系統(tǒng)(1)--- Fatou集與Julia集"。至于機器學(xué)習(xí)的話,在讀書期間基本上也沒接觸過,甚至沒聽說過還有這種東西。不過在讀書期間由于專業(yè)需要,C++ 之類的代碼還是能夠?qū)懸恍┑模?UVA OJ 上面也留下過自己的足跡。
▌2015 年:嘗試轉(zhuǎn)型
行路難,行路難,多歧路,今安在?
在 2015 年畢業(yè)之后機緣巧合,恰好進入騰訊公司從事機器學(xué)習(xí)的相關(guān)工作。不過剛進來的時候壓力也不小,現(xiàn)在回想起來的話,當時走了一些不該走的彎路。用李白的《行路難》中的詩詞來描述當時的心情就是“行路難,行路難,多歧路,今安在?”
在 2015 年 10 月份,第一次接觸到一個不大不小的項目,那就是 XX 推薦項目。而這個項目是當時組內(nèi)所接到的第二個推薦項目,當年的推薦系統(tǒng)還是搭建在大數(shù)據(jù)集群上的,完全沒有任何說明文檔和前端頁面,當時的整個系統(tǒng)和全部流程復(fù)雜而繁瑣。不過在接觸這個系統(tǒng)的過程中,逐步開始學(xué)習(xí)了 Linux 操作系統(tǒng)的一些簡單命令,SQL 的使用方法。
了解 SQL 的話其實不只是通過了這個系統(tǒng),通過當時的 ADS 值班,幫助業(yè)務(wù)方提取數(shù)據(jù),也把 SQL 的基礎(chǔ)知識進一步的加深了。SQL 的學(xué)習(xí)的話,在2015年讀過兩本非常不錯的入門教材《SQL基礎(chǔ)教程》與《HIVE編程指南》。Linux 的相關(guān)內(nèi)容閱讀了《Linux 命令行與 Shell 腳本編程大全》之后也就大概有所了解了。于是工作了一段時間之后,為了總結(jié)一些常見的 SQL 算法,寫過一篇文章 "HIVE基礎(chǔ)介紹"。
在做推薦項目的過程中,除了要使用 SQL 來處理數(shù)據(jù),要想做機器學(xué)習(xí),還需要了解常見的機器學(xué)習(xí)算法。當年接觸到的第一個機器學(xué)習(xí)算法就是邏輯回歸(Logistic Regression),既然提到了機器學(xué)習(xí)的邏輯回歸,無法避免的就是交叉驗證的概念,這個是機器學(xué)習(xí)中的一個基本概念。
通過物品的類別屬性和用戶的基本特征來構(gòu)造出新的特征,例如特征的內(nèi)積(inner product)。后來在學(xué)習(xí)的過程中逐步添加了特征的外積和笛卡爾積,除了特征的交叉之外,還有很多的方法來構(gòu)造特征,例如把特征標準化,歸一化,離散化,二值化等操作。除了構(gòu)造特征之外,如何判斷特征的重要性則是一個非常關(guān)鍵的問題。
最常見的方法就是查看訓(xùn)練好的模型的權(quán)重,另外還可以使用 Pearson 相關(guān)系數(shù)和 KL 散度等數(shù)學(xué)工具來粗糙的判斷特征是否有效。在此期間也寫過一些文章“交叉驗證”,“特征工程簡介”,“KL散度”。關(guān)于特征工程,除了閱讀一些必要的書籍之外,最重要的還是要實踐,只有實踐才能夠讓自己的經(jīng)驗更加豐富。
在做推薦系統(tǒng)的時候,之前都是通過邏輯回歸算法(Logistic Regression)離線地把模型的權(quán)重算好,然后導(dǎo)入線上系統(tǒng),再進行實時的計算和打分。除了離線的算法之外,在 2015 年的 12 月份了解到了能夠在線學(xué)習(xí)的 FTRL 算法。調(diào)研了之后在 2016 年初在組內(nèi)進行了分享,同時在zr9558.com上面分享了自己的總結(jié),最近把該文章轉(zhuǎn)移到自己的微信公眾號上“Follow the Regularized Leader”。
在做 XX 推薦項目的過程中,了解到了數(shù)據(jù)才是整個機器學(xué)習(xí)項目的基石,如果數(shù)據(jù)的質(zhì)量不佳,那就需要進行數(shù)據(jù)的預(yù)處理,甚至推動開發(fā)人員去解決數(shù)據(jù)上報的問題。通常來說,要想做好一個推薦項目,除了特征工程和算法之外,最重要的就是數(shù)據(jù)的核對。當時的經(jīng)驗是需要核對多方的數(shù)據(jù),那就是算法離線計算出來的結(jié)果,線上計算出來的結(jié)果,真實產(chǎn)品中所展示的結(jié)果這三方的數(shù)據(jù)必須要完全一致,一旦不一致,就需要復(fù)盤核查,而不是繼續(xù)推進項目。在此期間,踩過無數(shù)的數(shù)據(jù)的坑,因此得到的經(jīng)驗就是一定要反復(fù)的核查數(shù)據(jù)。
▌2016:從零到一
站在巨人的肩膀上,才能看得更遠。-—學(xué)習(xí)推薦系統(tǒng)
“站在巨人的肩膀上,才能看得更遠。”到了 2016 年的 2 月份,除了 XX 推薦項目的首頁個性化調(diào)優(yōu)算法之外,還開啟了另外一個小項目,嘗試開啟首頁的 tab,那就是針對不同的用戶推薦不同的物品。這個小項目簡單一點的做法就是使用 ItemCF 或者熱傳導(dǎo)傳播的算法,在用戶收聽過某個節(jié)目之后,就給用戶推薦相似的節(jié)目。
這種場景其實在工業(yè)界早就有了成功的案例,也不算是一個新的場景。就好比與用戶在某電商網(wǎng)站上看中了某本書,然后就被推薦了其他的相關(guān)書籍。之前也寫過一篇推薦系統(tǒng)的簡單算法“物質(zhì)擴散算法”,推薦給大家參考一下。至于 ItemCF 和熱傳導(dǎo)算法的相關(guān)內(nèi)容,會在后續(xù)的 Blog 中持續(xù)完善。
“讀書千遍,其義自見。”在使用整個推薦系統(tǒng)的過程中,筆者只是大概知道了整個系統(tǒng)是如何搭建而成的。而要整體的了解機器學(xué)習(xí)的相關(guān)算法,光做項目則是遠遠不夠的。在做推薦業(yè)務(wù)的這段時間,周志華老師的教材《機器學(xué)習(xí)》在2016年初上市,于是花了一些時間來閱讀這本書籍。但是個人感覺這本書難度不大,只是需要另外一本書結(jié)合著看才能夠體會其中的精妙之處,那就是《機器學(xué)習(xí)實戰(zhàn)》。在《機器學(xué)習(xí)實戰(zhàn)》中,不僅有機器學(xué)習(xí)相關(guān)算法的原理描述,還有詳細的源代碼,這足以讓每一個初學(xué)者從新手到入門了。
路漫漫其修遠兮,吾將上下而求索
說到從零到一,其實指的是在這一年體驗了如何從零到一地做一個新業(yè)務(wù)。到了 2016 年的時候,為了把機器學(xué)習(xí)引入業(yè)務(wù)安全領(lǐng)域,在部門內(nèi)部成立了 XX 項目組,這個項目在部門內(nèi)部其實并沒有做過大規(guī)模的嘗試,也并沒有成功的經(jīng)驗,甚至也沒有一個合適的系統(tǒng)讓人使用,而且安全業(yè)務(wù)和推薦業(yè)務(wù)基本上不是一回事。
因為對于推薦系統(tǒng)而言,給用戶的推薦是否準確決定了 CTR 是否達標,但是對于安全系統(tǒng)而言,要想上線打擊黑產(chǎn)的話,準確率則需要 99% 以上才行。之前的推薦系統(tǒng)用得最多的算法就是邏輯回歸,而且會存儲物品和用戶的兩類特征,其余的算法主要還是 ItemCF 和熱傳導(dǎo)算法。這就導(dǎo)致了當時做 XX 項目的時候,之前的技術(shù)方案并不可用,需要基于業(yè)務(wù)安全的實際場景來重新搭建一套框架體系。
但是當時做安全項目的時候并沒有實際的業(yè)務(wù)經(jīng)驗,而且暫定的計劃是基于 XX1 和 XX2 兩個業(yè)務(wù)來進行試點機器學(xué)習(xí)。為了做好這個項目,一開始筆者調(diào)研了幾家號稱做機器學(xué)習(xí)+安全的初創(chuàng)公司,其中調(diào)研的最多的就是 XX 這家公司,因為他們家發(fā)表了一篇文章,里面介紹了機器學(xué)習(xí)如何應(yīng)用在業(yè)務(wù)安全上,那就是搭建一套無監(jiān)督+有監(jiān)督+人工打標簽的對抗體系。筆者還是總結(jié)了當時兩三個月所學(xué)的異常點檢測算法,文章的鏈接如下:“異常點監(jiān)測算法(一)”,“異常點檢測算法(二)”,“異常點檢測算法(三)”,“異常點檢測算法綜述”。
在 2016 年底的時候,說起來也是機緣巧合,有的同事看到了我在 2016 年 11 月份發(fā)表的文章,就來找筆者探討了一下如何構(gòu)建游戲 AI。當時筆者對游戲AI的應(yīng)用場景幾乎不了解,只知道 DeepMind 做出了 AlphaGo,在 2013 年使用了深度神經(jīng)網(wǎng)絡(luò)玩 Atari 游戲。在12月份花費了一定的時間研究了強化學(xué)習(xí)和深度學(xué)習(xí),也搭建過簡單的 DQN 網(wǎng)絡(luò)進行強化學(xué)習(xí)的訓(xùn)練。通過幾次的接觸和交流之后總算 2017 年 1 月份做出一個簡單的游戲 AI,通過機器學(xué)習(xí)也能夠進行游戲 AI 的自主學(xué)習(xí)。雖然不在游戲部門,但是通過這件事情,筆者對游戲 AI 也產(chǎn)生了濃厚的興趣,撰寫過兩篇文章“強化學(xué)習(xí)與泛函分析”,“深度學(xué)習(xí)與強化學(xué)習(xí)”。
▌2017 年:再整旗鼓
在做日常項目的同時,在 2017 年也接觸量子計算。在后續(xù)幾個月的工作中,持續(xù)調(diào)研了量子計算的基礎(chǔ)知識,一些量子機器學(xué)習(xí)的技術(shù)方案,寫了兩篇文章“量子計算(一)”,“量子計算(二)”介紹了量子計算的基礎(chǔ)概念和技巧。
三十功名塵與土,八千里路云和月
提到再整旗鼓,其實指的是在 2017 年再次從零到一的做全新的項目。到了 2017 年 7 月份,隨著業(yè)務(wù)安全的機器學(xué)習(xí)框架已經(jīng)逐漸完善,XX 項目也快走到了尾聲,于是就又有了新的項目到了自己的手里,那就是織云智能運維項目。運營中心這邊還在探索和起步階段,業(yè)界的智能運維(AIOPS)的提出也是在2017年才逐步開始,那就是從手工運維,自動化運維,逐步走向人工智能運維的階段,也就是所謂的 AIOPS。只有這樣,運營中心才有可能實現(xiàn)真正的咖啡運維階段。
正式接觸到運維項目是 2017 年 8 月份,從跟業(yè)務(wù)運維同學(xué)的溝通情況來看,當時有幾個業(yè)務(wù)的痛點和難點。例如:織云Monitor 時間序列的異常檢測,哈勃的根因分析,織云ROOT 系統(tǒng)的根源分析,故障排查,成本優(yōu)化等項目。在 AIOPS 人員短缺,并且學(xué)術(shù)界并不怎么研究這類技術(shù)方案的前提下,如何在運維中開展機器學(xué)習(xí)那就是一個巨大的難題。就像當年有神盾系統(tǒng),無論怎么做都可以輕松的接入其余推薦業(yè)務(wù),并且也有相對成熟的內(nèi)部經(jīng)驗,學(xué)術(shù)界和工業(yè)界都有無數(shù)成功的案例。但是智能運維這一塊,在 2017 年才被推廣出來,之前都是手工運維和 DevOps 的一些內(nèi)容。于是,如何盡快搭建一套能夠在部門內(nèi)使用的智能運維體系就成了一個巨大的挑戰(zhàn)。面臨的難題基本上有以下幾點:
1. 歷史包袱沉重
2. AIOPS 人員短缺
3. 沒有成熟的系統(tǒng)框架
在這種情況下,外部引進技術(shù)是不可能了,只能夠靠自研,合作的同事主要是業(yè)務(wù)運維和運營開發(fā)。當時第一個接觸的智能運維項目就是哈勃的多維下鉆分析,其業(yè)務(wù)場景就是一旦發(fā)現(xiàn)了成功率等指標下跌之后,需要從多維的指標中精準的發(fā)現(xiàn)異常,例如從運營商,省份,手機等指標中發(fā)現(xiàn)導(dǎo)致成功率下跌的原因,這就是經(jīng)典的根因分析。這一塊在調(diào)研之后發(fā)現(xiàn),主要幾篇文章可以參考,綜合考慮了之后撰寫了一份資料,那就是“根因分析的探索”。PS:除了哈勃多維下鉆之外,個人感覺在 BI 智能商業(yè)分析中,其實也可以是這類方法來智能的發(fā)現(xiàn)“為什么DAU下跌?”“為什么收入沒有達到預(yù)期”等問題。
除了哈勃多維下鉆之外,織云Monitor 的時間序列異常檢測算法則是更為棘手的項目。之前的 Monitor 異常檢測算法,就是靠開發(fā)人員根據(jù)曲線的特點設(shè)定三個閾值(最大值,最小值,波動率)來進行異常檢測。這樣的結(jié)果就是準確率不準,覆蓋率不夠,人力成本巨大。在上百萬條曲線都需要進行異常檢測的時候,每一條曲線都需要人工配置閾值是完全不合理的。于是,導(dǎo)致的結(jié)果就是每周都需要有人值班,有了問題還不一定能夠及時發(fā)現(xiàn)。而對于時間序列算法,大家通常能夠想到的就是 ARIMA 算法,深度學(xué)習(xí)的 RNN 與 LSTM 算法,F(xiàn)acebook 近期開源的 Prophet 工具。這些方法筆者都調(diào)研過,并且未來會撰寫相關(guān)的文章介紹 ARIMA,RNN,Prophet 的使用,歡迎大家交流。
其實以上的幾種時間序列預(yù)測和異常檢測算法,主要還是基于單條時間序列來做的,而且基本上是針對那些比較平穩(wěn),具有歷史規(guī)律的時間序列來進行操作的。如果針對每一條曲線都單獨搭建一個時間序列模型的話,那和閾值檢測沒有任何的區(qū)別,人力成本依舊巨大。而且在 織云Monitor 的實際場景下,這些時間序列異常檢測模型都有著自身的缺陷,無法做到“百萬條KPI曲線一人挑”的效果。
于是在經(jīng)歷了很多調(diào)研之后,我們創(chuàng)新性地提出了一個技術(shù)方案,成功的做到了“百萬條曲線”的異常檢測就用幾個模型搞定。那就是無監(jiān)督學(xué)習(xí)的方案加上有監(jiān)督學(xué)習(xí)的方案,第一層我們使用無監(jiān)督算法過濾掉大部分的異常,第二層我們使用了有監(jiān)督的算法來提升準確率和召回率。
在時間序列異常檢測的各類算法中,通常的論文里面都是針對某一類時間序列,使用某一類模型,效果可以達到最優(yōu)。但是在我們的應(yīng)用場景下,見過的曲線千奇百怪,筆者都說不清楚有多少曲線的形狀,因此只用某一類時間序列的模型是絕對不可取的。但是,在學(xué)習(xí)機器學(xué)習(xí)的過程中,有一種集成學(xué)習(xí)的辦法,那就是把多個模型的結(jié)果作為特征,使用這些特征來訓(xùn)練一個較為通用的模型,從而對所有的 織云Monitor 時間序列進行異常檢測。這一類方法筆者總結(jié)過,那就是“時間序列簡介(一)”,最終我們做到了“百萬條曲線一人挑”,成功去掉了制定閾值的業(yè)務(wù)效果。
走向未來
亦余心之所善兮,雖九死其猶未悔。
在轉(zhuǎn)行的過程中,筆者也走過彎路,體會過排查數(shù)據(jù)問題所帶來的痛苦,經(jīng)歷過業(yè)務(wù)指標達成所帶來的喜悅,感受過如何從零到一搭建一套系統(tǒng)。在此撰寫一篇文章來記錄筆者這兩年多的成長經(jīng)歷,希望能夠盡微薄之力幫助到那些有志向轉(zhuǎn)行來做機器學(xué)習(xí)的人。從這兩年做項目的經(jīng)歷來看,要想從零到一地做好項目,在一開始就必須要有一個好的規(guī)劃,然后一步一步的根據(jù)項目的進展調(diào)整前進的方向。但是如果沒有一個足夠的知識積累,就很難找到合適的前進方向。
“亦余心之所善兮,雖九死其猶未悔。”在某些時候會有人為了短期的利益而放棄了一個長遠的目標,但是如果要讓自己走得更遠,最佳的方案是讓自己和團隊一起成長,最好的是大家都擁有一個長遠的目標,不能因為一些微小的波動而放任自己。同時,如果團隊或個人急于求成,往往會導(dǎo)致失敗,而堅持不懈的學(xué)習(xí)則是做科研和開展工作的不二法門。
詩人陸游曾經(jīng)教育過他的后輩:“汝果欲學(xué)詩,功夫在詩外”。意思是說,如果你想真正地寫出好的詩詞,就要在生活上下功夫,去體驗生活的酸甜苦辣,而不是抱著一本詩詞歌賦來反復(fù)閱讀。
如果看過天龍八部的人就知道,鳩摩智當時上少林寺去挑戰(zhàn),在少林高僧面前展示出自己所學(xué)的少林七十二絕技,諸多少林高僧無不大驚失色。而當時的虛竹在旁邊觀戰(zhàn),就對少林高僧們說:“鳩摩智所耍的招數(shù)雖然是少林絕技,但是本質(zhì)上卻是使用小無相功催動出來的。雖然招數(shù)相同,但是卻用的道家的內(nèi)力。”為什么少林的高僧們沒有看出來鳩摩智武功的關(guān)鍵之處呢,那是因為少林高僧們在練功的時候,一直抱著武學(xué)秘籍在修煉,一輩子練到頭了也就13門絕技。
其實從鳩摩智的個人修煉來看,修練武學(xué)的關(guān)鍵并不在武學(xué)秘籍里。沒有找到關(guān)鍵的佛經(jīng),沒有找到運功的法門,無論抱著武學(xué)秘籍修煉多少年,終究與別人有著本質(zhì)上的差距。
筆者在 SNG 社交網(wǎng)絡(luò)運營部的這兩年多,用過推薦項目,做過安全項目,正在做運維項目,也算是部門內(nèi)唯一一個(不知道是否準確)做過三種項目的人,使用過推薦系統(tǒng),從零到一搭建過兩個系統(tǒng)。目前筆者的個人興趣集中在 AIOPS 這個場景下,因為筆者相信在業(yè)務(wù)運維這個傳統(tǒng)領(lǐng)域,機器學(xué)習(xí)一定有著自己的用武之地。相信在不久的將來,AIOPS 將會在運維上面的各個場景落地,真正的走向咖啡運維。
-
人工智能
+關(guān)注
關(guān)注
1792文章
47442瀏覽量
239009 -
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8425瀏覽量
132775
原文標題:如何從0到1開始機器學(xué)習(xí)?
文章出處:【微信號:AI_Thinker,微信公眾號:人工智能頭條】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論