算法崗面試常見(jiàn)問(wèn)題大集合

技術(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í)際要求城豁。
    d(x, y) :=\sqrt{\left(x_{1}-y_{1}\right)^{2}+\left(x_{2}-y_{2}\right)^{2}+\cdots+\left(x_{n}-y_{n}\right)^{2}}=\sqrt{\sum_{i=1}^{n}\left(x_{i}-y_{i}\right)^{2}}
  • 曼哈頓距離苟穆,也就是歐式空間中的在直角坐標(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ì)算公式為:
    \left|x_{1}-x_{2}\right|+\left|y_{1}-y_{2}\right|

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ù)為:
    \left(K_{h} * K_{w} * C_{i n}\right) * C_{o u t}+C_{o u t}
    其中尝蠕,K_{h}是卷積核的高度,K_{w}是卷積核的寬度,C_{in}是輸入的通道數(shù)载庭,C_{out}是輸出的通道數(shù)
  • 對(duì)于某個(gè)全連接層看彼,如果輸入的數(shù)據(jù)有N_{in}個(gè)節(jié)點(diǎn)廊佩,輸出的數(shù)據(jù)有N_{out}個(gè)節(jié)點(diǎn),它的參數(shù)個(gè)數(shù)為:
    N_{i n} * N_{o u t}+N_{o u t}
  • FLOPs:全稱是floating point operations per second靖榕,指的是每秒浮點(diǎn)運(yùn)算次數(shù)标锄,即用來(lái)衡量硬件的計(jì)算性能
  • 對(duì)于某個(gè)卷積層,它的FLOPs數(shù)量是:
    \left[\left(K_{h} * K_{w} * C_{i n}\right) * C_{o u t}+C_{o u t}\right] *(H * W)=n u m_{-} \text { params } *(H * W)
    其中,num_{params}表示該層參數(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)積公式
    \kappa\left(x_{1}, x_{2}\right)=\left\langle x_{1}, x_{2}\right\rangle
  • 多項(xiàng)式核函數(shù)
    K(x, z)=(x \cdot z+1)^{p}
  • 高斯核函數(shù)
    K(x, z)=\exp \left(-\frac{\|x-z\|^{2}}{2 \sigma^{2}}\right)
  • 字符串核函數(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ù)下隱變量的條件概率值
      Q_{i}\left(z^{(i)}\right) :=p\left(z^{(i)} | x^{(i)} ; \theta\right)
    • M步:結(jié)合E步求出的隱變量的條件概率值麻顶,求出似然函數(shù)的下界函數(shù)(即某個(gè)期望函數(shù))最大值赦抖。
      \theta :=\arg \max _{\theta} \sum_{i} \sum_{z^{(i)}} Q_{i}\left(z^{(i)}\right) \log \frac{p\left(x^{(i)}, z^{(i)} ; \theta\right)}{Q_{i}\left(z^{(i)}\right)}
    • 重復(fù)進(jìn)行上面的兩步,直至收斂為止辅肾。
  • M步中下界函數(shù)的推導(dǎo)過(guò)程:
    \begin{aligned} \sum_{i} \log p\left(x^{(i)} ; \theta\right) &=\sum_{i} \log \sum_{z^{(i)}} p\left(x^{(i)}, z^{(i)} ; \theta\right) \\ &=\sum_{i} \log \sum_{z^{(i)}} Q_{i}\left(z^{(i)}\right) \frac{p\left(x^{(i)}, z^{(i)} ; \theta\right)}{Q_{i}\left(z^{(i)}\right)} \\ & \geq \sum_{i} \sum_{z^{(i)}} Q_{i}\left(z^{(i)}\right) \log \frac{p\left(x^{(i)}, z^{(i)} ; \theta\right)}{Q_{i}\left(z^{(i)}\right)} \end{aligned}

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è)高斯模型的概率)
      w_{j}^{(i)} :=p\left(z^{(i)}=j | x^{(i)} ; \phi, \mu, \Sigma\right)
      具體的計(jì)算公式為:
      p\left(z^{(i)}=j | x^{(i)} ; \phi, \mu, \Sigma\right)=\frac{p\left(x^{(i)} | z^{(i)}=j ; \mu, \Sigma\right) p\left(z^{(i)}=j ; \phi\right)}{\sum_{l=1}^{k} p\left(x^{(i)} | z^{(i)}=l ; \mu, \Sigma\right) p\left(z^{(i)}=l ; \phi\right)}
    • M步計(jì)算公式(計(jì)算每個(gè)高斯模型的權(quán)重新娜,均值赵辕,方差3個(gè)參數(shù)):
      \begin{aligned} \phi_{j} & :=\frac{1}{m} \sum_{i=1}^{m} w_{j}^{(i)} \\ \mu_{j} & :=\frac{\sum_{i=1}^{m} w_{j}^{(i)} x^{(i)}}{\sum_{i=1}^{m} w_{j}^{(i)}} \\ \Sigma_{j} & :=\frac{\sum_{i=1}^{m} w_{j}^{(i)}\left(x^{(i)}-\mu_{j}\right)\left(x^{(i)}-\mu_{j}\right)^{T}}{\sum_{i=1}^{m} w_{j}^{(i)}} \end{aligned}

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)

圖1.jpg

圖2.jpg

圖3.jpg
  • 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è)簇巩那。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吏夯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子即横,更是在濱河造成了極大的恐慌噪生,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件东囚,死亡現(xiàn)場(chǎng)離奇詭異跺嗽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)页藻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)桨嫁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人份帐,你說(shuō)我怎么就攤上這事璃吧。” “怎么了废境?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵畜挨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我噩凹,道長(zhǎng)巴元,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任驮宴,我火速辦了婚禮逮刨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堵泽。我一直安慰自己修己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布落恼。 她就那樣靜靜地躺著箩退,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佳谦。 梳的紋絲不亂的頭發(fā)上戴涝,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音钻蔑,去河邊找鬼啥刻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咪笑,可吹牛的內(nèi)容都是我干的可帽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼窗怒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼映跟!你這毒婦竟也來(lái)了蓄拣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤努隙,失蹤者是張志新(化名)和其女友劉穎球恤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體荸镊,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咽斧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躬存。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片张惹。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岭洲,靈堂內(nèi)的尸體忽然破棺而出宛逗,到底是詐尸還是另有隱情,我是刑警寧澤盾剩,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布拧额,位于F島的核電站,受9級(jí)特大地震影響彪腔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜进栽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一德挣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧快毛,春花似錦格嗅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至襟衰,卻和暖如春贴铜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瀑晒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工绍坝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苔悦。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓轩褐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親玖详。 傳聞我的和親對(duì)象是個(gè)殘疾皇子把介,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354