圖像是貓還是狗纫事?情感是正還是負(fù)?貸還是不貸所灸?這些問題丽惶,該如何使用合適的機(jī)器學(xué)習(xí)模型來解決呢?
問題
暑假后爬立,又有一批研究生要開題了钾唬。這幾天陸續(xù)收到他們發(fā)來的研究計(jì)劃大綱。
其中好幾個(gè)侠驯,打算使用機(jī)器學(xué)習(xí)做分類抡秆。
但是,從他們的文字描述來看吟策,不少人對(duì)機(jī)器學(xué)習(xí)進(jìn)行分類的方法儒士,還是一知半解。
考慮到之前分享機(jī)器學(xué)習(xí)處理分類問題的文章檩坚,往往針對(duì)具體的任務(wù)案例着撩。似乎對(duì)分類問題的整體步驟與注意事項(xiàng)诅福,還沒有詳細(xì)論述過。于是我決定寫這篇文章睹酌,幫他們梳理一下权谁。
他們和你一樣剩檀,也是我專欄的讀者憋沿。
如果你對(duì)機(jī)器學(xué)習(xí)感興趣,并且實(shí)際遇到了分類任務(wù)沪猴,那我解答他們遇到的一些疑問辐啄,可能對(duì)于你同樣有用。
所以运嗜,我把這篇文章也分享給你壶辜。希望能有一些幫助。
監(jiān)督
監(jiān)督式機(jī)器學(xué)習(xí)任務(wù)很常見担租。主要模型砸民,是分類與回歸。
就分類問題而言奋救,二元分類是典型應(yīng)用岭参。
例如決策輔助,你利用結(jié)構(gòu)化數(shù)據(jù)尝艘,判定可否貸款給某個(gè)客戶演侯;
例如情感分析,你需要通過一段文字背亥,來區(qū)分情感的正負(fù)極性秒际;
例如圖像識(shí)別,你得識(shí)別出圖片是貓狡汉,還是狗娄徊。
今天咱們就先介紹一下,二元分類盾戴,這個(gè)最為簡(jiǎn)單和常見的機(jī)器學(xué)習(xí)應(yīng)用場(chǎng)景嵌莉。
注意要做分類,你首先得有合適的數(shù)據(jù)捻脖。
什么是合適的數(shù)據(jù)呢锐峭?
這得回到我們對(duì)機(jī)器學(xué)習(xí)的大類劃分。
分類任務(wù)可婶,屬于監(jiān)督式學(xué)習(xí)沿癞。
監(jiān)督式學(xué)習(xí)的特點(diǎn),是要有標(biāo)記矛渴。
例如給你1000張貓的圖片椎扬,1000張狗的圖片惫搏,扔在一起,沒有打標(biāo)記蚕涤。這樣你是做不了分類的筐赔。
雖然你可以讓機(jī)器學(xué)習(xí)不同圖片的特征,讓它把圖片區(qū)分開揖铜。
但是這叫做聚類茴丰,屬于非監(jiān)督學(xué)習(xí)。
天知道天吓,機(jī)器是根據(jù)什么特征把圖片分開的贿肩。
你想得到的結(jié)果,是貓放在一類龄寞,狗放在另一類汰规。
但是機(jī)器抓取特征的時(shí)候,也許更喜歡按照顏色區(qū)分物邑。
結(jié)果白貓白狗放在了一個(gè)類別溜哮,黃貓黃狗放在了另一個(gè)類別。跟你想要的結(jié)果大相徑庭色解。
如果你對(duì)非監(jiān)督學(xué)習(xí)感興趣茂嗓,可以參考《如何用Python從海量文本抽取主題?》一文冒签。
所以在抛,要做分類,就必須有標(biāo)記才行萧恕。
但是標(biāo)記不是天上掉下來的刚梭。
大部分情況下,都是人打上去的票唆。
標(biāo)記
打標(biāo)記(Labeling)朴读,是個(gè)專業(yè)化而繁復(fù)的勞動(dòng)。
你可以自己打走趋,可以找人幫忙衅金,也可以利用眾包的力量。
例如亞馬遜的“土耳其機(jī)器人”(Amazon Mechanical Turk)項(xiàng)目簿煌。
別被名字唬住氮唯,這不是什么人工智能項(xiàng)目,而是普通人可以利用業(yè)余時(shí)間賺外快的機(jī)會(huì)姨伟。
你可以幫別人做任務(wù)拿傭金惩琉。任務(wù)中很重要的一部分,就是人工分類夺荒,打標(biāo)記瞒渠。
因此如果你有原始數(shù)據(jù)良蒸,但是沒有標(biāo)記,就可以把數(shù)據(jù)扔上去伍玖。
說明需求嫩痰,花錢找人幫你標(biāo)記。
類似的服務(wù)窍箍,國(guó)內(nèi)也有很多串纺。
建議找知名度比較高的平臺(tái)來做,這樣標(biāo)記的質(zhì)量會(huì)比較靠譜仔燕。
如果你還是在校學(xué)生造垛,可能會(huì)覺得這樣的服務(wù)價(jià)格太貴魔招,個(gè)人難以負(fù)擔(dān)晰搀。
沒關(guān)系。假如你的研究是有基金資助項(xiàng)目的一部分办斑,可以正大光明地找導(dǎo)師申請(qǐng)數(shù)據(jù)采集費(fèi)用外恕。
但若你的研究屬于個(gè)人行為,就得另想辦法了乡翅。
不少學(xué)生選擇的辦法鳞疲,是依靠團(tuán)隊(duì)支持。
例如找低年級(jí)的研究生幫忙標(biāo)記蠕蚜。
人家?guī)土嗣ι星ⅲ屇惆l(fā)表了論文,順利畢業(yè)靶累。你總得請(qǐng)大家吃一頓好吃的腺毫,是吧?
學(xué)習(xí)
有了標(biāo)記以后挣柬,你就能夠?qū)嵤┍O(jiān)督學(xué)習(xí)潮酒,做分類了。
這里我們順帶說一下邪蛔,什么叫做“機(jī)器學(xué)習(xí)”急黎。
這個(gè)名字很時(shí)髦。
其實(shí)它做的事情侧到,叫做“基于統(tǒng)計(jì)的信息表征”勃教。
先說信息表征(representation)。
你的輸入匠抗,可能是結(jié)構(gòu)化的數(shù)據(jù)故源,例如某個(gè)人的各項(xiàng)生理指標(biāo);可能是非結(jié)構(gòu)化數(shù)據(jù)戈咳,例如文本心软、聲音甚至是圖像壕吹,但是最終機(jī)器學(xué)習(xí)模型看到的東西,都是一系列的數(shù)字删铃。
這些數(shù)字耳贬,以某種形式排布。
可能是零維的猎唁,叫做標(biāo)量(scalar)咒劲;
可能是一維的,叫做向量(vector)诫隅;
可能是二維的腐魂,叫做矩陣(Matrice);
可能是高維的逐纬,叫做張量(Tensor)蛔屹。
但是,不論輸入的數(shù)據(jù)豁生,究竟有多少維度兔毒,如果你的目標(biāo)是做二元分類,那么經(jīng)過一個(gè)或簡(jiǎn)單甸箱、或復(fù)雜的模型育叁,最后的輸出,一定是個(gè)標(biāo)量數(shù)字芍殖。
你的模型豪嗽,會(huì)設(shè)置一個(gè)閾值。例如0.5豌骏。
超出這個(gè)數(shù)字的龟梦,被分類到一處。
反之肯适,被分類到另一處变秦。
任務(wù)完成。
那么模型究竟在做什么呢框舔?
它的任務(wù)蹦玫,就是把輸入的數(shù)據(jù),表征成最終的這個(gè)標(biāo)量刘绣。
打個(gè)不恰當(dāng)?shù)谋确接8龋腿缤?strong>高考。
每一個(gè)考生纬凤,其實(shí)都是獨(dú)特的福贞。
每個(gè)人都有自己的家庭,自己的夢(mèng)想停士,自己的經(jīng)歷挖帘,自己的故事完丽。
但是高考這個(gè)模型,不可能完整準(zhǔn)確表征上述全部細(xì)節(jié)拇舀。
它簡(jiǎn)單地以考生們的試卷答題紙作為輸入逻族,以一個(gè)最終的總成績(jī)作為輸出。
然后骄崩,劃定一個(gè)叫做錄取分?jǐn)?shù)線的東西聘鳞,作為閾值(判定標(biāo)準(zhǔn))。
達(dá)到或超出了要拂,錄取抠璃。
否則,不錄取脱惰。
這個(gè)分?jǐn)?shù)搏嗡,就是高考模型對(duì)每個(gè)考生的信息表征。
所謂分類模型的優(yōu)劣枪芒,其實(shí)就是看模型是否真的達(dá)到了預(yù)期的分類效果彻况。
什么是好的分類效果谁尸?
大學(xué)想招收的人舅踪,錄取了(True Positive, TP);
大學(xué)不想招收的人良蛮,沒被錄瘸槁怠(True Negative, TN)。
什么是不好的分類效果决瞳?
大學(xué)想招收的人货徙,沒能被錄取(False Negative, FN)皮胡;
大學(xué)不想招收的人痴颊,被錄取了(False Positive, FP)。
好的模型屡贺,需要盡力增大 TP 和 TN 的比例蠢棱,降低 FN 和 FP 的比例。
評(píng)判的標(biāo)準(zhǔn)甩栈,視你的類別數(shù)據(jù)平衡而定泻仙。
數(shù)據(jù)平衡量没,例如1000張貓照片玉转,1000張狗照片,可以使用 ROC AUC殴蹄。
數(shù)據(jù)不平衡究抓,例如有1000張貓的照片猾担,卻只有100張狗的照片,可以使用 Precision 和 Recall 刺下,或者二者相結(jié)合的 F1 score垒探。
因?yàn)橛羞@樣明確的評(píng)估標(biāo)準(zhǔn),所以二元分類模型不能滿足于“分了類”怠李,而需要向著“更好的分類結(jié)果”前進(jìn)圾叼。
辦法就是利用統(tǒng)計(jì)結(jié)果,不斷改進(jìn)模型的表征方法捺癞。
所以夷蚊,模型的參數(shù)需要不斷迭代。
恢復(fù)高考后的40年髓介,高考的形式惕鼓、科目、分值唐础、大綱……包括加分政策等箱歧,一直都在變化。這也可以看作是一種模型的迭代一膨。
“表征”+“統(tǒng)計(jì)”+“迭代”呀邢,這基本上就是所謂的“學(xué)習(xí)”。
結(jié)構(gòu)化
看到這里豹绪,希望你的頭腦里已經(jīng)有了機(jī)器學(xué)習(xí)做二元分類問題的技術(shù)路線概貌价淌。
下面咱們針對(duì)不同的數(shù)據(jù)類型,說說具體的操作形式和注意事項(xiàng)瞒津。
先說最簡(jiǎn)單的結(jié)構(gòu)化數(shù)據(jù)蝉衣。
例如《貸還是不貸:如何用Python和機(jī)器學(xué)習(xí)幫你決策?》一文中巷蚪,我們見到過的客戶信息病毡。
處理這樣的數(shù)據(jù),你首先需要關(guān)注數(shù)據(jù)的規(guī)模屁柏。
如果數(shù)據(jù)量大啦膜,你可以使用復(fù)雜的模型。
如果數(shù)據(jù)量小前联,你就得使用簡(jiǎn)單的模型功戚。
為什么呢?
因?yàn)樵綇?fù)雜的模型似嗤,表征的信息就越多啸臀。
表征的信息多,未必是好事。
因?yàn)槟阕プ〉某肆#扔锌赡苁切盘?hào)豌注,也有可能是噪聲。
如果表征信息多灯萍,可是學(xué)習(xí)過的數(shù)據(jù)不多轧铁,它可能就會(huì)對(duì)不該記住的信息,形成記憶旦棉。
在機(jī)器學(xué)習(xí)領(lǐng)域齿风,這是最恐怖的結(jié)果——過擬合(overfitting)。
翻譯成人話绑洛,就是見過的數(shù)據(jù)救斑,分類效果極好;沒見過的數(shù)據(jù)真屯,表現(xiàn)很糟糕脸候。
舉一個(gè)我自己的例子。
我上學(xué)前班后沒多久绑蔫,我媽就被請(qǐng)了家長(zhǎng)运沦。
因?yàn)槲覞h語(yǔ)拼音默寫,得了0分配深。
老師嘴上說携添,是懷疑我不認(rèn)真完成功課;心里想的凉馆,八成是這孩子智商余額不足薪寓。
其實(shí)我挺努力的。
每天老師讓回家默寫的內(nèi)容澜共,都默了。
但是我默寫的時(shí)候锥腻,是嚴(yán)格按照“a o e i u ……”的順序默的嗦董。
因?yàn)槊刻於歼@樣默寫,所以我記住的東西瘦黑,不是每個(gè)讀音對(duì)應(yīng)的符號(hào)京革,而是它們出現(xiàn)的順序。
結(jié)果上課的時(shí)候幸斥,老師是這樣念的“a b c d e ……”
我毫無懸念沒跟下來匹摇。
我的悲劇,源于自己的心智模型甲葬,實(shí)際上只反復(fù)學(xué)習(xí)了一條數(shù)據(jù)“a o e i u ……”廊勃。每天重復(fù),導(dǎo)致過擬合经窖,符號(hào)出現(xiàn)在順序中坡垫,才能辨識(shí)和記憶梭灿。
因此,見到了新的組合方式冰悠,就無能為力了堡妒。
看,過擬合很糟糕吧溉卓。
確定了模型的復(fù)雜度以后皮迟,你依然需要根據(jù)特征多少,選擇合適的分類模型桑寨。
上圖來自于 Scikit-learn 万栅,我截取了其中“分類”模型部分,你可以做參考西疤。
注意模型的效果烦粒,實(shí)際上是有等級(jí)劃分的。
例如根據(jù) Kaggle 數(shù)據(jù)科學(xué)競(jìng)賽多年的實(shí)踐結(jié)果來看代赁,Gradient Boosting Machine 優(yōu)于隨機(jī)森林扰她,隨機(jī)森林優(yōu)于決策樹。
這么比有些不厚道芭碍,因?yàn)槿叩某霈F(xiàn)徒役,也是有時(shí)間順序的。
讓爺爺跟孫子一起賽跑窖壕,公平性有待商榷忧勿。
因此,你不宜在論文中瞻讽,將不同的分類模型鸳吸,分別調(diào)包跑一遍,然后來個(gè)橫向?qū)Ρ却鬁y(cè)評(píng)速勇。
許多情況下晌砾,這是沒有意義的。
雖然顯得工作量很大烦磁。
但假如你發(fā)現(xiàn)在你自己的數(shù)據(jù)集上面养匈,決策樹的效果就是明顯優(yōu)于 Gradient Boosting Machine ,那你倒是很有必要通過論文做出匯報(bào)都伪。
盡管大部分審稿人都會(huì)認(rèn)為呕乎,一定是你算錯(cuò)了。
另一個(gè)需要注意的事項(xiàng)陨晶,是特征工程(feature engineering)猬仁。
什么叫特征工程呢?
就是手動(dòng)挑選特征,或者對(duì)特征(組合)進(jìn)行轉(zhuǎn)化逐虚。
例如《如何用Python和深度神經(jīng)網(wǎng)絡(luò)鎖定即將流失的客戶聋溜?》一文中,我們就對(duì)特征進(jìn)行了甄別叭爱。其中三列數(shù)據(jù)撮躁,我們直接剔除掉了:
- RowNumber:行號(hào),這個(gè)肯定沒用买雾,刪除
- CustomerID:用戶編號(hào)把曼,這個(gè)是順序發(fā)放的,刪除
- Surname:用戶姓名漓穿,對(duì)流失沒有影響嗤军,刪除
正式學(xué)習(xí)之前,你需要把手頭掌握的全部數(shù)據(jù)分成3類:
- 訓(xùn)練集
- 驗(yàn)證集
- 測(cè)試集
我在給期刊審稿的時(shí)候晃危,發(fā)現(xiàn)許多使用機(jī)器學(xué)習(xí)模型的作者叙赚,無論中外,都似乎不能精確理解這些集合的用途僚饭。
訓(xùn)練集讓你的模型學(xué)習(xí)震叮,如何利用當(dāng)前的超參數(shù)(例如神經(jīng)網(wǎng)絡(luò)的層數(shù)、每一層的神經(jīng)元個(gè)數(shù)等)組合鳍鸵,盡可能把表征擬合標(biāo)記結(jié)果苇瓣。
就像那個(gè)笑話說的一樣:
Machine Learning in a Nutshell:
Interviewer: what's you biggest strength?
Me: I'm a quick learner.
Interviewer: What's 11*11?
Me: 65.
Interviewer: Not even close. It's 121.
Me: It's 121.
而驗(yàn)證集的存在,就是為了讓你對(duì)比不同的超參數(shù)選擇偿乖,哪一組更適合當(dāng)前任務(wù)击罪。它必須用訓(xùn)練集沒有用過的數(shù)據(jù)。
驗(yàn)證集幫你選擇了合適的超參數(shù)后贪薪,它的歷史任務(wù)也就結(jié)束了媳禁。
這時(shí)候,你可以把訓(xùn)練集古掏、驗(yàn)證集合并在一起损话,用最終確定的超參數(shù)組合進(jìn)行訓(xùn)練,獲得最優(yōu)模型槽唾。
這個(gè)模型表現(xiàn)怎么樣?
你當(dāng)然需要其他的數(shù)據(jù)來評(píng)判光涂。這就是為什么你還要?jiǎng)澐殖隽硗獾臏y(cè)試集庞萍。
圖像
Franc?ois Chollet 在自己的書中舉過一個(gè)例子,我覺得很有啟發(fā)忘闻,一并分享給你钝计。
假如你看到了這樣的原始數(shù)據(jù):
你該怎么做分類?
有的同學(xué)一看是圖像,立刻決定私恬,上卷積神經(jīng)網(wǎng)絡(luò)债沮!
別忙,想想看本鸣,真的需要“直接上大錘”嗎疫衩?
別的不說,那一圈的刻度荣德,就對(duì)我們的模型毫無意義闷煤。
你可以利用特征工程,將其表達(dá)為這樣的坐標(biāo)點(diǎn):
你看涮瞻,這樣處理之后鲤拿,你立刻就擁有了結(jié)構(gòu)化數(shù)據(jù)。
注意這個(gè)轉(zhuǎn)換過程署咽,并不需要人工完成近顷,完全可以自動(dòng)化。
但是舉一反三的你宁否,估計(jì)已經(jīng)想到了“更好的”解決方案:
對(duì)窒升,這樣一來犁钟,表達(dá)鐘表時(shí)間的數(shù)據(jù)瓤逼,就從原先的4個(gè)數(shù)字薪夕,變成了只需要2個(gè)映凳。
一個(gè)本來需要用復(fù)雜模型解決的問題芜赌,就是因?yàn)楹?jiǎn)單的特征工程轉(zhuǎn)化轿秧,復(fù)雜度和難度顯著下降哼鬓。
其實(shí)送浊,曾經(jīng)人們進(jìn)行圖片分類青伤,全都得用特征工程的方法督怜。
那個(gè)時(shí)候,圖片分類問題極其繁瑣狠角、成本很高号杠,而且效果還不理想。
手動(dòng)提取的特征丰歌,也往往不具備良好的可擴(kuò)展性和可遷移性姨蟋。
于是,深度卷積神經(jīng)網(wǎng)絡(luò)就登場(chǎng)了立帖。
如果你的圖片數(shù)據(jù)量足夠多的話眼溶,你就可以采用“端到端”的學(xué)習(xí)方式。
所謂“端到端”晓勇,是指不進(jìn)行任何的特征工程堂飞,構(gòu)造一個(gè)規(guī)模合適的神經(jīng)網(wǎng)絡(luò)模型灌旧,扔圖片進(jìn)去就可以了。
但是绰筛,現(xiàn)實(shí)往往是殘酷的枢泰。
你最需要了解的,是圖片不夠多的時(shí)候铝噩,怎么辦衡蚂。
這時(shí)候,很容易出現(xiàn)過擬合薄榛。
因?yàn)樯疃壬窠?jīng)網(wǎng)絡(luò)讳窟,屬于典型的復(fù)雜模型。
這個(gè)時(shí)候敞恋,可以嘗試以下幾個(gè)不同的方法:
首先丽啡,如果有可能,搜集更多的帶標(biāo)注圖片硬猫。這是最簡(jiǎn)單的辦法补箍,如果成本可以接受,你應(yīng)該優(yōu)先采用啸蜜。
其次坑雅,使用數(shù)據(jù)增強(qiáng)(Data Augmentation)。名字聽起來很強(qiáng)大衬横,其實(shí)無非是把原始的數(shù)據(jù)進(jìn)行鏡像裹粤、剪裁、旋轉(zhuǎn)蜂林、扭曲等處理遥诉。這樣“新的”圖片與老圖片的標(biāo)注肯定還是一樣的。但是圖片內(nèi)容發(fā)生的變化噪叙,可以有效防止模型記住過多噪聲矮锈。
第三,使用遷移學(xué)習(xí)睁蕾。
所謂遷移學(xué)習(xí)苞笨,就是利用別人訓(xùn)練好的模型,保留其中從輸入開始的大多數(shù)層次(凍結(jié)保留其層次數(shù)量子眶、神經(jīng)元數(shù)量等網(wǎng)絡(luò)結(jié)構(gòu)瀑凝,以及權(quán)重?cái)?shù)值),只把最后的幾層敲掉臭杰,換上自己的幾層神經(jīng)網(wǎng)絡(luò)猜丹,對(duì)小規(guī)模數(shù)據(jù)做訓(xùn)練。
上圖同樣來自于 Franc?ois Chollet 的著作硅卢。
這種做法射窒,用時(shí)少,成本低将塑,效果還特別好脉顿。如果重新訓(xùn)練,圖片數(shù)少点寥,就很容易過擬合艾疟。但是用了遷移學(xué)習(xí),過擬合的可能性就大大降低敢辩。
其原理其實(shí)很容易理解蔽莱。
卷積神經(jīng)網(wǎng)絡(luò)的層次,越是靠近輸入位置戚长,表達(dá)的特征就越是細(xì)節(jié)盗冷;越到后面,就越宏觀同廉。
識(shí)別貓和狗仪糖,要從形狀邊緣開始;識(shí)別哆啦a夢(mèng)和瓦力迫肖,也一樣要從形狀邊緣開始锅劝。因此模型的底層,可以被拿來使用蟆湖。
你訓(xùn)練的故爵,只是最后幾層表征方式。結(jié)構(gòu)簡(jiǎn)單隅津,當(dāng)然也就不需要這么多數(shù)據(jù)了诬垂。
第四,引入 Dropout, Regularization 和 Early Stopping 等常規(guī)方法饥瓷。注意這些方法不僅適用于圖像數(shù)據(jù)剥纷。
以 Dropout 為例。假如一個(gè)模型因?yàn)閺?fù)雜呢铆,所以記住了很多噪聲晦鞋,那么訓(xùn)練的時(shí)候,每次都隨機(jī)將一定比例的神經(jīng)元“扔掉”(設(shè)置權(quán)重為0)棺克,那么模型的復(fù)雜度降低悠垛。而且因?yàn)殡S機(jī),又比降低層數(shù)與神經(jīng)元個(gè)數(shù)的固化模型適用性更高娜谊。
文本
前面說過了确买,機(jī)器不認(rèn)得文本,只認(rèn)得數(shù)字纱皆。
所以湾趾,要對(duì)文本做二元分類芭商,你需要把文本轉(zhuǎn)換成為數(shù)字。
這個(gè)過程搀缠,叫做向量化铛楣。
向量化的方式,有好幾種艺普。大致上可以分成兩類:
第一類簸州,是無意義轉(zhuǎn)換。也就是轉(zhuǎn)換的數(shù)字歧譬,只是個(gè)編號(hào)而已岸浑,本身并不攜帶其他語(yǔ)義信息。
這一類問題瑰步,我們?cè)凇?a href="http://www.reibang.com/p/29aa3ad63f9d" target="_blank">如何用Python和機(jī)器學(xué)習(xí)訓(xùn)練中文文本情感分類模型矢洲?》中,已經(jīng)非常詳細(xì)地介紹過了面氓。
你需要做的兵钮,包括分詞(如果是中文)、向量化舌界、去除停用詞掘譬,然后丟進(jìn)一個(gè)分類模型(例如樸素貝葉斯,或者神經(jīng)網(wǎng)絡(luò))呻拌,直接獲取結(jié)果葱轩,加以評(píng)估。
但是藐握,這個(gè)過程靴拱,顯然有大量的語(yǔ)義和順序信息被丟棄了。
第二類猾普,是有意義轉(zhuǎn)換袜炕。這時(shí)候,每個(gè)語(yǔ)言單元(例如單詞)轉(zhuǎn)換出來的數(shù)字初家,往往是個(gè)高維向量偎窘。
這個(gè)向量,你可以自己通過訓(xùn)練來產(chǎn)生溜在。
但是這種訓(xùn)練陌知,需要對(duì)海量語(yǔ)料進(jìn)行建模。
建模的過程掖肋,成本很高仆葡,占用龐大存儲(chǔ)空間,運(yùn)算量極大志笼。
因此更常見的做法沿盅,是使用別人通過大規(guī)模語(yǔ)料訓(xùn)練后的結(jié)果把篓。也就是我們?cè)?jīng)介紹過的詞嵌入預(yù)訓(xùn)練模型。
具體內(nèi)容嗡呼,請(qǐng)參見《如何用Python處理自然語(yǔ)言纸俭?(Spacy與Word Embedding)》和《如何用 Python 和 gensim 調(diào)用中文詞嵌入預(yù)訓(xùn)練模型?》南窗。
注意如果你有多個(gè)預(yù)訓(xùn)練模型可以選擇,那么盡量選擇與你要解決任務(wù)的文本更為接近的那種郎楼。
畢竟預(yù)訓(xùn)練模型來自于統(tǒng)計(jì)結(jié)果万伤。兩種差別很大的語(yǔ)料,詞語(yǔ)在上下文中的含義也會(huì)有顯著差異呜袁,導(dǎo)致語(yǔ)義的刻畫不夠準(zhǔn)確敌买。
如果你需要在分類的過程中,同時(shí)考慮語(yǔ)義和語(yǔ)言單元順序等信息阶界,那么你可以這樣做:
第一步虹钮,利用詞嵌入預(yù)訓(xùn)練模型,把你的輸入語(yǔ)句轉(zhuǎn)化為張量膘融,這解決了詞語(yǔ)的語(yǔ)義問題芙粱;
第二步,采用一維卷積神經(jīng)網(wǎng)絡(luò)(Conv1D)模型氧映,或者循環(huán)神經(jīng)網(wǎng)絡(luò)模型(例如 LSTM)春畔,構(gòu)造分類器。
注意這一步中岛都,雖然兩種不同的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)律姨,都可以應(yīng)用。但是一般而言臼疫,處理二元分類問題择份,前者(卷積神經(jīng)網(wǎng)絡(luò))表現(xiàn)更好。
因?yàn)榫矸e神經(jīng)網(wǎng)絡(luò)實(shí)際上已經(jīng)充分考慮了詞語(yǔ)的順序問題烫堤;而循環(huán)神經(jīng)網(wǎng)絡(luò)用在此處荣赶,有些“大炮轟蚊子”。很容易發(fā)生過擬合塔逃,導(dǎo)致模型效果下降讯壶。
實(shí)施
如果你了解二元分類問題的整體流程,并且做好了模型的選擇湾盗,那么實(shí)際的機(jī)器學(xué)習(xí)過程伏蚊,是很簡(jiǎn)單的。
對(duì)于大部分的普通機(jī)器學(xué)習(xí)問題格粪,你都可以用 Scikit-learn 來調(diào)用模型躏吊。
注意其實(shí)每一個(gè)模型氛改,都有參數(shù)設(shè)置的需要。但是對(duì)于很多問題來說比伏,默認(rèn)初始參數(shù)胜卤,就能帶來很不錯(cuò)的運(yùn)行結(jié)果。
Scikit-learn 雖好赁项,可惜一直不能很好支持深度學(xué)習(xí)任務(wù)葛躏。
因而不論是圖像還是文本分類問題,你都需要挑選一個(gè)好用的深度學(xué)習(xí)框架悠菜。
注意舰攒,目前主流的深度學(xué)習(xí)框架,很難說有好壞之分悔醋。
畢竟摩窃,在深度學(xué)習(xí)領(lǐng)域如此動(dòng)蕩激烈的競(jìng)爭(zhēng)環(huán)境中,“壞”框架(例如功能不完善芬骄、性能低下)會(huì)很快被淘汰出局猾愿。
然而,從易用性上來說账阻,框架之間確實(shí)有很大區(qū)別蒂秘。
易用到了一種極致,便是蘋果的 Turi Create 宰僧。
從《如何用Python和深度神經(jīng)網(wǎng)絡(luò)識(shí)別圖像材彪?》和《如何用Python和深度神經(jīng)網(wǎng)絡(luò)尋找近似圖片?》這兩篇文章中琴儿,你應(yīng)該有體會(huì)段化,Turi Create 在圖像識(shí)別和相似度查詢問題上,已經(jīng)易用到你自己都不知道究竟發(fā)生了什么造成,任務(wù)就解決了显熏。
但是,如果你需要對(duì)于神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)進(jìn)行深度設(shè)置晒屎,那么 Turi Create 就顯得不大夠用了喘蟆。
畢竟,其開發(fā)的目標(biāo)鼓鲁,是給蘋果移動(dòng)設(shè)備開發(fā)者賦能蕴轨,讓他們更好地使用深度學(xué)習(xí)技術(shù)。
對(duì)于更通用的科研和實(shí)踐深度學(xué)習(xí)任務(wù)骇吭,我推薦你用 Keras 橙弱。
它已經(jīng)可以把 Theano, Tensorflow 和 CNTK 作為后端。
對(duì)比上面那張深度學(xué)習(xí)框架全家福,你應(yīng)該看到棘脐,Keras 覆蓋了 Google 和 微軟自家框架斜筐,幾乎占領(lǐng)了深度學(xué)習(xí)框架界的半壁江山。
照這勢(shì)頭發(fā)展下去蛀缝,一統(tǒng)江湖也說不定哦顷链。
為什么 Keras 那么厲害?
因?yàn)楹?jiǎn)單易學(xué)屈梁。
簡(jiǎn)單易學(xué)到嗤练,顯著拉低了深度學(xué)習(xí)的門檻。
就連 Tensorflow 的主力開發(fā)人員 Josh Gordon俘闯,也已經(jīng)認(rèn)為你根本沒必要去學(xué)習(xí)曾經(jīng)的 Tensorflow 繁復(fù)語(yǔ)法了潭苞。
直接學(xué) Keras ,用它完成任務(wù)真朗,結(jié)束。
另外僧诚,使用深度學(xué)習(xí)遮婶,你可能需要 GPU 硬件設(shè)備的支持。這東西比較貴湖笨。建議你采用租用的方式旗扑。
《如何用云端 GPU 為你的 Python 深度學(xué)習(xí)加速?》提到的 FloydHub慈省,租賃一個(gè)小時(shí)臀防,大概需要1美元左右。注冊(cè)賬號(hào)就贈(zèng)送你2個(gè)小時(shí)边败;
至于《如何免費(fèi)云端運(yùn)行Python深度學(xué)習(xí)框架袱衷?》中提到的 Google Colab ,就更慷慨了——到目前為止笑窜,一直是免費(fèi)試用致燥。
喜歡請(qǐng)點(diǎn)贊。還可以微信關(guān)注和置頂我的公眾號(hào)“玉樹芝蘭”(nkwangshuyi)排截。
如果你對(duì)數(shù)據(jù)科學(xué)感興趣嫌蚤,不妨閱讀我的系列教程索引貼《如何高效入門數(shù)據(jù)科學(xué)?》断傲,里面還有更多的有趣問題及解法脱吱。