技術(shù)交流QQ群:1027579432画株,歡迎你的加入缸剪!
1.參考博客
2.模型過(guò)擬合的解決方法
- L1/L2正則化(原理奧卡姆剃刀):L2正則化也叫作權(quán)重衰減糟红,目標(biāo)函數(shù)中增加所有權(quán)重w參數(shù)的平方之和分瘾,迫使所有w可能趨向0但不為0;L1正則化在損失函數(shù)中加入所有權(quán)重參數(shù)w的絕對(duì)值之和留攒,迫使更多的w為0聪轿,使特征變得稀疏爷肝。
- Batch Normalization(對(duì)神經(jīng)網(wǎng)絡(luò)中下一層的輸入進(jìn)行歸一化處理,使得輸入量的均值為0屹电,方差為1阶剑,即通過(guò)特征歸一化,加速模型的訓(xùn)練)
- shortcut-connect(使用殘差網(wǎng)絡(luò)Residual network)
- 數(shù)據(jù)增強(qiáng)(增加樣本的數(shù)量)
- early stopping
- Dropout:在訓(xùn)練過(guò)程中危号,讓神經(jīng)元以超參數(shù)p的概率被激活(也就是說(shuō)1-p的概率被設(shè)置為0)牧愁,類似于bagging算法
3.如何解決樣本類別的不均衡問(wèn)題?
- a.過(guò)采樣/上采樣:增加類別少的樣本數(shù)量實(shí)現(xiàn)樣本數(shù)量的均衡外莲。具體是通過(guò)復(fù)制類別上的樣本構(gòu)成多條數(shù)據(jù)猪半。此方法的缺點(diǎn)是當(dāng)樣本的特征很少時(shí)兔朦,容易出現(xiàn)過(guò)擬合。需要對(duì)過(guò)采樣方法進(jìn)行改進(jìn)磨确,改進(jìn)的方法是:在類別少的樣本中加入噪聲沽甥、干擾數(shù)據(jù)或通過(guò)一定的規(guī)則產(chǎn)生新合成的樣本,如smote算法乏奥。
- b.欠采樣/下采樣:減少類別多的樣本數(shù)量摆舟,一般的方法是隨機(jī)地去掉一些類別多的樣本。
- c.調(diào)整正負(fù)樣本的懲罰權(quán)重:對(duì)類別少的樣本賦予高的權(quán)重邓了,對(duì)類別多的樣本賦予低的權(quán)重恨诱。
- d.通過(guò)集成學(xué)習(xí)的方法:每次生成訓(xùn)練集時(shí),使用所有類別少的樣本骗炉,同時(shí)從類別多的樣本中隨機(jī)抽取數(shù)據(jù)與類別少的樣本合并起來(lái)照宝,構(gòu)成一個(gè)新的訓(xùn)練集。
- e.使用特征選擇:一般樣本不均衡也會(huì)導(dǎo)致特征不均衡句葵。但如果類別少的樣本量具有一定的規(guī)模時(shí)厕鹃,則意味著其特征的分布較為均勻,可以選擇出具有顯著特征配合參與解決樣本不均衡的問(wèn)題乍丈。
4.在神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程中剂碴,為什么會(huì)出現(xiàn)梯度消失的問(wèn)題?如何防止诗赌?
- 原因:使用了不合適的激活函數(shù)汗茄,例如sigmoid函數(shù)。此時(shí)铭若,當(dāng)神經(jīng)網(wǎng)絡(luò)的層數(shù)很深時(shí),利用鏈?zhǔn)角髮?dǎo)法則計(jì)算梯度時(shí)递览,損失函數(shù)的梯度連乘叼屠,導(dǎo)致乘積會(huì)變得越來(lái)越小接近于0,從而神經(jīng)網(wǎng)絡(luò)無(wú)法學(xué)習(xí)到新的信息绞铃。
- 解決方法:
- 預(yù)訓(xùn)練加微調(diào)
- 梯度剪切
- 權(quán)重正則化
- 使用不同的激活函數(shù)
- 使用Batch Normalization
- 使用殘差網(wǎng)絡(luò)ResNet
- 使用LSTM網(wǎng)絡(luò)
5.介紹一下TensorFlow中的計(jì)算圖
- TensorFlow是一個(gè)通過(guò)計(jì)算圖的形式來(lái)表述計(jì)算的編程系統(tǒng)镜雨,計(jì)算圖也叫作數(shù)據(jù)流圖《酰可以把計(jì)算圖看做是一種有向圖荚坞,TensorFlow中的每個(gè)節(jié)點(diǎn)都是計(jì)算圖上的一個(gè)張量Tensor,而節(jié)點(diǎn)之間的邊描述了計(jì)算之間的依賴關(guān)系和數(shù)學(xué)運(yùn)算菲盾。
6.K-Means或KNN中颓影,通常使用歐式距離來(lái)表示最近的數(shù)據(jù)點(diǎn)之間的距離,有時(shí)候也使用曼哈度距離懒鉴,對(duì)比兩者的區(qū)別诡挂。
- 歐式距離最常見(jiàn)的是兩個(gè)或多個(gè)點(diǎn)之間的距離表示法碎浇,又稱為歐幾里得距離。也就是通常所說(shuō)的L2范數(shù)璃俗,公式如下奴璃。歐式距離的缺點(diǎn)是它將樣本的不同屬性之間的差別等同看待,這一點(diǎn)有時(shí)候不能滿足實(shí)際要求城豁。
- 曼哈頓距離苟穆,也就是歐式空間中的在直角坐標(biāo)系上兩個(gè)點(diǎn)所形成的線段對(duì)軸產(chǎn)生的投影的距離總和。也就是我們所說(shuō)的L1距離唱星。例如鞭缭,坐標(biāo)(x1,y1)的點(diǎn)P1與坐標(biāo)(x2, y2)的點(diǎn)P2的曼哈頓距離計(jì)算公式為:
7.參數(shù)模型與非參數(shù)模型
- 參數(shù)模型:根據(jù)預(yù)先設(shè)計(jì)的規(guī)則,例如方差損失最小魏颓,進(jìn)行學(xué)習(xí)岭辣,參數(shù)模型例子:回歸(線性回歸、邏輯回歸)模型甸饱;最好可以看一下或者直接進(jìn)行一下相關(guān)的推導(dǎo)沦童;根據(jù)規(guī)則,擁有少部分?jǐn)?shù)據(jù)就可以叹话;
- 非參數(shù)模型:不需要事先假設(shè)規(guī)則偷遗,直接挖掘潛在數(shù)據(jù)中的規(guī)則;非參數(shù)模型例子:KNN驼壶,決策樹(shù)氏豌,挖掘數(shù)據(jù)潛在的特征,所以比較靈活热凹;
8.生成模型與判別模型
- 生成模型:根據(jù)數(shù)據(jù)學(xué)習(xí)聯(lián)合概率分布P(x,y)泵喘,從而計(jì)算出條件概率分布P(y|x)作為預(yù)測(cè)的模型。常用于含有隱變量的模型般妙,例如HMM纪铺,樸素貝葉斯算法、高斯混合模型GMM碟渺、文檔主題生成模型LDA鲜锚、限制玻爾茲曼機(jī)等
- 判別模型:根據(jù)數(shù)據(jù)直接學(xué)習(xí)條件概率分布P(x|y)或者決策函數(shù)Y=f(X)作為預(yù)測(cè)模型。例如:邏輯回歸苫拍、RF芜繁、SVM、神經(jīng)網(wǎng)絡(luò)绒极、感知機(jī)骏令、KNN、CRF等
- 兩者的對(duì)比:
- 使用生成式方法得到的模型集峦,可以還原出模型的聯(lián)合概率分布伏社,而判別模型不可以抠刺;
- 生成式方法得到的模型收斂速度更快。當(dāng)樣本數(shù)增加時(shí)摘昌,生成式方法得到的模型能更快的收斂到真實(shí)模型速妖;
- 存在隱變量時(shí),只能使用生成模型聪黎;
- 使用判別式方法學(xué)習(xí)得到的模型罕容,直接面對(duì)預(yù)測(cè),學(xué)習(xí)的準(zhǔn)確率通常更高稿饰,可以簡(jiǎn)化學(xué)習(xí)問(wèn)題锦秒。
9.LR和SVM的聯(lián)系和區(qū)別?
- 聯(lián)系:
- LR和SVM都可以處理分類問(wèn)題喉镰,且一般都用于處理線性二分類問(wèn)題
- 兩個(gè)方法都可以增加不同的正則化項(xiàng)旅择,如L1、L2正則化項(xiàng)
- 區(qū)別:
- LR是參數(shù)模型侣姆,SVM是非參數(shù)模型
- 從損失函數(shù)來(lái)看生真,LR使用的是交叉熵?fù)p失函數(shù),SVM使用的hinge損失函數(shù)捺宗,這兩個(gè)損失函數(shù)的目的都是增加對(duì)分類影響較大的樣本點(diǎn)的權(quán)重柱蟀,減小與分類關(guān)系比較小的數(shù)據(jù)點(diǎn)的權(quán)重。
- SVM的處理方法只考慮支持向量蚜厉,也就是只考慮和分類最相關(guān)的少數(shù)樣本點(diǎn)來(lái)學(xué)習(xí)分類器长已。而邏輯回歸通過(guò)非線性映射,大大減小了離分離超平面遠(yuǎn)的樣本點(diǎn)權(quán)重昼牛,相對(duì)提升了與分類最相關(guān)的樣本點(diǎn)的權(quán)重术瓮。
- LR模型相對(duì)來(lái)說(shuō)簡(jiǎn)單好理解,一般用于大規(guī)模的線性分類匾嘱。SVM的理解和優(yōu)化比較復(fù)雜斤斧,在處理復(fù)制非線性分類時(shí),使用核技巧來(lái)計(jì)算優(yōu)勢(shì)明顯霎烙。
- LR能做的SVM也能做,但可能準(zhǔn)確率是上有問(wèn)題蕊连,但SVM能做的LR做不了悬垃。
10.神經(jīng)網(wǎng)絡(luò)中參數(shù)量parameters和FLOPs計(jì)算
- CNN中的parameters分為兩種:W和b,對(duì)于某一個(gè)卷積層甘苍,它的parameters的個(gè)數(shù)為:
其中尝蠕,是卷積核的高度,是卷積核的寬度,是輸入的通道數(shù)载庭,是輸出的通道數(shù)
-
對(duì)于某個(gè)全連接層看彼,如果輸入的數(shù)據(jù)有個(gè)節(jié)點(diǎn)廊佩,輸出的數(shù)據(jù)有個(gè)節(jié)點(diǎn),它的參數(shù)個(gè)數(shù)為:
- FLOPs:全稱是floating point operations per second靖榕,指的是每秒浮點(diǎn)運(yùn)算次數(shù)标锄,即用來(lái)衡量硬件的計(jì)算性能
-
對(duì)于某個(gè)卷積層,它的FLOPs數(shù)量是:
其中,表示該層參數(shù)的數(shù)量茁计,H是輸出圖片的高料皇,W是輸出圖片的寬
-
例題1:假設(shè)你的輸入是一個(gè)300×300的彩色(RGB)圖像,而你沒(méi)有使用卷積神經(jīng)網(wǎng)絡(luò)星压。 如果第一個(gè)隱藏層有100個(gè)神經(jīng)元践剂,每個(gè)神經(jīng)元與輸入層進(jìn)行全連接,那么這個(gè)隱藏層有多少個(gè)參數(shù)(包括偏置參數(shù))娜膘?
- A1:因?yàn)檩斎氲墓?jié)點(diǎn)數(shù)量是300*300*3,輸出的節(jié)點(diǎn)數(shù)量是100逊脯。然后加上偏置項(xiàng)b,因?yàn)殡[藏層有100個(gè)節(jié)點(diǎn)竣贪,每個(gè)節(jié)點(diǎn)都有一個(gè)偏置军洼,所以b=100。利用上面計(jì)算全連接網(wǎng)絡(luò)的公式贾富,故3*300*300*100+100
-
例題2:假設(shè)你的輸入是300×300彩色(RGB)圖像歉眷,并且你使用卷積層和100個(gè)過(guò)濾器,每個(gè)過(guò)濾器都是5×5的大小颤枪,請(qǐng)問(wèn)這個(gè)隱藏層有多少個(gè)參數(shù)(包括偏置參數(shù))汗捡?
- A2:首先,參數(shù)和輸入的圖片大小是沒(méi)有關(guān)系的畏纲,無(wú)論你給的圖像像素有多大扇住,參數(shù)值都是不變的,在這個(gè)題中盗胀,參數(shù)值只與過(guò)濾器有關(guān)艘蹋。單個(gè)過(guò)濾器的大小是5*5,由于輸入的是RGB圖像,所以輸入通道數(shù)目是3票灰。因此一個(gè)過(guò)濾器的組成是5*5*3,每一過(guò)濾器只有一個(gè)偏置項(xiàng)b,因此一個(gè)過(guò)濾器所擁有的參數(shù)是5*5*3+1=76女阀,一共用了100個(gè)過(guò)濾器,所以隱藏層含有76*100=7600個(gè)參數(shù)屑迂。其實(shí)浸策,也就是上面的公式計(jì)算CNN的參數(shù)量灿椅。
11.SVM中常見(jiàn)的幾種核函數(shù)
- 線性核函數(shù):內(nèi)積公式
- 多項(xiàng)式核函數(shù)
- 高斯核函數(shù)
- 字符串核函數(shù):詳見(jiàn)李航統(tǒng)計(jì)學(xué)習(xí)方法
12.邏輯回歸與線性回歸的聯(lián)系與區(qū)別
- 聯(lián)系:邏輯回歸和線性回歸首先都是廣義的線性回歸拢军;邏輯回歸的模型本質(zhì)上是一個(gè)對(duì)數(shù)線性回歸模型,邏輯回歸都是以線性回歸為理論支持的山上。但線性回歸模型無(wú)法做到sigmoid的非線性形式手报,sigmoid可以輕松處理0/1分類問(wèn)題蚯舱。
- 區(qū)別:
- 線性模型的優(yōu)化目標(biāo)函數(shù)是最小二乘改化,而邏輯回歸則是似然函數(shù)
- 線性回歸在整個(gè)實(shí)數(shù)域范圍內(nèi)進(jìn)行預(yù)測(cè),敏感度一致枉昏;而分類范圍陈肛,需要在[0,1]。邏輯回歸就是一種減小預(yù)測(cè)范圍凶掰,將預(yù)測(cè)值限定為[0,1]間的一種回歸模型燥爷,因而對(duì)于這類問(wèn)題來(lái)說(shuō),邏輯回歸的魯棒性比線性回歸的要好懦窘。
13.XGBoost為什么要用泰勒公式展開(kāi)前翎,優(yōu)勢(shì)在哪?
- XGBoost使用了一階和二階偏導(dǎo), 二階導(dǎo)數(shù)有利于梯度下降的更快更準(zhǔn)。使用泰勒展開(kāi)取得二階倒數(shù)形式, 可以在不選定損失函數(shù)具體形式的情況下用于算法優(yōu)化分析.本質(zhì)上也就把損失函數(shù)的選取和模型算法優(yōu)化和參數(shù)選擇分開(kāi)了畅涂,這種去耦合增加了XGBoost的適用性港华。
14.XGBoost如何尋找最優(yōu)特征?是有放回還是無(wú)放回午衰?
- XGBoost在訓(xùn)練過(guò)程中給各個(gè)特征的增益評(píng)分立宜,最大增益的特征會(huì)被選出來(lái)作為分裂的依據(jù),從而記憶了每個(gè)特征對(duì)在模型訓(xùn)練時(shí)的重要性臊岸。XGBoost屬于boosting的集成學(xué)習(xí)方法橙数,樣本是無(wú)放回的,因此每輪計(jì)算樣本不重復(fù)帅戒。XGBoost支持子采樣灯帮,即每輪計(jì)算不使用全部樣本,以減少過(guò)擬合逻住。
15.決策樹(shù)钟哥、隨機(jī)森林RF、Boosting瞎访、Adaboost腻贰、GBDT、XGBoost的區(qū)別扒秸?
- bagging與boosting的區(qū)別:
- bagging方法有放回的采樣相同數(shù)量樣本訓(xùn)練學(xué)習(xí)器播演,然后再一起投票。學(xué)習(xí)器之間不存在強(qiáng)的依賴關(guān)系伴奥,學(xué)習(xí)器可以并行訓(xùn)練生成宾巍。集成方式一般為投票法。隨機(jī)森林屬于Bagging的代表渔伯,放回抽樣,每個(gè)學(xué)習(xí)器隨機(jī)選擇部分特征去優(yōu)化肄程。
- Boosting方法使用全部樣本锣吼,依次訓(xùn)練每個(gè)學(xué)習(xí)器选浑,迭代集成。學(xué)習(xí)器之間不存在強(qiáng)依賴關(guān)系玄叠,學(xué)習(xí)器可并行訓(xùn)練生成古徒,集成方式為加權(quán)和;Adaboost屬于Boosting读恃,采用指數(shù)損失函數(shù)代替原本分類任務(wù)中的0-1損失函數(shù)隧膘;GBDT屬于Boosting的優(yōu)秀代表,對(duì)函數(shù)殘差近似值進(jìn)行梯度下降寺惫,用CRAT樹(shù)作為基本的學(xué)習(xí)器疹吃,集成模型為回歸模型。XGBoost屬于Boosting的集大成者西雀,對(duì)函數(shù)殘差近似值進(jìn)行梯度下降萨驶,迭代時(shí)利用二階梯度信息,集成模型可用于分類也可以用于回歸艇肴。
- 決策樹(shù)的學(xué)習(xí)過(guò)程:從根開(kāi)始建立樹(shù)腔呜,也就是如何選擇特征進(jìn)行分裂。ID3算法使用信息增益再悼、C4.5使用信息增益比核畴、CART樹(shù)采用基尼系數(shù)計(jì)算最優(yōu)分類點(diǎn),XGBoost使用二階泰勒展開(kāi)系數(shù)計(jì)算最優(yōu)分裂點(diǎn)冲九。
16.GBDT與XGBoost的對(duì)比谤草,XGBoost的優(yōu)點(diǎn)
- 損失函數(shù)用泰勒展開(kāi)二項(xiàng)逼近,而不是像GBDT中用的就是一階導(dǎo)數(shù)
- 對(duì)樹(shù)的結(jié)構(gòu)進(jìn)行了正則化約束娘侍,防止模型過(guò)于復(fù)雜咖刃,降低了過(guò)擬合的可能性
- 節(jié)點(diǎn)的分裂方式不同,GBDT使用的是基尼系數(shù)憾筏,XGBoost使用的是經(jīng)過(guò)優(yōu)化推導(dǎo)后的算法(窮舉法選擇最佳的分裂節(jié)點(diǎn)嚎杨、通過(guò)加權(quán)分位數(shù)方法近似選擇最佳的分裂節(jié)點(diǎn)、針對(duì)稀疏特征的分裂點(diǎn)選擇法)
17.L1和L2范數(shù)的區(qū)別
- L1 norm:向量中各個(gè)元素絕對(duì)值之和氧腰,也稱為稀疏規(guī)則算子枫浙,L1范數(shù)可以使權(quán)重稀疏,方便特征提裙潘箩帚;L1正則化先驗(yàn)服從拉普拉斯分布
- L2 norm:向量中各個(gè)元素平方和的1/2次方,又稱為Frobenius范數(shù)黄痪,L2范數(shù)可以防止過(guò)擬合紧帕,提升模型的泛化能力;L2正則化先驗(yàn)服從高斯分布
18.闡述Adaboost算法的流程,并寫(xiě)出權(quán)重更新的公式
19.LSTM的結(jié)構(gòu)推導(dǎo)是嗜,為什么比普通的RNN好愈案?
20.為什么樸素貝葉斯算法如此樸素?
- 因?yàn)樗僭O(shè)所有的特征在數(shù)據(jù)集中的作用都是同樣重要的鹅搪,而且相互獨(dú)立的站绪。這個(gè)假設(shè)在現(xiàn)實(shí)中基本上是不存在的,但特征相關(guān)性很小的實(shí)際情況還很多丽柿,歲月這個(gè)模型還可以工作的很好恢准。
21.EM算法原理說(shuō)明
- 有時(shí)候樣本的產(chǎn)生和隱含變量有關(guān)(隱變量是不能觀察的),而求模型的參數(shù)時(shí)一般都采用極大似然估計(jì)甫题,由于含有隱變量馁筐,所以對(duì)似然函數(shù)的參數(shù)求導(dǎo)數(shù)是求不出來(lái)的,這時(shí)候用EM算法來(lái)求模型的參數(shù)幔睬,典型的用法是用在GMM和HMM中眯漩。步驟如下:
- E步:選擇一組參數(shù),求出在此參數(shù)下隱變量的條件概率值
- M步:結(jié)合E步求出的隱變量的條件概率值麻顶,求出似然函數(shù)的下界函數(shù)(即某個(gè)期望函數(shù))最大值赦抖。
- 重復(fù)進(jìn)行上面的兩步,直至收斂為止辅肾。
- M步中下界函數(shù)的推導(dǎo)過(guò)程:
22.GMM算法原理說(shuō)明
- EM算法的常用例子是高斯混合模型GMM队萤,每個(gè)樣本都有可能由K個(gè)高斯模型產(chǎn)生,只不過(guò)每個(gè)高斯模型的產(chǎn)生概率不同矫钓,因此每個(gè)樣本都有對(duì)應(yīng)的高斯分布(K個(gè)模型中的一個(gè))要尔,此時(shí)的隱變量就是每個(gè)樣本對(duì)應(yīng)的某個(gè)高斯分布。
- GMM算法的E步(計(jì)算每個(gè)樣本對(duì)應(yīng)每個(gè)高斯模型的概率)
具體的計(jì)算公式為:
- M步計(jì)算公式(計(jì)算每個(gè)高斯模型的權(quán)重新娜,均值赵辕,方差3個(gè)參數(shù)):
23.KNN算法中K是如何選擇的?
- 如果選擇較小的K值,就相當(dāng)于用較小的鄰域中的訓(xùn)練實(shí)例進(jìn)行預(yù)測(cè)概龄,“學(xué)習(xí)”近似誤差會(huì)減小还惠,只有與輸入實(shí)例較近或相似的訓(xùn)練實(shí)例才會(huì)對(duì)預(yù)測(cè)結(jié)果起作用,與此同時(shí)帶來(lái)的問(wèn)題是“學(xué)習(xí)”的估計(jì)誤差會(huì)增大私杜。換句話說(shuō)蚕键,K值的減小就意味著整體模型變得復(fù)雜,容易發(fā)生過(guò)擬合衰粹;
- 如果選擇較大的K值锣光,就相當(dāng)于用較大領(lǐng)域中的訓(xùn)練實(shí)例進(jìn)行預(yù)測(cè),其優(yōu)點(diǎn)是可以減少學(xué)習(xí)的估計(jì)誤差铝耻,但缺點(diǎn)是學(xué)習(xí)的近似誤差會(huì)增大誊爹。這時(shí)候,與輸入實(shí)例較遠(yuǎn)(不相似的)訓(xùn)練實(shí)例也會(huì)對(duì)預(yù)測(cè)器作用,使預(yù)測(cè)發(fā)生錯(cuò)誤替废,且K值的增大就意味著整體的模型變得簡(jiǎn)單箍铭。
- K=N,此時(shí)無(wú)論輸入實(shí)例是什么椎镣,都只是簡(jiǎn)單的預(yù)測(cè)它屬于在訓(xùn)練實(shí)例中最多的累,模型過(guò)于簡(jiǎn)單兽赁,忽略了訓(xùn)練實(shí)例中大量有用信息状答。
- 實(shí)際中,使用交叉驗(yàn)證的方法選擇最優(yōu)的K的取值刀崖。
24.機(jī)器學(xué)習(xí)中惊科,為什么經(jīng)常需要對(duì)數(shù)據(jù)進(jìn)行歸一化?
- 歸一化能提高梯度下降算法求解的速度
- 歸一化有可能提高精度
25.神經(jīng)網(wǎng)絡(luò)中的批量歸一化Batch Normalization(BN)原理
26.哪些機(jī)器學(xué)習(xí)算法不需要進(jìn)行歸一化操作亮钦?
- 概率模型不需要做歸一化操作馆截,因?yàn)樗鼈儾魂P(guān)心變量的值,而關(guān)心的是變量分布和變量之間的條件概率蜂莉,如決策樹(shù)蜡娶。但是,像Adaboost映穗、SVM窖张、LR、KNN蚁滋、Kmeans等最優(yōu)化問(wèn)題就需要?dú)w一化宿接。
27.為什么樹(shù)形結(jié)構(gòu)不需要?dú)w一化?
- 數(shù)值縮放辕录,不影響分裂點(diǎn)位置睦霎。因?yàn)榈谝徊蕉际前凑仗卣髦颠M(jìn)行排序的,排序的順序不變走诞,那么所屬的分支以及分裂點(diǎn)就不會(huì)變副女。對(duì)于線性模型,比如說(shuō)LR速梗,假設(shè)有兩個(gè)特征肮塞,一個(gè)是(0,1)的,一個(gè)是(0,10000)的姻锁,這樣運(yùn)用梯度下降時(shí)候枕赵,損失等高線是一個(gè)橢圓的形狀,這樣想迭代到最優(yōu)點(diǎn)位隶,就需要很多次迭代拷窜,但是如果進(jìn)行了歸一化,那么等高線就是圓形的,那么SGD就會(huì)往原點(diǎn)迭代篮昧,需要的迭代次數(shù)較少赋荆。另外,注意樹(shù)模型是不能進(jìn)行梯度下降的懊昨,因?yàn)闃?shù)模型是階躍的窄潭,階躍點(diǎn)是不可導(dǎo)的,并且求導(dǎo)沒(méi)意義酵颁,所以樹(shù)模型(回歸樹(shù))尋找最優(yōu)點(diǎn)是通過(guò)尋找最優(yōu)分裂點(diǎn)完成的嫉你。
28.一個(gè)完整機(jī)器學(xué)習(xí)項(xiàng)目的流程
- 抽象成數(shù)學(xué)問(wèn)題、獲取數(shù)據(jù)躏惋、特征預(yù)處理與特征選擇幽污、訓(xùn)練模型與調(diào)優(yōu)、模型診斷簿姨、模型融合距误、上線運(yùn)行
29.條件隨機(jī)場(chǎng)CRF模型相對(duì)于HMM模型(隱馬爾科夫模型)和MEMM模型(最大熵隱馬爾科夫模型)的優(yōu)勢(shì)。
- HMM模型中一個(gè)最大的缺點(diǎn)即其輸出獨(dú)立性假設(shè)扁位,由于輸出獨(dú)立性假設(shè)的缺點(diǎn)導(dǎo)致HMM模型不能考慮上下文的特征准潭,限制了特征的選擇。
- MEMM模型則解決了HMM模型的最大的缺點(diǎn)贤牛,可以任意選擇特征惋鹅,但是由于其每一個(gè)節(jié)點(diǎn)都要進(jìn)行歸一化,所以只能找到局部最優(yōu)值殉簸。同時(shí)闰集,也帶來(lái)了標(biāo)記偏見(jiàn)的問(wèn)題即凡是在訓(xùn)練語(yǔ)料庫(kù)中未出現(xiàn)的情況都被忽略掉了。CRF模型很好的解決了這個(gè)問(wèn)題般卑,它并不在每一節(jié)點(diǎn)進(jìn)行歸一化武鲁,而是所有特征進(jìn)行全局歸一化,因此可以求出全局的最優(yōu)值蝠检。
30.什么是熵沐鼠?
- 熵的定義:離散隨機(jī)事件的出現(xiàn)概率。一個(gè)系統(tǒng)越是有序叹谁,信息熵就越低饲梭。信息熵可以被認(rèn)為是系統(tǒng)有序化程度的一個(gè)度量。
31.BP反向傳播算法推導(dǎo)及python實(shí)現(xiàn)
import numpy as np
import matplotlib.pyplot as plt
class MLP():
def __init__(self, name='nn', layer_structure=[], task_model=None, batch_size=1, load_model=None):
"""layer_number : 神經(jīng)網(wǎng)絡(luò)的層數(shù)
layer_structure = [輸入的特征個(gè)數(shù)焰檩,第1層神經(jīng)元個(gè)數(shù)憔涉,第2層神經(jīng)元個(gè)數(shù),...析苫,最后一層神經(jīng)元個(gè)數(shù)輸出層特征個(gè)數(shù)]兜叨,
如網(wǎng)絡(luò)層數(shù)設(shè)為layer_number=3, layer_structure=[20,10,5,1]:輸入特征是20個(gè)穿扳,第一層有10個(gè)神經(jīng)元,第二層5個(gè)国旷,第三層1個(gè).
output_model = 'regression'/'logistic'
"""
self.name = name
self.layer_number = len(layer_structure) - 1
self.layer_structure = layer_structure
self.task_model = task_model
self.W = []
self.B = []
self.batch_size = batch_size
self.total_loss = []
if self.task_model == 'logistic' or self.task_model == 'multi':
self.total_accuracy = []
if load_model == None:
print("Initializing the network from scratch ...")
for index in range(self.layer_number):
self.W.append(np.random.randn(self.layer_structure[index], self.layer_structure[index+1]))
self.B.append(np.random.randn(1, self.layer_structure[index+1]))
else:
print("Initializing the network from trained model ...")
for index in range(self.layer_number):
self.W.append(np.loadtxt(load_model + self.name + "_layer_" + str(index) + "_W.txt").reshape(self.layer_structure[index], self.layer_structure[index+1]))
self.B.append(np.loadtxt(load_model + self.name + "_layer_" + str(index) + "_B.txt").reshape(1, self.layer_structure[index+1]))
def normal_parameters(self, means, sigmas):
self.means = means
self.sigams = sigmas
def sigmoid(self, x):
return 1/(1+np.exp(-x))
def sigmoid_gradient(self, x):
return self.sigmoid(x)*(1-self.sigmoid(x))
def softmax(self, x):
return np.exp(x)/np.sum(np.exp(x), axis = 1, keepdims = True)
def forward(self, x):
"""
intput : x = [batch_size, features]
"""
self.before_activation = []
self.activations = [x]
for index in range(self.layer_number):
if index < self.layer_number - 1:
Z = np.dot(self.activations[index], self.W[index]) + self.B[index]
self.before_activation.append(Z)
self.activations.append(self.sigmoid(Z))
else:
if self.task_model == 'logistic':
Z = np.dot(self.activations[index], self.W[index]) + self.B[index]
self.before_activation.append(Z)
self.activations.append(self.sigmoid(Z))
elif self.task_model == 'regression':
Z = np.dot(self.activations[index], self.W[index]) + self.B[index]
self.before_activation.append(Z)
self.activations.append(Z)
elif self.task_model == 'multi':
Z = np.dot(self.activations[index], self.W[index]) + self.B[index]
self.before_activation.append(Z)
self.activations.append(self.softmax(Z))
return self.activations[-1]
def __call__(self, x):
return self.forward(x)
def lossfunction(self, inputs, target):
if self.task_model == 'regression':
return(np.mean(np.sum((inputs - target)**2, 1)))
elif self.task_model == 'logistic':
return np.mean(np.sum(-target*np.log(inputs+1e-14) - (1-target)*np.log(1-inputs+1e-14), 1))
elif self.task_model == 'multi':
return np.mean(np.sum(-target*np.log(inputs+1e-14), 1))
def back_forward(self, targets=None, loss=None, regularization=False):
self.dWs = []
self.dBs = []
self.dAs = []
W_reverse = self.W[::-1]
activations_reverse = self.activations[::-1]
before_activation_reverse = self.before_activation[::-1]
# 從最后一層開(kāi)始往回傳播
for k in range(self.layer_number):
if(k == 0):
if loss == 'MSE' or loss == 'CE' or loss == 'BE':
dZ = activations_reverse[k] - targets
dW = 1/self.batch_size*np.dot(activations_reverse[k+1].T, dZ)
dB = 1/self.batch_size*np.sum(dZ, axis = 0, keepdims = True)
dA_before = np.dot(dZ, W_reverse[k].T)
self.dWs.append(dW)
self.dBs.append(dB)
self.dAs.append(dA_before)
else:
dZ = self.dAs[k-1]*self.sigmoid_gradient(before_activation_reverse[k])
dW = 1/self.batch_size*np.dot(activations_reverse[k+1].T,dZ)
dB = 1/self.batch_size*np.sum(dZ, axis = 0, keepdims = True)
dA_before = np.dot(dZ, W_reverse[k].T)
self.dWs.append(dW)
self.dBs.append(dB)
self.dAs.append(dA_before)
self.dWs = self.dWs[::-1]
self.dBs = self.dBs[::-1]
def steps(self, lr=0.001, lr_decay=False):
for index in range(len(self.dWs)):
self.W[index] -= lr*self.dWs[index]
self.B[index] -= lr*self.dBs[index]
def train(self, train_datas=None, train_targets=None, train_epoch=1, lr=0.001, lr_decay=False, loss='MSE', regularization=False, display=False):
train_counts = 0
for epoch in range(train_epoch):
if epoch == int(train_epoch * 0.7) and lr_decay == True:
lr *= 0.1
train_steps = train_datas.shape[0] // self.batch_size
for i in range(train_steps):
input_data = train_datas[self.batch_size*i : self.batch_size*(i+1), :].reshape(self.batch_size, train_datas.shape[1])
targets = train_targets[self.batch_size*i : self.batch_size*(i+1), :].reshape(self.batch_size, train_targets.shape[1])
prediction = self.forward(input_data)
forward_loss = self.lossfunction(prediction, targets)
if self.task_model=='logistic':
accuracy = np.sum((prediction>0.6) == targets) / targets.shape[0]
self.total_accuracy.append(accuracy)
elif self.task_model=='multi':
accuracy = np.sum(np.argmax(prediction,1) == np.argmax(targets,1)) / targets.shape[0]
self.total_accuracy.append(accuracy)
self.total_loss.append(forward_loss)
if display:
if train_counts % 10 == 0:
if self.task_model == 'logistic' or self.task_model == 'multi':
print("After " + str(train_counts) + ", loss is ", forward_loss,
", accuracy is ", accuracy)
else:
print("After " + str(train_counts) + ", loss is ", forward_loss)
self.back_forward(targets=targets, loss=loss, regularization=regularization)
self.steps(lr=lr, lr_decay=lr_decay)
train_counts += 1
def save_model(self, path):
print("Saving the " + self.name + " model ...")
for i in range(self.layer_number):
np.savetxt(path + self.name + "_layer_" + str(i) + "_W.txt", self.W[i])
np.savetxt(path + self.name + "_layer_" + str(i) + "_B.txt", self.B[i])
print("Model saved !!!")
32.K_Means算法的原理
- 聚類算法綜述:聚類算法是一種無(wú)監(jiān)督學(xué)習(xí)算法矛物,它是將相似的對(duì)象歸到同一個(gè)簇中。K均值算法中的K可以理解用戶想要聚類成K個(gè)不同的簇跪但,K是一個(gè)用戶可以自行定義的超參數(shù)履羞。
- K均值聚類的優(yōu)缺點(diǎn):
- 優(yōu)點(diǎn):容易實(shí)現(xiàn)
- 缺點(diǎn):可能收斂到局部最小值,在大規(guī)模的數(shù)據(jù)上收斂慢
- 適用場(chǎng)合:數(shù)值型數(shù)據(jù)
- K_Means算法的基本流程:
- 1.隨機(jī)選擇K個(gè)點(diǎn)作為起始的聚類中心
- 2.遍歷每個(gè)樣本特漩,計(jì)算每個(gè)樣本到K個(gè)聚類中心的距離吧雹,找出"距離"聚類中心最近的樣本,并將此樣本聚集到離它最近的那一個(gè)簇中涂身。注:K_Means算法的性能會(huì)受到所選距離計(jì)算方法的影響。
- 3.所有樣本都聚集到K個(gè)簇完成后搓蚪,計(jì)算K個(gè)簇的均值蛤售,并將聚類中心移動(dòng)到K個(gè)簇的均值處作為新的聚類中心。
- 4.重復(fù)上述步驟2~3妒潭,直到最大迭代次數(shù)就停止悴能。
-
K_Means算法的優(yōu)化(為了克服收斂于局部最小值提出):如何知道生成的簇比較好?一種用來(lái)衡量K_Means算法聚類效果的指標(biāo)是SSE誤差平方和(預(yù)測(cè)數(shù)據(jù)與原始數(shù)據(jù)之間誤差的平方和),SSE越小表示樣本點(diǎn)越接近于聚類中心點(diǎn)雳灾,聚類效果越好漠酿。因?yàn)閷?duì)誤差取了平方,因此更加重視那些遠(yuǎn)離聚類中心的點(diǎn)(未理解)谎亩。降低SSE值的方法是增加簇的個(gè)數(shù)炒嘲,但是簇的個(gè)數(shù)K在算法一開(kāi)始運(yùn)行時(shí)就固定了,不能改變匈庭。聚類的目標(biāo)是在保持原有簇?cái)?shù)目不變的條件下夫凸,提高簇的質(zhì)量。常用思想是:對(duì)生成的簇進(jìn)行后處理阱持,將具有最大SSE值的簇劃分成兩個(gè)簇夭拌。為了保持簇的總數(shù)不變,可以將某兩個(gè)簇進(jìn)行合并衷咽「氡猓可以有下面兩種方法合并:
- 1.合并最近的聚類中心:計(jì)算所有聚類中心之間的距離,合并距離最近的兩個(gè)聚類中心點(diǎn)镶骗。
- 2.合并兩個(gè)使得SSE增加最小的聚類中心:合并兩個(gè)簇桶现,然后計(jì)算總的SSE。必須在所有可能的兩個(gè)簇上重復(fù)上述處理過(guò)程卖词,直到找到合并最佳的兩個(gè)簇巩那。