機器學(xué)習(xí)(深度學(xué)習(xí))常見面試題--基礎(chǔ)知識篇

1. 模型評估

在機器學(xué)習(xí)領(lǐng)域,模型評估至關(guān)重要僧界,只有選擇和問題相匹配的評估方法拟枚,才能更快更好的完成訓(xùn)練哩盲。
將模型評估之前拢切,需要有幾個定義牢記心中月洛。

  • TP — 將正樣本分類為正的數(shù)挂签;
  • FN — 將正樣本分類為負(fù)的數(shù)痰憎;
  • FP — 將負(fù)樣本分類為正的數(shù)震嫉;
  • TN — 將負(fù)樣本分類為負(fù)的數(shù)价卤。

Accuracy

準(zhǔn)確率赤赊,分類正確的樣本占總樣本的比例闯狱。
Accuracy = \frac{n_{correct}}{n_{total}}
當(dāng)不同類別的樣本比例非常不均衡時,占比大的類別往往成為影響準(zhǔn)確率的主要因素抛计。即準(zhǔn)確率雖然簡單直觀哄孤,但會收到樣本不均衡問題的干擾,導(dǎo)致不能很好的反應(yīng)模型性能吹截。
可以使用平均準(zhǔn)確率(每個類別下樣本準(zhǔn)確了的算數(shù)平均)瘦陈。

Recall

召回率,實際為正且預(yù)測為正的樣本量與實際為正的樣本量的比值波俄。
Recall = \frac{TP}{TP + FN}

Precision

精確率晨逝,實際為正且預(yù)測為正的樣本量與預(yù)測為正的樣本量的比值。
Presision = \frac{TP}{TP + FP}

F1-score

前邊介紹了Recall和Precision懦铺,他們是既矛盾又統(tǒng)一的兩個指標(biāo)捉貌。為了提高Precision,模型要盡可能把更有把握的樣本預(yù)測為正,這就回導(dǎo)致大量實際為正的樣本預(yù)測為負(fù)趁窃,致使Recall變低牧挣。F1-score是個很好的指標(biāo)能融合Recall和Precision兩個指標(biāo)。
F1 = \frac{2 \cdot Precision \cdot Recall }{Precision + Recall}

P-R曲線

P-R曲線橫軸是Recall醒陆,縱軸是Precision瀑构。P-R曲線上的每個點,代表在在某一閾值下统求,將大于該閾值的樣本分類為正检碗,小于該閾值的樣本分類為負(fù)時,Recall和Precision的值码邻。P-R曲線是將閾值從大到小排列生成的折剃。

ROC曲線

ROC曲線,受試者工作特征曲線像屋。最初用于軍事和醫(yī)學(xué)領(lǐng)域怕犁。橫軸是假陽性率(FPR),縱軸是真陽性率(TPR)己莺。
FPR = \frac{FP}{FP + TN}
TPR = \frac{TP}{TP + FN}
ROC曲線的畫法:
二分類任務(wù)中奏甫,模型輸出一般為預(yù)測樣本為正例的概率。按照預(yù)測概率從高到低排序凌受,并封別將其作為閾值阵子,大于該閾值的為正例。每個閾值對應(yīng)一個FPR和TPR胜蛉,連接所有點就成了ROC曲線挠进。

AUC

AUC為ROC曲線下面積。一般取值在0.5~1之間誊册,越大越好领突。

P-R VS ROC

至此我們分別介紹了P-R曲線和ROC曲線。在非常偏態(tài)的數(shù)據(jù)集上案怯,P-R曲線能更全面衡量模型表現(xiàn)君旦。當(dāng)正負(fù)樣本發(fā)生變化時,ROC曲線形狀基本不變嘲碱,而P-R曲線會發(fā)生劇烈變化金砍。

2. 基礎(chǔ)模型

GBDT(梯度提升樹)

梯度提升樹,是機器學(xué)習(xí)中非常優(yōu)秀的模型麦锯。非常好的體現(xiàn)了“從錯誤中學(xué)習(xí)”的理念捞魁,基于決策樹訓(xùn)練的殘差進行學(xué)習(xí),其中殘差用損失函數(shù)的負(fù)梯度來擬合离咐。需要注意的是谱俭,在每一輪迭代中奉件,首先計算當(dāng)前模型在所有樣本上的負(fù)梯度,并以此為新的目標(biāo)訓(xùn)練一個新的弱分類器并計算該弱分類器的權(quán)重昆著,最終實現(xiàn)模型的更新县貌。

GBDT算法

如上圖所示,h(x_i:a)表示一個基函數(shù)凑懂,即CART樹煤痕。參數(shù)a_m表示樹的劃分變量、劃分位置等信息接谨,通過優(yōu)化算法得出摆碉。\rho_m為當(dāng)前第m棵樹的權(quán)重,通過優(yōu)化算法得出脓豪。

優(yōu)點
  • 預(yù)測階段很快巷帝,樹之間可以并行計算
  • 在分布稠密的數(shù)據(jù)集上,泛化能力和表達(dá)能力都很好
  • 使用弱分類器扫夜,具有更好的魯棒性
缺點
  • 在高維稀疏數(shù)據(jù)集上楞泼,表現(xiàn)不如SVM或者神經(jīng)網(wǎng)絡(luò)
  • 訓(xùn)練過程比較慢,需要串行

XGBoost/GBDT及聯(lián)系和區(qū)別

XGBoost是陳天奇等人開源的機器學(xué)習(xí)框架笤闯。是GBDT的一種高效實現(xiàn)方式堕阔,并在工程上做了一些改進。原始的GBDT由經(jīng)驗損失函數(shù)的負(fù)梯度構(gòu)建新的決策樹颗味,在決策樹構(gòu)建完成后進行剪枝超陆。而XGBoost在構(gòu)建決策樹階段就加入了正則項
L_t = \sum_{i}l(y_i, F_{t-1}(x_i) + f_i(x_i)) + \Omega(f_t)
其中\Omega(f_t)樹結(jié)構(gòu)的正則化項:
\Omega(f_t) = \gamma T + \frac{1}{2} \lambda\sum_{j=1}^{T}w_j^2
T為葉子結(jié)點的個數(shù),w_j為葉子結(jié)點預(yù)測值浦马。
對損失函數(shù)L_tF_{t-1}處進行二階泰勒展開:
L_t \approx \tilde{L}_t = \sum_{j=1}^T \left[ G_j w_j + \frac{1}{2} (H_j + \lambda) w_j^2 \right] + \gamma T
其中G_j = \sum_{i \in I_j} \nabla_{F_{t-1}}l(y_i, F_{t-1}(x_i))时呀,H_j = \sum_{i \in I_j} \nabla_{F_{t-1}}^2l(y_i, F_{t-1}(x_i))I_j表示所有葉子結(jié)點j的樣本的索引的集合捐韩。
如果樹的結(jié)構(gòu)已知退唠,那么可以通過對損失函數(shù)求導(dǎo)得出葉子結(jié)點的預(yù)測值:
w_j^* = - \frac{G_j}{H_J + \lambda}
但是我們很難從所有結(jié)構(gòu)中找到最好的樹結(jié)構(gòu)鹃锈,是個NP-hard問題荤胁。因此只能用貪心算法找到一個次優(yōu)的樹。XGBoost有自己的方式選取最優(yōu)分裂屎债,采用的是CART算法仅政。
將預(yù)測值倒入到損失函數(shù)中,可以求得損失函數(shù)的極小值:
\tilde{L}_t^* = - \frac{1}{2} \sum_{j=1}^T[ \frac{G_j^2}{H_j + \lambda} ] + \gamma T
然后計算分裂前后損失的差值:
Gain = \frac{G_L^2}{H_{L} + \lambda } + \frac{G_R^2}{H_{R} + \lambda} - \frac{(G_L + G_R)^2}{H_L + H_R + \lambda} - \gamma
XGBoost通過遍歷所有可能的取值盆驹,找到最大化Gain的值進行分裂圆丹。
現(xiàn)總結(jié)如下:

  • GBDT是算法,XGBoost是其中一種工程實現(xiàn)
  • 在CART作為基分類器時躯喇,XGBoost引入了正則化項來控制模型的復(fù)雜度辫封,這有利于防止模型過擬合硝枉。
  • GBDT在訓(xùn)練時,只用了損失函數(shù)的一階導(dǎo)數(shù)倦微,XGBoost對損失函數(shù)進行泰勒展開妻味,同時用了一階導(dǎo)數(shù)和二階導(dǎo)數(shù)。
  • 傳統(tǒng)GBDT采用CART樹作為基分類起欣福,XGBoost支持多種類型的分類器。
  • 傳統(tǒng)GBDT在每輪迭代是使用了全部數(shù)據(jù)雏逾,XGBoost采用了類似隨機森林的策略郑临,支持對數(shù)據(jù)進行采樣。
  • 傳統(tǒng)GBDT沒有對缺失值進行處理牧抵,XGBoost采用稀疏感知算法,能自動學(xué)習(xí)出缺失值的處理策略妹孙。稀疏感知算法获枝,分別枚舉特征缺省的樣本歸為左右分支后的增益蠢正,選擇增益最大的枚舉項即為最優(yōu)缺省方向。

LightGBM和XGBoost的區(qū)別

從名字可以看出省店,LightGBM是輕量級的GBM嚣崭,相比XGBoost有訓(xùn)練速度快,占用內(nèi)存底等特點懦傍。

單邊梯度抽樣算法(GOSS)

GBDT的梯度大小可以反應(yīng)樣本的權(quán)重雹舀,梯度越小說明模型擬合越好。單邊梯度抽樣算法利用這一點粗俱,減少了梯度小的樣本说榆,計算過程中重點關(guān)注梯度大的樣本,極大減少了計算量寸认。同時為了不改變樣本分布签财,在計算增益時,對梯度小的樣本引入一個常數(shù)進行平衡偏塞。

直方圖算法

直方圖法唱蒸,是將連續(xù)特征離散化成k特離散特征,從而不再需要遍歷所有取值灸叼,只需要遍歷k個離散特征尋找最佳分裂點神汹。雖然該方法可能會對模型精度有一定影響庆捺,在一定程度上起到了正則化的效果。

互斥特征捆綁算法

特征之間有可能是互相排斥的屁魏,將互相排斥的特征捆綁疼燥,可以降低特征數(shù)量。

基于最大深度的 Leaf-wise 的垂直生長算法
  • Level-wise: 基于層進行生長醉者,直到達(dá)到停止條件;
  • Leaf-wise: 每次分裂增益最大的葉子節(jié)點呈队,直到達(dá)到停止條件粒竖。

XGBoost 采用 Level-wise 的增長策略蕊苗,方便并行計算每一層的分裂節(jié)點朽砰,提高了訓(xùn)練速度瞧柔,但同時也因為節(jié)點增益過小增加了很多不必要的分裂造锅,降低了計算量; LightGBM 采用 Leaf-wise 的增長策略減少了計算量肺素,配合最大深度的限制防止過擬合宇驾,由于每次都需要計算增益最大的節(jié)點塌西,所以無法并行分裂捡需。

類別特征最優(yōu)分割

LightGBM 原生支持類別特征站辉,采用 many-vs-many 的切分方式將類別特征分為兩個子集饰剥,實現(xiàn)類別特征的最優(yōu)切分。 假設(shè)有某維特征有 k 個類別棒卷,則有 2^{(k-1)} - 1 中可能若厚,時間復(fù)雜度為 O(2^k) 盹沈,LightGBM 基于 Fisher 大佬的 《On Grouping For Maximum Homogeneity》實現(xiàn)了 O(klog_2k) 的時間復(fù)雜度乞封。

特征并行和數(shù)據(jù)并行
緩存優(yōu)化

LightGBM怎么調(diào)參

以下是參數(shù)結(jié)束肃晚,復(fù)制自官網(wǎng)。

  • boosting_type (str, optional (default='gbdt')) – ‘gbdt’, traditional Gradient Boosting Decision Tree. ‘dart’, Dropouts meet Multiple Additive Regression Trees. ‘goss’, Gradient-based One-Side Sampling. ‘rf’, Random Forest.
  • num_leaves (int, optional (default=31)) – Maximum tree leaves for base learners.
  • max_depth (int, optional (default=-1)) – Maximum tree depth for base learners, <=0 means no limit.
  • learning_rate (float, optional (default=0.1)) – Boosting learning rate. You can use callbacks parameter of fit method to shrink/adapt learning rate in training using reset_parameter callback. Note, that this will ignore the learning_rate argument in training.
  • n_estimators (int, optional (default=100)) – Number of boosted trees to fit.
  • subsample_for_bin (int, optional (default=200000)) – Number of samples for constructing bins.
  • objective (str, callable or None, optional (default=None)) – Specify the learning task and the corresponding learning objective or a custom objective function to be used (see note below). Default: ‘regression’ for LGBMRegressor, ‘binary’ or ‘multiclass’ for LGBMClassifier, ‘lambdarank’ for LGBMRanker.
  • class_weight (dict, 'balanced' or None, optional (default=None)) – Weights associated with classes in the form {class_label: weight}. Use this parameter only for multi-class classification task; for binary classification task you may use is_unbalance or scale_pos_weight parameters. Note, that the usage of all these parameters will result in poor estimates of the individual class probabilities. You may want to consider performing probability calibration (https://scikit-learn.org/stable/modules/calibration.html) of your model. The ‘balanced’ mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as n_samples / (n_classes * np.bincount(y)). If None, all classes are supposed to have weight one. Note, that these weights will be multiplied with sample_weight (passed through the fit method) if sample_weight is specified.
  • min_split_gain (float, optional (default=0.)) – Minimum loss reduction required to make a further partition on a leaf node of the tree.
  • min_child_weight (float, optional (default=1e-3)) – Minimum sum of instance weight (hessian) needed in a child (leaf).
  • min_child_samples (int, optional (default=20)) – Minimum number of data needed in a child (leaf).
  • subsample (float, optional (default=1.)) – Subsample ratio of the training instance.
  • subsample_freq (int, optional (default=0)) – Frequency of subsample, <=0 means no enable.
  • colsample_bytree (float, optional (default=1.)) – Subsample ratio of columns when constructing each tree.
  • reg_alpha (float, optional (default=0.)) – L1 regularization term on weights.
  • reg_lambda (float, optional (default=0.)) – L2 regularization term on weights.
  • random_state (int, RandomState object or None, optional (default=None)) – Random number seed. If int, this number is used to seed the C++ code. If RandomState object (numpy), a random integer is picked based on its state to seed the C++ code. If None, default seeds in C++ code are used.
  • n_jobs (int, optional (default=-1)) – Number of parallel threads to use for training (can be changed at prediction time).
  • importance_type (str, optional (default='split')) – The type of feature importance to be filled into feature_importances_. If ‘split’, result contains numbers of times the feature is used in a model. If ‘gain’, result contains total gains of splits which use the feature.

針對更好的準(zhǔn)確率

  • Use large max_bin (may be slower)
  • Use small learning_rate with large num_iterations
  • Use large num_leaves (may cause over-fitting)
  • Use bigger training data
  • Try dart
  • 使用較大的 max_bin (學(xué)習(xí)速度可能變慢)
  • 使用較小的 learning_rate 和較大的 num_iterations
  • 使用較大的 num_leaves (可能導(dǎo)致過擬合)
  • 使用更大的訓(xùn)練數(shù)據(jù)
  • 嘗試 dart

處理過擬合

  • 使用early_stopping
  • Use small max_bin
  • Use small num_leaves
  • Use min_data_in_leaf and min_sum_hessian_in_leaf
  • Use bagging by set bagging_fraction and bagging_freq
  • Use feature sub-sampling by set feature_fraction
  • Use bigger training data
  • Try lambda_l1, lambda_l2 and min_gain_to_split for regularization
  • Try max_depth to avoid growing deep tree
  • 使用較小的 max_bin
  • 使用較小的 num_leaves
  • 使用 min_data_in_leafmin_sum_hessian_in_leaf
  • 通過設(shè)置 bagging_fractionbagging_freq 來使用 bagging
  • 通過設(shè)置 feature_fraction 來使用特征子抽樣
  • 使用更大的訓(xùn)練數(shù)據(jù)
  • 使用 lambda_l1, lambda_l2min_gain_to_split 來使用正則
  • 嘗試 max_depth 來避免生成過深的樹

邏輯回歸損失函數(shù)推導(dǎo)

邏輯回歸
p = \sigma(\theta^TX)
其中\sigma(x) = \frac{1}{1 - e^{-x} }。也叫對數(shù)幾率回歸:
log \frac{p}{1-p} = \theta^TX
其中\frac{p}{1-p}為幾率落剪。
已知邏輯回歸模型:
p = \frac{1}{1 - e^{-\theta^TX}} \\ \left\{ \begin{array}{**lr**} y = 1 & p \geq 0.5 \\ y = 0 & p < 0.5 \end{array} \right.
邏輯回歸作為二分類問題忠怖,損失函數(shù)也分為兩部分

  • 當(dāng)真實樣本y=1時凡泣,估計出來的概率p越小鞋拟,損失函數(shù)值越大
  • 當(dāng)真實樣本y=0時,估計出來的概率p越大席舍,損失函數(shù)值越大
    可以使用如下函數(shù)
    J = \left\{ \begin{array}{**lr**} -log(p) & y = 1 \\ -log(1-p) & y = 0 \end{array} \right.
    上邊兩個式子可以合并:
    J(p, y) = -log(p)^y - log(1-p)^{1-y}
    對于整個集合的損失函數(shù),可以取其平均值:
    J(\theta) = - \frac{1}{m} \sum_{i=1}^{m}y_ilog(p_i) + (1-y_i)log(1-p_i)
    其中p_i = \sigma(\theta^Tx_i)福铅。
    即:
    L(\theta) = - \frac{1}{m} \sum_{i=1}^{m} y_i log(\sigma(\theta^TX_i)) + (1 - y_i) log(1-\sigma(\theta^TX_i))

SoftMax和CrossEntropy求梯度

我們考慮如下結(jié)構(gòu)的softmax

softmax

輸入分別為1滑黔、2略荡、3汛兜,經(jīng)過全連接后得到4、5辫塌、6掺喻,在對4巢寡、5抑月、6做softmax谦絮,得到a4层皱、a5、a6她奥。
a4绷跑、a5砸捏、a6機會模型輸出的概率分布垦藏,損失函數(shù)為 -Y log A∠ヅ海現(xiàn)在考慮對w41求導(dǎo):
\frac{\delta Loss}{\delta w_{41}} = \frac{\delta Loss}{\delta A} \cdot \frac{\delta A}{\delta z_4 } \cdot \frac{\delta z_4 }{\delta w_{41}}
其中\frac{\delta Loss}{\delta a_4} = \frac{1}{a_4}, \frac{\delta z_4 }{\delta w_{41}} = x_1,比較麻煩的是\frac{\delta A }{\delta z_4 }蝗肪。
當(dāng)i = j時:\frac{\delta a_j }{\delta z_j } = a_j(1-a_j)
當(dāng)i != j時:\frac{\delta a_j }{\delta z_i } = -a_ja_i

3. 神經(jīng)網(wǎng)絡(luò)

神經(jīng)網(wǎng)絡(luò)有哪些初始化方法

神經(jīng)網(wǎng)絡(luò)初始化的選擇很關(guān)鍵辛馆,不合理的初始化甚至?xí)?dǎo)致梯度消失昙篙、梯度爆炸等問題缴挖,對模型訓(xùn)練產(chǎn)生負(fù)面影響映屋。

1. 全零初始化或等值初始化

并不推薦棚点,由于每個神經(jīng)元學(xué)到的東西完全相同瘫析,會導(dǎo)致對稱性問題颁股。

2. 正態(tài)初始化

0均值甘有,標(biāo)準(zhǔn)差設(shè)置成一個小值亏掀。
這樣做的好處是滤愕,權(quán)重有相同的偏差间影,有正有負(fù),比較合理裙顽。

3. 均值初始化

均值初始化的區(qū)間為[- \frac{1}{\sqrt{n_{in}}}, \frac{1}{\sqrt{n_{in}} }], n_{in}表示輸入神經(jīng)元的數(shù)量键科。

4. Xavier初始化

根據(jù)sigmoid函數(shù)的特點勋颖,可以推想出:
如果初始化值很小饭玲,隨著層數(shù)的傳遞卑硫,方差就會趨近于0蚕断,從而導(dǎo)致失去非線性只有線性亿乳。
如果初始化值很大葛假,隨著層數(shù)的傳遞,方差會迅速變大恢氯,sigmoid的輸入很大時勋磕,會導(dǎo)致梯度小時問題挂滓。Xavier初始化同時考慮了網(wǎng)絡(luò)的大懈险尽(輸入亲怠、輸出神經(jīng)元數(shù)量)团秽,有兩種方法:

  • 均值為0踪栋,方差為\sqrt{\frac{2}{n_{in} + n_{out}}}
  • 均勻分布夷都,[-\sqrt\frac{6}{n_{in} + n_{out}}, \sqrt\frac{6}{n_{in} + n_{out } } ]
    這種方法對于激活函數(shù)是sigmoid或tanh的神經(jīng)網(wǎng)絡(luò)比較好囤官。

5. He 初始化

也有兩種方式:

  • 均值為0党饮,方差為\sqrt\frac{2}{n_{in}}
  • 均勻分布刑顺,[- \sqrt\frac{6}{n_{in }}, \sqrt\frac{6}{n_{in} }]
    適用于ReLU等為激活函數(shù)的神經(jīng)網(wǎng)絡(luò)。

6. Pre-trained

即最近流行的遷移學(xué)習(xí)贝淤,使用與訓(xùn)練的權(quán)重初始化朽基,起點更好踩晶,收斂速度更快渡蜻。

BatchNorm

訓(xùn)練和測試

Batch-Normalization是一種讓神經(jīng)網(wǎng)絡(luò)訓(xùn)練更快茸苇、更穩(wěn)定的方法学密。計算每個mini-batch的均值方差腻暮,并將輸入拉回到均值為0方差為1的表征正態(tài)分布哭靖,最后還要學(xué)習(xí)\gamma \beta對其進行伸縮變換筝蚕,最終得到Batch-Normalization層的輸出起宽。

batch-normalization

需要注意的是坯沪,在測試階段屏箍,由于不一定存在mini-batch,因此需要使用訓(xùn)練階段的均值钝诚、方差凝颇。
affine表示是否進行仿射拧略。
track_running_stats表示是否使用全局均值垫蛆、方差袱饭。
記錄一個滑動平均的均值虑乖、方差:
mean = momentum * mean + (1-momentum) * x_mean
var = momentum * var + (1-momentum) * x_var

研究表明仅叫,BatchNorm放到激活函數(shù)之后通常能帶來更好的效果惑芭。

BatchNorm作用

  • 隨著網(wǎng)絡(luò)的深入遂跟,每個隱藏層的參數(shù)變化導(dǎo)致后一層神經(jīng)層的輸入發(fā)生變化幻锁,不同batch的數(shù)據(jù)分布也可能發(fā)生細(xì)微變化哄尔。這些變化會迫使神經(jīng)網(wǎng)絡(luò)要擬合到不同分布的數(shù)據(jù)岭接,增加了訓(xùn)練難度和過擬合風(fēng)險。
  • BN效果好是因為BN的存在會引入mini-batch內(nèi)其他樣本的信息粘拾,就會導(dǎo)致預(yù)測一個獨立樣本時入偷,其他樣本信息相當(dāng)于正則項疏之,使得loss曲面變得更加平滑锋爪,更容易找到最優(yōu)解几缭。

Dropout

在機器學(xué)習(xí)中年栓,如果模型參數(shù)太多某抓,而訓(xùn)練樣本不足否副,很容易導(dǎo)致模型過擬合备禀。Dropout可以在一定程度上緩解過擬合的風(fēng)險曲尸,起到正則化的效果纽乱。
Dropout就是在前向傳播的過程中鸦列,讓神經(jīng)元以一定的概率p停止工作薯嗤,這樣可以使他不過多依賴特定特征組合应民,使模型泛化能力更強。

Dropout流程

首先以一定概率刪掉該層的神經(jīng)元涉馅,得到新的神經(jīng)網(wǎng)絡(luò)稚矿。再把輸入x輸入到新的神經(jīng)網(wǎng)絡(luò)中晤揣,得到損失函數(shù)昧识,反向傳播跪楞,更新這個新的神經(jīng)網(wǎng)絡(luò)的參數(shù)甸祭。最后恢復(fù)原始的神經(jīng)網(wǎng)絡(luò)池户,在另一個batch的訓(xùn)練中重復(fù)前邊兩個步驟处嫌,直到訓(xùn)練完全結(jié)束熏迹。
測試階段注暗,由于不再以概率p將神經(jīng)元刪除捆昏,需要對權(quán)重W乘以概率參數(shù)p骗卜。保證該層輸出比訓(xùn)練階段不出現(xiàn)太大變化寇仓。
由于我們訓(xùn)練的時候會隨機的丟棄一些神經(jīng)元,但是預(yù)測的時候就沒辦法隨機丟棄了躺枕。如果丟棄一些神經(jīng)元罢猪,這會帶來結(jié)果不穩(wěn)定的問題膳帕,也就是給定一個測試數(shù)據(jù)备闲,有時候輸出a有時候輸出b恬砂,結(jié)果不穩(wěn)定泻骤,這是實際系統(tǒng)不能接受的狱掂,用戶可能認(rèn)為模型預(yù)測不準(zhǔn)鸟顺。那么一種”補償“的方案就是每個神經(jīng)元的權(quán)重都乘以一個p讯嫂,這樣在“總體上”使得測試數(shù)據(jù)和訓(xùn)練數(shù)據(jù)是大致一樣的欧芽。比如一個神經(jīng)元的輸出是x千扔,那么在訓(xùn)練的時候它有p的概率參與訓(xùn)練曲楚,(1-p)的概率丟棄洞渤,那么它輸出的期望是px+(1-p)0=px。因此測試的時候把這個神經(jīng)元的權(quán)重乘以p可以得到同樣的期望抡蛙。

Dropout位置

Dropout一般放到全連接層之后粗截,激活函數(shù)之前熊昌,防止過擬合婿屹。一般不會放到卷基層后昂利,由于卷基層參數(shù)較少蜂奸,一般使用BatchNorm即可围详。

Dropout防止過擬合的原因

  1. 取平均祖屏。Dropout掉不同的神經(jīng)元嫉拐,就像在訓(xùn)練不同的神經(jīng)網(wǎng)絡(luò)魁兼。不同的網(wǎng)絡(luò)會產(chǎn)生不同的過擬合盖呼,Dropout相當(dāng)于去平均几晤,防止過擬合蟹瘾。
  2. 減少神經(jīng)元之間復(fù)雜的共適關(guān)系憾朴。Dropout可使兩個神經(jīng)元不一定每次都在同一個Dropout網(wǎng)絡(luò)中出現(xiàn)众雷,可以防止某些特征僅僅在其他特定特征出現(xiàn)時才發(fā)揮作用鸡岗。使神經(jīng)網(wǎng)絡(luò)不會對特定的特征片段過于敏感轩性,防止某些特征丟失導(dǎo)致的性能下降炮姨。

源碼中的Dropout

def dropout(x, level):
    if level < 0. or level >= 1: #level是概率值舒岸,必須在0~1之間
        raise ValueError('Dropout level must be in interval [0, 1[.')
    retain_prob = 1. - level

    # 我們通過binomial函數(shù)蛾派,生成與x一樣的維數(shù)向量。binomial函數(shù)就像拋硬幣一樣夜焦,我們可以把每個神經(jīng)元當(dāng)做拋硬幣一樣
    # 硬幣 正面的概率為p茫经,n表示每個神經(jīng)元試驗的次數(shù)
    # 因為我們每個神經(jīng)元只需要拋一次就可以了所以n=1卸伞,size參數(shù)是我們有多少個硬幣荤傲。
    random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即將生成一個0终佛、1分布的向量查蓉,0表示這個神經(jīng)元被屏蔽,不工作了鹃共,也就是dropout了
    print(random_tensor)

    x *= random_tensor
    print(x)
    x /= retain_prob

    return x

計算CNN輸出霜浴,參數(shù)量

W為輸入的長度阴孟。
F為卷積核長度永丝。
P為padding長度。
S為stride喝检。
當(dāng)padding = “VALID”時挠说,
N = \lfloor \frac{W - F + 2P }{S} \rfloor + 1
這里表示的是向下取整再加1损俭。
當(dāng)padding='SAME'時撩炊,
N = \lceil\frac{W}{S} \rceil向上取整。

textRNN網(wǎng)絡(luò)結(jié)構(gòu)

textRNN

textRNN比較簡單骆膝,先是講單詞word embedding阅签,然后輸入到一個BiLSTM結(jié)構(gòu)中政钟,結(jié)下來有兩種處理方式:1是講每個LSTM的最后一個隱藏狀態(tài)concat到一起精算;2是將每個時間步的兩個LSTM隱藏狀態(tài)concat到一起灰羽,再將所有時間步對其取平均值。最終連接個全連接+softmax怠噪。

textCNN網(wǎng)絡(luò)結(jié)構(gòu)

textCNN

將文本當(dāng)作單通道圖片處理,即輸入為(Batch_size, sequence_length, embedding_dim, 1)捂寿,然后選取卷積: (2, embedding_dim), (3, embedding_dim), (4, embedding_dim)秦陋,每個卷積選兩個卷積核驳概。再將卷機后的結(jié)果做1維的maxpooling,再concat到一起旷赖,輸入的softmax中顺又,得到最終分類。

self-attention中為什么除以根號dk

self-attention公示:
attention(Q, K, V) = softmax(\frac{QK}{\sqrt{d_k}}) V
d_k是詞向量/隱藏層的維度等孵。

  • 一個原因是除一個數(shù)稚照,方式輸入到softmax的值過大,導(dǎo)致偏導(dǎo)數(shù)趨近0.
  • 使QK的結(jié)果滿足期望為0俯萌,方差為1的分布果录,類似于歸一化返弹。

Word2Vec

Skip Gram

Skip-gram的思想是利用目標(biāo)詞預(yù)測背景詞悦施。其輸入是一個單詞,輸出是這個單詞的背景詞。

CBOW

全程是continuous bag of words。其本質(zhì)是通過context word預(yù)測targetword,通過背景詞預(yù)測目標(biāo)詞。


CBOW

如上圖所示舷蒲,context word包含C個單詞,分別是target word的臨近的C個單詞,將C個單詞輸出相加再除以C,得到target word的隱藏層撤缴,在對隱藏層進行輸出虎眨。

Hierarchical Softmax

在NLP任務(wù)重碌冶,Vocabrary往往會很大拒逮,因此在尋找概率最大的輸出時,需要對一個很大的向量進行Softmax佣赖,Hierarchical Softmax可以解決計算量過大的問題俩檬。

Huffman Tree

哈夫曼是一種帶權(quán)路徑長度最短的二叉樹屈藐,也稱為最優(yōu)二叉樹。
首先根據(jù)詞頻構(gòu)建哈夫曼樹,這樣做的優(yōu)點是高頻詞距離跟節(jié)點較近,低頻次距離跟節(jié)點較遠(yuǎn)洞渔。
根據(jù)哈夫曼樹浆熔,給出單詞w的條件概率公式:
p(w|context(w)) = \prod_{j=2}^{l^w} p(d_j^w | x_w, \theta^{w}_{j-1})
這里邊有幾個重要的概念需要解釋,其中l^w為從跟節(jié)點到單詞w所在的葉子結(jié)點的節(jié)點個數(shù),d_j^w表示單詞在該節(jié)點的編碼(0伞剑, 1)雪营,注意這是從2開始的谴餐,因為根節(jié)點沒有編碼侈咕。
p(d_j^w | x_w, \theta^{w}_{j-1}) = \left\{ \begin{array}{**lr**} \sigma(x_w^T \theta^W_{j-1}) & d_j^w = 0 \\ 1-\sigma(x_w^T \theta^W_{j-1}) & d_j^w = 1 \end{array} \right.
對于邏輯回歸帽揪,我們可以用指數(shù)的方式將兩項合并成一項:
p(d_j^w | x_w, \theta^{w}_{j-1}) =\left[ \sigma(x_w^T \theta^W_{j-1}) \right]^{1-d_j^w} \cdot \left[ 1 - \sigma(x_w^T \theta^W_{j-1}) \right]^{d_j^w}
將上邊工時帶入到條件概率公式得到:
p(w|context(w)) = \prod_{j=2}^{l^w} \left[ \sigma(x_w^T \theta^W_{j-1}) \right]^{1-d_j^w} \cdot \left[ 1 - \sigma(x_w^T \theta^W_{j-1}) \right]^{d_j^w}

Negative Sampling

對于Vocabrary過大的問題,還有一種解決方案就是Negative Sampling。一般情況下日月,在訓(xùn)練過程中勒庄,每個樣本會影響網(wǎng)絡(luò)的所有參數(shù)劳殖,Negative Sampling的思想,就是每個樣本只更新部分參數(shù)落竹,而非全部怪与。假設(shè)輸入樣本為('A', 'B')纫雁,當(dāng)'A'經(jīng)過one-hot編碼,隱藏層檬某,輸出為長度為vocab_size大小的向量初坠,而只有其中'B'對應(yīng)的單詞是我們希望的輸出,其他都是負(fù)樣本心墅。Negative Sampling的思想是隨機選擇一小部分負(fù)樣本來更新權(quán)重。
那么如何選擇Negative Samples呢棺禾,根據(jù)一定的概率選出滞欠,而這個概率是和單詞的詞頻相關(guān)的朗儒。

ELMo

word2vec十分好用规求,但有一個缺陷就是姨伤,身為靜態(tài)詞向量臊泌,無法解決一詞多義的問題猪狈。而ELMo是一種動態(tài)詞向量峡继,能根據(jù)語義生成詞向量检激,因此可以很好的應(yīng)對一詞多義問題。

ELMo

如上圖所示,ELMo的原理是將文本輸入到兩個BiLSTM中,并將輸入向量绣夺、中間層向量和輸出向量分別加權(quán)求和:
ELMo = \alpha_1 \cdot E_1 + \alpha_2 \cdot E_2 + \alpha_3 \cdot E_3
其中\alpha為可變參數(shù),可以使用固定值,也可以在訓(xùn)練過程中學(xué)習(xí)求冷。再將得到的ELMo結(jié)果輸入到下游任務(wù)重钱磅。

未完待續(xù)~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末心俗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尿招,更是在濱河造成了極大的恐慌隧甚,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門人乓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戳护,“玉大人,你說我怎么就攤上這事∑榇荆” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵毯辅,是天一觀的道長。 經(jīng)常有香客問我立镶,道長壁袄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任媚媒,我火速辦了婚禮嗜逻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缭召。我一直安慰自己栈顷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布嵌巷。 她就那樣靜靜地躺著萄凤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搪哪。 梳的紋絲不亂的頭發(fā)上靡努,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音晓折,去河邊找鬼惑朦。 笑死,一個胖子當(dāng)著我的面吹牛漓概,可吹牛的內(nèi)容都是我干的漾月。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼胃珍,長吁一口氣:“原來是場噩夢啊……” “哼梁肿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堂鲜,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤栈雳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后缔莲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哥纫,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛀骇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厌秒。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖擅憔,靈堂內(nèi)的尸體忽然破棺而出鸵闪,到底是詐尸還是另有隱情,我是刑警寧澤暑诸,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布蚌讼,位于F島的核電站,受9級特大地震影響个榕,放射性物質(zhì)發(fā)生泄漏篡石。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一西采、第九天 我趴在偏房一處隱蔽的房頂上張望凰萨。 院中可真熱鬧,春花似錦械馆、人聲如沸胖眷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽珊搀。三九已至,卻和暖如春仿畸,著一層夾襖步出監(jiān)牢的瞬間食棕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工错沽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留簿晓,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓千埃,卻偏偏與公主長得像憔儿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子放可,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容