1. 模型評估
在機器學(xué)習(xí)領(lǐng)域,模型評估至關(guān)重要僧界,只有選擇和問題相匹配的評估方法拟枚,才能更快更好的完成訓(xùn)練哩盲。
將模型評估之前拢切,需要有幾個定義牢記心中月洛。
- TP — 將正樣本分類為正的數(shù)挂签;
- FN — 將正樣本分類為負(fù)的數(shù)痰憎;
- FP — 將負(fù)樣本分類為正的數(shù)震嫉;
- TN — 將負(fù)樣本分類為負(fù)的數(shù)价卤。
Accuracy
準(zhǔn)確率赤赊,分類正確的樣本占總樣本的比例闯狱。
當(dāng)不同類別的樣本比例非常不均衡時,占比大的類別往往成為影響準(zhǔn)確率的主要因素抛计。即準(zhǔn)確率雖然簡單直觀哄孤,但會收到樣本不均衡問題的干擾,導(dǎo)致不能很好的反應(yīng)模型性能吹截。
可以使用平均準(zhǔn)確率(每個類別下樣本準(zhǔn)確了的算數(shù)平均)瘦陈。
Recall
召回率,實際為正且預(yù)測為正的樣本量與實際為正的樣本量的比值波俄。
Precision
精確率晨逝,實際為正且預(yù)測為正的樣本量與預(yù)測為正的樣本量的比值。
F1-score
前邊介紹了Recall和Precision懦铺,他們是既矛盾又統(tǒng)一的兩個指標(biāo)捉貌。為了提高Precision,模型要盡可能把更有把握的樣本預(yù)測為正,這就回導(dǎo)致大量實際為正的樣本預(yù)測為負(fù)趁窃,致使Recall變低牧挣。F1-score是個很好的指標(biāo)能融合Recall和Precision兩個指標(biāo)。
P-R曲線
P-R曲線橫軸是Recall醒陆,縱軸是Precision瀑构。P-R曲線上的每個點,代表在在某一閾值下统求,將大于該閾值的樣本分類為正检碗,小于該閾值的樣本分類為負(fù)時,Recall和Precision的值码邻。P-R曲線是將閾值從大到小排列生成的折剃。
ROC曲線
ROC曲線,受試者工作特征曲線像屋。最初用于軍事和醫(yī)學(xué)領(lǐng)域怕犁。橫軸是假陽性率(FPR),縱軸是真陽性率(TPR)己莺。
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)模型的更新县貌。
如上圖所示,表示一個基函數(shù)凑懂,即CART樹煤痕。參數(shù)表示樹的劃分變量、劃分位置等信息接谨,通過優(yōu)化算法得出摆碉。為當(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)建決策樹階段就加入了正則項
其中樹結(jié)構(gòu)的正則化項:
T為葉子結(jié)點的個數(shù),為葉子結(jié)點預(yù)測值浦马。
對損失函數(shù)在處進行二階泰勒展開:
其中时呀,,表示所有葉子結(jié)點j的樣本的索引的集合捐韩。
如果樹的結(jié)構(gòu)已知退唠,那么可以通過對損失函數(shù)求導(dǎo)得出葉子結(jié)點的預(yù)測值:
但是我們很難從所有結(jié)構(gòu)中找到最好的樹結(jié)構(gòu)鹃锈,是個NP-hard問題荤胁。因此只能用貪心算法找到一個次優(yōu)的樹。XGBoost有自己的方式選取最優(yōu)分裂屎债,采用的是CART算法仅政。
將預(yù)測值倒入到損失函數(shù)中,可以求得損失函數(shù)的極小值:
然后計算分裂前后損失的差值:
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 offit
method to shrink/adapt learning rate in training usingreset_parameter
callback. Note, that this will ignore thelearning_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 useis_unbalance
orscale_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 asn_samples / (n_classes * np.bincount(y))
. If None, all classes are supposed to have weight one. Note, that these weights will be multiplied withsample_weight
(passed through thefit
method) ifsample_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 largenum_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
andmin_sum_hessian_in_leaf
- Use bagging by set
bagging_fraction
andbagging_freq
- Use feature sub-sampling by set
feature_fraction
- Use bigger training data
- Try
lambda_l1
,lambda_l2
andmin_gain_to_split
for regularization - Try
max_depth
to avoid growing deep tree - 使用較小的
max_bin
- 使用較小的
num_leaves
- 使用
min_data_in_leaf
和min_sum_hessian_in_leaf
- 通過設(shè)置
bagging_fraction
和bagging_freq
來使用 bagging - 通過設(shè)置
feature_fraction
來使用特征子抽樣 - 使用更大的訓(xùn)練數(shù)據(jù)
- 使用
lambda_l1
,lambda_l2
和min_gain_to_split
來使用正則 - 嘗試
max_depth
來避免生成過深的樹
邏輯回歸損失函數(shù)推導(dǎo)
邏輯回歸
其中。也叫對數(shù)幾率回歸:
其中為幾率落剪。
已知邏輯回歸模型:
邏輯回歸作為二分類問題忠怖,損失函數(shù)也分為兩部分
- 當(dāng)真實樣本y=1時凡泣,估計出來的概率p越小鞋拟,損失函數(shù)值越大
- 當(dāng)真實樣本y=0時,估計出來的概率p越大席舍,損失函數(shù)值越大
可以使用如下函數(shù)
上邊兩個式子可以合并:
對于整個集合的損失函數(shù),可以取其平均值:
其中福铅。
即:
SoftMax和CrossEntropy求梯度
我們考慮如下結(jié)構(gòu)的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):
其中, ,比較麻煩的是蝗肪。
當(dāng)i = j時:
當(dāng)i != j時:
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ū)間為表示輸入神經(jīng)元的數(shù)量键科。
4. Xavier初始化
根據(jù)sigmoid函數(shù)的特點勋颖,可以推想出:
如果初始化值很小饭玲,隨著層數(shù)的傳遞卑硫,方差就會趨近于0蚕断,從而導(dǎo)致失去非線性只有線性亿乳。
如果初始化值很大葛假,隨著層數(shù)的傳遞,方差會迅速變大恢氯,sigmoid的輸入很大時勋磕,會導(dǎo)致梯度小時問題挂滓。Xavier初始化同時考慮了網(wǎng)絡(luò)的大懈险尽(輸入亲怠、輸出神經(jīng)元數(shù)量)团秽,有兩種方法:
- 均值為0踪栋,方差為
- 均勻分布夷都,
這種方法對于激活函數(shù)是sigmoid或tanh的神經(jīng)網(wǎng)絡(luò)比較好囤官。
5. He 初始化
也有兩種方式:
- 均值為0党饮,方差為
- 均勻分布刑顺,
適用于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í)對其進行伸縮變換筝蚕,最終得到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防止過擬合的原因
- 取平均祖屏。Dropout掉不同的神經(jīng)元嫉拐,就像在訓(xùn)練不同的神經(jīng)網(wǎng)絡(luò)魁兼。不同的網(wǎng)絡(luò)會產(chǎn)生不同的過擬合盖呼,Dropout相當(dāng)于去平均几晤,防止過擬合蟹瘾。
- 減少神經(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”時挠说,
這里表示的是向下取整再加1损俭。
當(dāng)padding='SAME'時撩炊,
向上取整。
textRNN網(wǎng)絡(luò)結(jié)構(gòu)
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)
將文本當(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公示:
是詞向量/隱藏層的維度等孵。
- 一個原因是除一個數(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)詞。
如上圖所示舷蒲,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的條件概率公式:
這里邊有幾個重要的概念需要解釋,其中為從跟節(jié)點到單詞w所在的葉子結(jié)點的節(jié)點個數(shù),表示單詞在該節(jié)點的編碼(0伞剑, 1)雪营,注意這是從2開始的谴餐,因為根節(jié)點沒有編碼侈咕。
對于邏輯回歸帽揪,我們可以用指數(shù)的方式將兩項合并成一項:
將上邊工時帶入到條件概率公式得到:
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的原理是將文本輸入到兩個BiLSTM中,并將輸入向量绣夺、中間層向量和輸出向量分別加權(quán)求和:
其中為可變參數(shù),可以使用固定值,也可以在訓(xùn)練過程中學(xué)習(xí)求冷。再將得到的ELMo結(jié)果輸入到下游任務(wù)重钱磅。