知识复习:nlp算法面试汇总
文章目錄
- 2.相似度
- 3.正則化
- 3.1 L1
- 3.2 過擬合和欠擬合
- 3.2.1 dropout
- 3.3 欠擬合
- 4. 激活函數
- 4.1 sigmoid
- 5.Bert
- 5.1 Bert原版
- 5.1.2 bert的訓練
- 5.2改進
- 5.2.1缺點改進
- 5.2.2任務改進
- 5.3 參數量
- 5.3 transformer
- 5.3.1 多頭注意力機制
- 6.搜索
- 6.1pagerank
- 6.2 文本匹配
- 7.神經網絡基礎
- 7.1Norm
- 7.2 LSTM
- 7.2.1結構
- 7.2.2公式
- 7.2.3 計算參數
- 7.2.4 why解決了梯度消失/梯度消失
- 7.2.5初始化方法,免于梯度消失
- 7.3 歸一化
- 7.4 optim
- 1.1 隨機梯度下降
- 8.常見函數
- 8.1 softmax
- softmax
- 8.2損失函數
- 8.2.1交叉熵和平方損失
- 8.2.2交叉熵是怎么來的
- 8.2.3分類的損失函數
- 8.2.4 交叉熵的梯度
- 8.2.5 BP
- 8.2.6 KL散度
- 9.word2vec
- 10.訓練
- 10.1如何調整學習率
- 11.python語言基礎
- 11.1 迭代器和生成器
- 11.2 垃圾回收機制
- 12 sql
- 12.1 阿里的留存量問題
- 13. 評價指標
- 13.1 F1,P,R,AUC
- 13.2 驗證集recall和p都高,測試集recall和auc沒下降,prec下降很厲害
- 14 . 算法題:
- 14.1n*m的01矩陣,做q次翻轉(0->1,1->0),每次翻轉后輸出行內最長的1序列
- 14.2 .二叉樹,每個節點為原點有一個左子樹集合,將每個集合的節點向前平移n格,輸出層次遍歷
- 15. 智力題
- 16 機器學習
- 16.1 決策樹:
- 16.1.1 分類樹
- 16.1.1.1 ID3:信息增益劃分
- 16.1.1.2 C4.5:增益率
- 16.1.1.3 CART
- 16.1.2 回歸樹
- 16.1.2.1 提升樹
- GBDT:提升樹基礎上的改進
- 16.2 線性回歸
- 16.3 word2vec
- 16.3.1 negative sampling
- 16.4 處理過擬合
- 17. 任務
- 17.1 ner序列標注
- 17.1.1 邊界錯誤
2.相似度
https://blog.csdn.net/ctwy291314/article/details/81667288
3.正則化
-
L1:
- 菱形
-
L2:
- 圓形
- 圓形
-
趨于0的概率大小:
-
L0>Lp(p~(0,1))>L1>L2
-
L0太理想了
-
在實際應用中,由于L0范數本身不容易有一個好的數學表示形式,給出上面問題的形式化表示是一個很難的問題,故被人認為是一個NP難問題。所以在實際情況中,L0的最優問題會被放寬到L1或L2下的最優化。
-
L1–>參數稀疏,特征選擇
- 原因一:有尖,最小值容易出現在坐標軸上
- 原因2: L1是拉普拉斯分布,更尖銳,L2則是高斯分布,比L1平緩,所以L1更容易收斂到0的點*
- 原因3:L1是L0的凸優化?之類的。
- 效果就是讓w往0靠,使網絡中的權重盡可能為0,也就相當于減小了網絡復雜度,防止過擬合。
-
L2:平滑
- 經變化后w前面系數為 1?ηλ/n ,由于η、λ、n都是正的。所以 1?ηλ/n小于1,它的效果是減小w,這也就是權重衰減(weight decay)的由來
3.1 L1
- L1不可導的時候該怎么辦
- 當損失函數不可導,梯度下降不再有效,可以使用坐標軸下降法,
- 梯度下降是沿著當前點的負梯度方向進行參數更新,
- 坐標軸下降法是沿著坐標軸的方向,假設有m個特征個數,坐標軸下降法進參數更新的時候,先固定m-1個值,然后再求另外一個的局部最優解,從而避免損失函數不可導問題。
- 使用Proximal Algorithm對L1進行求解,此方法是去優化損失函數上界結果。
3.2 過擬合和欠擬合
過擬合:隨著訓練過程的進行,模型復雜度,在training data上的error漸漸減小。可是在驗證集上的error卻反而漸漸增大——由于訓練出來的網絡過擬合了訓練集,對訓練集以外的數據卻不work。
1.正則化(Regularization)(L1和L2)
2.數據增強(Data augmentation),也就是增加訓練數據樣本,清洗噪聲
將原始圖片旋轉一個小角度
加入隨機噪聲
一些有彈性的畸變(elastic distortions),論文《Best practices for convolutional neural networks applied to visual document analysis》對MNIST做了各種變種擴增。
截取(crop)原始圖片的一部分
3.Dropout
在dropout部分, 我們已經解釋過, 之所以dropout可以抑制overfitting, 是因為在訓練階段, 我們引入了 隨機性(隨機cancel一些Neuron),減少網絡的匹配度, 在測試階段, 我們去除掉隨機性, 并通過期望的方式marginalize隨機影響。
在BatchNormalization中, 訓練階段, 我們隨機選取了Batch進行Normalization, 并計算running mean等, 在測試階段, 應用running_mean這些訓練參數來進行整體Normalization, 本質上是 在Marginalize訓練階段的隨機性。 因此, BatchNormalization也提供了 Regularization的作用, 實際應用中證明, NB在防止過擬合方面確實也有相當好的表現。
4…early stopping
3.2.1 dropout
Dropout
在dropout部分, 我們已經解釋過, 之所以dropout可以抑制overfitting, 是因為在訓練階段, 我們引入了 隨機性(隨機cancel一些Neuron),減少網絡的匹配度, 在測試階段, 我們去除掉隨機性, 并通過期望的方式marginalize隨機影響。
在BatchNormalization中, 訓練階段, 我們隨機選取了Batch進行Normalization, 并計算running mean等, 在測試階段, 應用running_mean這些訓練參數來進行整體Normalization, 本質上是 在Marginalize訓練階段的隨機性。 因此, BatchNormalization也提供了 Regularization的作用, 實際應用中證明, NB在防止過擬合方面確實也有相當好的表現。
3.3 欠擬合
1)添加其他特征項,有時候我們模型出現欠擬合的時候是因為特征項不夠導致的,可以添加其他特征項來很好地解決。例如,“組合”、“泛化”、“相關性”三類特征是特征添加的重要手段,無論在什么場景,都可以照葫蘆畫瓢,總會得到意想不到的效果。除上面的特征之外,“上下文特征”、“平臺特征”等等,都可以作為特征添加的首選項。
2)添加多項式特征,這個在機器學習算法里面用的很普遍,例如將線性模型通過添加二次項或者三次項使模型泛化能力更強。例如上面的圖片的例子。
3)減少正則化參數,正則化的目的是用來防止過擬合的,但是現在模型出現了欠擬合,則需要減少正則化參數。
4. 激活函數
4.1 sigmoid
- sigmoid函數特性
- 二分類為什么用sigmoid:
- 二分類滿足伯努利假設
- sigmoid可由伯努利假設推出
5.Bert
- Bert
- 是個預訓練語言模型,基本結構取自transformer的編碼層,基本的bert疊加了12個transformer編碼層,但是與transformer不同的是,
- 在輸入層:不僅有token embedding,position embedding,還有segment embedding(因為bert允許輸入兩個句子,以sep間隔,以segment區分
- position encoding:transformer使用sin,cos;
- position encoding:
- 使 PE 能夠適應比訓練集里面所有句子更長的句子,假設訓練集里面最長的句子是有 20 個單詞,突然來了一個長度為 21 的句子,則使用公式計算的方法可以計算出第 21 位的 Embedding。
- 可以讓模型容易地計算出相對位置,對于固定長度的間距 k,PE(pos+k) 可以用 PE(pos) 計算得到。因為 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。
- 人為提升多樣性:頻率不同,
- position encoding:
- multi-head self-attention,K,Q,V=WX
- attention比lstm好在哪里:
- attention會記住重要的,不會因為距離太遠而遺忘
- lstm會遺忘(有遺忘門)
- attention可并行
- attention比lstm好在哪里:
- add:殘差x+mh-self-attention(x)
- norm:layernorm:使得方差,均值相同(每層輸入)
- y=x?E[x]Var[x]+??γ+βy = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \betay=Var[x]+??x?E[x]??γ+β
torch,matmul(
torch.softmax(
torch.matmul(q, k.permute(0, 1, 3, 2)) / sqrt(dk) ), v).permute(0, 2, 1, 3).reshape(batch, n, self.dim_v)
- y=x?E[x]Var[x]+??γ+βy = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \betay=Var[x]+??x?E[x]??γ+β
5.1 Bert原版
-
XLNET
BERT在第一個預訓練階段,假設句子中多個單詞被Mask掉,這些被Mask掉的單詞之間沒有任何關系,是條件獨立的,然而有時候這些單詞之間是有關系的,比如”New York is a city”,假設我們Mask住”New”和”York”兩個詞,那么給定”is a city”的條件下”New”和”York”并不獨立,因為”New York”是一個實體,看到”New”則后面出現”York”的概率要比看到”Old”后面出現”York”概率要大得多。
但是需要注意的是,這個問題并不是什么大問題,甚至可以說對最后的結果并沒有多大的影響,因為本身BERT預訓練的語料就是海量的(動輒幾十個G),所以如果訓練數據足夠大,其實不靠當前這個例子,靠其它例子,也能彌補被Mask單詞直接的相互關系問題,因為總有其它例子能夠學會這些單詞的相互依賴關系。
BERT的在預訓練時會出現特殊的[MASK],但是它在下游的fine-tune中不會出現,這就造成了預訓練和微調之間的不匹配,微調不出現[MASK]這個標記,模型好像就沒有了著力點、不知從哪入手。所以只將80%的替換為[mask],但這也只是緩解、不能解決。
相較于傳統語言模型,Bert的每批次訓練數據中只有 15% 的標記被預測,這導致模型需要更多的訓練步驟來收斂。
另外還有一個缺點,是BERT在分詞后做[MASK]會產生的一個問題,為了解決OOV的問題,我們通常會把一個詞切分成更細粒度的WordPiece。BERT在Pretraining的時候是隨機Mask這些WordPiece的,這就可能出現只Mask一個詞的一部分的情況 -
中文上
bert僅僅基于attention,沒有考慮詞性、對上下文信息也僅僅用了embedding,僅僅用語義信息,會出現錯判。Bert對各個詞的權重是一樣的,不能突出關鍵詞。bert對整句話只抽取一個主旨,像‘我做了頭發,我還能買新衣服’這樣的句子,就判斷不出來了。
在訓練中,融入詞性、句法信息、停用詞,抽取多個主旨,以改善這個現象
5.1.2 bert的訓練
- mask掉一部分然后去預測這部分詞。
- 判斷兩個句子是否相連
5.2改進
5.2.1缺點改進
- 中文
- 百度ernie
- bert學不到實體或短語信息:mask實體
- 清華ernie
- 引入:詞匯、句法和知識信息
- entity embedding作為ERNIE模型的輸入(知識圖譜中的)
- mask實體并從知識圖譜中找實體對齊
- 百度ernie
- xlnet:https://blog.csdn.net/u012526436/article/details/93196139
- mask:finetune和訓練時不一致
- mask之間的順序不考慮
- 排列組合所有順序
- albert:https://blog.csdn.net/chaojianmo/article/details/104061718/
- 因式分解embedding:EH1H2
- 跨層參數共享(fc/multihead)\
- NSP->SOP:同個文檔里負采樣,避免學習到主題
5.2.2任務改進
- MASS:Masked Sequence to Sequence Pre-training for Language Generation
- encoder-att-decoder:mask encoder的部分詞,decoder出來這些詞
- UNILM:UNIfied pre-trained Language Model
- 3種mask
- mask后文
- mask seq2–學習生成
- 僅mask padding
- 3種mask
5.3 參數量
https://zhuanlan.zhihu.com/p/144582114
5.3 transformer
5.3.1 多頭注意力機制
q=torch.matmul(W_q, x) k=torch.matmul(W_k,x) v=torch.matmul(W_v,x) q=q.reshape(batch,n,head,dk).permute(0,2,1,3) k=k.reshape(batch,n,head,dk).permute(0,2,1,3) v=v.reshape(batch,n,head,dk).permute(0,2,1,3)# batch,head,n,dk torch.matmul( torch.softmax(torch.matmul(q, k.permute(0, 1, 3, 2)) / sqrt(dk) ), v).permute(0, 2, 1, 3).reshape(batch, n, self.dim_v)6.搜索
6.1pagerank
https://blog.csdn.net/csdn_lzw/article/details/79733962
核心思想:認為萬維網中一個頁面的重要性取決于指向它的其他頁面的數量和質量。
- 問題
- 終止點問題:有些網站沒有出邊,迭代后,所有的pagerank->0
- 陷阱:有的節點存在指向自己的路徑,多次迭代后,他自己為1,其他為0
- 解決
- 遇見以上情況,關閉當前,隨機調到其他網址上
- 遇見以上情況,關閉當前,隨機調到其他網址上
6.2 文本匹配
https://blog.csdn.net/ling620/article/details/95468908
- 傳統文本匹配
- 詞匯相似度,詞匯層面
- 詞義局限,結構局限,知識局限
- 主題模型–詞匯分布
- LSA:SVD
- PLSA:概率
- LDA:
- 詞:詞的分布代表主題,不同主題的詞的分布不同
- 文章的含義:同一主題在不同文章中,出現的概率不同
- 確定好主題與詞匯的分布、主題與文章的分布:
- 隨機生成文章的各個主題比例
- 再根據主題生成詞
- –這是LDA的文章生成過程。忽略了詞的順序,所以不用來生成
- 做主題分析
- 主題模型可做用戶畫像
- 深層語義
- 表現型:word embedding,之類的,得到向量
- 交互型:判定兩個句子的相似度
- 應用
- 短-短:得到兩個文本的額向量;求相似度(余弦,歐式)
- 短-長:獲得長的主題模型;求該主題模型生成短文本的概率為其相似度
- 長-長:分別求兩者的主題模型;計算兩個多項式分布之間的距離作為其相似度(海林哥距離)
7.神經網絡基礎
7.1Norm
原因:
1.網絡的各層輸入數據的分布則會不斷變化。
2.會逐漸使得激活函數趨于飽和,導致梯度消失
https://zhuanlan.zhihu.com/p/74516930
https://www.cnblogs.com/shuimuqingyang/p/14007260.html
(bs,seq_len,embedding_size)
batchnorm:bs
layernorm:embedding_size(神經元)
-
BatchNorm
- why:原始數據分布不一致;經過每層計算后分布也不一致
- why不每層直接變為均值0,方差1的分布?學不到數據特征–所以之后再加上可訓練參數變為另一個y(x->均值0方差1的x1->y)
- 訓練階段
- 滑動平均值、方差:x’ = (1-momentum)x + momentumx’’
- 測試階段
-
batchNorm是在batch上,對NHW做歸一化,對小batchsize效果不好;
- layerNorm在通道方向上,對CHW歸一化,主要對RNN作用明顯;
- instanceNorm在圖像像素上,對HW做歸一化,用在風格化遷移; GroupNorm將channel分組,然后再做歸一化;
- SwitchableNorm是將BN、LN、IN結合,賦予權重,讓網絡自己去學習歸一化層應該使用什么方法
7.2 LSTM
7.2.1結構
- 結構
7.2.2公式
- 公式
7.2.3 計算參數
- 計算參數
7.2.4 why解決了梯度消失/梯度消失
- 沒有解決 、
- 多條鏈路
- 梯度消失得原因:Sigmoid函數有一個缺點:當x較大或較小時,導數接近0或者1;并且Sigmoid函數導數的最大值是0.25
- 鏈式法則求導時,多個導數同時大于或小于1
- 解決
- 好的參數初始化方式:HE
- 非飽和的激活函數relu,導數為1
- 殘差/多路:一條路掛了,其他仍可走
- BATCH NORMAL:梯度消失、內部協方差位移,分布變化
- 梯度裁剪
- 更快的優化器
- 正則化
7.2.5初始化方法,免于梯度消失
https://blog.csdn.net/xxy0118/article/details/84333635
https://zhuanlan.zhihu.com/p/40175178
Xavier:輸入和輸出可以保持方差相同的正態分布,適用于tanh
He:正向傳播時,狀態值的方差保持不變;反向傳播時,關于激活值的梯度的方差保持不變。
為什么weights初始化要非對稱?
如果對稱初始化,假設weights全是1,則對于每個神經元的輸出結果相同;經歷過BP反向傳播后,weights的各個位置得到的是相同的更新。
因此無論網絡訓練多少輪,對于每一層中的各個神經元,weights都是相同的,無法學習(提取)到不同的特征。
為什么weights初始化不能全為0?
原因同上。
為什么初始化值不能太大?
對于sigmoid、tanh激活函數,初始化值太大,使得流入激活函數的值過大,造成飽和現象,當反相傳播時,會使得梯度極小,導致梯度彌散。(ReLU函數不受此影響)
為什么初始化值不能太小?
初始化太小時,經過多層網絡,輸出值變得極小,在反向傳播時也會使得梯度極小,導致梯度彌散。(ReLU函數也受此影響!)
7.3 歸一化
什么不需要歸一化:決策樹
歸一化的用處:
1.使不同量綱的特征處于同一數值量級,減少方差大的特征的影響,使模型更準確。
2.加快學習算法的收斂速度
歸一化:1)把數據變成(0,1)或者(1,1)之間的小數。主要是為了數據處理方便提出來的,把數據映射到0~1范圍之內處理,更加便捷快速。2)把有量綱表達式變成無量綱表達式,便于不同單位或量級的指標能夠進行比較和加權。歸一化是一種簡化計算的方式,即將有量綱的表達式,經過變換,化為無量綱的表達式,成為純量。
??標準化:在機器學習中,我們可能要處理不同種類的資料,例如,音訊和圖片上的像素值,這些資料可能是高維度的,資料標準化后會使每個特征中的數值平均變為0(將每個特征的值都減掉原始資料中該特征的平均)、標準差變為1,這個方法被廣泛的使用在許多機器學習算法中(例如:支持向量機、邏輯回歸和類神經網絡)。
??中心化:平均值為0,對標準差無要求
作者:brucep3
鏈接:https://www.jianshu.com/p/95a8f035c86c
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
7.4 optim
- SGD,Momentum,Adagard,Adam原理
-
SGD為隨機梯度下降,每一次迭代計算數據集的mini-batch、batch、單個的梯度,然后對參數進行更新。隨機應該是指單個數據的梯度
-
Momentum參考了物理中動量的概念,前幾次的梯度也會參與到當前的計算中,但是前幾輪的梯度疊加在當前計算中會有一定的衰減。
-
Adagard在訓練的過程中可以自動變更學習的速率,設置一個全局的學習率,而實際的學習率與以往的參數模和的開方成反比。
-
Adam利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率,在經過偏置的校正后,每一次迭代后的學習率都有個確定的范圍,使得參數較為平穩。
-
1.1 隨機梯度下降
- x=x-lr*g
- 隨機:每次算一個數據的梯度
- mini-batch:每次算一批數據的梯度(平均、求和)
optim
- 這里調整的是梯度–但tf是調整的學習率
- 不會因為梯度很大而導致學習率(步長)也變得很大,參數的值相對比較穩定。
8.常見函數
8.1 softmax
- word2vec里因為分母涉及整個詞典,因此使用negative sample和層次softmax
softmax
8.2損失函數
8.2.1交叉熵和平方損失
- 交叉熵
- 平方損失:線性回歸
- 邏輯回歸:極大似然估計
- 交叉熵:分類
- 分類why不用平方損失
-
平方差的函數是凸函數,分類器用了sigmoid,不是凸函數,不利于優化
-
直觀上,對特定的分類問題,平方差的損失有上限(所有標簽都錯,損失值是一個有效值),但交叉熵則可以用整個非負域來反映優化程度的程度。
-
但也可以用。
-
從本質上看,平方差的意義和交叉熵的意義不一樣
- 概率理解上,平方損失函數意味著模型的輸出是以預測值為均值的高斯分布,損失函數是在這個預測分布下真實值的似然度,softmax損失意味著真實標簽的似然度。
- 在分類問題下大部分時候誤差并不服從高斯分布。
- 分類問題中的標簽,是沒有連續的概念的。1-hot作為標簽的一種表達方式,每個標簽之間的距離也是沒有實際意義的,所以預測值和標簽兩個向量之間的平方差這個值不能反應分類這個問題的優化程度。
- 還有個原因應該是softmax帶來的vanishing gradient吧。預測值離標簽越遠,有可能的梯度越小。李龍說的non-convex問題,應該是一種體現形式
-
作者:北野寺僧人
鏈接:https://www.zhihu.com/question/319865092/answer/717476767
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
- 下面這個解釋有個問題:y*f會大于1嗎?
8.2.2交叉熵是怎么來的
-
滿足伯努利分布,所以用sigmoid
- 可從伯努利分布推導出來:https://zhuanlan.zhihu.com/p/360717173
-
來自KL散度https://blog.csdn.net/tsyccnh/article/details/79163834
-
KL散度用以描述兩個分布的差異(真實分布和預測分布)
-
KL=H§+交叉熵
-
DKL(p∣∣q)=∑i=1np(xi)log(p(xi))?∑i=1np(xi)log(q(xi))=?H(p(x))?∑i=1np(xi)log(q(xi))D_{KL}(p||q) \\ = \sum_{i=1}^np(x_i)log(p(x_i))-\sum_{i=1}^np(x_i)log(q(x_i))\\ = -H(p(x))-\sum_{i=1}^np(x_i)log(q(x_i))DKL?(p∣∣q)=i=1∑n?p(xi?)log(p(xi?))?i=1∑n?p(xi?)log(q(xi?))=?H(p(x))?i=1∑n?p(xi?)log(q(xi?))
8.2.3分類的損失函數
hinge損失
交叉熵損失
0-1損失
感知器損失
8.2.4 交叉熵的梯度
https://blog.csdn.net/qian99/article/details/78046329
=ai-yi在這里插入圖片描述
8.2.5 BP
https://blog.csdn.net/u010916338/article/details/83310442
8.2.6 KL散度
9.word2vec
- cbow.,skip-gram
- 層次softmax:哈希曼樹,頻率高的路徑短
- 負采樣:
- 這里還有一種解決問題的思路,我們最后的softmax分出來的類是整個詞袋的大小,那么是不是可以把詞袋大小減小,因為有些出現概率低的詞我們根本可以不考慮。這就是負采樣的核心思想。
那么怎么選取頻率較高的詞,構成最后softmax要分的類呢
只計算正例和負例的loss
負例的選擇
https://www.cnblogs.com/pinard/p/7249903.html
作者:吳祺育的筆記
鏈接:https://www.jianshu.com/p/d8bfaae28fa9
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
https://www.jianshu.com/p/d8bfaae28fa9
10.訓練
10.1如何調整學習率
11.python語言基礎
11.1 迭代器和生成器
- 迭代器一次性取出全部
- 生成器:yield ,一次取一部分,然后暫停,遇見send和next再繼續,一次只取一部分,對內存友好。
11.2 垃圾回收機制
https://blog.csdn.net/xiongchengluo1129/article/details/80462651
- 計數
- 當指向該對象的內存的引用計數器為0的時候,該內存將會被Python虛擬機銷毀
- 缺點:
- 無法解決循環引用的問題。A和B相互引用而再沒有外部引用A與B中的任何一個,它們的引用計數都為1,但顯然應該被回收。
- 標記-清除
- 第一階段是標記階段,GC會把所有的『活動對象』打上標記,第二階段是把那些沒有標記的對象『非活動對象』進行回收。
- 如何判斷:
- 對象之間通過引用(指針)連在一起,構成一個有向圖,對象構成這個有向圖的節點,而引用關系構成這個有向圖的邊。從根對象(root object)出發,沿著有向邊遍歷對象,可達的(reachable)對象標記為活動對象,不可達的對象就是要被清除的非活動對象(4,5)。根對象就是全局變量、調用棧、寄存器。
- 對象之間通過引用(指針)連在一起,構成一個有向圖,對象構成這個有向圖的節點,而引用關系構成這個有向圖的邊。從根對象(root object)出發,沿著有向邊遍歷對象,可達的(reachable)對象標記為活動對象,不可達的對象就是要被清除的非活動對象(4,5)。根對象就是全局變量、調用棧、寄存器。
- GC
- 對于程序,存在一定比例的內存塊的生存周期比較短;而剩下的內存塊,生存周期會比較長,甚至會從程序開始一直持續到程序結束。生存期較短對象的比例通常在 80%~90% 之間,這種思想簡單點說就是:對象存在時間越長,越可能不是垃圾,應該越少去收集。這樣在執行標記-清除算法時可以有效減小遍歷的對象數,從而提高垃圾回收的速度。
12 sql
12.1 阿里的留存量問題
電話,講了下思路
- table A: userid | dt
- userid:用戶id
- dt:上次登錄時間,登錄覆蓋,2021-04-13
- 留存率:
- 昨天登錄100人
- 今天這100人里只有70人登錄
- 留存率:70%
- 解決方法
- 備份昨日的表–臨時表
- 每日計算留存率
https://zhuanlan.zhihu.com/p/123292172
13. 評價指標
13.1 F1,P,R,AUC
-
https://zhuanlan.zhihu.com/p/69771204
-
acc=(TP+TN)/(P+N)
-
錯誤率=(FP+FN)/(P+N)
-
precision=TP/(TP+FP)=TP/len(predict)
-
recall=TP/(TP+FN)=TP/len(gold)=sensitivity
-
真正例率:TPR是 TP/P=TP/(len(gold))=TP/(TP+FN)=recall
-
假正例率:FPR=FP/N=FP/(FP+TN)
-
AUC=ROC的面積,面積大,模型泛化能力強
-
ROC
-
如何畫roc
- 調整閾值畫的
13.2 驗證集recall和p都高,測試集recall和auc沒下降,prec下降很厲害
- 原因可能是閾值太低了
- 但序列標注那種有閾值嗎?argmax的?
- 可能最高的那個概率也很低,所以矮子里拔高個
- 可以讓設置如果最大值很小的話,就不要了
- 閾值低:p高,r低
- 閾值高:p低,r高
- 還有可能是沒學好負例。
14 . 算法題:
14.1n*m的01矩陣,做q次翻轉(0->1,1->0),每次翻轉后輸出行內最長的1序列
???感覺題目理解有點問題
輸入:
n=5 m=4 q=5
矩陣:
0 1 1 0
1 0 0 1
0 1 1 0
1 0 0 1
0 0 0 0
1 1
1 4
3 1
4 2
4 3
14.2 .二叉樹,每個節點為原點有一個左子樹集合,將每個集合的節點向前平移n格,輸出層次遍歷
輸入:
2
7 1
7 2
輸出:
2 4 6 1 5 3 7
4 1 3 2 5 6 7
.二叉樹,每個節點為原點有一個左子樹集合,將每個集合的節點向前平移n格,輸出層次遍歷
他怎么說怎么加,或者做數學題……,數學題應該O(n),但邊界怎么處理?邊界還是要算一遍?
15. 智力題
https://www.nowcoder.com/discuss/tiny/694863?channel=666&source_id=feed_index_nctrack&fromIframe=true
16 機器學習
16.1 決策樹:
https://blog.csdn.net/qq_22194315/article/details/83752321
16.1.1 分類樹
loss:信息增益、增益率、gini_index
16.1.1.1 ID3:信息增益劃分
D:數據集,pk:數據集中第k類占比
信息增益=劃分前的熵-劃分后
劃分后熵越低,純度越高,劃分前一定,信息增益越大越好
缺點:它傾向于選取取值數目多的屬性,因為這樣的屬性計算出來的信息增益最大,但往往會導致泛化能力變弱。比如樣本集有100個樣本,然后樣本有一個屬性“編號”,100個樣本的編號各不相同,如果按編號屬性劃分則對新樣本的預測很不友好,因為編號對label的影響太小了。
基于此,下面就有C4.5的最優屬性選取方式就減輕了信息增益的傾向帶來的不足。
16.1.1.2 C4.5:增益率
V(a)稱為屬性a的固有值,如果屬性a的取值數目過多,那么IV(a)會變得很大,那么增益率就會變得很小。但是C4.5并不是單純地選取增益率最大的屬性作為最優屬性,而是先比較信息增益,也就是說我們在信息增益高于平均水平的屬性集合中再選取增益率最大的屬性。
16.1.1.3 CART
16.1.2 回歸樹
16.1.2.1 提升樹
- 損失函數(這里是MSE)
- CART回歸樹:
- 每次找使得loss最小的屬性j和劃分s,得到回歸樹
- 計算殘差,得到新的數據集(x, r)(r = yi- predict_i)
- 首先遍歷數據集的屬性集,對于每一個屬性j,我們優化上述目標。由于屬性j有很多取值,那么從這些取值中先計算劃分點,一般是相鄰兩個值的中間數作為劃分點,這樣我們的到劃分點s的集合。舉個例子,假如j有10個取值,那么先從小到大排序,然后可以計算10個取值中的劃分點,相鄰兩個取值的平均值作為一個劃分點,我們就可以得到9個劃分點。
- 上述優化目標也就是,遍歷每一個可能的j和s,尋找使得上述目標最小的j,s來劃分當前結點。其中c1、c2是各分支的預測label(一般取分支結點的數據集的均值),R1、R2是各分支的樣本子集。注意這里是用CART回歸樹舉例,對于結點的劃分只能產生兩個分支。劃分之后,遞歸地對子結點利用上述優化目標進行劃分,直至到達遞歸邊界(一般是限定葉子個數,最大深度等)。
- 得到這樣的回歸樹之后,我們利用步驟?更新提升樹的模型fm,并再次計算殘差,又得到新的數據集(x,r),繼續擬合生成新的回歸樹直至迭代到M。
GBDT:提升樹基礎上的改進
- 初始化
- 殘差
- x與負梯度組合成新的數據集,用回歸樹去擬合,然后更新提升樹的模型,這就是GBDT。
16.2 線性回歸
16.3 word2vec
skip-gram ,cbow
16.3.1 negative sampling
https://zhuanlan.zhihu.com/p/56106590
1.把常見的詞組作為一個單詞。
2.少采樣常見的詞 (比如:A the)
詞出現的越多越容易不容易被采樣到
3.修改優化目標函數,這個策略稱之為“Negative Sampling(負采樣)“,使得每個訓練樣本只去更新模型中一小部分的weights。
出現越多的詞越容易被更新
https://www.cnblogs.com/pinard/p/7243513.html
層次softmax
沿著霍夫曼樹走
16.4 處理過擬合
https://www.jianshu.com/p/97aafe479fa1
- 數據增強
- Early stopping
- 增加噪聲
- 簡化網絡結構
- Dropout
- 貝葉斯方法:正則化:L1,L2
- BN:
batch normalization
這句話什么意思呢?意思就是同樣一個樣本的輸出不再僅僅取決于樣本本身,也取決于跟這個樣本屬于同一個mini-batch的其它樣本。同一個樣本跟不同的樣本組成一個mini-batch,它們的輸出是不同的(僅限于訓練階段,在inference階段是沒有這種情況的)。我把這個理解成一種數據增強:同樣一個樣本在超平面上被拉扯,每次拉扯的方向的大小均有不同。不同于數據增強的是,這種拉扯是貫穿數據流過神經網絡的整個過程的,意味著神經網絡每一層的輸入都被數據增強處理了。
相比于Dropout、L1、L2正則化來說,BN算法防止過擬合效果沒那末明顯。
17. 任務
17.1 ner序列標注
17.1.1 邊界錯誤
增大邊界錯誤的loss,便捷預測錯給更大的懲罰
總結
以上是生活随笔為你收集整理的知识复习:nlp算法面试汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5崛起之时,Java桌面时代就已
- 下一篇: suitecrm配置(nginx设置)