├── .gitignore ├── .nojekyll ├── AI算法 ├── CV │ ├── CV基础.md │ ├── images │ │ ├── 20200314215428236.png │ │ ├── 20210126230537122.png │ │ ├── 3e1f4862466b01fdfb642f6c1d6da19b.png │ │ ├── CZnUSwEcFy84JVL.jpg │ │ ├── FPN.png │ │ ├── IOU.png │ │ ├── KocaU1zbxnXYsyJ.jpg │ │ ├── RPN_loss.png │ │ ├── RPN网络示意图.png │ │ ├── ce.png │ │ ├── faster-rcnn原理图.png │ │ ├── faster-rcnn结构图示意图.jpg │ │ ├── kmeans算法.jpg │ │ ├── v2-a08645e392a6a5cb49e271e5310f0dd8_1440w.png │ │ ├── 双线性插值.png │ │ ├── 检测分类分割.jpg │ │ ├── 目标检测模型年限图.png │ │ └── 目标检测模型示意图(YOLOv4).png │ ├── 目标检测.md │ └── 目标检测.pdf ├── NLP │ ├── 应用场景 │ │ ├── NLG.md │ │ └── Similarity.md │ ├── 文本表示 │ │ ├── Word2Vec详解.assets │ │ │ ├── NNLM.png │ │ │ └── Word2Vec.png │ │ ├── Word2Vec详解.md │ │ ├── Word2Vec详解.pdf │ │ ├── 文本结构理解.md │ │ └── 文本表征方式.md │ └── 特征挖掘 │ │ ├── BERT │ │ ├── BERT面试题.md │ │ └── img │ │ │ ├── 20191017120044663-16497775072026.png │ │ │ ├── 20191017120044663.png │ │ │ ├── image-20211101145141135-16497775072021.png │ │ │ ├── image-20211101145141135.png │ │ │ ├── layernorm1-16497775072023.png │ │ │ ├── layernorm1.png │ │ │ ├── layernorm2-16497775072024.png │ │ │ ├── layernorm2.png │ │ │ ├── layernorm3-16497775072025.png │ │ │ ├── layernorm3.png │ │ │ ├── qkv-16497775072022.png │ │ │ ├── qkv.png │ │ │ ├── v2-fb520ebe418cab927efb64d6a6ae019e_720w-16497775072037.jpg │ │ │ └── v2-fb520ebe418cab927efb64d6a6ae019e_720w.jpg │ │ └── 基于深度学习的模型.md ├── machine-learning │ ├── .DS_Store │ ├── ABTest.md │ ├── Adaboost.md │ ├── Apriori.md │ ├── CRF.md │ ├── Catboost.md │ ├── DecisionTree.md │ ├── EnsembleLearning.md │ ├── FrequentPattern.md │ ├── HMM.md │ ├── LightGBM.md │ ├── NaïveBayes.md │ ├── Prophet.md │ ├── RandomForest.md │ ├── SVM.md │ ├── TreeEmbedding.md │ ├── XGBoost.md │ ├── img │ │ ├── Adaboost │ │ │ └── Adboost框架图.png │ │ ├── CRF │ │ │ └── image-20210903204605132.png │ │ ├── LightGBM │ │ │ ├── LightGBM.jpg │ │ │ └── LightGBM.png │ │ ├── Metrics │ │ │ ├── image-20210616212000816.png │ │ │ ├── image-20210616214012974.png │ │ │ ├── image-20210616214714505.png │ │ │ ├── image-20210616223053609.png │ │ │ ├── image-20210713205533305.png │ │ │ └── image-20210713205621418.png │ │ ├── SVM │ │ │ ├── watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NTQ3Mjgx,size_16,color_FFFFFF,t_70-20211031095607863-5645369.png │ │ │ ├── watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NTQ3Mjgx,size_16,color_FFFFFF,t_70-20211031095607863.png │ │ │ ├── watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NTQ3Mjgx,size_16,color_FFFFFF,t_70-20211031095618159.png │ │ │ └── watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NTQ3Mjgx,size_16,color_FFFFFF,t_70.png │ │ ├── XGBoost │ │ │ └── image-20210921182812155.png │ │ ├── kNN │ │ │ ├── image-20210903212028347.png │ │ │ ├── image-20210903212049572.png │ │ │ ├── image-20210903212122156-0675286.png │ │ │ └── image-20210903212122156.png │ │ ├── 机器学习基础面试题 │ │ │ ├── image-20210703211855105.png │ │ │ └── image-20210703212000568.png │ │ └── 过拟合与欠拟合 │ │ │ ├── 247f6539-1c10-75ac-84f8-02d238699dfd.jpg │ │ │ ├── 96b02ee9-c6ab-718f-b358-0a8db26f9cd7.jpg │ │ │ ├── DwEp7GHqvo4Q9S1.png │ │ │ ├── JrBui5yzA3IGgk7.png │ │ │ ├── f4a1eb7a-3ce3-7cea-84a0-d569423b2d01.jpg │ │ │ ├── image-20210927150625116.png │ │ │ ├── v2-3aaa69f70754c469bca5c8e4c3e161db_720w.jpg │ │ │ ├── v2-a026e24156e13a1d14c43df26b9bd2a4_720w.jpg │ │ │ └── v2-f6edae58134c5a26687c3883af48d5d5_720w.jpg │ ├── kNN.md │ ├── kmeans.md │ ├── metrics.md │ ├── w2v+tf-idf.md │ ├── 机器学习基础面试题.md │ ├── 梯度下降.md │ ├── 线性回归+逻辑回归.md │ └── 过拟合与欠拟合.md ├── 推荐 │ ├── FTRL.md │ ├── Graph_Embedding.md │ ├── collaborative_filtering.md │ ├── deepfm.md │ ├── gbdt_lr.md │ └── 向量化搜索.md └── 风控 │ └── 面试题.md ├── LICENSE ├── README.md ├── _coverpage.md ├── _navbar.md ├── _sidebar.md ├── assert ├── apr.png ├── auc.png ├── big-data1.png ├── bigdata2.png ├── conf_matrix.png ├── d1-1.png ├── exm6.png ├── filter-1.png ├── filter-2.png ├── formula-word2vec-1.png ├── formula-word2vec-2.png ├── fp.png ├── fptree.png ├── g-1.png ├── g-2.png ├── gbdt-1.png ├── gbdt-2.png ├── gbdt-3.png ├── gbdt-4.png ├── gbdt-lr.png ├── mult_gbdt.png ├── os1.jpg ├── prb10.gif ├── r.jpe ├── simain.jpg └── word2vec-3.PNG ├── content.png ├── index.html ├── 大数据技术 └── README.md ├── 开发 ├── Docker+万字教程:从入门到掌握.pdf ├── Java后端开发.md ├── 前端开发 │ ├── 【1】javascript.md │ ├── 【2】html.md │ ├── 【3】css.md │ ├── 【4】网络及浏览器.md │ ├── 【5】前端框架及打包工具.md │ └── 【6】nodejs.md └── 大数据 │ ├── Technology.md │ ├── mapreduce.md │ └── questions.md ├── 数学 └── 统计学 │ ├── logic.md │ └── probability.md ├── 数据结构与算法 ├── Array.md ├── binaryTree.md ├── dp.md ├── graph.md ├── greedy.md ├── linklist.md ├── search.md ├── sort.md └── string.md ├── 模拟面试 └── readme.md └── 计算机基础 ├── 操作系统.md ├── 数据库.md └── 计算机网络.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Editors 2 | .vscode/ 3 | .idea/ 4 | 5 | # Vagrant 6 | .vagrant/ 7 | 8 | # Mac/OSX 9 | .DS_Store 10 | 11 | # Windows 12 | Thumbs.db 13 | 14 | # Source for the following rules: https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore 15 | # Byte-compiled / optimized / DLL files 16 | __pycache__/ 17 | *.py[cod] 18 | *$py.class 19 | 20 | # C extensions 21 | *.so 22 | 23 | # Distribution / packaging 24 | .Python 25 | build/ 26 | develop-eggs/ 27 | dist/ 28 | downloads/ 29 | eggs/ 30 | .eggs/ 31 | lib/ 32 | lib64/ 33 | parts/ 34 | sdist/ 35 | var/ 36 | wheels/ 37 | *.egg-info/ 38 | .installed.cfg 39 | *.egg 40 | MANIFEST 41 | 42 | # PyInstaller 43 | # Usually these files are written by a python script from a template 44 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 45 | *.manifest 46 | *.spec 47 | 48 | # Installer logs 49 | pip-log.txt 50 | pip-delete-this-directory.txt 51 | 52 | # Unit test / coverage reports 53 | htmlcov/ 54 | .tox/ 55 | .nox/ 56 | .coverage 57 | .coverage.* 58 | .cache 59 | nosetests.xml 60 | coverage.xml 61 | *.cover 62 | .hypothesis/ 63 | .pytest_cache/ 64 | 65 | # Translations 66 | *.mo 67 | *.pot 68 | 69 | # Django stuff: 70 | *.log 71 | local_settings.py 72 | db.sqlite3 73 | 74 | # Flask stuff: 75 | instance/ 76 | .webassets-cache 77 | 78 | # Scrapy stuff: 79 | .scrapy 80 | 81 | # Sphinx documentation 82 | docs/_build/ 83 | 84 | # PyBuilder 85 | target/ 86 | 87 | # Jupyter Notebook 88 | .ipynb_checkpoints 89 | 90 | # IPython 91 | profile_default/ 92 | ipython_config.py 93 | 94 | # pyenv 95 | .python-version 96 | 97 | # celery beat schedule file 98 | celerybeat-schedule 99 | 100 | # SageMath parsed files 101 | *.sage.py 102 | 103 | # Environments 104 | .env 105 | .venv 106 | env/ 107 | venv/ 108 | ENV/ 109 | env.bak/ 110 | venv.bak/ 111 | 112 | # Spyder project settings 113 | .spyderproject 114 | .spyproject 115 | 116 | # Rope project settings 117 | .ropeproject 118 | 119 | # mkdocs documentation 120 | /site 121 | 122 | # mypy 123 | .mypy_cache/ 124 | .dmypy.json 125 | dmypy.json -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/.nojekyll -------------------------------------------------------------------------------- /AI算法/CV/images/20200314215428236.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/20200314215428236.png -------------------------------------------------------------------------------- /AI算法/CV/images/20210126230537122.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/20210126230537122.png -------------------------------------------------------------------------------- /AI算法/CV/images/3e1f4862466b01fdfb642f6c1d6da19b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/3e1f4862466b01fdfb642f6c1d6da19b.png -------------------------------------------------------------------------------- /AI算法/CV/images/CZnUSwEcFy84JVL.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/CZnUSwEcFy84JVL.jpg -------------------------------------------------------------------------------- /AI算法/CV/images/FPN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/FPN.png -------------------------------------------------------------------------------- /AI算法/CV/images/IOU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/IOU.png -------------------------------------------------------------------------------- /AI算法/CV/images/KocaU1zbxnXYsyJ.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/KocaU1zbxnXYsyJ.jpg -------------------------------------------------------------------------------- /AI算法/CV/images/RPN_loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/RPN_loss.png -------------------------------------------------------------------------------- /AI算法/CV/images/RPN网络示意图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/RPN网络示意图.png -------------------------------------------------------------------------------- /AI算法/CV/images/ce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/ce.png -------------------------------------------------------------------------------- /AI算法/CV/images/faster-rcnn原理图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/faster-rcnn原理图.png -------------------------------------------------------------------------------- /AI算法/CV/images/faster-rcnn结构图示意图.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/faster-rcnn结构图示意图.jpg -------------------------------------------------------------------------------- /AI算法/CV/images/kmeans算法.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/kmeans算法.jpg -------------------------------------------------------------------------------- /AI算法/CV/images/v2-a08645e392a6a5cb49e271e5310f0dd8_1440w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/v2-a08645e392a6a5cb49e271e5310f0dd8_1440w.png -------------------------------------------------------------------------------- /AI算法/CV/images/双线性插值.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/双线性插值.png -------------------------------------------------------------------------------- /AI算法/CV/images/检测分类分割.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/检测分类分割.jpg -------------------------------------------------------------------------------- /AI算法/CV/images/目标检测模型年限图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/目标检测模型年限图.png -------------------------------------------------------------------------------- /AI算法/CV/images/目标检测模型示意图(YOLOv4).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/images/目标检测模型示意图(YOLOv4).png -------------------------------------------------------------------------------- /AI算法/CV/目标检测.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/CV/目标检测.pdf -------------------------------------------------------------------------------- /AI算法/NLP/应用场景/NLG.md: -------------------------------------------------------------------------------- 1 | # NLG 2 | 3 | ## 知识体系 4 | 5 | 主要包括 NLG 相关知识点。 6 | 7 | ## Questions 8 | 9 | ### 文本生成评估指标 BLUE 的缺点? 10 | 11 | - 过于依赖参考翻译,如果译文质量很好但部分字词在参考翻译中没有的话得分会很低。 12 | - 未考虑语法问题。 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /AI算法/NLP/应用场景/Similarity.md: -------------------------------------------------------------------------------- 1 | # 相似度 2 | 3 | ## 知识体系 4 | 5 | 主要分为两大类架构体系:表示型和交互型。 6 | 7 | ## Questions 8 | 9 | ### 表示型 10 | 11 | #### 孪生网络原理? 12 | 13 | 孪生网络是指包含两个或多个相同子网络的架构。相同是指配置、参数和权重都一模一样。主要用于评价输入之间的相似度。损失函数主要采用 Triplet Loss 或 Contrastive Loss。 14 | 15 | -------------------------------------------------------------------------------- /AI算法/NLP/文本表示/Word2Vec详解.assets/NNLM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/文本表示/Word2Vec详解.assets/NNLM.png -------------------------------------------------------------------------------- /AI算法/NLP/文本表示/Word2Vec详解.assets/Word2Vec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/文本表示/Word2Vec详解.assets/Word2Vec.png -------------------------------------------------------------------------------- /AI算法/NLP/文本表示/Word2Vec详解.md: -------------------------------------------------------------------------------- 1 | # 1 模型介绍 2 | 3 | ## 1.1 模型概述 4 | 5 | Word2Vec是Google在2013年提出的一个NLP工具,它通过一个浅层的双层神经网络,高效率、高质量地将海量单词向量化。训练得到的词向量满足: 6 | 7 | - 相似单词的词向量彼此接近。例如$\text{dis}(\vec V(\text{man}),\vec V(\text{woman})) \ll \text{dis}(\vec V(\text{man}),\vec V(\text{computer}))$ 8 | - 保留单词间的线性规则性。例如$\vec V(\text{king})-\vec V(\text{man})+\vec V(\text{woman})\approx \vec V(\text{queen})$ 9 | 10 | Word2Vec模型的灵感来源于Bengio在2003年提出的NNLM模型(Nerual Network Language Model),该模型使用一个三层前馈神经网络$f(w_k,w_{k-1},w_{k-2},...,w_{k-n+1};\theta)$来拟合一个词序列的条件概率$P(w_k|w_{k-1},w_{k-2},...,w_1)$。第一层是映射层,通过一个共享矩阵,将One-Hot向量转化为词向量,第二层是一个激活函数为tanh的隐含层,第三层是Softmax输出层,将向量映射到$[0,1]$概率空间中。根据条件概率公式与大数定律,使用词频$\frac{\text{Count}(w_k,w_{k-1},w_{k-2},...,w_{k-n+1})}{\text{Count}(w_{k-1},w_{k-2},...,w_{k-n+1})}$来近似地估计真实的条件概率。 11 | 12 | NNLM 13 | 14 | Bengio发现,我们可以使用映射层的权值作为词向量表征。但是,由于参数空间非常庞大,NNLM模型的训练速度非常慢,在百万级的数据集上需要耗时数周才能得到相对不错的结果,而在千万级甚至更大的数据集上,几乎无法得到结果。 15 | 16 | Mikolov发现,NNLM模型可以被拆分成两个步骤: 17 | 18 | - 用一个简单的模型训练出一个连续的词向量(映射层) 19 | - 基于词向量表征,训练出一个N-Gram神经网络模型(隐含层+输出层) 20 | 21 | 而模型的计算瓶颈主要在第二步,特别是输出层的Sigmoid归一化部分。如果我们只是想得到词向量,可以对第二步的神经网络模型进行简化,从而提高模型的训练效率。因此,Mikolov对NNLM模型进行了以下几个部分的修改: 22 | 23 | - 舍弃了隐含层。 24 | - NNLM在利用上文词预测目标词时,对上文词的词向量进行了拼接,Word2Vec模型对其直接进行了求和,从而降低了隐含元的维度。 25 | - NNLM在进行Sigmoid归一化时需要遍历整个词汇表,Word2Vec模型提出了Hierarchical Softmax与Negative Sampling两种策略进行优化。 26 | - 依据分布式假设(上下文环境相似的两个词有着相近的语义),将下文单词也纳入训练环境,并提出了两种训练策略,一种是用上下文预测中心词,称为CBOW,另一种是用中心词预测上下文,称为Skip-Gram。 27 | 28 | Word2Vec 29 | 30 | ## 1.2 CBOW模型 31 | 32 | 假设我们的语料是**"NLP is so interesting and challenging"**。循环使用每个词作为中心词,来其上下文词来预测中心词。我们通常使用一个指定长度的窗口,根据马尔可夫性质,忽略窗口以外的单词。 33 | 34 | | 中心词 | 上下文 | 35 | | :---------: | :--------------------------: | 36 | | NLP | is, so | 37 | | is | NLP, so, interesting | 38 | | so | NLP, is, interesting, and | 39 | | interesting | is, so, and, challenging | 40 | | and | so, interesting, challenging | 41 | | challenging | interesting, and | 42 | 43 | 我们的目标是通过上下文来预测中心词,也就是给定上下文词,出现该中心词的概率最大。这和完形填空颇有点异曲同工之妙。也即$\max P(\text{NLP|is, so})*P(\text{is|NLP, so, interesting})*\dots$ 44 | 45 | 用公式表示如下: 46 | $$ 47 | \begin{align} 48 | \max\limits_{\theta} L(\theta)&=\prod\limits_{w\in D}p(w|C(w)) \\ 49 | &=\sum\limits_{w \in D}\log p(w|C(w)) 50 | \end{align} 51 | $$ 52 | 53 | 其中$w$指中心词,$C(w)$指上下文词集,$D$指语料库,也即所有中心词的词集。 54 | 55 | 问题的核心变成了如何构造$\log p(w|C(w))$。我们知道,NNLM模型的瓶颈在Sigmoid归一化上,Mikolov提出了两种改进思路来绕过Sigmoid归一化这一操作。一种思想是将输出改为一个霍夫曼树,每一个单词的概率用其路径上的权重乘积来表示,从而减少高频词的搜索时间;另一种思想是将预测每一个单词的概率,概率最高的单词是中心词改为预测该单词是不是正样本,通过负采样减少负样本数量,从而减少训练时间。 56 | 57 | ### 1.2.1 Hierarchical Softmax 58 | 59 | ### 1.2.2 Negative Sampling 60 | 61 | 基于Hierachical Softmax的模型使用Huffman树代替了传统的线性神经网络,可以提高模型训练的效率。但是,如果训练样本的中心词是一个很生僻的词,那么在Huffman树中仍旧需要进行很复杂的搜索。负采样方法的核心思想是:设计一个分类器, 对于我们需要预测的样本,设为正样本;而对于不是我们需要的样本,设置成负样本。在CBOW模型中,我们需要预测中心词$w$,因此正样本只有$w$,也即$\text{Pos}(w)=\{w\}$,而负样本为除了$w$之外的所有词。对负样本进行**随机采样**,得到$\text{Neg}(w)$,大大简化了模型的计算。 62 | 63 | 我们首先将$C(w)$输入映射层并求和得到隐含表征$h_w=\sum\limits_{u \in C(w)}\vec v(u)$ 64 | 65 | 从而, 66 | $$ 67 | \begin{align} 68 | p(u|C(w))&= 69 | \begin{cases} 70 | \sigma(h_w^T\theta_u), &\mathcal{D}(w,u)=1 \\ 71 | 1-\sigma(h_w^T\theta_u), &\mathcal{D}(w,u)=0 \\ 72 | \end{cases}\\ 73 | &=[\sigma(h_w^T\theta_u)]^{\mathcal{D}(w,u)} \cdot [1-\sigma(h_w^T\theta_u)]^{1-\mathcal{D}(w,u)} 74 | \end{align} 75 | $$ 76 | 77 | 从而, 78 | $$ 79 | \begin{align} 80 | \max\limits_{\theta} L(\theta)&=\sum\limits_{w \in D}\log p(w|C(w))\\ 81 | &=\sum\limits_{w \in D}\log \prod\limits_{u \in D}p(u|C(w)) \\ 82 | &\approx\sum\limits_{w \in D}\log \prod\limits_{u \in \text{Pos(w)}\cup \text{Neg(w)} }p(u|C(w))\\ 83 | &=\sum\limits_{w \in D}\log\prod\limits_{u \in \text{Pos(w)}\cup \text{Neg(w)}}[\sigma(h_w^T\theta_u)]^{\mathcal{D}(w,u)} \cdot [1-\sigma(h_w^T\theta_u)]^{1-\mathcal{D}(w,u)} \\ 84 | &=\sum\limits_{w \in D}\sum\limits_{u \in \text{Pos}(w)\cup \text{Neg}(w)}\mathcal{D}(w,u)\cdot\log \sigma(h_w^T\theta_u)+[1-\mathcal{D}(w,u)]\cdot \log [1-\sigma(h_w^T\theta_u)]\\ 85 | &=\sum\limits_{w \in D}\left\{\sum\limits_{u \in \text{Pos}(w)}\log \sigma(h_w^T\theta_u)+\sum\limits_{u \in \text{Neg}(w)}\log [1-\sigma(h_w^T\theta_u)]\right\} 86 | \end{align} 87 | $$ 88 | 89 | 由于上式是一个最大化问题,因此使用随机梯度上升法对问题进行求解。 90 | 91 | 令$L(w,u,\theta)=\mathcal{D}(w,u)\cdot\log \sigma(h_w^T\theta_u)+[1-\mathcal{D}(w,u)]\cdot \log [1-\sigma(h_w^T\theta_u)]$ 92 | 93 | 则$\frac{\partial L}{\partial\theta_u}=\mathcal{D}(w,u)\cdot[1-\sigma(h_w^T\theta_u)]h_w+[1-\mathcal{D}(w,u)]\cdot \sigma(h_w^T\theta_u)h_w=[\mathcal{D}(w,u)-\sigma(h_w^T\theta_u)]h_w$ 94 | 95 | 因此$\theta_u$的更新公式为:$\theta_u:=\theta_u+\eta[\mathcal{D}(w,u)-\sigma(h_w^T\theta_u)]h_w$ 96 | 97 | 同样地,$\frac{\partial L}{\partial h_w}=[\mathcal{D}(w,u)-\sigma(h_w^T\theta_u)]\theta_u$ 98 | 99 | 上下文词的更新公式为:$v(\tilde{w}):=v(\tilde{w})+\eta\sum\limits_{u \in \text{Pos}(w)\cup \text{Neg}(w)}[\mathcal{D}(w,u)-\sigma(h_w^T\theta_u)]\theta_u$ 100 | 101 | ## 1.3 Skip-Gram模型 102 | 103 | 仍旧使用上文的语料库**"NLP is so interesting and challenging"**,这次,我们的目标是通过中心词来预测上下文,也就是给定中心词,出现这些上下文词的概率最大。也即$\max P(is|NLP)*P(so|NLP)*P(NLP|is)*P(so|is)*P(interesting|is)*\dots$ 104 | 105 | 用公式表示如下: 106 | $$ 107 | \begin{align} 108 | \max\limits_{\theta} L(\theta)&=\prod\limits_{w\in D}\prod\limits_{c \in C(w)}p(c|w) \\ 109 | &=\sum\limits_{w \in D}\sum\limits_{c \in C(w)}\log p(c|w) 110 | \end{align} 111 | $$ 112 | 113 | ### 1.3.1 Hierarchical Softmax 114 | 115 | ### 1.3.2 Negative Sampling 116 | 117 | # 2 常见面试问题 118 | 119 | **Q1:介绍一下Word2Vec模型。** 120 | 121 | > A:两个模型:CBOW/Skip-Gram 122 | > 123 | > 两种加速方案:Hierarchical Softmax/Negative Sampling 124 | 125 | **Q2:Word2Vec模型为什么要定义两套词向量?** 126 | 127 | > A:因为每个单词承担了两个角色:中心词和上下文词。通过定义两套词向量,可以将两种角色分开。cs224n中提到是为了更方便地求梯度。参考见:https://www.zhihu.com/answer/706466139 128 | 129 | **Q3:Hierarchial Softmax 和 Negative Sampling对比** 130 | 131 | > A:基于Huffman树的Hierarchial Softmax 虽然在一定程度上能够提升模型运算效率,但是,如果中心词是生僻词,那么在Huffman树中仍旧需要进行很复杂的搜索$(O(\log N))$。而Negative Sampling通过随机负采样来提升运算效率,其复杂度和设定的负样本数$K$线性相关$(O(K))$,当$K$取较小的常数时,负采样在每⼀步的梯度计算开销都较小。 132 | 133 | **Q4:HS为什么用霍夫曼树而不用其他二叉树?** 134 | 135 | > 这是因为Huffman树对于高频词会赋予更短的编码,使得高频词离根节点距离更近,从而使得训练速度加快。 136 | 137 | **Q5:Word2Vec模型为什么要进行负采样?** 138 | 139 | > A:因为负样本的数量很庞大,是$O(|V^2|)$。 140 | 141 | **Q6:负采样为什么要用词频来做采样概率?** 142 | 143 | > 为这样可以让频率高的词先学习,然后带动其他词的学习。 144 | 145 | **Q7:One-hot模型与Word2Vec模型比较?** 146 | 147 | > A:One-hot模型的缺点 148 | > 149 | > - 稀疏 Sparsity 150 | > - 只能表示维度数量的单词 Capacity 151 | > - 无法表示单词的语义 Meaning 152 | 153 | **Q8:Word2Vec模型在NNLM模型上做了哪些改进?** 154 | 155 | > A:相同点:其本质都可以看作是语言模型; 156 | > 157 | > 不同点:词向量只不过 NNLM 一个产物,Word2vec 虽然其本质也是语言模型,但是其专注于词向量本身,因此做了许多优化来提高计算效率: 158 | > 159 | > - 与 NNLM 相比,词向量直接 sum,不再拼接,并舍弃隐层; 160 | > 161 | > - 考虑到 sofmax 归一化需要遍历整个词汇表,采用 hierarchical softmax 和 negative sampling 进行优化,hierarchical softmax 实质上生成一颗带权路径最小的哈夫曼树,让高频词搜索路劲变小;negative sampling 更为直接,实质上对每一个样本中每一个词都进行负例采样; 162 | 163 | **Q9:Word2Vec与LSA对比?** 164 | 165 | > A:LSA是基于共现矩阵构建词向量,本质上是基于全局语料进行SVD矩阵分解,计算效率低; 166 | > 167 | > 而Word2Vec是基于上下文局部语料计算共现概率,计算效率高。 168 | 169 | **Q10:Word2Vec的缺点?** 170 | 171 | > 忽略了词语的语序; 172 | > 173 | > 没有考虑一词多义现象 174 | 175 | **Q11:怎么从语言模型理解词向量?怎么理解分布式假设?** 176 | 177 | > 词向量是语言模型的一个副产物,可以理解为,在语言模型训练的过程中,势必在一定程度上理解了每个单词的含义。而这在计算机的表示下就是词向量。 178 | > 179 | > 分布式假设指的是相同上下文语境的词有似含义。 180 | 181 | **参考资料** 182 | 183 | word2vec 中的数学原理详解 https://blog.csdn.net/itplus/article/details/37969519 184 | 185 | Word2Vec原理介绍 https://www.cnblogs.com/pinard/p/7160330.html 186 | 187 | 词向量介绍 https://www.cnblogs.com/sandwichnlp/p/11596848.html 188 | 189 | 一些关于词向量的问题 https://zhuanlan.zhihu.com/p/56382372 190 | 191 | 一个在线尝试Word2Vec的小demo https://ronxin.github.io/wevi/ 192 | -------------------------------------------------------------------------------- /AI算法/NLP/文本表示/Word2Vec详解.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/文本表示/Word2Vec详解.pdf -------------------------------------------------------------------------------- /AI算法/NLP/文本表示/文本结构理解.md: -------------------------------------------------------------------------------- 1 | # 基于词角度 2 | 3 | ## 知识体系 4 | 5 | 基于词角度的文本结构理解主要包括分词、词性标注和命名实体识别。对于文本未切分的语言,分词一般会作为自然语言处理的第一步。即使到了字粒度的 BERT 时代, WWM 效果也要更好一些。从大的方面看有两种不同的分词方式:基于词典和基于序列标注。后者也可用于词性标注和命名实体识别任务。 6 | 7 | 8 | ## Questions 9 | 10 | ### 常用的分词方法有哪些? 11 | 12 | 常用分词方法有两种:基于词典的方法和基于序列标注的方法。前者又包括字符串匹配方法和统计语言模型方法;后者包括统计方法和深度学习方法。 13 | 14 | ### 字符串匹配分词的优缺点是什么? 15 | 16 | 优点:方法简单可控、速度快;缺点:难以解决歧义及新词问题。 17 | 18 | ### 结巴分词原理? 19 | 20 | 基于词典构造有向无环图,计算最大概率路径。新词发现使用 HMM,弥补了 Ngram 难以发现新词的不足。 21 | 22 | ### HMM 怎么做分词的? 23 | 24 | HMM 使用序列标注法进行分词,以 BEMS 标签为例,此为隐状态取值空间。模型需要估计隐状态初始概率、隐状态之间的转移概率和隐状态到观测序列的发射概率。可以使用有监督或无监督学习算法,有监督学习根据标注数据利用极大似然法进行估计,无监督学习使用 Baum-Welch 算法。实际使用时使用维特比算法进行解码,得到最可能的隐状态序列。 25 | 26 | ### MEMM 是什么? 27 | 28 | HMM 有两个基本假设:齐次一阶马尔科夫和观测独立假设。也就是 t 时刻的状态仅仅与前一个状态有关,同时观测序列仅仅取决于它对应的隐状态。这就和实际不符,因为隐状态往往和上下文信息都有关系。于是在 HMM 的基础上引入了 MEMM,即最大熵马尔科夫模型。它打破了 HMM 的观测独立假设,考虑了整个观测序列。HMM 是一种对隐状态序列和观测状态序列联合概率进行建模的生成式模型;MEMM 是直接对标注后的后验概率进行建模的判别式模型。 29 | 30 | ### 什么是标注偏置问题?如何解决? 31 | 32 | 在 MEMM 中需要对局部进行归一化,因此隐状态会倾向于转移到那些后续状态可能更少的状态上(以提高整体的后验概率),这就是标注偏置问题。CRF,条件随机场在 MEMM 的基础上进行了全局归一化,解决了标注偏置问题。这其实已经打破了 HMM 的第一个假设(齐次马尔科夫),将有向变成了无向。 33 | 34 | ### BILSTM-CRF 原理 35 | 36 | BiLSTM 是双向 RNN 模型,每一个 Token 对应一个 Label,可以直接用来做序列标注任务。但是 BiLSTM 在 NER 问题上有个问题,因为 NER 的标签之间往往也有关系,比如形容词后面一半会接名词(中文为例),动词后面会接副词,LSTM 没办法获取这部分特征。这时候我们就需要 CRF 层,简单来说,就是加入 Label 之间的关系特征。也就是说,每一个 Label 在预测时都会考虑全局其他的 Label。 37 | 38 | ### 如何解决序列标注标签不均衡问题? 39 | 40 | 在 NER 任务中,标签不均衡一般是指要标注的实体较少,大多数标签为 O 的情况,以及部分实体过多,其他实体过少的情况。一般可以有以下几种处理思路: 41 | 42 | - 数据增强,主要是词替换(包括同类实体词替换、同义词替换、代词替换等)、随机增删实体词以外的词构建新样本、继续增加新样本、半监督方法等 43 | - 损失函数,给 loss 增加权重惩罚、Dice Loss 等 44 | - 迁移学习,借助预训练模型已经学到的丰富知识 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /AI算法/NLP/文本表示/文本表征方式.md: -------------------------------------------------------------------------------- 1 | # 静态语义表示方法 2 | 3 | ## 知识体系 4 | 5 | 主要包括词袋模型 BoW、TFIDF、LDA、Word2vec、Golve、Doc2Vec 等。 6 | 7 | 8 | ## Questions 9 | ### 在小数据集中 Skip-Gram 和 CBoW 哪种表现更好? 10 | 11 | Skip-Gram 是用一个 Center Word 预测其 Context 里的 Word;而 CBoW 是用 Context 里的所有 Word 去预测一个 Center Word。显然,前者对训练数据的利用更高效(构造的数据集多),因此,对于较小的语料库,Skip-Gram是更好的选择。 12 | 13 | ### 为什么要使用HS(Hierarchical Softmax )和负采样(Negative Sampling)? 14 | 15 | 两个模型的原始做法都是做内积,经过 Softmax 后得到概率,因此复杂度很高。假设我们拥有一个百万量级的词典,每一步训练都需要计算上百万次词向量的内积,显然这是无法容忍的。因此人们提出了两种较为实用的训练技巧,即 HS 和 Negative Sampling。 16 | 17 | ### 介绍一下HS(Hierarchical Softmax ) 18 | 19 | HS 是试图用词频建立一棵哈夫曼树,那么经常出现的词路径会比较短。树的叶子节点表示词,共词典大小多个,而非叶子结点是模型的参数,比词典个数少一个。要预测的词,转化成预测从根节点到该词所在叶子节点的路径,是多个二分类问题。本质是把 N 分类问题变成 log(N) 次二分类 20 | 21 | ### 介绍一下负采样(Negative Sampling) 22 | 23 | 把原来的 Softmax 多分类问题,直接转化成一个正例和多个负例的二分类问题。让正例预测 1,负例预测 0,这样子更新局部的参数。. 24 | 25 | ### 负采样为什么要用词频来做采样概率? 26 | 27 | 可以让频率高的词先学习,然后带动其他词的学习。 28 | 29 | ### 负采样有什么作用? 30 | 31 | - 可以大大降低计算量,加快模型训练时间 32 | - 保证模型训练效果,因为目标词只跟相近的词有关,没有必要使用全部的单词作为负例来更新它们的权重 33 | 34 | ### 对比 Skip-Gram 和 CBOW 35 | 36 | CBOW 会比 Skip-Gram 训练速度更快,因为前者每次会更新 Context(w) 的词向量,而 Skip-Gram 只更新核心词的词向量。 37 | Skip-Gram 对低频词效果比 CBOW 好,因为 SkipGram 是尝试用当前词去预测上下文,当前词是低频词还是高频词没有区别。但是 CBOW 相当于是完形填空,会选择最常见或者说概率最大的词来补全,因此不太会选择低频词。 38 | 39 | ### 对比字向量和词向量 40 | 41 | 字向量可以解决未登录词的问题,以及可以避免分词;词向量包含的语义空间更大,更加丰富,如果语料足够的情况下,词向量是能够学到更多的语义信息。 42 | 43 | ### 如何衡量 Word2vec 得出的词/字向量的质量? 44 | 45 | 在实际工程中一般以 Word Embedding 对于实际任务的收益为评价标准,包括词汇类比任务(如 king – queen = man - woman)以及 NLP 中常见的应用任务,比如命名实体识别(NER),关系抽取(RE)等。 46 | 47 | ### 神经网络框架里的 Embedding 层和 Word Embedding 有什么关系? 48 | 49 | Embedding 层就是以 One-Hot 为输入(实际一般输入字或词的 id)、中间层节点为字向量维数的全连接层。而这个全连接层的参数,就是一个 “词向量表”,即 Word Embedding。 50 | ### Word2vec 的缺点? 51 | 没有考虑词序,因为它假设了词的上下文无关(把概率变为连乘);没有考虑全局的统计信息。 52 | 53 | ### LDA 的原理? 54 | 55 | LDA 是 pLSA 的贝叶斯版本,pLSA 是使用生成模型建模文章的生成过程,它假定 K 个主题 Z,对于文档集 D 中每个文档 Di 都包含 Ni 个词 W,对每个 Wi,最大化给定文档 Di 生成主题 Zi,再根据 Di 和 Zi 生成 Wi 的概率,最终生成整个文档序列。 56 | 57 | LDA 将每篇文章的主题分布和每个主题对应的词分布看成是一种先验分布,即狄利克雷分布。之所以选择该分布,是因为它是多项式分布的共轭先验概率分布,后验分布依然服从狄利克雷分布,方便计算。 58 | 59 | 具体过程为:首先从超参数为 α 的狄利克雷分布中抽样生成给定文档的主题分布 θ,对于文档中的每一个词,从多项式分布 θ 中抽样生成对应的主题 z,从超参数为 β 的狄利克雷分布中抽样生成给定主题 z 的词分布 φ,从多项式分布 φ 中抽样生成词 w。 60 | 61 | LDA 的主题数为超参数,一般使用验证集评估 ppl 或 HDP-LDA。 62 | 63 | ### Word2vec 和 TF-IDF 在计算相似度时的区别? 64 | 65 | - 前者是稠密向量,后者是稀疏向量 66 | - 前者维度低很多,计算更快 67 | - 前者可以表达语义信息,后者不行 68 | - 前者可以通过计算余弦相似度计算两个向量的相似度,后者不行 69 | 70 | ### 为什么训练得到的字词向量会有如下一些性质,比如向量的夹角余弦、向量的欧氏距离都能在一定程度上反应字词之间的相似性? 71 | 72 | 因为我们在用语言模型无监督训练时,是开了窗口的,通过前 n 个字预测下一个字的概率,这个 n 就是窗口的大小,同一个窗口内的词语,会有相似的更新,这些更新会累积,而具有相似模式的词语就会把这些相似更新累积到可观的程度。 73 | 74 | ### Word2vec 与 Glove的异同? 75 | 76 | 在 Word2vec 中,高频的词共现只是产生了更多的训练数据,并没有携带额外的信息;Glove 加入词的全局共现频率信息。它基于词上下文矩阵的矩阵分解技术,首先构建一个大的单词×上下文共现矩阵,然后学习低维表示,可以视为共现矩阵的重构问题。 77 | 78 | - Word2vec 是局部语料训练,特征提取基于滑动窗口;Glove 的滑动窗口是为了构建共现矩阵,统计全部语料在固定窗口内词的共现频次。 79 | - Word2vec 损失函数是带权重的交叉熵;Glove 的损失函数是最小平方损失 80 | - Glove 利用了全局信息,训练时收敛更快 81 | 82 | ### Word2vec 相比之前的 Word Embedding 方法好在什么地方? 83 | 84 | 考虑了上下文。 85 | 86 | ### Doc2vec 原理? 87 | 88 | Doc2vec 是训练文档表征的,在输入层增加了一个 Doc 向量。有两种不同的训练方法:Distributed Memory 是给定上下文和段落向量的情况下预测单词的概率。在一个句子或者段落文档训练过程中,段落 ID 保存不变,共享同一个段落向量。Distributed Bag of Words 则在只给定段落向量的情况下预测段落中一组随机单词的概率。使用时固定词向量,随机初始化 Doc 向量,训练几个步骤后得到最终 Doc 向量。 89 | 90 | ### FastText 相比 Word2vec 有哪些不同? 91 | 92 | - FastText 增加了 Ngram 特征,可以更好地解决未登录词及在小数据集上训练的问题 93 | - FastText 是一个工具包,除了可以训练词向量还可以训练有监督的文本分类模型 94 | 95 | ## 参考链接 96 | 97 | 1. [https://blog.csdn.net/zhangxb35/article/details/74716245](https://blog.csdn.net/zhangxb35/article/details/74716245) 98 | 2. [https://spaces.ac.cn/archives/4122](https://spaces.ac.cn/archives/4122) 99 | 100 | -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/20191017120044663-16497775072026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/20191017120044663-16497775072026.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/20191017120044663.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/20191017120044663.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/image-20211101145141135-16497775072021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/image-20211101145141135-16497775072021.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/image-20211101145141135.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/image-20211101145141135.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/layernorm1-16497775072023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/layernorm1-16497775072023.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/layernorm1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/layernorm1.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/layernorm2-16497775072024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/layernorm2-16497775072024.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/layernorm2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/layernorm2.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/layernorm3-16497775072025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/layernorm3-16497775072025.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/layernorm3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/layernorm3.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/qkv-16497775072022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/qkv-16497775072022.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/qkv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/qkv.png -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/v2-fb520ebe418cab927efb64d6a6ae019e_720w-16497775072037.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/v2-fb520ebe418cab927efb64d6a6ae019e_720w-16497775072037.jpg -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/BERT/img/v2-fb520ebe418cab927efb64d6a6ae019e_720w.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/NLP/特征挖掘/BERT/img/v2-fb520ebe418cab927efb64d6a6ae019e_720w.jpg -------------------------------------------------------------------------------- /AI算法/NLP/特征挖掘/基于深度学习的模型.md: -------------------------------------------------------------------------------- 1 | # 基于深度学习的模型 2 | 3 | 4 | ## 知识体系 5 | 6 | 主要包括深度学习相关的特征抽取模型,包括卷积网络、循环网络、注意力机制、预训练模型等。 7 | 8 | ### CNN 9 | 10 | TextCNN 是 CNN 的 NLP 版本,来自 Kim 的 [[1408.5882] Convolutional Neural Networks for Sentence Classification](https://arxiv.org/abs/1408.5882) 11 | 12 | 结构如下: 13 | 14 | ![](http://qnimg.lovevivian.cn/paper-textcnn-1.jpg) 15 | 16 | 大致原理是使用多个不同大小的 filter(也叫 kernel) 对文本进行特征提取,如上图所示: 17 | 18 | - 首先通过 Embedding 将输入的句子映射为一个 `n_seq * embed_size` 大小的张量(实际中一般还会有 batch_size) 19 | - 使用 `(filter_size, embed_size)` 大小的 filter 在输入句子序列上平滑移动,这里使用不同的 padding 策略,会得到不同 size 的输出 20 | - 由于有 `num_filters` 个输出通道,所以上面的输出会有 `num_filters` 个 21 | - 使用 `Max Pooling` 或 `Average Pooling`,沿着序列方向得到结果,最终每个 filter 的输出 size 为 `num_filters` 22 | - 将不同 filter 的输出拼接后展开,作为句子的表征 23 | 24 | ### RNN 25 | 26 | RNN 的历史比 CNN 要悠久的多,常见的类型包括: 27 | 28 | - 一对一(单个 Cell):给定单个 Token 输出单个结果 29 | - 一对多:给定单个字符,在时间步向前时同时输出结果序列 30 | - 多对一:给定文本序列,在时间步向前执行完后输出单个结果 31 | - 多对多1:给定文本序列,在时间步向前时同时输出结果序列 32 | - 多对多2:给定文本序列,在时间步向前执行完后才开始输出结果序列 33 | 34 | 由于 RNN 在长文本上有梯度消失和梯度爆炸的问题,它的两个变种在实际中使用的更多。当然,它们本身也是有一些变种的,这里我们只介绍主要的模型。 35 | 36 | - LSTM:全称 Long Short-Term Memory,一篇 Sepp Hochreiter 等早在 1997 年的论文[《LONG SHORT-TERM MEMORY》](https://www.bioinf.jku.at/publications/older/2604.pdf)中被提出。主要通过对原始的 RNN 添加三个门(遗忘门、更新门、输出门)和一个记忆层使其在长文本上表现更佳。 37 | 38 | ![](https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/LSTM_Cell.svg/1280px-LSTM_Cell.svg.png) 39 | 40 | - GRU:全称 Gated Recurrent Units,由 Kyunghyun Cho 等人 2014 年在论文[《Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation》](https://arxiv.org/pdf/1406.1078v3.pdf) 中首次被提出。主要将 LSTM 的三个门调整为两个门(更新门和重置门),同时将记忆状态和输出状态合二为一,在效果没有明显下降的同时,极大地提升了计算效率。 41 | 42 | ![](https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Gated_Recurrent_Unit%2C_base_type.svg/1920px-Gated_Recurrent_Unit%2C_base_type.svg.png) 43 | 44 | ## Questions 45 | 46 | ### CNN相关 47 | 48 | #### CNN 有什么好处? 49 | 50 | - 稀疏(局部)连接:卷积核尺寸远小于输入特征尺寸,输出层的每个节点都只与部分输入层连接 51 | - 参数共享:卷积核的滑动窗在不同位置的权值是一样的 52 | - 等价表示(输入/输出数据的结构化):输入和输出在结构上保持对应关系(长文本处理容易) 53 | 54 | #### CNN 有什么不足? 55 | 56 | - 只有局部语义,无法从整体获取句子语义 57 | - 没有位置信息,丢失了前后顺序信息 58 | 59 | #### 卷积层输出 size? 60 | 61 | 给定 n×n 输入,f×f 卷积核,padding p,stride s,输出的尺寸为: 62 | 63 | $$ 64 | \lfloor \frac{n+2p-f}{s} + 1 \rfloor \times \lfloor \frac{n+2p-f}{s} + 1 \rfloor 65 | $$ 66 | 67 | ### RNN 68 | 69 | #### LSTM 网络结构? 70 | 71 | LSTM 即长短时记忆网络,包括三个门:更新门(输入门)、遗忘门和输出门。公式如下: 72 | 73 | $$ 74 | \hat{c}^{} = \tanh (W_c [a^{, x^{}] + b_c) \\ 75 | \Gamma_u = \sigma(W_u [a^{, x^{}] + b_u) \\ 76 | \Gamma_f = \sigma(W_f [a^{, x^{}] + b_f) \\ 77 | \Gamma_o = \sigma(W_o [a^{, x^{}] + b_o) \\ 78 | c^{} = \Gamma_u * \hat{c}^{} + \Gamma_f*c^{} \\ 79 | a^{} = \Gamma_o * c^{} 80 | $$ 81 | 82 | #### 如何解决 RNN 中的梯度消失或梯度爆炸问题? 83 | 84 | - 梯度截断 85 | - ReLU、LeakReLU、Elu 等激活函数 86 | - Batch Normalization 87 | - 残差连接 88 | - LSTM、GRU 等架构 89 | 90 | #### 假设输入维度为 m,输出为 n,求 GRU 参数? 91 | 92 | 输入 W:3nm,隐层 W:3nn,隐层 b:3n,合计共:`3*(nn+nm+n)`。当然,也有的实现会把前一时刻的隐层和当前时刻的输入分开,使用两个 bias,此时需要再增加 3n 个参数。 93 | 94 | #### LSTM 和 GRU 的区别? 95 | 96 | - GRU 将 LSTM 的更新门、遗忘门和输出门替换为更新门和重置门 97 | - GRU 将记忆状态和输出状态合并为一个状态 98 | - GRU 参数更少,更容易收敛,但数据量大时,LSTM 效果更好 99 | 100 | ### Attention 101 | 102 | #### Attention 机制 103 | 104 | Attention 核心是从输入中有选择地聚焦到特定重要信息上的一种机制。有三种不同用法: 105 | 106 | - 在 encoder-decoder attention 层,query 来自上一个 decoder layer,memory keys 和 values 来自 encoder 的 output 107 | - encoder 包含 self-attention,key value 和 query 来自相同的位置,即前一层的输出。encoder 的每个位置都可以注意到前一层的所有位置 108 | - decoder 与 encoder 类似,通过将所有不合法连接 mask 以防止信息溢出 109 | 110 | #### 自注意力中为何要缩放? 111 | 112 | 维度较大时,向量内积容易使得 SoftMax 将概率全部分配给最大值对应的 Label,其他 Label 的概率几乎为 0,反向传播时这些梯度会变得很小甚至为 0,导致无法更新参数。因此,一般会对其进行缩放,缩放值一般使用维度 dk 开根号,是因为点积的方差是 dk,缩放后点积的方差为常数 1,这样就可以避免梯度消失问题。 113 | 114 | 另外,Hinton 等人的研究发现,在知识蒸馏过程中,学生网络以一种略微不同的方式从教师模型中抽取知识,它使用大模型在现有标记数据上生成软标签,而不是硬的二分类。直觉是软标签捕获了不同类之间的关系,这是大模型所没有的。这里的软标签就是缩放的 SoftMax。 115 | 116 | 至于为啥最后一层为啥一般不需要缩放,因为最后输出的一般是分类结果,参数更新不需要继续传播,自然也就不会有梯度消失的问题。 117 | 118 | ### Transformer 119 | 120 | #### Transformer 中为什么用 Add 而不是 Concat? 121 | 122 | 在 Embedding 中,Add 等价于 Concat,三个 Embedding 相加与分别 One-Hot Concat 效果相同。 123 | 124 | ### ELMO 125 | 126 | #### 简单介绍下ELMO 127 | 128 | 使用双向语言模型建模,两层 LSTM 分别学习语法和语义特征。首次使用两阶段训练方法,训练后可以在下游任务微调。 129 | 130 | Feature-Based 微调,预训练模型作为纯粹的表征抽取器,表征依赖微调任务网络结构适配(任务缩放因子 γ)。 131 | 132 | ### ELMO的缺点 133 | 134 | ELMO 的缺点主要包括:不完全的双向预训练(Bi 是分开的,仅在 Loss 合并);需要进行任务相关的网络设计(每种下游任务都要特定的设计);仅有词向量无句向量(没有句向量任务)。 135 | 136 | 137 | ### GPT 138 | 139 | #### 简单介绍下GPT 140 | 141 | 使用 Transformer 的 Decoder 替换 LSTM 作为特征提取器。 142 | 143 | Model-Based 微调,预训练模型作为任务网络的一部分参与任务学习,简化了下游任务架构设计。 144 | 145 | #### GPT的缺点 146 | 147 | GPT 的缺点包括:单项预训练模型;仅有词向量无句向量(仅学习语言模型)。 148 | 149 | ### BERT 150 | 151 | #### 简单介绍下BERT 152 | 153 | 使用 Transformer Encoder 作为特征提取器,交互式双向语言建模(MLM),Token 级别+句子级别任务(MLM+NSP),两阶段预训练。 154 | 155 | Feature-Based 和 Model-Based,实际一般使用 Model-Based。 156 | 157 | #### BERT缺点 158 | 159 | BERT 的缺点是:字粒度难以学到词、短语、实体的完整语义。 160 | 161 | ### ERNIE 162 | 163 | #### ERNIE对BERT进行了哪些优化? 164 | 165 | 对 BERT 的缺点进行了优化,Mask 从字粒度的 Token 修改为完整的词或实体。ERNIE2.0 引入更多的预训练任务以捕捉更丰富的语义知识。 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /AI算法/machine-learning/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/AI算法/machine-learning/.DS_Store -------------------------------------------------------------------------------- /AI算法/machine-learning/ABTest.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # AB测试面试题 4 | 5 | ## 1. 介绍一下ABTest的步骤 6 | 7 | ABtest就是为了测试和验证模型/项目的效果,在app/pc端设计出多个版本,在同一时间维度下,分别用组成相同/相似的群组去随机访问这些版本,记录下群组的用户体验数据和业务数据,最后评估出最好的版本给予采用。 8 | 9 | 步骤: 10 | 11 | ```python 12 | 1. 基于现状和期望,分析并提出假设 13 | 2. 设定目标制定方案 14 | 3. 设计与开发 15 | 4. 分配流量进行测试 16 | 5. 埋点采集数据 17 | 6. 实验后分析数据 18 | 7. 发布新版本/改进设计方案/调整流量继续测试 19 | ``` 20 | 21 | 22 | 23 | ## 2. ABtest背后的理论支撑是什么? 24 | 25 | **中心极限定理**:在样本量足够大的时候,可以认为样本的均值近似服从正态分布。 26 | 27 | **假设检验**:假设检验是研究如何根据抽样后获得的样本来检查抽样前所作假设是否合理,**A/B Test 从本质上来说是一个基于统计的假设检验过程**,它首先对实验组和对照组的关系提出了某种假设,然后计算这两组数据的差异和确定该差异是否存在统计上的显著性,最后根据上述结果对假设做出判断。 28 | 29 | 假设检验的核心是**证伪**,所以原假设是统计者想要拒绝的假设,无显著差异我们也可以理解为:实验组和对照组的统计差异是由抽样误差引起的(误差服从正态分布)。 30 | 31 | ## 3. 如何分组才能更好地避免混淆呢? 32 | 33 | 1. 利用用户的唯一标识的尾号或者其他标识进行分类,如按照尾号的奇数或者偶数将其分为两组。 34 | 2. 用一个hash函数将用户的唯一标识进行hash取模,分桶。可以将用户均匀地分到若干个桶中,如分到100个或者1000个桶中,这样的好处就是可以进一步将用户打散,提高分组的效果。 35 | 36 | 当然,如果有多个分组并行进行的情况的话,要考虑独占域和分享域问题。(不同域之间的用户相互独立,交集为空)对于共享域,我们要进行分层。但是在分层中,下一层要将上一层的用户打散,确保下一层用户的随机性。 37 | 38 | 39 | 40 | ## 4. 样本量大小如何? 41 | 42 | ​ 理论上,我们想要样本量越多的越好,因为这样可以避免第二类错误。随着样本量增加,power=1-β也在增大,一般到80%,这里我们可以算出一个最小样本量,但理论上样本量还是越大越好。 43 | 44 | 实际上,样本量越少越好,这是因为 45 | 46 | 1. 流量有限:小公司就这么点流量,还要精打细算做各种测试,开发各种产品。在保证样本分组不重叠的基础上,产品开发速度会大大降低。 47 | 48 | 2. 试错成本大:如果拿50%的用户做实验,一周以后发现总收入下降了20%,这样一周时间的实验给公司造成了10%的损失,这样损失未免有点大。 49 | 50 | ## 5. 两类错误是什么? 51 | 52 | 1. **弃真**:实验组和对照组没有显著差异,但我们接受了方案推了全量。减少这种错误的方法就是提高显著性水平,比如 p 值小于 0.05 才算显著,而不是小于 0.1,显著性水平是人为给定的犯一类错误的可以接受的上限($p$值为犯 I 类错误的概率$\alpha$ )。 53 | 54 | 2. **存伪**:实验组和对照组有显著差异,但我们没有接受方案。 55 | 56 | II 类错误和**统计功效 (power)** 有关,统计功效可以简单理解为真理能被发现的可能性。统计功效 为:$1-\beta$ ,而$\beta$为犯第二类错误的概率。影响统计功效的因素有很多,主要的有三个:统计量、样本量和 I 类错误的概率$\alpha$ 。 57 | 58 | ## 6. 埋点&暗中观察 59 | 60 | ​ 当我们确定了需要分析的具体指标之后,就需要我们进行埋点设计,把相关的用户行为收集起来,供后续的流程进行数据分析,从而得出实验结论。 61 | 62 | ​ 对于 ABTest我们需要知道当前用户是处于对照组还是实验组,所以埋点中这些参数必须要有。埋点完了就是收集实验数据了(暗中观察),主要看以下两个方面: 63 | 64 | 1. 观察样本量是否符合预期,比如实验组和对照组分流的流量是否均匀,正常情况下,分流的数据不会相差太大,如果相差太大,就要分析哪里出现了问题。 65 | 66 | 2. 观察用户的行为埋点是否埋的正确,很多次实验之后,我们发现埋点埋错了。 67 | 68 | 69 | 70 | ## 7. 如果一个人有多个账号,分别做不同用途,abtest的时候怎么分组才最合理呢? 71 | 72 | 我们对这类人的分类是,看的不是他是谁,而是他做了什么。按照我们对行业的分类,行为不同的话就是两类人,和身份证是不是同一个无关。我们要聚合的是有相同行为特征的账户,而不是人。 73 | 74 | ## 参考资料 75 | 76 | https://zhuanlan.zhihu.com/p/165406531 -------------------------------------------------------------------------------- /AI算法/machine-learning/Adaboost.md: -------------------------------------------------------------------------------- 1 | ![Adboost框架图](img/Adaboost/Adboost框架图.png) 2 | 3 | 4 | 5 | 6 | 7 | # Adaboost 算法介绍 8 | 9 | ## 1. 集成学习 10 | 11 | 集成学习(ensemble learning)通过构建并结合多个学习器(learner)来完成学习任务,通常可获得比单一学习器更良好的泛化性能(特别是在集成弱学习器(weak learner)时)。 12 | 13 | 目前集成学习主要分为2大类: 14 | 15 | 一类是以bagging、Random Forest等算法为代表的,**各个学习器之间相互独立、可同时生成**的并行化方法; 16 | 17 | 一类是以boosting、Adaboost等算法为代表的,**个体学习器是串行序列化生成的、具有依赖关系**,它试图不断增强单个学习器的学习能力。 18 | 19 | ## 2. Adaboost 算法详解 20 | 21 | ### 2.1 Adaboost 步骤概览 22 | 23 | 1. 初始化训练样本的权值分布,每个训练样本的权值应该相等(如果一共有$N$个样本,则每个样本的权值为$\frac{1}{N}$) 24 | 25 | 2. 依次构造训练集并训练弱分类器。如果一个样本被准确分类,那么它的权值在下一个训练集中就会降低;相反,如果它被分类错误,那么它在下个训练集中的权值就会提高。权值更新过后的训练集会用于训练下一个分类器。 26 | 27 | 3. 将训练好的弱分类器集成为一个强分类器,误差率小的弱分类器会在最终的强分类器里占据更大的权重,否则较小。 28 | 29 | ### 2.2 Adaboost 算法流程 30 | 31 | 给定一个样本数量为$m$的数据集 32 | $$ 33 | T= \left \{\left(x_{1}, y_{1}\right), \ldots,\left(x_{m}, y_{m}\right) \right \} 34 | $$ 35 | $y_i$ 属于标记集合$\{-1,+1\}$。 36 | 37 | 训练集的在第$k$个弱学习器的输出权重为 38 | $$ 39 | D(k)=\left(w_{k 1}, w_{k 2}, \ldots w_{k m}\right) ; \quad w_{1 i}=\frac{1}{m} ; i=1,2 \ldots m 40 | $$ 41 | - 初始化训练样本的权值分布,每个训练样本的权值相同: 42 | 43 | $$ 44 | D(1)=\left(w_{1 1}, w_{1 2}, \ldots w_{1 m}\right) ; \quad w_{1 i}=\frac{1}{m} ; i=1,2 \ldots m 45 | $$ 46 | - 进行多轮迭代,产生$T$个弱分类器。 47 | - 使用权值分布 $D(t) $的训练集进行训练,得到一个弱分类器 48 | 49 | $$ 50 | G_{t}(x) : \quad \chi \rightarrow\{-1,+1\} 51 | $$ 52 | - 计算 $G_t(x)$ 在训练数据集上的分类误差率(其实就是被 $G_t(x) $误分类样本的权值之和): 53 | 54 | $$ 55 | e_{t}=P\left(G_{t}\left(x_{i}\right) \neq y_{i}\right)=\sum_{i=1}^{m} w_{t i} I\left(G_{t}\left(x_{i}\right) \neq y_{i}\right) 56 | $$ 57 | - 计算弱分类器 Gt(x) 在最终分类器中的系数(即所占权重) 58 | $$ 59 | \alpha_{t}=\frac{1}{2} \ln \frac{1-e_{t}}{e_{t}} 60 | $$ 61 | - 更新训练数据集的权值分布,用于下一轮(t+1)迭代 62 | $$ 63 | D(t+1)=\left(w_{t+1,1} ,w_{t+1,2} ,\cdots w_{t+1, i} \cdots, w_{t+1, m}\right) 64 | $$ 65 | 66 | $$ 67 | w_{t+1,i}=\frac{w_{t,i}}{Z_{t}} \times \left\{\begin{array}{ll}{e^{-\alpha_{t}}} & {\text ({ if } G_{t}\left(x_{i}\right)=y_{i}}) \\ {e^{\alpha_{t}}} & {\text ({ if } G_{t}\left(x_{i}\right) \neq y_{i}})\end{array}\right.= \frac{w_{t,i}}{Z_{t}} \exp \left(-\alpha_{t} y_{i} G_{t}\left(x_{i}\right)\right) 68 | $$ 69 | 70 | 71 | 72 | ​ 其中 $Z_t$是规范化因子,使得$D(t+1)$成为一个概率分布(和为1): 73 | $$ 74 | Z_{t}=\sum_{j=1}^{m} w_{t,i} \exp \left(-\alpha_{t} y_{i} G_{t}\left(x_{i}\right)\right) 75 | $$ 76 | 77 | 78 | * 集成$T$个弱分类器为1个最终的强分类器: 79 | $$ 80 | G(x)=\operatorname{sign}\left(\sum_{t=1}^{T} \alpha_{t} G_{t}(x)\right) 81 | $$ 82 | 83 | 84 | ## 3. 算法面试题 85 | ### 3.1 Adaboost分类模型的学习器的权重系数$\alpha$怎么计算的? 86 | 87 | Adaboost是前向分步加法算法的特例,分类问题的时候认为损失函数指数函数。 88 | 89 | 1. 当基函数是分类器时,Adaboost的最终分类器是: 90 | $$ 91 | f(x)=\sum_{m-1}^{M}{\alpha_mG_m(x)}=f_{m-1}(x)+{\alpha_mG_m(x)} 92 | $$ 93 | 94 | 2. 目标是使前向分步算法得到的$\alpha$和$G_m(x)$使$f_m(x)$在训练数据集T上的指数损失函数最小,即 95 | $$ 96 | (\alpha, G_m(x))=arg min_{\alpha, G}\sum_{i=1}^{N}exp[-y_i(f_{m-1}(x_i)+\alpha G(x_i))] 97 | $$ 98 | 其中,$\hat{w}_{mi}=exp[-y_i f_{m-1}(x_i)].$为了求上式的最小化,首先计算$G_m^*(x)$,对于任意的$\alpha >0$,可以转化为下式: 99 | $$ 100 | G_{m}^*=argmin_{G}\sum_{i=1}^{N}\hat{w}_{mi}I(y_i \neq G(x_i)) 101 | $$ 102 | 之后求$\alpha_m^*$,将上述式子化简,得到 103 | 104 | $$ 105 | \sum_{i=1}^{N}\hat{w}_{mi}exp[-y_i \alpha G(x_i)] 106 | = \sum_{y_i =G_m(x_i)}\hat{w}_{mi}e^{-\alpha}+\sum_{y_i \neq G_m(x_i)}{\hat{w}_{mi}e^{\alpha}} = (e^{\alpha} - e^{- \alpha})\sum_{i=1}^{N}\hat{w}_{mi}I(y_i \neq G(x_i)) + e^{- \alpha}\sum_{i=1}^{N}\hat{w}_{mi} 107 | $$ 108 | 109 | 将已经求得的$G_m^*(x)$带入上式面,对$\alpha$求导并等于0,得到最优的$\alpha$. 110 | $$ 111 | a_m^*=\frac{1}{2} log{\frac{1-e_m}{e_m}} 112 | $$ 113 | 其中$e_m$是分类误差率: 114 | $$ 115 | e_m=\frac{\sum_{i=1}^{N}\hat{w}_{mi}I(y_i \neq G_m(x_i))}{\sum_{i=1}^{N}\hat{w}_{mi}}=\sum_{i=1}^{N}\hat{w}_{mi}I(y_i \neq G_m(x_i)) 116 | $$ 117 | 118 | 119 | ### 3.2 Adaboost能否做回归问题? 120 | 121 | Adaboost也能够应用到回归问题,相应的算法如下: 122 | 输入: $T={(x_i, y_1),(x_i, y_1),...,(x_N, y_N)}$, 弱学习器迭代次数$M$。 123 | 输出:强分类器$f(x)$. 124 | 125 | 1. 初始化权重, 126 | $$D(1)={w_{11},w_{12},...,w_{1N}}; w_{1i}=\frac{1}{N}; i=1,2,..,N$$ 127 | 128 | 2. 根据$m=1,2,...,M$; 129 | 130 | + 学习得到$G_m(x)$ 131 | 132 | + 计算训练集上最大误差 133 | $$ 134 | E_m=max|y_i-G_m(x_i)|, i=1,2,..,N 135 | $$ 136 | 137 | + 计算样本的相对平方误差: 138 | $$ 139 | e_{mi}=\frac{(y_i-G_m(x_i))^2}{E_m^2} 140 | $$ 141 | 142 | + 计算回归误差率: 143 | $$ 144 | e_m=\sum_{i=1}^{N}w_{mi}e_{mi} 145 | $$ 146 | 147 | + 计算学习器系数: 148 | $$ 149 | \alpha_m=\frac{e_m}{1-e_m} 150 | $$ 151 | 152 | + 更新样本权重: 153 | $$ 154 | w_{m+1,i}=\frac{w_{mi}}{Z_m}{\alpha_{m}^{1-e^{m,i}}} 155 | $$ 156 | 其中$Z_m$是规范化因子, 157 | $$ 158 | Z_m=\sum_{i=1}^{m}w_{mi}{\alpha_{m}^{1-e^{m,i}}} 159 | $$ 160 | 161 | 3. 得到强学习器: 162 | $$ 163 | f(x)=\sum_{m=1}{M}G_{m}^*(x) 164 | $$ 165 | 166 | **注:** **不管是分类问题还是回归问题,根据误差改变权重就是Adaboost的本质,可以基于这个构建相应的强学习器。** 167 | 168 | ### 3.3 boosting和bagging之间的区别,从偏差-方差的角度解释Adaboost? 169 | 170 | 集成学习提高学习精度,降低模型误差,模型的误差来自于方差和偏差,其中bagging方式是降低模型方差,一般选择多个相差较大的模型进行bagging。boosting是主要是通过降低模型的偏差来降低模型的误差。其中Adaboost每一轮通过误差来改变数据的分布,使偏差减小。 171 | 172 | ### 3.4 为什么Adaboost方式能够提高整体模型的学习精度? 173 | 174 | 根据前向分布加法模型,Adaboost算法每一次都会降低整体的误差,虽然单个模型误差会有波动,但是整体的误差却在降低,整体模型复杂度在提高。 175 | 176 | ### 3.5 Adaboost算法如何加入正则项? 177 | 178 | $$ 179 | f_m(x)=f_{m-1}(x)+\eta \alpha_{m}G_{m}(x) 180 | $$ 181 | 182 | 183 | 184 | ### 3.6 Adaboost使用m个基学习器和加权平均使用m个学习器之间有什么不同? 185 | 186 | Adaboost的m个基学习器是有顺序关系的,第k个基学习器根据前k-1个学习器得到的误差更新数据分布,再进行学习,每一次的数据分布都不同,是使用同一个学习器在不同的数据分布上进行学习。加权平均的m个学习器是可以并行处理的,在同一个数据分布上,学习得到m个不同的学习器进行加权。 187 | 188 | ### 3.7 Adaboost和GBDT之间的区别? 189 | 190 | 相同点: 191 | 192 | ​ Adaboost和GBDT都是通过减低偏差提高模型精度,都是前项分布加法模型的一种, 193 | 194 | 不同点: 195 | 196 | ​ Adaboost每一个根据前m-1个模型的误差更新当前数据集的权重,学习第m个学习器; 197 | 198 | ​ GBDT是根据前m-1个的学习剩下的label的偏差,修改当前数据的label进行学习第m个学习器,一般使用梯度的负方向替代偏差进行计算。 199 | 200 | 201 | 202 | ### 3.8 Adaboost的迭代次数(基学习器的个数)如何控制? 203 | 204 | 一般使用earlystopping进行控制迭代次数。 205 | 206 | ### 3.9 Adaboost算法中基学习器是否很重要,应该怎么选择基学习器? 207 | 208 | sklearn中的adaboost接口给出的是使用决策树作为基分类器,一般认为决策树表现良好,其实可以根据数据的分布选择对应的分类器,比如选择简单的逻辑回归,或者对于回归问题选择线性回归。 209 | 210 | ### 3.10 MultiBoosting算法将Adaboost作为Bagging的基学习器,Iterative Bagging将Bagging作为Adaboost的基学习器。比较两者的优缺点? 211 | 212 | 两个模型都是降低方差和偏差。主要的不同的是顺序不同。MultiBosoting先减低模型的偏差再减低模型的方差,这样的方式 213 | MultiBoosting由于集合了Bagging,Wagging,AdaBoost,可以有效的降低误差和方差,特别是误差。但是训练成本和预测成本都会显著增加。 214 | Iterative Bagging相比Bagging会降低误差,但是方差上升。由于Bagging本身就是一种降低方差的算法,所以Iterative Bagging相当于Bagging与单分类器的折中。 215 | 216 | ### 3.11 训练过程中,每轮训练一直存在分类错误的问题,整个Adaboost却能快速收敛,为何? 217 | 218 | 每轮训练结束后,AdaBoost 会对样本的权重进行调整,调整的结果是越到后面被错误分类的样本权重会越高。而后面的分类器为了达到较低的带权分类误差,会把样本权重高的样本分类正确。这样造成的结果是,虽然每个弱分类器可能都有分错的样本,然而整个 AdaBoost 却能保证对每个样本进行正确分类,从而实现快速收敛。 219 | 220 | ### 3.12 Adaboost 的优缺点? 221 | 222 | ​ 优点:能够基于泛化性能相当弱的的学习器构建出很强的集成,不容易发生过拟合。 223 | 224 | ​ 缺点:对异常样本比较敏感,异常样本在迭代过程中会获得较高的权值,影响最终学习器的性能表现。 225 | 226 | ## 参考资料: 227 | 228 | 1. 台湾清华大学李端兴教授2017年秋机器学习概论课程(CS 4602)PPT 229 | 2. 周志华 《机器学习》第8章 集成学习 230 | 3. [July的博客](https://blog.csdn.net/v_JULY_v/article/details/40718799) 231 | 4. http://fornlp.com/%E5%91%A8%E5%BF%97%E5%8D%8E-%E3%80%8A%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E3%80%8B-%E7%AD%94%E6%A1%88%E6%95%B4%E7%90%86/ -------------------------------------------------------------------------------- /AI算法/machine-learning/Apriori.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 协同过滤面试题 4 | 5 | ## 1. 协同过滤推荐有哪些类型 6 | 7 | * 基于用户(user-based)的协同过滤 8 | 9 | 基于用户(user-based)的协同过滤主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。 10 | 11 | * 基于项目(item-based)的协同过滤 12 | 13 | 基于项目(item-based)的协同过滤和基于用户的协同过滤类似,只不过这时我们转向找到物品和物品之间的相似度,只有找到了目标用户对某些物品的评分,那么我们就可以对相似度高的类似物品进行预测,将评分最高的若干个相似物品推荐给用户 14 | 15 | * 基于模型(model based)的协同过滤 16 | 17 | 用机器学习的思想来建模解决,主流的方法可以分为:用关联算法,聚类算法,分类算法,回归算法,矩阵分解,神经网络,图模型以及隐语义模型来解决。 18 | 19 | ## 2. 基于模型的协同过滤 20 | 21 | * 用关联算法做协同过滤 22 | 23 | 做频繁集挖掘,找到满足支持度阈值的关联物品的频繁N项集或者序列。将频繁项集或序列里的其他物品按一定的评分准则推荐给用户,这个评分准则可以包括**支持度**,**置信度**和**提升度**等。 常用的关联推荐算法有**Apriori**,**FP Tree**和**PrefixSpan** 24 | 25 | * 用聚类算法做协同过滤 26 | 27 | - 基于用户聚类,则可以将用户按照一定距离度量方式分成不同的目标人群,将**同样目标人群评分高的物品推荐给目标用户**。 28 | 29 | - 基于物品聚类,则是**将用户评分高物品的相似同类物品推荐给用户**。常用的聚类推荐算法有**K-Means**, **BIRCH**, **DBSCAN**和**谱聚类** 30 | 31 | * 用分类算法做协同过滤 32 | 33 | 设置一份评分阈值,评分高于阈值的就是推荐,评分低于阈值就是不推荐,我们**将问题变成了一个二分类问题**。虽然分类问题的算法多如牛毛,但是目前使用最广泛的是逻辑回归。因为**逻辑回归的解释性比较强**,每个物品是否推荐我们都有一个明确的概率放在这,同时可以对数据的特征做工程化,得到调优的目的。常见的分类推荐算法有逻辑回归和朴素贝叶斯,两者的特点是解释性很强。 34 | 35 | * 用回归算法做协同过滤 36 | 37 | 评分可以是一个连续的值而不是离散的值,**通过回归模型**我们可以得到目标用户对某商品的**预测打分**。常用的回归推荐算法有Ridge回归,回归树和支持向量回归。 38 | 39 | * 用矩阵分解做协同过滤 40 | 41 | 用矩阵分解做协同过滤是目前使用也很广泛的一种方法。由于传统的奇异值分解SVD要求矩阵不能有缺失数据,必须是稠密的,而我们的用户物品评分矩阵是一个很典型的稀疏矩阵,直接使用传统的SVD到协同过滤是比较复杂的。 42 | 43 | * 用神经网络做协同过滤 44 | 45 | 用神经网络乃至深度学习做协同过滤应该是以后的一个趋势。目前比较主流的用两层神经网络来做推荐算法的是限制玻尔兹曼机(RBM) 46 | 47 | * 用隐语义模型做协同过滤 48 | 49 | 隐语义模型主要是基于NLP的,涉及到**对用户行为的语义分析来做评分推荐**,主要方法有隐性语义分析LSA和隐含狄利克雷分布LDA, 50 | 51 | * 用图模型做协同过滤 52 | 53 | 用图模型做协同过滤,则将用户之间的相似度放到了一个图模型里面去考虑,常用的算法是SimRank系列算法和马尔科夫模型算法。 54 | 55 | ## 3. 频繁项集的评估标准 56 | 57 | * 支持度: 58 | 59 | * 支持度就是几个关联的数据在数据集中出现的次数占总数据集的比重。或者说几个数据关联出现的概率。 60 | $$ 61 | \text {Support} (X, Y)=P(X Y)=\frac{\text { number }(X Y)}{\text { num (AllSamples) }} 62 | $$ 63 | 64 | 65 | * 置信度: 66 | 67 | * 一个数据出现后,另一个数据出现的概率,或者说数据的条件概率。 68 | $$ 69 | \text {Confidence }(X \Leftarrow Y)=P(X | Y)=\frac{P(X Y)}{ P(Y)} 70 | $$ 71 | 72 | * 提升度 : 73 | 74 | * 提升度表示含有Y的条件下,同时含有X的概率,与X总体发生的概率之比 75 | $$ 76 | \text {Lift }(X \Leftarrow Y)=\frac{P(X | Y)}{ P(X)} = \frac{\text { Confidence }(X \Leftarrow Y) }{ P(X)} 77 | $$ 78 | 79 | * 注意: 80 | * 支持度高的数据不一定构成频繁项集,但是支持度太低的数据肯定不构成频繁项集。 81 | * 提升度体先了$X$和$Y$之间的关联关系, 提升度大于1则$X\Leftarrow Y$是有效的强关联规则, 提升度小于等于1则$X\Leftarrow Y$是无效的强关联规则 。一个特殊的情况,如果$X$和$Y$独立,则$\operatorname{Lift}(X \Leftarrow Y)=1$,因此$P(X | Y)=P(X)$ 82 | 83 | ## 4. 使用Aprior算法找出频繁k项集 84 | 85 | 输入:数据集合$D$,支持度阈值$\alpha$ 86 | 87 | 输出:最大的频繁$k$项集 88 | 89 | * 扫描整个数据集,得到所有出现过的数据,作为候选频繁1项集。$k=1$,频繁0项集为空集。 90 | 91 | * 挖掘频繁$k$项集 92 | * 扫描数据计算候选频繁$k$项集的支持度 93 | * 去除候选频繁$k$项集中支持度低于阈值的数据集,得到频繁$k$项集。如果得到的频繁$k$项集为空,则直接返回频繁$k-1$项集的集合作为算法结果,算法结束。如果得到的频繁$k$项集只有一项,则直接返回频繁$k$项集的集合作为算法结果,算法结束。 94 | * 基于频繁$k$项集,连接生成候选频繁$k+1$项集。 95 | 96 | * 令$k=k+1$,转入步骤挖掘频繁$k$项集。 97 | 98 | 从算法的步骤可以看出,Aprior算法每轮迭代都要扫描数据集,因此在数据集很大,数据种类很多的时候,算法效率很低。 99 | 100 | 具体实现: 101 | 102 | 103 | 104 | ## 5. 使用Aprior算法找出强关联规则 105 | 106 | - 强关联规则: 107 | 108 | - 如果规则$R$:$\Rightarrow $满足 : 109 | 110 | $$ 111 | \tag{1} { support }(X \Rightarrow Y) \geq \min {sup} 112 | $$ 113 | 114 | $$ 115 | \tag{2} confidence (X \Rightarrow Y) \geq \min conf 116 | $$ 117 | 118 | 称关联规则$X\Rightarrow Y$为强关联规则,否则称关联规则$X\Rightarrow Y$为弱关联规则。在挖掘关联规则时,产生的关联规则要经过$\min sup$和$\min conf$的衡量筛选出来的强关联规则才能用商家的决策 119 | 120 | -------------------------------------------------------------------------------- /AI算法/machine-learning/CRF.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 条件随机场面试题 4 | 5 | Author: 李文乐; Email: cocoleYY@outlook.com 6 | 7 | 8 | ## 1. 简单介绍条件随机场 ## 9 | 10 | ------------------------------------------------------------ 11 | 条件随机场(conditional random field,简称 CRF)是给定一组输入随机变量条 件下另一组输出随机变量的条件概率分布模型,其特点是**假设输出随机变量构成马尔可夫随机场**,是一种鉴别式机率模型,是随机场的一种,常用于标注或分析序列资料,如自然语言文字或是生物序列。 12 | 如同马尔可夫随机场,条件随机场为无向图模型,图中的顶点代表随机变量,顶点间的连线代表随机变量间的相依关系,在条件随机场当中,随机变量 Y 的分布为条件机率,给定的观察值则为随机变量 X。 13 | 原则上,条件随机场的图模型布局是可以任意给定的,一般**常用的布局是链接式**的架构,链接式架构不论在训练(training)、推论(inference)、或是解码(decoding)上,都存在有效率的算法可供演算。 14 | 条件随机场跟隐马尔可夫模型常被一起提及,条件随机场对于输入和输出的机率分布,没有如隐马尔可夫模型那般强烈的假设存在 [补充:因为HMM模型假设后面状态和前面无关]。 15 | 16 | ##2. 条件随机场预测的维特比算法求解过程: 17 | 18 | 输入:模型特征向量F(y,x)和权值向量w,观测序列$x=(x_1,x_2,…,x_n)$; 19 | 输出:最优路径$y^*=(y_1^*,y_2^*,…,y_n^*) $ 20 | 21 | 初始化: 22 | $$ 23 | \delta_{1}(j)=w \cdot F_{1}\left(y_{0}=\operatorname{start}, y_{1}=j, x\right), \quad j=1,2, \cdots, m 24 | $$ 25 | 递推: 26 | $$ 27 | \delta_{i}(l)=\max _{1C4.5算法—> CART算法 32 | 33 | * $ID3$ 34 | * $ID3$算法没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。 35 | * $ID3$算法采用信息增益大的特征优先建立决策树的节点,偏向于取值比较多的特征 36 | * $ID3$算法对于缺失值的情况没有做考虑 37 | * $ID3$算法没有考虑过拟合的问题 38 | 39 | * $C4.5$在$ID3$算法上面的改进 40 | * 连续的特征离散化 41 | * 使用信息增益比 42 | * 通过剪枝算法解决过拟合 43 | 44 | * $C4.5$的不足: 45 | * $C4.5$生成的是多叉树 46 | * $C4.5$只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。 47 | * $C4.5$由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算 48 | 49 | * $CART$算法 50 | * 可以做回归,也可以做分类, 51 | * 使用基尼系数来代替信息增益比 52 | * $CART$分类树离散值的处理问题,采用的思路是不停的二分离散特征。 53 | 54 | ## 5. 决策树的缺失值是怎么处理的 55 | 56 | 主要需要解决的是两个问题,一是在样本某些特征缺失的情况下选择划分的属性,二是选定了划分属性,对于在该属性上缺失特征的样本的处理。 57 | 58 | * 如何在特征值缺失的情况下进行划分特征的选择? 59 | 60 | * 每个样本设置一个权重(初始可以都为1) 61 | 62 | * 划分数据,一部分是有特征值$a$的数据,另一部分是没有特征值$a$的数据,记为$\tilde{D}$, 63 | 64 | * **对**没有缺失特征值$a$的**数据集$\tilde{D}$,**来和对应的特征$A$的各个特征值一起**计算加权重后的信息增益比**,最后乘上一个系数$\rho$ 。 65 | 66 | $$ 67 | \rho=\frac{\sum_{x \in \tilde{D}} w_{x}}{\sum_{x \in {D}} w_{x}} 68 | $$ 69 | 70 | $$ 71 | \tilde{p}_{k}=\frac{\sum_{x \in \tilde{D}_{k}} w_{x}}{\sum_{x \in \tilde{D}} w_{x}} \quad(1 \leq \mathrm{k} \leq|y|) 72 | $$ 73 | 74 | $$ 75 | \tilde{r}_{v}=\frac{\sum_{x \in \tilde D^{v}} w_{x}}{\sum_{x \in \tilde{D}} w_{x}} \quad(1 \leq v \leq V) 76 | $$ 77 | 78 | ​ 假设特征$A$有$v$个取值$\{a_1,a_2 \dots a_v\}$ 79 | 80 | ​ $\tilde D$:该特征上没有缺失值的样本 81 | 82 | ​ $\tilde D_k$:$\tilde D$中属于第$k$类的样本子集 83 | 84 | ​ $\tilde D^v$:$\tilde D$中在特征$a$上取值为$a_v$的样本子集 85 | 86 | ​ $\rho$:无特征$A$缺失的样本加权后所占加权总样本的比例。 87 | 88 | ​ $\tilde{p}_{k}$:无缺失值样本第$k$类所占无缺失值样本的比例 89 | 90 | ​ $\tilde{r}_{v}$:无缺失值样本在特征$a$上取值$a^v$的样本所占无缺失值样本的比例 91 | 92 | ​ 新的信息增益公式: 93 | $$ 94 | \begin{aligned} 95 | &\operatorname{Gain}(D, a)=\rho \times \operatorname{Gain}(\tilde{D}, a)=\rho \times\left(\operatorname{Ent}(\tilde{D})-\sum_{v=1}^{V} \tilde{r}_{v} \operatorname{Ent}\left(\tilde{D}^{v}\right)\right)\\ 96 | &\operatorname{Ent}(\tilde{D})=-\sum_{k=1}^{|y|} \tilde{p}_{k} \log _{2} \tilde{p}_{k} 97 | \end{aligned} 98 | $$ 99 | 100 | * 给定划分特征,若样本在该特征上的值是缺失的,那么该如何对这个样本进行划分? 101 | 102 | ``` 103 | (即到底把这个样本划分到哪个结点里?) 104 | ``` 105 | 106 | * 让包含缺失值的样本以不同的概率划分到不同的子节点中去。 107 | 108 | ``` 109 | 比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9。 110 | ``` 111 | 112 | 113 | 114 | ## 6. 决策树的目标函数是什么? 115 | 116 | $$ 117 | C_{\alpha}(T)=\sum_{t=1}^{|T|} N_{t} H_{t}(T)+a|T| 118 | $$ 119 | 120 | $$ 121 | H_{t}(T)=-\sum_{k} \frac{N_{t k}}{N_{t}} \log \frac{N_{t k}}{N_{t}} 122 | $$ 123 | 124 | 其中$|T|$代表叶节点个数 125 | 126 | $N_t$表示具体某个叶节点的样本数 127 | 128 | $H_t(T)$ 表示叶节点$t$上的经验熵 129 | 130 | $\alpha|T|$为正则项,$\alpha \geqslant 0 $ 为参数 131 | 132 | ## 7. 决策树怎么处理连续性特征? 133 | 134 | 因为连续特征的可取值数目不再有限,因此不能像前面处理离散特征枚举离散特征取值来对结点进行划分。因此需要连续特征离散化,常用的离散化策略是二分法,这个技术也是$C4.5$中采用的策略。下面来具体介绍下,如何采用二分法对连续特征离散化: 135 | 136 | * 训练集D,连续特征$A$,其中A有n个取值 137 | 138 | * 对$A$的取值进行从小到大排序得到:$\{a_1,a_2\dots a_n\}$ 139 | 140 | * 寻找划分点$t$,$t$将D分为子集$D_{t}^{-}$与$D_{t}^{+}$ 141 | * $D_{t}^{-}$:特征$A$上取值不大于$t$的样本 142 | * $D_{t}^{+}$:特征$A$上取值大于$t$的样本 143 | 144 | * 对相邻的特征取值$a_i$与$a_{i+1}$,t再区间$[a_i,a_{i+1})$中取值所产生的划分结果相同,因此对于连续特征$A$,包含有$n-1$个元素的后选划分点集合 145 | 146 | $$ 147 | T_a = \{\frac{a_i + a_{i+1}}{2}|1\leq{i}\leq{n-1} \} 148 | $$ 149 | 150 | * 把区间$[a_i,a_{i+1})$的中位点$\frac{a_i + a_{i+1}}{2}$作为候选划分点 151 | 152 | * 按照处理离散值那样来选择最优的划分点,使用公式: 153 | $$ 154 | Gain(D,a) =\underbrace{max}_{t\in T_a}Gain(D,a,t) = \underbrace{max}_{t\in T_a}\ (Ent(D) - \sum_{\lambda \in \{-,+ \}}\frac{|D_t^{\lambda}|}{|D|}Ent(D_t^{\lambda})) 155 | $$ 156 | 其中$Gain(D,a,t)$是样本集$D$基于划分点$t$二分之后的信息增益。划分点时候选择使用$Gain(D,a,t)$最大的划分点。 157 | 158 | ## 8. 决策树对离散值的处理 159 | 160 | 思想和$C4.5$相同,都是将连续的特征离散化。唯一区别在选择划分点时,C4.5是信息增益比,CART是基尼系数。 161 | 162 | CART采用的是不停的二分。会考虑把特征$A$分成${A1}$和${A2,A3}$、${A2}$和${A1,A3}$、${A3}$和${A1,A2}$三种情况,找到基尼系数最小的组合,比如${A2}$和${A1,A3}$,然后建立二叉树节点,一个节点是$A2$对应的样本,另一个节点是${A1,A3}$对应的样本。由于这次没有把特征$A$的取值完全分开,后面还有机会对子节点继续选择特征$A$划分$A1$和$A3$。这和$ID3、C4.5$不同,在$ID3$或$C4.5$的一颗子树中,离散特征只会参与一次节点的建立。 163 | 164 | ## 9. 决策树怎么防止过拟合? 165 | * 对于决策树进行约束:根据情况来选择或组合 166 | 167 | * 设置每个叶子节点的最小样本数,可以避免某个特征类别只适用于极少数的样本。 168 | * 设置每个节点的最小样本数,从根节点开始避免过度拟合。 169 | 170 | * 设置树的最大深度,避免无限往下划分。 171 | 172 | * 设置叶子节点的最大数量,避免出现无限多次划分类别。 173 | 174 | * 设置评估分割数据是的最大特征数量,避免每次都考虑所有特征为求“最佳”,而采取随机选择的方式避免过度拟合。 175 | 176 | * 预剪枝(提前停止):控制**深度、当前的节点数、分裂对测试集的准确度提升大小** 177 | * 限制树的高度,可以利用交叉验证选择 178 | * 利用分类指标,如果下一次切分没有降低误差,则停止切分 179 | * 限制树的节点个数,比如某个节点小于100个样本,停止对该节点切分 180 | 181 | * 后剪枝(自底而上):**生成决策树、交叉验证剪枝:子树删除,节点代替子树、测试集准确率判断决定剪枝** 182 | * 在决策树构建完成之后,根据加上正则项的结构风险最小化自下向上进行的剪枝操作. 剪枝的目的就是防止过拟合,是模型在测试数据上变现良好,更加鲁棒。 183 | 184 | 185 | 186 | ## 10. 如果特征很多,决策树中最后没有用到的特征一定是无用吗? 187 | 188 | 不是无用的,从两个角度考虑: 189 | 190 | * **特征替代性**,如果可以已经使用的特征$A$和特征$B$可以提点特征$C$,特征$C$可能就没有被使用,但是如果把特征$C$单独拿出来进行训练,依然有效 191 | 192 | * 决策树的每一条路径就是**计算条件概率的条件**,前面的条件如果包含了后面的条件,只是这个条件在这棵树中是无用的,如果把这个条件拿出来也是可以帮助分析数据. 193 | 194 | ## 11.决策树的优缺点? 195 | 196 | * 优点: 197 | * 简单直观,生成的决策树很直观。 198 | * 基本不需要预处理,不需要提前归一化,处理缺失值。 199 | * 既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。 200 | * 可以处理多维度输出的分类问题。 201 | * 相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释 202 | * 可以交叉验证的剪枝来选择模型,从而提高泛化能力。 203 | * 对于异常点的容错能力好,健壮性高。 204 | * 用白盒模型,可清洗观察每个步骤,对大数据量的处理性能较好,更贴近人类思维。 205 | 206 | * 缺点: 207 | * 决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。 208 | * 决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。 209 | * 寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。 210 | * 有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。 211 | * 如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。 212 | 213 | ## 12. 树形结构为什么不需要归一化? 214 | 215 | * 计算信息增益前,按照特征值进行排序,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。 216 | 217 | * **数值缩放不影响分裂点位置,对树模型的结构不造成影响**。 218 | 219 | 220 | 221 | ## 13. 如果特征很多,决策树中最后没有用到的特征一定是无用吗? 222 | 223 | 不是无用的,从两个角度考虑: 224 | 225 | * 特征替代性,如果可以已经使用的特征$A$和特征$B$可以提点特征$C$,特征$C$可能就没有被使用,但是如果把特征$C$单独拿出来进行训练,依然有效. 226 | 227 | * 决策树的每一条路径就是计算条件概率的条件,前面的条件如果包含了后面的条件,只是这个条件在这棵树中是无用的,如果把这个条件拿出来也是可以帮助分析数据。 228 | 229 | 230 | 231 | ## 参考资料 232 | 233 | [c4.5为什么使用信息增益比来选择特征?](https://www.zhihu.com/question/22928442/answer/440836807) 234 | -------------------------------------------------------------------------------- /AI算法/machine-learning/EnsembleLearning.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 集成学习面试题 4 | 5 | ## 1. 什么是集成学习算法? 6 | 7 | **集成学习算法是一种优化手段或者策略**,将多个较弱的模型集成模型组,一般的弱分类器可以是决策树,SVM,KNN等构成。其中的模型可以单独进行训练,并且它们的预测能以某种方式结合起来去做出一个总体预测。 8 | 9 | ## 2. 集成学习主要有哪几种框架? 10 | 11 | 集成学习从集成思想的架构分为Bagging,Boosting,Stacking三种。 12 | 13 | ## 3. 简单介绍一下bagging,常用bagging算法有哪些? 14 | 15 | * Bagging 16 | * **多次采样,训练多个分类器,集体投票,旨在减小方差**, 17 | * 基于数据**随机重抽样**的分类器构建方法。从训练集中进行子抽样组成每个基模型所需要的子训练集,对所有基模型预测的结果进行综合产生最终的预测结果。 18 | 19 | * 算法流程: 20 | * 输入为样本集$D={(x_1,y_1),(x_2,y_2) \dots (x_m,y_m)}$,弱学习器算法,弱分类器迭代次数$T$。 21 | * 输出为最终的强分类器$f(x)$ 22 | 23 | * 对于$t=1,2 \dots T$ 24 | * 对训练集进行第t次随机采样,共采集$T$次,得到包含$T$个样本的采样集$D_t$ 25 | * 用采样集$D_t$训练第$t$个弱学习器$G_t(x)$ 26 | 27 | * 如果是分类算法预测,则$T$个弱学习器投出最多票数的类别或者类别之一为最终类别。如果是回归算法,$T$个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出。 28 | * 常用bagging算法:随机森林算法 29 | 30 | ## 4. 简单介绍一下boosting,常用boosting算法有哪些? 31 | 32 | * Boosting 33 | * **基分类器层层叠加,聚焦分错的样本,旨在减小方差** 34 | * 训练过程为阶梯状,基模型按次序进行训练(实现上可以做到并行),基模型的训练集按照某种策略每次都进行一定的转化,每次都是提高前一次分错了的数据集的权值,最后对所有基模型预测的结果进行线性组合产生最终的预测结果。 35 | 36 | * 算法流程: 37 | 38 | * 给定初始训练数据,由此训练出第一个基学习器; 39 | 40 | * 根据基学习器的表现对样本进行调整,在之前学习器做错的样本上投入更多关注; 41 | * 用调整后的样本,训练下一个基学习器; 42 | * 重复上述过程T次,将T个学习器加权结合。 43 | 44 | * 常用boosting算法: 45 | * Adaboost 46 | * GBDT 47 | * XGBoost 48 | 49 | ## 5. boosting思想的数学表达式是什么? 50 | 51 | $$ 52 | f(x)=w_{0}+\sum_{m=1}^{M} w_{m} \phi_{m}(x) 53 | $$ 54 | 55 | 其中$w$是权重,$\phi$是弱分类器的集合,可以看出最终就是基函数的线性组合。 56 | 57 | ## 6. 简单介绍一下stacking 58 | 59 | * Stacking 60 | * **多次采样,训练多个分类器,将输出作为最后的输入特征** 61 | * 将训练好的所有基模型对训练集进行预测,第个$i$基模型对第$i$个训练样本的预测值将作为新的训练集中第$i$个样本的第$i$个特征值,最后基于新的训练集进行训练。同理,预测的过程也要先经过所有基模型的预测形成新的测试集,最后再对测试集进行预测。 62 | 63 | * stacking常见的使用方式: 64 | * 由k-NN、随机森林和朴素贝叶斯基础分类器组成,它的预测结果由作为元分类器的逻回归组合。 65 | 66 | ## 7. 你意识到你的模型受到低偏差和高方差问题的困扰,应该使用哪种算法来解决问题呢?为什么? 67 | 68 | 低偏差意味着模型的预测值接近实际值。换句话说,该模型有足够的灵活性,以模仿训练数据的分布。貌似很好,但是别忘了,一个灵活的模型没有泛化能力。这意味着,当这个模型用在对一个未曾见过的数据集进行测试的时候,它会令人很失望。 69 | 在这种情况下,我们可以使用bagging算法(如随机森林),以解决高方差问题。bagging算法把数据集分成重复随机取样形成的子集。然后,这些样本利用单个学习算法生成一组模型。接着,利用投票(分类)或平均(回归)把模型预测结合在一起。另外,为了应对大方差,我们可以: 70 | 71 | * 使用正则化技术,惩罚更高的模型系数,从而降低了模型的复杂性。 72 | * 使用可变重要性图表中的前n个特征。 73 | * 可以用于当一个算法在数据集中的所有变量里很难寻找到有意义信号的时候。 74 | 75 | ## 8. 常用的基分类器是什么? 76 | 77 | 最常用的基分类器是决策树,原因: 78 | 79 | * 决策树可以较为方便地将样本的权重整合到训练过程中,而不需要使用过采样的方法来调整样本权重。 80 | * 决策树的表达能力和泛化能力,可以通过调节树的层数来做折中。 81 | * 数据样本的扰动对于决策树的影响较大,因此不同子样本集合生成的决策树基分类器随机性较大,这样的“不稳定学习器”更适合作为基分类器。此外,在决策树节点分裂的时候,随机地选择一个特征子集,从中找出最优分裂属性,**很好地引入了随机性。** 82 | 83 | ## 9. 可否将随机森林中的基分类器,由决策树替换为线性分类器或K-近邻?请解释为什么? 84 | 不能: 85 | 86 | * Bagging的主要好处是集成后的分类器的方差,比基分类器的方差小。 87 | * 随机森林属于Bagging类的集成学习,对样本分布较为敏感的分类器更适用于Bagging。 88 | 89 | * 线性分类器或者K-近邻都是较为稳定的分类器,本身方差就不大。 90 | * 线性分类器或者K-近邻可能会由于Bagging的采样,导致在训练中更难收敛,增大偏差。 91 | 92 | ## 10. GBDT和RF如何计算特征重要性 93 | 94 | * RF有两种方法: 95 | - 通过计算Gini系数的减少量VIm=GI−(GIL+GIR)判断特征重要性,越大越重要。 96 | - 对于一颗树,先使用**袋外错误率**(OOB)样本计算测试误差a,再随机打乱OOB样本中第i个特征(上下打乱特征矩阵第i列的顺序)后计算测试误差b,a与b差距越大特征i越重要。 97 | 98 | - GBDT计算方法: 99 | - 所有回归树中通过特征i分裂后平方损失的减少值的和/回归树数量 得到特征重要性。 在sklearn中,GBDT和RF的特征重要性计算方法是相同的,都是基于单棵树计算每个特征的重要性,探究每个特征在每棵树上做了多少的贡献,再取个平均值。 100 | 101 | - Xgb主要有三种计算方法: 102 | - importance_type=weight(默认值),特征重要性使用特征在所有树中作为划分属性的次数。 103 | - mportance_type=gain,特征重要性使用特征在作为划分属性时loss平均的降低量。 104 | - importance_type=cover,特征重要性使用特征在作为划分属性时对样本的覆盖度。 -------------------------------------------------------------------------------- /AI算法/machine-learning/FrequentPattern.md: -------------------------------------------------------------------------------- 1 | # 频繁模式(frequent pattern) 2 | 频繁模式一般是指频繁地出现在数据集中的模式。这种频繁模式和关联规则是数据挖掘中想要挖掘的知识。我们都知道一个很有趣的故事,就是啤酒和尿布的故事, 3 | 4 | 在某些特定的情况下,“啤酒”与“尿布”两件看上去毫无关系的商品,会经常出现在同一个购物篮中,且大多出现在年轻的父亲身上。 5 | 6 | 分析背后原因是,在美国有婴儿的家庭中,一般是母亲在家中照看婴儿,年轻的父亲去超市买尿布。父亲在购买尿布的同时,往往会顺便为自己购买啤酒。 7 | 8 | 由此,沃尔玛就在卖场尝试将啤酒与尿布摆放在相同区域,让年轻的父亲可以同时找到这两件商品,并很快地完成购物,从而极大提升商品销售收入。 9 | 10 | 数据挖掘就是想要挖掘出这种有趣的模式,可以称做频繁模式和关联规则的挖掘,一般情况下使用支持度(support)和置信度(confidence)来表示关联的程度,领域的专家设置最小支持度和最小置信度阈值,如果某个模式大于最小支持度和最小置信度,就认为是频繁模式。 11 | 12 | 为了挖掘这种模式,一般常用的有两种算法: 13 | 1. Apriori 14 | 2. Fp-tree 15 | 16 | 在介绍这两个算法之前需要给出一些定义: 17 | 1. A=>B的支持度: 18 | $$support(A=>B)=p(A\cup B) \tag{1}$$ 19 | 2. A=>B的置信度: 20 | $$confidence(A=>B)=P(B|A)$$ 21 | $$=\frac{support(A \cup B)}{supoort(A)}=\frac{support_count(A \cup B)}{supoort_count(A)} \tag{2}$$ 22 | 3. 一般关联规则的挖掘有两步过程: 23 | + 找出所有的频繁项集: 每一个频繁出现的次数大于等于最小支持度技术min_sup. 24 | + 由频繁相机产生强关联规则: 这些规则必须满足最小支持度和最小置信度. 25 | ## Apriori 26 | Apriori通过限制候选产生发现频繁项集,它是为布尔关联规则挖掘频繁项集的原创性算法. 根据先验知识(频繁项集的所有非空子集也一定是频繁的).Apriri算法使用一种称为逐层搜索的迭代过程,其中k项集用于探索(k+1)项集. 27 | Apriori主要有两步完成: 连接步和剪枝步。 28 | 这个算法给出一个例子更容易理解: 29 | 30 | 解答(详细过程请参考《数据挖掘概念与技术第三版》 p250) 31 | 32 | 33 | ## FPTree 34 | FPTree是基于频繁模式的增长,不产生候选挖掘频繁项集的挖掘方法, 35 | 使用频繁模式增长方法,我们重新考察例图6.2事务数据库 D 的挖掘。 36 | 数据库的第一次扫描与 Apriori 相同,它导出频繁项(1-项集)的集合,并得到它们的支持度计数(频繁性)。设最小支持度计数为 2。频繁项的集合按支持度计数的递减序排序。结果集或表记作 L 。这样,我们有: 37 | L = [I2:7, I1:6, I3:6, I4:2, I5:2]。 38 | FP-树构造如下: 39 | 1. 首先,创建树的根结点,用“null”标记。 40 | 2. 二次扫描数据库 D。每个事务中的项按 L 中的次序处理(即,根据递减支持度计数排序)并对每个事务创建一个分枝. 41 | 3. 例如, 42 | 第一个事务“T100: I1, I2, I5”按 L 的次序包含三个项{ I2, I1, I5},导致构造树的第一个分 43 | 枝<(I2:1), (I1:1), (I5:1)>。该分枝具有三个结点,其中,I2 作为根的子女链接,I1 链接到 I2, 44 | I5 链接到 I1。第二个事务 T200 按 L 的次序包含项 I2 和 I4,它导致一个分枝,其中,I2 链接到根, 45 | I4 链接到 I2。然而,该分枝应当与 T100 已存在的路径共享前缀。这样,我们将结点 I2 的计 46 | 数增加 1,并创建一个新结点(I4:1),它作为(I2:2)的子女链接。一般地,当为一个事务考虑增加 47 | 分枝时,沿共同前缀上的每个结点的计数增加 1,为随在前缀之后的项创建结点并链接。 48 | 4. 为方便树遍历,创建一个项头表,使得每个项通过一个结点链指向它在树中的出现。扫描所有 49 | 的事务之后得到的树展示在图 6.8 中,附上相关的结点链。这样,数据库频繁模式的挖掘问题就转换成挖掘 FP-树问题. 50 | 51 | 5. 根据fp tree得到频繁项集,根据支持度计数依次考虑每一个满足的元素,首先考虑计数最小的ID I5. 从根节点遍历所有到I5的路径,记录这个路径作为条件模式基,之后根据最小支持度得到条件Fp-tree,最后产生频繁项集. 具体的操作表格如下: 52 | 53 | 54 | **注:** 详细见数据挖掘概念与技术第6章 55 | 56 | # 核心公式 57 | 1. 如何评估哪些模式是有趣的? 58 | > 相关规则是A=>B[support, confidence]进一步扩充到相关分析A=>B[support, confidence, correlation], 59 | > 常用的相关性度量: 60 | > + 提升度(lift),计算公式如下: 61 | > $$lift(A,b)=\frac{p(A \cup B)}{p(A)p(B)}=\frac{P(B|A)}{p(B)}=\frac{conf(A=>B)}{sup(B)} \tag{3}$$ 62 | > + 使用$\chi^2$进行相关分析 63 | 64 | 2. 常用的模式评估度量 65 | > + 全置信度(all_confidence) 66 | > $$all_conf(A,B)=\frac{A \cup B}{max\{sup(A),sup(B)\}}=min\{p(A|B),p(B|A)\} \tag{4}$$ 67 | > + 最大置信度(max_confidence) 68 | > $$max_conf(A,B)=max\{P(A|B),p(B|A)\} \tag{5}$$ 69 | > + Kulczynski(Kulc)度量 70 | > $$Kulc(A,B)=\frac{1}{2}(P(A|B)+P(B|A)) \tag{6}$$ 71 | > + 余弦度量 72 | > $$cosine(A,B)=\frac{P(A\cup B)}{\sqrt{P(A) \times P(B)}}=\frac{sup(A \cup B)}{\sqrt{(sup(A) \times sup(B))}}=\sqrt{P(A|B)\times P(B|A)} \tag{7}$$ 73 | 对于指示有趣的模式联系,全置信度、最大置信度、Kulczynsji和余弦哪个最好? 为了回答这个问题,引进不平衡比(Imbalance Ratio, IR) 74 | $$IR(A,B)=\frac{|sup(A)-sup(B)|}{sup(A)+sup(B)-sup(A\cup B)} \tag{8}$$ 75 | # 算法十问 76 | 1. 强规则一定是有趣的吗? 77 | > 不一定,规则是否有兴趣可能用主观或客观的标准来衡量。最终,只有用户能够确定规则是否是有趣的,并且这种判断是主观的,因不同用户而异。 78 | 79 | 2. 如何提高Apriori算法的效率? 80 | > + **事务压缩**(压缩进一步迭代扫描的事务数):不包含任何 k-项集的事务不可能包含任何(k+1)-项集。这样,这种事务在其后的考虑时,可以加上标记或删除,因为为产生 j-项集(j > k),扫描数据库时不再需要它们。 81 | > + **基于散列的技术**(散列项集计数):一种基于散列的技术可以用于压缩候选 k-项集 Ck (k >1)。 82 | > **划分**(为找候选项集划分数据):可以使用划分技术,它只需要两次数据库扫描,以挖掘频繁项集。 83 | > + **选样**(在给定数据的一个子集挖掘):选样方法的基本思想是:选取给定数据库 D 的随机样本 S,然后,在 S 而不是在 D 中搜索频繁项集。用这种方法,我们牺牲了一些精度换取了有效性。 84 | > + **动态项集计数**(在扫描的不同点添加候选项集):动态项集计数技术将数据库划分为标记开始点的块。 85 | 86 | 3. Apriori算法的优缺点? 87 | > 1. 优点: 88 | > + 简单、易理解 89 | > + 数据要求低。 90 | > 2. 缺点: 91 | > + 在每一步产生候选项目集时循环产生的组合过多,没有排除不应该参与组合的元素。 92 | > + 每次计算项集的支持度时,都对数据库中的全部记录进行了一遍扫描比较,如果是一个大型的数据库时,这种扫描会大大增加计算机的I/O开销。 93 | > 3. 改进: 94 | > + 利用建立临时数据库的方法来提高Apriori算法的效率。 95 | > + Fp-tree 算法。以树形的形式来展示、表达数据的形态;可以理解为水在不同河流分支的流动过程。 96 | > + 垂直数据分布。相当于把原始数据进行行转列的操作,并且记录每个元素的个数。 97 | 98 | 4. FPtree vs Apriori算法 99 | > FP-tree算法相对于Apriori算法,时间复杂度和空间复杂都有了显著的提高。但是对海量数据集,时空复杂度仍然很高,此时需要用到数据库划分等技术。 100 | 101 | 102 | # 面试真题 103 | 1. 简述Apriori算法的思想,谈谈该算法的应用领域并举例? 104 | 思想:其发现关联规则分两步,第一是通过迭代,检索出数据源中所有烦琐项集,即支持度不低于用户设定的阀值的项即集,第二是利用第一步中检索出的烦琐项集构造出满足用户最小信任度的规则,其中,第一步即挖掘出所有频繁项集是该算法的核心,也占整个算法工作量的大部分。在商务、金融、保险等领域皆有应用。在建筑陶瓷行业中的交叉销售应用,主要采用了Apriori算法. 105 | 2. 简述FPtree的原理和Apriori的不同? 106 | 107 | 3. 豆瓣电影数据集关联规则挖掘? 108 | 如果让你分析电影数据集中的导演和演员信息,从而发现两者之间的频繁项集及关联规则,你会怎么做? 109 | 110 | # 参考 111 | 1. https://saliormoon.github.io/2016/07/01/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E9%9D%A2%E8%AF%95%E9%97%AE%E9%A2%981/ 112 | 2. 数据挖掘概念与技术第三版 113 | 3. https://baijiahao.baidu.com/s?id=1607039314145277013&wfr=spider&for=pc 114 | 4. -------------------------------------------------------------------------------- /AI算法/machine-learning/HMM.md: -------------------------------------------------------------------------------- 1 | # HMM # 2 | #### Author: 李文乐; Email: cocoleYY@outlook.com #### 3 | 4 | 5 | ## 直观理解 ## 6 | 7 | ------------------------------------------------------------ 8 | 马尔可夫链(英语:Markov chain),又称离散时间马尔可夫链(discrete-time Markov chain,缩写为DTMC),因俄国数学家安德烈·马尔可夫(俄语:Андрей Андреевич Марков)得名,为状态空间中经过从一个状态到另一个状态的转换的随机过程。 9 | 隐马尔可夫模型包含5个要素:**初始概率分布,状态转移概率分布,观测概率分布,所有可能状态的集合,所有可能观测的集合**。 10 | 隐马尔可夫模型HMM是结构最简单的动态贝叶斯网络,是**有向图模型**。 11 | 12 | ## 核心公式 ## 13 | 14 | ---------- 15 | 1. 依据马尔可夫性,所有变量的联合概率分布为: 16 | > ![](https://m.qpic.cn/psb?/V11thrEZ18EV2M/y3zg1TDuIJGhEoCSULdtzszvuKIYGR91GX0V9e6t8mY!/b/dL8AAAAAAAAA&bo=zQE4AAAAAAARB8Q!&rf=viewer_4) 17 | 18 | 19 | ## 注意要点 ## 20 | 21 | ---------- 22 | 23 | 24 | - 统计语言模型[Statistical Language Model] 25 | > 是自然语言处理的重要技术,对于要处理的一段文本,我们可以看做是离散的时间序列,并且具有上下文依存关系;该模型可以应用在语音识别和机器翻译等领域,其模型表达式如下: 26 | > ![](http://m.qpic.cn/psb?/V11thrEZ18EV2M/VCYlXkt5CTD8qCeTNEGGbOzbC0P1ulagomRNpGJVoh8!/b/dLgAAAAAAAAA&bo=lgFMAAAAAAARF*s!&rf=viewer_4) 27 | > 如果只考虑前n-1个单词的影响,称为n元语法(n-grams),那么语言模型变为: 28 | > ![](https://m.qpic.cn/psb?/V11thrEZ18EV2M/ruqcInmRICKbhoBQyRGXCVAVhHHU9GoUd7I0PE4uI5U!/b/dDUBAAAAAAAA&bo=0AFHAAAAAAARB6Y!&rf=viewer_4) 29 | > 注意:很多时候我们无法考量太久以前的词,一是因为距离太远的词与当前词关系不大,二是因为距离越长模型参数越多,并且成指数级增长,因此4元以上几乎没人使用。当n=2的时候,就是只考虑前一个单词的一阶马尔科夫链模型,大家都知道在NLP任务中,上下文信息相关性的跨度可能非常大,马尔科夫模型无法处理这样的问题,需要新的模型可以解决这种长程依赖性(Long Distance Dependency)。 30 | > 这里可以回忆一下RNN/LSTM网络,通过隐状态传递信息,可以有效解决长程依赖问题,但当处理很长的序列的时候,它们仍然面临着挑战,即梯度消失。 31 | 32 | 33 | 34 | - 两点马尔可夫性质:[可以理解为无记忆性;留意:NLP问题会涉及哦] 35 | 36 | 37 | > (1). 下一个状态的概率分布只与当前状态有关 38 | ![](https://m.qpic.cn/psb?/V11thrEZ18EV2M/VlLQJYru9cCYXpDnysn3kTOfnC*iVWjZazU*srv20nw!/b/dDYBAAAAAAAA&bo=BAIyAAAAAAARBwQ!&rf=viewer_4) 39 | 40 | 41 | > (2). 下一个时刻的观测只与其相对应的状态有关 42 | ![](http://m.qpic.cn/psb?/V11thrEZ18EV2M/pHu31gXWQnnUuPqUPF.OGld*1N5VtsQ9YAhwVwegRBI!/b/dAYBAAAAAAAA&bo=CgIvAAAAAAARFwc!&rf=viewer_4) 43 | 44 | 45 | 46 | - 最大熵马尔可夫模型为什么会产生标注偏置问题?如何解决? 47 | 48 | 49 | 50 | - HMM为什么是生成模型 51 | > 因为HMM直接对联合概率分布建模;相对而言,条件随机场CRF直接对条件概率建模,所以是判别模型。 52 | 53 | 54 | 55 | - HMM在处理NLP词性标注和实体识别任务中的局限性 56 | > 在序列标注问题中,隐状态(标注)不仅和单个观测状态相关,还 和观察序列的长度、上下文等信息相关。例如词性标注问题中,一个词被标注为 动词还是名词,不仅与它本身以及它前一个词的标注有关,还依赖于上下文中的 其他词 57 | > 58 | 59 | 60 | 61 | - 隐马尔可夫模型包括概率计算问题、预测问题、学习问题三个基本问题 62 | > (1)概率计算问题:已知模型的所有参数,计算观测序列Y出现的概率,可 使用前向和后向算法求解。 63 | > (2)预测问题:已知模型所有参数和观测序列Y,计算最可能的隐状态序 列X,可使用经典的动态规划算法——维特比算法来求解最可能的状态序列。 64 | > (3)学习问题:已知观测序列Y,求解使得该观测序列概率最大的模型参 数,包括隐状态序列、隐状态之间的转移概率分布以及从隐状态到观测状态的概 率分布,可使用Baum-Welch算法进行参数的学习,Baum-Welch算法是最大期望算 法的一个特例。 65 | 66 | 67 | 68 | - 浅谈最大熵模型 69 | >最大熵这个词听起来很玄妙,其实就是保留全部的不确定性,将风险降到最小。 70 | >应用在词性标注,句法分析,机器翻译等NLP任务中。 71 | >![](https://m.qpic.cn/psb?/V11thrEZ18EV2M/b7zb1D1Obg8wK8WVUacEg*PGY1f5voNT.CQpcGwNTjQ!/b/dFMBAAAAAAAA&bo=tgFVAgAAAAADB8I!&rf=viewer_4) 72 | > 73 | 74 | 75 | 76 | ## 面试真题 ## 77 | 78 | ---------- 79 | 1. 如何对中文分词问题用HMM模型进行建模的训练? 80 | ![](https://m.qpic.cn/psb?/V11thrEZ18EV2M/qrxf7RmpPpOope..bx*jIfLkDAarZNo2vV*eUKu1238!/b/dDQBAAAAAAAA&bo=OQIRAwAAAAADBws!&rf=viewer_4) 81 | 2. 最大熵HMM模型为什么会产生标注偏置问题,如何解决? 82 | ![](https://m.qpic.cn/psb?/V11thrEZ18EV2M/xW2pgRjkJbr9ERjCFYtgDV7m0yu5mCJKQiP56pLUFS8!/b/dMQAAAAAAAAA&bo=5QHWBgAAAAADBxY!&rf=viewer_4) 83 | 84 | 85 | 86 | ## 参考 ## 87 | 1.隐马尔可夫链定义参考维基百科 88 | 2.统计学 李航 89 | 3.数学之美 90 | 4.百面机器学习 91 | -------------------------------------------------------------------------------- /AI算法/machine-learning/LightGBM.md: -------------------------------------------------------------------------------- 1 | ![](img/LightGBM/LightGBM.PNG) 2 | 3 | 4 | 5 | # LightGBM面试题 6 | 7 | ## 1. 简单介绍一下LightGBM? 8 | 9 | LightGBM是一个梯度 boosting 框架,使用基于学习算法的决策树。 它可以说是分布式的,高效的。 10 | 11 | 从 LightGBM 名字我们可以看出其是轻量级(Light)的梯度提升机(GBM),其相对 XGBoost 具有训练速度快、内存占用低的特点。 12 | 13 | LightGBM 是为解决GBDT训练速度慢,内存占用大的缺点,此外还提出了: 14 | 15 | - 基于Histogram的决策树算法 16 | 17 | - 单边梯度采样 Gradient-based One-Side Sampling(GOSS) 18 | 19 | - 互斥特征捆绑 Exclusive Feature Bundling(EFB) 20 | 21 | - 带深度限制的Leaf-wise的叶子生长策略 22 | 23 | - 直接支持类别特征(Categorical Feature) 24 | 25 | - 支持高效并行 26 | 27 | - Cache命中率优化 28 | 29 | ## 2. 介绍一下直方图算法? 30 | 31 | 直方图算法就是使用直方图统计,将大规模的数据放在了直方图中,分别是每个bin中**样本的梯度之和** 还有就是每个bin中**样本数量** 32 | 33 | - 首先确定对于每一个特征需要多少个箱子并为每一个箱子分配一个整数; 34 | 35 | - 将浮点数的范围均分成若干区间,区间个数与箱子个数相等 36 | 37 | - 将属于该箱子的样本数据更新为箱子的值 38 | 39 | - 最后用直方图表示 40 | 41 | 优点: 42 | 43 | **内存占用更小**:相比xgb不需要额外存储预排序,且只保存特征离散化后的值(整型) 44 | 45 | **计算代价更小**: 相比xgb不需要遍历一个特征值就需要计算一次分裂的增益,只需要计算k次(k为箱子的个数) 46 | 47 | **直方图做差加速**:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到,在速度上可以提升一倍 48 | 49 | ## 3. 介绍一下Leaf-wise和 Level-wise? 50 | 51 | XGBoost 采用 Level-wise,策略遍历一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,实际上很多叶子的分裂增益较低,没必要进行搜索和分裂 52 | 53 | LightGBM采用Leaf-wise的增长策略,该策略每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,Leaf-wise的优点是:在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度;Leaf-wise的缺点是:可能会长出比较深的决策树,产生过拟合。因此LightGBM会在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合 54 | 55 | ## 4. 介绍一下单边梯度采样算法(GOSS)? 56 | 57 | GOSS算法从减少样本的角度出发,排除大部分小梯度的样本,仅用剩下的样本计算信息增益,它是一种在减少数据量和保证精度上平衡的算法。与此同时,未了不改变数据的总体分布,GOSS对要进行分裂的特征按照绝对值大小进行排序,选取最大的a个数据,在剩下梯度小的数据中选取b个,这b个数据乘以权重$\frac{1-a}{b}$,最后使用这a+b个数据计算信息增益。 58 | 59 | ## 5. 介绍互斥特征捆绑算法(EFB)? 60 | 61 | 互斥特征捆绑算法(Exclusive Feature Bundling, EFB)指出如果将一些特征进行融合绑定,则可以降低特征数量。 62 | LightGBM的EFB算法将这个问题转化为图着色的问题来求解,将所有的特征视为图的各个顶点,将不是相互独立的特征用一条边连接起来,边的权重就是两个相连接的特征的总冲突值,这样需要绑定的特征就是在图着色问题中要涂上同一种颜色的那些点(特征)。另外,算法可以允许一小部分的冲突,我们可以得到更少的绑定特征,进一步提高计算效率。 63 | 64 | ## 6. 特征之间如何捆绑? 65 | 66 | 比如,我们在bundle中绑定了两个特征A和B,A特征的原始取值为区间 $[0,10)$,B特征的原始取值为区间$[0,20)$,我们可以在B特征的取值上加一个偏置常量10,将其取值范围变为$[10,30)$,绑定后的特征取值范围为$[0,30)$ 67 | 68 | ## 7. LightGBM是怎么支持类别特征? 69 | 70 | * 离散特征建立直方图的过程 71 | 72 | 统计该特征下每一种离散值出现的次数,并从高到低排序,并过滤掉出现次数较少的特征值, 然后为每一个特征值,建立一个bin容器。 73 | 74 | * 计算分裂阈值的过程 75 | 76 | * 先看该特征下划分出的bin容器的个数,如果bin容器的数量小于4,直接使用one vs other方式, 逐个扫描每一个bin容器,找出最佳分裂点; 77 | 78 | * 对于bin容器较多的情况, 先进行过滤,只让子集合较大的bin容器参加划分阈值计算, 对每一个符合条件的bin容器进行公式计算 79 | $$ 80 | \frac{该bin容器下所有样本的一阶梯度之和 }{ 该bin容器下所有样本的二阶梯度之和} + 正则项 81 | $$ 82 | 83 | * **这里为什么不是label的均值呢?其实"label的均值"只是为了便于理解,只针对了学习一棵树且是回归问题的情况, 这时候一阶导数是Y, 二阶导数是1**),得到一个值,根据该值对bin容器从小到大进行排序,然后分从左到右、从右到左进行搜索,得到最优分裂阈值。但是有一点,没有搜索所有的bin容器,而是设定了一个搜索bin容器数量的上限值,程序中设定是32,即参数max_num_cat。 84 | 85 | * LightGBM中对离散特征实行的是many vs many 策略,这32个bin中最优划分的阈值的左边或者右边所有的bin容器就是一个many集合,而其他的bin容器就是另一个many集合。 86 | 87 | * 对于连续特征,划分阈值只有一个,对于离散值可能会有多个划分阈值,每一个划分阈值对应着一个bin容器编号,当使用离散特征进行分裂时,只要数据样本对应的bin容器编号在这些阈值对应的bin集合之中,这条数据就加入分裂后的左子树,否则加入分裂后的右子树。 88 | 89 | ## 8. LightGBM的优缺点 90 | 91 | 优点: 92 | 93 | - 直方图算法极大的降低了时间复杂度; 94 | - 单边梯度算法过滤掉梯度小的样本,减少了计算量; 95 | - 基于 Leaf-wise 算法的增长策略构建树,减少了计算量; 96 | - 直方图算法将存储特征值转变为存储 bin 值,降低了内存消耗 97 | - 互斥特征捆绑算法减少了特征数量,降低了内存消耗 98 | 99 | 缺点: 100 | 101 | - LightGBM在Leaf-wise可能会长出比较深的决策树,产生过拟合 102 | - LightGBM是基于偏差的算法,所以会对噪点较为敏感; 103 | 104 | 105 | 106 | ## 9. GBDT是如何做回归和分类的 107 | 108 | - **回归** 109 | 110 | 生成每一棵树的时候,第一棵树的一个叶子节点内所有样本的label的均值就是这个棵树的预测值,后面根据残差再预测,最后根据将第一棵树的预测值+权重*(其它树的预测结果) 111 | 112 | ![image-20210629173116854](../../../../../Library/Application Support/typora-user-images/image-20210629173116854.png) 113 | 114 | * **分类** 115 | 116 | 分类时针对样本有三类的情况, 117 | 118 | * 首先同时训练三颗树。 119 | - 第一棵树针对样本 x 的第一类,输入为(x, 0)。 120 | - 第二棵树输入针对样本 x 的第二类,假设 x 属于第二类,输入为(x, 1)。 121 | - 第三棵树针对样本 x 的第三类,输入为(x, 0)。 122 | - 参照 CART 的生成过程。输出三棵树对 x 类别的预测值 f1(x), f2(x), f3(x)。 123 | * 在后面的训练中,我们仿照多分类的逻辑回归,使用 softmax 来产生概率。 124 | - 针对类别 1 求出残差 f11(x) = 0 − f1(x); 125 | - 类别 2 求出残差 f22(x) = 1 − f2(x); 126 | - 类别 3 求出残差 f33(x) = 0 − f3(x)。 127 | * 然后第二轮训练, 128 | - 第一类输入为(x, f11(x)) 129 | - 第二类输入为(x, f22(x)) 130 | - 第三类输入为(x, f33(x))。 131 | * 继续训练出三棵树,一直迭代 M 轮,每轮构建 3 棵树。当训练完毕以后,新来一个样本 x1,我们需要预测该样本的类别的时候,便可使用 softmax 计算每个类别的概率。 132 | 133 | 134 | 135 | ## 参考资料 136 | 137 | 深入理解LightGBM https://mp.weixin.qq.com/s/zejkifZnYXAfgTRrkMaEww 138 | 139 | 决策树(下)——XGBoost、LightGBM(非常详细) - 阿泽的文章 - 知乎 https://zhuanlan.zhihu.com/p/87885678 140 | 141 | Lightgbm如何处理类别特征: https://blog.csdn.net/anshuai_aw1/article/details/83275299 142 | 143 | LightGBM 直方图优化算法:https://blog.csdn.net/jasonwang_/article/details/80833001 144 | -------------------------------------------------------------------------------- /AI算法/machine-learning/NaïveBayes.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 贝叶斯面试题 4 | 5 | ## 1.简述朴素贝叶斯算法原理和工作流程 6 | 7 | **工作原理**: 8 | 9 | * 假设现在有样本$x=(x_1, x_2, x_3, \dots x_n)$待分类项 10 | * 假设样本有$m$个特征$(a_1,a_2,a_3,\dots a_m)$(特征独立) 11 | * 再假设现在有分类目标$Y=\{ y_1,y_2,y_3,\dots ,y_n\}$ 12 | * 那么就$\max ({P}({y}_1 | {x}), {P}({y}_2 | {x}), {P}({y}_3 | {x}) ,{P}({y_n} | {x}))$是最终的分类类别。 13 | * 而$P(y_i | x)=\frac{P(x | y_i) * P(y_i)}{ P(x)} $,因为$x$对于每个分类目标来说都一样,所以就是求$\max({P}({x}|{y_i})*{P}({y_i}))$ 14 | * $P(x | y _i) * P(y_i)=P(y_i) * \prod(P(a_j| y_i))$,而具体的$P(a_j|y_i)$和$P(y_i)$都是能从训练样本中统计出来 15 | * ${P}({a_j} | {y_i})$表示该类别下该特征$a_j$出现的概率$P(y_i)$表示全部类别中这个这个类别出现的概率,这样就能找到应该属于的类别了 16 | 17 | 18 | 19 | ## 2. 条件概率、先验概率、后验概率、联合概率、贝叶斯公式的概念 20 | 21 | * 条件概率: 22 | 23 | * $P(X|Y)$含义: 表示$Y$发生的条件下$X$发生的概率。 24 | * 先验概率 25 | 26 | * **表示事件发生前的预判概率。**这个可以是基于历史数据统计,也可以由背景常识得出,也可以是主观观点得出。一般都是单独事件发生的概率,如 $P(X)$ 27 | * 后验概率 28 | 29 | * 基于先验概率求得的**反向条件概率**,形式上与条件概率相同(若$P(X|Y)$ 为正向,则$P(Y|X)$ 为反向) 30 | * 联合概率: 31 | 32 | * 事件$X$与事件$Y$同时发生的概率。 33 | 34 | * 贝叶斯公式 35 | 36 | * 37 | $$ 38 | P(Y|X) = \frac{P(X|Y) P(Y)}{P(X)} \\ 39 | $$ 40 | 41 | * $P(Y)$ 叫做**先验概率**:事件$X$发生之前,我们根据以往经验和分析对事件$Y$发生的一个概率的判断 42 | 43 | * $P(Y|X)$ 叫做**后验概率**:事件$X$发生之后,我们对事件$Y$发生的一个概率的重新评估 44 | 45 | * $P(Y,X)$叫做**联合概率**:事件$X$与事件$Y$同时发生的概率。 46 | 47 | * 先验概率和后验概率是相对的。如果以后还有新的信息引入,更新了现在所谓的后验概率,得到了新的概率值,那么这个新的概率值被称为后验概率。 48 | 49 | 50 | 51 | ## 3.为什么朴素贝叶斯如此“朴素”? 52 | 53 | 因为它**假定所有的特征在数据集中的作用是同样重要和独立的**。正如我们所知,这个假设在现实世界中是很不真实的,因此,说朴素贝叶斯真的很“朴素”。用贝叶斯公式表达如下: 54 | $$ 55 | P(Y|X_1, X_2) = \frac{P(X_1|Y) P(X_2|Y) P(Y)}{P(X_1)P(X_2)} 56 | $$ 57 | **而在很多情况下,所有变量几乎不可能满足两两之间的条件。** 58 | 59 | 朴素贝叶斯模型(Naive Bayesian Model)的朴素(Naive)的含义是**“很简单很天真”**地假设样本特征彼此独立.这个假设现实中基本上不存在,但特征相关性很小的实际情况还是很多的,所以这个模型仍然能够工作得很好。 60 | 61 | ## 4.什么是贝叶斯决策理论? 62 | 63 | 贝叶斯决策理论是主观贝叶斯派归纳理论的重要组成部分。贝叶斯决策就是在不完全情报下,对部分未知的状态用主观概率估计,然后用贝叶斯公式对发生概率进行修正,最后再利用期望值和修正概率做出最优决策(选择概率最大的类别)。 64 | 贝叶斯决策理论方法是统计模型决策中的一个基本方法,其**基本思想**是: 65 | 66 | * 已知类条件概率密度参数表达式和先验概率 67 | * 利用贝叶斯公式转换成后验概率 68 | * 根据后验概率大小进行决策分类 69 | 70 | ## 5.朴素贝叶斯算法的前提假设是什么? 71 | 72 | * 特征之间相互独立 73 | * 每个特征同等重要 74 | 75 | ## 6.为什么属性独立性假设在实际情况中很难成立,但朴素贝叶斯仍能取得较好的效果? 76 | 77 | * 对于分类任务来说,只要各类别的条件概率排序正确、无需精准概率值即可导致正确分类; 78 | * 如果属性间依赖对所有类别影响相同,或依赖关系的影响能相互抵消,则属性条件独立性假设在降低计算开销的同时不会对性能产生负面影响。 79 | 80 | ## 7.什么是朴素贝叶斯中的零概率问题?如何解决? 81 | 82 | **零概率问题**:在计算实例的概率时,如果某个量$x$,在观察样本库(训练集)中没有出现过,会导致整个实例的概率结果是0。 83 | 84 | **解决办法**:若$P(x)$为零则无法计算。为了解决零概率的问题,法国数学家拉普拉斯最早提出用加1的方法估计没有出现过的现象的概率,所以加法平滑也叫做**拉普拉斯平滑**。 85 | 86 | **举个栗子**:假设在文本分类中,有3个类,$C1、C2、C3$,在指定的训练样本中,某个词语$K1$,在各个类中观测计数分别为0,990,10,$K1$的概率为0,0.99,0.01,对这三个量使用拉普拉斯平滑的计算方法如下: 87 | 88 | ``` 89 | 1/1003=0.001, 90 | 991/1003=0.988, 91 | 11/1003=0.011 92 | 在实际的使用中也经常使用加 lambda(1≥lambda≥0)来代替简单加1。如果对N个计数都加上lambda,这时分母也要记得加上N*lambda。 93 | ``` 94 | 95 | 将朴素贝叶斯中的所有概率计算**应用拉普拉斯平滑即可以解决零概率问题**。 96 | 97 | ## 8.朴素贝叶斯中概率计算的下溢问题如何解决? 98 | 99 | **下溢问题**:在朴素贝叶斯的计算过程中,需要对特定分类中各个特征出现的**概率进行连乘,小数相乘,越乘越小,这样就造成了下溢出**。 100 | 为了解决这个问题,对乘积结果取自然对数。通过求对数可以避免下溢出或者浮点数舍入导致的错误。 101 | $$ 102 | \prod_{i=x}^{n} p\left(x_{i} | y_{j}\right) 103 | $$ 104 | **解决办法**:对其**取对数**: 105 | $$ 106 | \log \prod_{i=1}^{n} p\left(x_{i} | y_{j}\right) 107 | $$ 108 | 109 | $$ 110 | =\sum_{i=1}^{n} \log p\left(x_{i} | y_{j}\right) 111 | $$ 112 | 113 | 将小数的乘法操作转化为取对数后的加法操作,规避了变为零的风险同时并不影响分类结果。 114 | 115 | ## 9.当数据的属性是连续型变量时,朴素贝叶斯算法如何处理? 116 | 117 | 当朴素贝叶斯算法数据的属性为连续型变量时,有两种方法可以计算属性的类条件概率。 118 | 119 | * 第一种方法:把一个连续的属性离散化,然后用相应的离散区间替换连续属性值。但这种方法不好控制离散区间划分的粒度。如果粒度太细,就会因为每个区间内训练记录太少而不能对$P(X|Y)$ 120 | 做出可靠的估计,如果粒度太粗,那么有些区间就会有来自不同类的记录,因此失去了正确的决策边界。 121 | * 第二种方法:假设连续变量服从某种概率分布,然后使用训练数据估计分布的参数,例如可以使用高斯分布来表示连续属性的类条件概率分布。 122 | * 高斯分布有两个参数,均值$\mu$和方差$\sigma 2$,对于每个类$y_i$,属性$X_i$的类条件概率等于: 123 | 124 | $$ 125 | P\left(X_{i}=x_{i} | Y=y_{j}\right)=\frac{1}{\sqrt{2 \Pi} \sigma_{i j}^{2}} e^{\frac{\left(x_{i}-\mu_{j}\right)^{2}}{2 \sigma_{i}^{2}}} 126 | $$ 127 | 128 | $\mu_{i j}$:类$y_j$的所有训练记录关于$X_i$的样本均值估计 129 | 130 | $\sigma_{i j}^{2}$:类$y_j$的所有训练记录关于$X$的样本方差 131 | 132 | 通过高斯分布估计出类条件概率。 133 | 134 | ## 10.朴素贝叶斯有哪几种常用的分类模型? 135 | 136 | 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利 137 | 138 | * 高斯模型: 139 | 140 | * 处理包含连续型变量的数据,使用高斯分布概率密度来计算类的条件概率密度 141 | 142 | * 多项式模型: 143 | 144 | * 其中$\alpha$为拉普拉斯平滑,加和的是属性出现的总次数,比如文本分类问题里面,不光看词语是否在文本中出现,也得看出现的次数。如果总词数为$n$,出现词数为$m$的话,说起来有点像掷骰子$n$次出现$m$次这个词的场景。 145 | $$ 146 | P\left(x_{i} | y_{k}\right)=\frac{N_{y k_{1}}+\alpha}{N_{y_{k}}+\alpha n} 147 | $$ 148 | 149 | * 多项式模型适用于离散特征情况,在文本领域应用广泛, 其基本思想是:**我们将重复的词语视为其出现多次**。 150 | 151 | * 伯努利模型: 152 | 153 | * 伯努利模型特征的取值为布尔型,即出现为true没有出现为false,在文本分类中,就是一个单词有没有在一个文档中出现。 154 | 155 | * 伯努利模型适用于离散特征情况,它将重复的词语都视为只出现一次。 156 | $$ 157 | P( '代开', '发票', '发票', '我' | S) = P('代开' | S) P( '发票' | S) P('我' | S) 158 | $$ 159 | 我们看到,”发票“出现了两次,但是我们只将其算作一次。我们看到,”发票“出现了两次,但是我们只将其算作一次。 160 | 161 | ## 11.为什么说朴素贝叶斯是高偏差低方差? 162 | 163 | 在统计学习框架下,大家刻画模型复杂度的时候,有这么个观点,认为$Error=Bias +Variance$。 164 | 165 | * $Error$反映的是整个模型的准确度, 166 | * $Bias$反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度, 167 | * $Variance$反映的是模型每一次输出结果与模型输出期望(平均值)之间的误差,即模型的稳定性,数据是否集中。 168 | * 对于复杂模型,充分拟合了部分数据,使得他们的偏差较小,而由于对部分数据的过度拟合,对于部分数据预测效果不好,整体来看可能引起方差较大。 169 | * 对于朴素贝叶斯了。它简单的假设了各个数据之间是无关的,是一个被严重简化了的模型,简单模型与复杂模型相反,大部分场合偏差部分大于方差部分,也就是说高偏差而低方差。 170 | 171 | ## 12.朴素贝叶斯为什么适合增量计算? 172 | 173 | 因为朴素贝叶斯在训练过程中实际只需要计算出各个类别的概率和各个特征的类条件概率,这些概率值可以快速的根据增量数据进行更新,无需重新全量训练,所以其十分适合增量计算,该特性可以使用在超出内存的大量数据计算和按小时级等获取的数据计算中。 174 | 175 | ## 13.高度相关的特征对朴素贝叶斯有什么影响? 176 | 177 | 假设有两个特征高度相关,相当于该特征在模型中发挥了两次作用(计算两次条件概率),使得朴素贝叶斯获得的结果向该特征所希望的方向进行了偏移,影响了最终结果的准确性,所以朴素贝叶斯算法应先处理特征,把相关特征去掉。 178 | 179 | ## 14.朴素贝叶斯的应用场景有哪些? 180 | 181 | * **文本分类/垃圾文本过滤/情感判别**: 182 | 这大概是朴素贝叶斯应用最多的地方了,即使在现在这种分类器层出不穷的年代,在文本分类场景中,朴素贝叶斯依旧坚挺地占据着一席之地。因为多分类很简单,同时在文本数据中,分布独立这个假设基本是成立的。而垃圾文本过滤(比如垃圾邮件识别)和情感分析(微博上的褒贬情绪)用朴素贝叶斯也通常能取得很好的效果。 183 | * **多分类实时预测**: 184 | 对于文本相关的多分类实时预测,它因为上面提到的优点,被广泛应用,简单又高效。 185 | * **推荐系统**: 186 | 朴素贝叶斯和协同过滤是一对好搭档,协同过滤是强相关性,但是泛化能力略弱,朴素贝叶斯和协同过滤一起,能增强推荐的覆盖度和效果。 187 | 188 | ## 15.朴素贝叶斯有什么优缺点? 189 | 190 | * 优点: 191 | * 对数据的训练快,分类也快 192 | * 对缺失数据不太敏感,算法也比较简单 193 | * 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,可以一批批的去增量训练 194 | * 缺点: 195 | * 对输入数据的表达形式很敏感 196 | * 由于朴素贝叶斯的“朴素”特点,所以会带来一些准确率上的损失。 197 | * 需要计算先验概率,分类决策存在错误率。 198 | 199 | ## 16.朴素贝叶斯与 LR 区别? 200 | 201 | - **朴素贝叶斯是生成模型**,根据已有样本进行贝叶斯估计学习出先验概率 $P(Y)$ 和条件概率 $P(X|Y)$,进而求出联合分布概率 $P(X,Y)$,最后利用贝叶斯定理求解$P(Y|X)$, 而**LR是判别模型**,根据极大化对数似然函数直接求出条件概率 $P(Y|X)$ 202 | - 朴素贝叶斯是基于很强的**条件独立假设**(在已知分类Y的条件下,各个特征变量取值是相互独立的),而 LR 则对此没有要求 203 | - 朴素贝叶斯适用于数据集少的情景,而LR适用于大规模数据集。 204 | 205 | ## 17. 贝叶斯优化算法(参数调优) 206 | 207 | * 网格搜索和随机搜索:在测试一个新点时,会忽略前一个点的信息; 208 | 209 | * 贝叶斯优化算法:充分利用了之前的信息。贝叶斯优化算法通过对目标函数形式进行学习,找到使目标函数向全局最优值提升的参数。 210 | 211 | * 学习目标函数形式的方法: 212 | * 首先根据先验分布,假设一个搜集函数; 213 | * 每一次使用新的采样点来测试目标函数时,利用这个信息来更新目标函数的先验分布 214 | * 算法测试由后验分布给出的全局最值最可能出现的位置的点。 215 | 216 | 对于贝叶斯优化算法,有一个需要注意的地方,一旦找到了一个局部最优值,它会在该区域不断采样,所以很容易陷入局部最优值。为了弥补这个缺陷,贝叶斯优化算法会在探索和利用之间找到一个平衡点,“探索”就是在还未取样的区域获取采样点;而“利用”则是根据后验分布在最可能出现全局最值的区域进行采样。 217 | 218 | ## 18.朴素贝叶斯分类器对异常值敏感吗? 219 | 220 | 朴素贝叶斯是一种**对异常值不敏感**的分类器,保留数据中的异常值,常常可以保持贝叶斯算法的整体精度,如果对原始数据进行降噪训练,分类器可能会因为失去部分异常值的信息而导致泛化能力下降。 221 | 222 | ## 19.朴素贝叶斯算法对缺失值敏感吗? 223 | 224 | 朴素贝叶斯是一种**对缺失值不敏感**的分类器,朴素贝叶斯算法能够处理缺失的数据,在算法的建模时和预测时数据的属性都是单独处理的。因此**如果一个数据实例缺失了一个属性的数值,在建模时将被忽略**,不影响类条件概率的计算,在预测时,计算数据实例是否属于某类的概率时也将忽略缺失属性,不影响最终结果。 225 | 226 | ## 20. 一句话总结贝叶斯算法 227 | 228 | **贝叶斯分类器直接用贝叶斯公式解决分类问题**。假设样本的特征向量为$x$,类别标签为$y$,根据贝叶斯公式,样本属于每个类的条件概率(后验概率)为: 229 | $$ 230 | p(y | \mathbf{x})=\frac{p(\mathbf{x} | y) p(y)}{p(\mathbf{x})} 231 | $$ 232 | 分母$p(x)$对所有类都是相同的,**分类的规则是将样本归到后验概率最大的那个类**,不需要计算准确的概率值,只需要知道属于哪个类的概率最大即可,这样可以忽略掉分母。分类器的判别函数为: 233 | $$ 234 | \arg \max _{y} p(\mathrm{x} | y) p(y) 235 | $$ 236 | 在实现贝叶斯分类器时,**需要知道每个类的条件概率分布$p(x|y)$即先验概率**。一般假设样本服从正态分布。训练时确定先验概率分布的参数,一般用最大似然估计,即最大化对数似然函数。 237 | 238 | **贝叶斯分类器是一种生成模型,可以处理多分类问题,是一种非线性模型。** 239 | 240 | ## 21.朴素贝叶斯与LR的区别?(经典问题) 241 | 242 | 朴素贝叶斯是生成模型,而LR为判别模型.朴素贝叶斯:已知样本求出先验概率与条件概率,进而计算后验概率。**优点:样本容量增加时,收敛更快;隐变量存在时也可适用。缺点:时间长;需要样本多;浪费计算资源**. **Logistic回归**:不关心样本中类别的比例及类别下出现特征的概率,它直接给出预测模型的式子。设每个特征都有一个权重,训练样本数据更新权重w,得出最终表达式。**优点:直接预测往往准确率更高;简化问题;可以反应数据的分布情况,类别的差异特征;适用于较多类别的识别。缺点:收敛慢;不适用于有隐变量的情况。** > + 朴素贝叶斯是基于很强的条件独立假设(在已知分类Y的条件下,各个特征变量取值是相互独立的),而LR则对此没有要求。 > + 朴素贝叶斯适用于数据集少的情景,而LR适用于大规模数据集。 243 | 244 | 245 | 246 | -------------------------------------------------------------------------------- /AI算法/machine-learning/Prophet.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Prophet面试题 4 | 5 | ## 1. 简要介绍Prophet 6 | 7 | 常见的时间序列分解方法: 8 | 9 | 将时间序列分成季节项$S_t$,趋势项$T_t$,剩余项$R_t$,即对所有的$t≥0$ 10 | $$ 11 | y_{t}=S_{t}+T_{t}+R_{t} 12 | $$ 13 | 14 | $$ 15 | y_{t}=S_{t} \times T_{t} \times R_{t} 16 | $$ 17 | 18 | $$ 19 | \ln y_{t}=\ln S_{t}+\ln T_{t}+\ln R_{t} 20 | $$ 21 | 22 | fbprophet 的在此基础上,添加了节日项。 23 | $$ 24 | y(t)=g(t)+s(t)+h(t)+\epsilon_{t} 25 | $$ 26 | 27 | ## 2. 趋势项模型 28 | 29 | * **基于逻辑回归** 30 | 31 | sigmoid 函数为 32 | $$ 33 | \sigma(x)=1 /\left(1+e^{-x}\right) 34 | $$ 35 | prophet在逻辑回归的基础上添加了随时间变化的参数,那么逻辑回归就可以改写成: 36 | $$ 37 | f(x)=\frac{C(t)}{\left(1+e^{-k(t)(x-m(t))}\right)} 38 | $$ 39 | 这里的 $C$ 称为曲线的最大渐近值, $k$ 表示曲线的增长率,$m$ 表示曲线的中点。当 $$ 40 | C=1, k=1, m=0 41 | $$时,恰好就是大家常见的 sigmoid 函数的形式。 42 | 43 | * **基于分段线性函数** 44 | $$ 45 | g(t)=\frac{C(t)}{1+\exp \left(-\left(k+\boldsymbol{a}(t)^{t} \boldsymbol{\delta}\right) \cdot\left(t-\left(m+\boldsymbol{a}(t)^{T} \boldsymbol{\gamma}\right)\right.\right.} 46 | $$ 47 | $k$表示变化量 48 | 49 | $a_{j}(t)$表示指示函数: 50 | $$ 51 | a_{j}(t)=\left\{\begin{array}{l}1, \text { if } t \geq s_{j} \\ 0, \text { otherwise }\end{array}\right. 52 | $$ 53 | $\delta_{j}$表示在时间戳$s_{j}$上的增长率的变化量 54 | 55 | $\gamma_{j}$确定线段边界 56 | $$ 57 | \gamma_{j}=\left(s_{j}-m-\sum_{\ell当属于某个簇的样本数过多、分散程度较大时把这个簇分为两个子簇| 33 | | 对奇异点敏感 | k-median | 中位数代替平均值作为簇中心 | 34 | | 只能找到球状群 | GMM | 以高斯分布考虑簇内数据点的分布 | 35 | | 分群结果不稳定 | K-means++ | 初始的聚类中心之间的相互距离要尽可能的远 | 36 | 37 | ## 4. k值的选取 38 | 39 | 40 | K-means算法要求事先知道数据集能分为几群,主要有两种方法定义k。 41 | 42 | - 手肘法:通过绘制k和损失函数的关系图,选拐点处的k值。 43 | 44 | - 经验选取人工据经验先定几个k,多次随机初始化中心选经验上最适合的。 45 | 46 | 通常都是以经验选取,因为实际操作中拐点不明显,且手肘法效率不高。 47 | 48 | 49 | ## 5. K-means算法中初始点的选择对最终结果的影响 50 | 51 | 52 | K-means选择的初始点不同获得的最终分类结果也可能不同,随机选择的中心会导致K-means陷入局部最优解。 53 | 54 | 55 | ## 6. 为什么在计算K-means之前要将数据点在各维度上归一化 56 | 57 | 因为数据点各维度的量级不同。 58 | 举个例子,最近正好做完基于RFM模型的会员分群,每个会员分别有R(最近一次购买距今的时长)、F(来店消费的频率)和M(购买金额)。如果这是一家奢侈品商店,你会发现M的量级(可能几万元)远大于F(可能平均10次以下),如果不归一化就算K-means,相当于F这个特征完全无效。如果我希望能把常客与其他顾客区别开来,不归一化就做不到。 59 | 60 | 61 | 62 | ## 7. K-means不适用哪些数据 63 | 64 | 65 | 1. 数据特征极强相关的数据集,因为会很难收敛(损失函数是非凸函数),一般要用kernal K-means,将数据点映射到更高维度再分群。 66 | 2. 数据集可分出来的簇密度不一,或有很多离群值(outliers),这时候考虑使用密度聚类。 67 | 68 | 69 | ## 8. K-means 中常用的距离度量 70 | 71 | 72 | K-means中比较常用的距离度量是欧几里得距离和余弦相似度。 73 | 74 | 75 | ## 9. K-means是否会一直陷入选择质心的循环停不下来(为什么迭代次数后会收敛)? 76 | 77 | 78 | 从K-means的第三步我们可以看出,每回迭代都会用簇内点的**平均值**去更新簇中心,所以最终簇内的平方误差和(SSE, sum of squared error)一定最小。 平方误差和的公式如下: 79 | $$ 80 | L(X) = \sum_{i=1}^{k}{\sum_{j\in C_i}{(x_{ij}-\bar{x_i})^2}} 81 | $$ 82 | 83 | ## 10. 聚类和分类区别 84 | 85 | 86 | 1. 产生的结果相同(将数据进行分类) 87 | 2. 聚类事先没有给出标签(无监督学习) 88 | 89 | 90 | ## 11. 如何对K-means聚类效果进行评估 91 | 92 | 93 | 回到聚类的定义,我们希望得到**簇内数据相似度尽可能地大,而簇间相似度尽可能地小**。常见的评估方式: 94 | 95 | | 名称 | 公式 | 含义 | 如何比较 | 96 | |:-------------------------------------| :------------------------------------------------------: | :----- | :----------- | 97 | | sum of squares within clusters(SSW) | $\sum_{i=1}^{K}{ \parallel x_i-c_{l_i} \parallel ^2}$ |所有簇内差异之和|越小越好| 98 | | sum of squares between clusters(SSB) | $\sum_{i=1}^{K}{n_i \parallel c_i-\bar{x} \parallel ^2}$ |簇心与簇内均值差异的加权和|越大越好| 99 | |Calinski-Harabasz | $\frac{\frac{SSB}{K-1}}{\frac{SSW}{N-K}}$ |簇间距离和簇内距离之比(除数是惩罚项,因为SSW下降地比较快)|越大越好 | 100 | |Ball&Hall |$\frac{SSW}{K}$ | 几乎同SSW|越小越好| 101 | |Dunn’s index | $\frac{\min_{i=1}^M{\min_{j=i+1}^M{d(c_i, c_j)}}}{\max_{k=1}^M{diam(c_k)}}$
$where d(c_i, c_j)=\min_{x \in c_i, x' \in c_j}{\parallel x-x' \parallel}^2 and$
$diam(c_k)=\max_{x, x' \in c_k}{\parallel x-x' \parallel}^2$ |本质上也是簇间距离和簇内距离之比|越大越好| 102 | 103 | 104 | 另一个常见的方法是画图,将不同簇的数据点用不同颜色表示。这么做的好处是最直观,缺点是无法处理高维的数据,它最多能展示三维的数据集。 105 | 如果维数不多也可以做一定的降维处理(PCA)后再画图,但会损失一定的信息量。 106 | 107 | 聚类算法几乎没有统一的评估指标,可能还需要根据聚类目标想评估方式,如对会员作分群以后,我想检查分得的群体之间是否确实有差异,这时候可以用MANOVA计算,当p值小于0.01说明分群合理。 108 | 109 | ## 12. K-means中空聚类的处理 110 | 111 | 112 | 如果所有的点在指派步骤都未分配到某个簇,就会得到空簇。如果这种情况发生,则需要某种策略来选择一个替补质心,否则的话,平方误差将会偏大。一种方法是选择一个距离当前任何质心最远的点。这将消除当前对总平方误差影响最大的点。另一种方法是从具有最大SEE的簇中选择一个替补的质心。这将分裂簇并降低聚类的总SEE。如果有多个空簇,则该过程重复多次。另外编程实现时,要注意空簇可能导致的程序bug。 113 | 114 | 115 | ## 参考资料 116 | 117 | 1. Mann A K, Kaur N. Review paper on clustering techniques[J]. Global Journal of Computer Science and Technology, 2013. 118 | 2. https://blog.csdn.net/hua111hua/article/details/86556322 119 | 3. REZAEI M. Clustering validation[J]. 120 | -------------------------------------------------------------------------------- /AI算法/machine-learning/metrics.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 评测指标面试题 4 | 5 | metric主要用来评测机器学习模型的好坏程度,不同的任务应该选择不同的评价指标,分类,回归和排序问题应该选择不同的评价函数. 不同的问题应该不同对待,即使都是分类问题也不应该唯评价函数论,不同问题不同分析. 6 | 7 | ## 回归(Regression) 8 | ### 平均绝对误差(MAE) 9 | 10 | 平均绝对误差MAE(Mean Absolute Error)又被称为 L1范数损失。 11 | $$ 12 | MAE=\frac{1}{n}\sum_{i=1}^{n}|y_i-\hat{y}_i| \tag{1} 13 | $$ 14 | MAE虽能较好衡量回归模型的好坏,但是绝对值的存在导致函数不光滑,在某些点上不能求导,可以考虑将绝对值改为残差的平方,这就是均方误差。 15 | 16 | ### 均方误差(MSE) 17 | 18 | 均方误差MSE(Mean Squared Error)又被称为 L2范数损失 。 19 | $$ 20 | MSE=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2 \tag{2} 21 | $$ 22 | 由于MSE与我们的目标变量的量纲不一致,为了保证量纲一致性,我们需要对MSE进行开方 。 23 | 24 | ### 均方根误差(RMSE) 25 | $$ 26 | RMSE=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2} \tag{3} 27 | $$ 28 | 29 | 30 | 31 | ### R2_score 32 | 33 | $$ 34 | R2_score =1-\frac{\sum^n_{i}\left(y_{i}-\hat{y}\right)^{2} / n}{\sum^n_{i}\left(y_{i}-\bar{y}\right)^{2} / n}=1-\frac{M S E}{\operatorname{Var}} \tag{4} 35 | $$ 36 | 37 | 38 | $R2{_score}$又称决定系数,表示反应因变量的全部变异能通过数学模型被自变量解释的比例, $R2\_{score}$越大,模型准确率越好。 39 | 40 | $y$表示实际值,$\hat{y}$表示预测值,$\bar{y}$表示实际值的均值,$n$表示样本数,$i$表示第$i$个样本。$Var$表示实际值的方差,也就是值的变异情况。 41 | 42 | $MSE$表示均方误差,为残差平方和的均值,该部分不能能被数学模型解释的部分,属于不可解释性变异。 43 | 44 | 因此: 45 | $$ 46 | 可解释性变异占比 = 1-\frac{不可解释性变异}{整体变异}= 1-\frac{M S E}{\operatorname{Var}} = R2\_score \tag{5} 47 | $$ 48 | 49 | 50 | ## 分类(Classification) 51 | ### 准确率和错误率 52 | 53 | 54 | $$ 55 | Acc(y,\hat{y})=\frac{1}{n}\sum_{i=1}^{n}y_i=\hat{y_i} \tag{6} 56 | $$ 57 | 58 | $$ 59 | Error(y, \hat{y})=1-acc(y,\hat{y}) \tag{7} 60 | $$ 61 | Acc与Error平等对待每个类别,即每一个样本判对 (0) 和判错 (1) 的代价都是一样的。使用Acc与Error作为衡量指标时,需要考虑样本不均衡问题以及实际业务中好样本与坏样本的重要程度。 62 | 63 | ### 混淆矩阵 64 | 对于二分类问题,可将样例根据其真是类别与学习器预测类别的组合划分为: 65 | 66 | ``` 67 | 真正例(true positive, TP):预测为 1,预测正确,即实际 1 68 | 假正例(false positive, FP):预测为 1,预测错误,即实际 0 69 | 真反例(ture negative, TN):预测为 0,预测正确,即实际 0 70 | 假反例(false negative, FN):预测为 0,预测错误,即实际 1 71 | ``` 72 | 73 | 则有:TP+FP+TN+FN=样例总数. 分类结果的混淆矩阵(confusion matrix)如下: 74 | 75 | ![image-20210616223053609](img/Metrics/image-20210616223053609.png) 76 | 77 | ### 精确率(查准率) Precision 78 | 79 | Precision 是分类器预测的正样本中预测正确的比例,取值范围为[0,1],取值越大,模型预测能力越好。 80 | $$ 81 | P=\frac{TP}{TP+FP} \tag{8} 82 | $$ 83 | 84 | ### 召回率(查全率)Recall 85 | 86 | Recall 是分类器所预测正确的正样本占所有正样本的比例,取值范围为[0,1],取值越大,模型预测能力越好。 87 | $$ 88 | R=\frac{TP}{TP+FN} \tag{9} 89 | $$ 90 | 91 | 92 | ### F1 Score 93 | 94 | Precision和Recall 是互相影响的,理想情况下肯定是做到两者都高,但是一般情况下Precision高、Recall 就低, Recall 高、Precision就低。为了均衡两个指标,我们可以采用Precision和Recall的加权调和平均(weighted harmonic mean)来衡量,即F1 Score 95 | $$ 96 | \frac{1}{F_1}=\frac{1}{2} \cdot (\frac{1}{P}+\frac{1}{R}) \tag{10} 97 | $$ 98 | 99 | $$ 100 | F_1=\frac{2*P*R}{P+R} \tag{11} 101 | $$ 102 | 103 | 104 | ### ROC 105 | ROC全称是"受试者工作特征"(Receiver Operating Characteristic)曲线. ROC曲线为 FPR 与 TPR 之间的关系曲线,这个组合以 FPR 对 TPR,即是以代价 (costs) 对收益 (benefits),显然收益越高,代价越低,模型的性能就越好。 其中ROC曲线的横轴是"假正例率"(False Positive Rate, **FPR**), 纵轴是"真正例率"(True Positive Rate, **TPR**), **注意这里不是上文提高的P和R**. 106 | 107 | - y 轴为真阳性率(TPR):在所有的正样本中,分类器预测正确的比例(等于Recall) 108 | 109 | $$ 110 | TPR=\frac{TP}{TP+FN} \tag{12} 111 | $$ 112 | 113 | - x 轴为假阳性率(FPR):在所有的负样本中,**分类器预测错误的比例** 114 | 115 | 116 | $$ 117 | FPR=\frac{FP}{TN+FP} \tag{13} 118 | $$ 119 | 120 | 121 | 现实使用中,一般使用有限个测试样例绘制ROC曲线,此时需要有有限个(真正例率,假正例率)坐标对. 绘图过程如下: 122 | 1. 给定$m^+$个正例和$m^-$个反例,根据学习器预测结果对样例进行排序,然后将分类阈值设为最大,此时真正例率和假正例率都为0,坐标在(0,0)处,标记一个点. 123 | 2. 将分类阈值依次设为每个样本的预测值,即依次将每个样本划分为正例. 124 | 3. 假设前一个坐标点是(x,y),若当前为真正例,则对应坐标为$(x,y+\frac{1}{m^+})$, 若是假正例,则对应坐标为$(x+\frac{1}{m^-}, y)$ 125 | 4. 线段连接相邻的点. 126 | 127 | ROC曲线如下图(其中对角线对应于"随机猜测"模型): 128 | 129 | ![image-20210616214012974](img/Metrics/image-20210616214012974.png) 130 | 131 | ### AUC 132 | 133 | 对于二分类问题,预测模型会对每一个样本预测一个得分s或者一个概率p。 然后,可以选取一个阈值t,让得分s>t的样本预测为正,而得分s 30 | 31 | 参考资料:https://blog.csdn.net/simple_the_best/article/details/71167786 32 | 33 | ## 2. 什么是过拟合和欠拟合,为什么会出现这个现象 34 | 35 | 过拟合指的是在训练数据集上表现良好,而在未知数据上表现差。如图所示: 36 | 37 | ![img](img/过拟合与欠拟合/247f6539-1c10-75ac-84f8-02d238699dfd.jpg) 38 | 39 | 欠拟合指的是模型没有很好地学习到数据特征,不能够很好地拟合数据,在训练数据和未知数据上表现都很差。 40 | 41 | 过拟合的原因在于: 42 | 43 | - 参数太多,模型复杂度过高; 44 | 45 | - 建模样本选取有误,导致选取的样本数据不足以代表预定的分类规则; 46 | 47 | - 样本噪音干扰过大,使得机器将部分噪音认为是特征从而扰乱了预设的分类规则; 48 | 49 | - 假设的模型无法合理存在,或者说是假设成立的条件实际并不成立。 50 | 51 | 欠拟合的原因在于: 52 | 53 | - 特征量过少; 54 | 55 | - 模型复杂度过低。 56 | 57 | 58 | 59 | ## 3. 怎么解决欠拟合 60 | 61 | - 增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间; 62 | 63 | - 添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强; 64 | 65 | - 减少正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数; 66 | - 使用非线性模型,比如核SVM 、决策树、深度学习等模型; 67 | - 调整模型的容量(capacity),通俗地,模型的容量是指其拟合各种函数的能力; 68 | - 容量低的模型可能很难拟合训练集。 69 | 70 | ## 4. 怎么解决过拟合(重点) 71 | 72 | - 获取和使用更多的数据(数据集增强)——解决过拟合的根本性方法 73 | 74 | - 特征降维:人工选择保留特征的方法对特征进行降维 75 | 76 | - 加入正则化,控制模型的复杂度 77 | 78 | - Dropout 79 | 80 | - Early stopping 81 | 82 | - 交叉验证 83 | - 增加噪声 84 | 85 | ## 5. 为什么参数越小代表模型越简单? 86 | 87 | 因为参数的稀疏,在一定程度上实现了特征的选择。 88 | 89 | 越复杂的模型,越是会尝试对所有的样本进行拟合,甚至包括一些异常样本点,这就容易造成在较小的区间里预测值产生较大的波动,这种较大的波动也反映了在这个区间里的导数很大,而只有较大的参数值才能产生较大的导数。因此复杂的模型,其参数值会比较大。 因此参数越少代表模型越简单。 90 | 91 | ## 6. 为什么L1比L2更容易获得稀疏解?(重点) 92 | 93 | 94 | 95 | ![img](img/过拟合与欠拟合/v2-a026e24156e13a1d14c43df26b9bd2a4_720w.jpg) 96 | 97 | ![img](img/过拟合与欠拟合/v2-f6edae58134c5a26687c3883af48d5d5_720w.jpg) 98 | 99 | ![img](img/过拟合与欠拟合/v2-3aaa69f70754c469bca5c8e4c3e161db_720w.jpg) 100 | 101 | 参考链接: https://www.zhihu.com/question/37096933/answer/475278057 102 | 103 | ## 7. Dropout为什么有助于防止过拟合?(重点) 104 | 105 | * 取平均的作用 106 | 107 | 先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。例如3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。 108 | 109 | * 减少神经元之间复杂的共适应关系 110 | 111 | 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。 112 | 113 | * Dropout类似于性别在生物进化中的角色 114 | 115 | 物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。 116 | 117 | 参考链接:https://zhuanlan.zhihu.com/p/38200980 118 | 119 | ## 8. Dropout在训练和测试时都需要吗? 120 | 121 | Dropout在训练时采用,是为了减少神经元对部分上层神经元的依赖,类似将多个不同网络结构的模型集成起来,减少过拟合的风险。而在测试时,应该用整个训练好的模型,因此不需要dropout。 122 | 123 | ## 9. Dropout如何平衡训练和测试时的差异呢? 124 | 125 | Dropout 在训练时以一定的概率使神经元失活,实际上就是让对应神经元的输出为0。假设失活概率为 p ,就是这一层中的每个神经元都有p的概率失活。 126 | 127 | 例如在三层网络结构中,如果失活概率为0.5,则平均每一次训练有3个神经元失活,所以输出层每个神经元只有3个输入,而实际测试时是不会有dropout的,输出层每个神经元都有6个输入。 128 | 129 | **因此在训练时还要对第二层的输出数据除以(1-p)之后再传给输出层神经元,作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。** 130 | 131 | ## 10. BN和Dropout共同使用时会出现的问题 132 | 133 | BN和Dropout单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2的效果,相反可能会得到比单独使用更差的效果。 134 | 135 | 参考链接:https://www.zhihu.com/tardis/sogou/art/61725100 136 | 137 | ## 11. L1 和 L2 正则先验分别服从什么分布 138 | 139 | 先验就是优化的起跑线, 有先验的好处就是可以在较小的数据集中有良好的泛化性能,当然这是在先验分布是接近真实分布的情况下得到的了,从信息论的角度看,向系统加入了正确先验这个信息,肯定会提高系统的性能。 140 | 141 | L1 正则先验分布是 Laplace 分布,L2 正则先验分布是 Gaussian 分布。 142 | 143 | Laplace 分布公式为: 144 | $$ 145 | f(x)=\frac{1}{2 \lambda} e^{-\frac{|x-\mu|}{\lambda}} 146 | $$ 147 | 148 | 149 | Gaussian 分布公式为: 150 | $$ 151 | f(x)=\frac{1}{\sqrt{2 \pi} \sigma} \exp \left(-\frac{(x-\mu)^{2}}{2 \sigma^{2}}\right) 152 | $$ 153 | 154 | 155 | 对参数引入高斯正态先验分布相当于L2正则化: 156 | 157 | 158 | 159 | ![img](img/过拟合与欠拟合/96b02ee9-c6ab-718f-b358-0a8db26f9cd7.jpg) 160 | 161 | 162 | 163 | 对参数引入拉普拉斯先验等价于 L1正则化: 164 | 165 | 166 | 167 | ![img](img/过拟合与欠拟合/f4a1eb7a-3ce3-7cea-84a0-d569423b2d01.jpg) 168 | 169 | 170 | 171 | 从上面两图可以看出, L2先验趋向零周围, L1先验趋向零本身。 172 | 173 | 参考链接:https://blog.csdn.net/akenseren/article/details/80427471 174 | -------------------------------------------------------------------------------- /AI算法/推荐/FTRL.md: -------------------------------------------------------------------------------- 1 | # FTRL 2 | FTRL(Follow the Regularized Leader) 由Google的H. Berendan McMahan 等人于2010年提出【4】,FTRL是一种在线最优化求解算法,结合L1-FOBOS和L1-RDA算法,用于解决在线学习中,权重参数不能产生较好的稀疏性的问题。 3 | 由于在线学习涉及内容较多,本文从提升模型稀疏性的角度入手,简单介绍经典的TG, L1-FOBOS, L1-RDA 和 FTRL 算法的原理。 4 | 5 | ## 模型稀疏性 6 | 众所周知,Lasso对权重参数(W)引入L1正则项使得模型的训练结果具有稀疏性,稀疏的模型不仅有变量选择的功能,同时在模型线上进行预测时,可以大大减小运算量。但是在在线学习的场景下,利用SGD的方式进行权重参数(W)的更新,每次只使用一个样本,权重参数的更新具有很大的随机性,无法将权重参数准确地更新为0。为解决这一问题,TG, L1-FOBOS, L1-RDA,FTRL 等一系列算法被提出。 7 | 8 | ## TG(Truncated Gradient) 9 | 为了得到具有稀疏性的权重参数(W),最简单的方法就是引入一个阈值,当某个权重参数的值小于该阈值就将其置0。TG方法就是在这个想法的基础上,稍加改进,使用如下式的梯度更新方式。 10 | $$W^{(t+1)}=T_{1}\left(W^{(t)}-\eta^{(t)} G^{(t)}, \eta^{(t)} \lambda^{(t)}, \theta\right)$$ 11 | $$T_{1}\left(v_{i}, \alpha, \theta\right)=\left\{\begin{array}{ll} 12 | \max \left(0, v_{i}-\alpha\right) & \text { if } v_{i} \in[0, \theta] \\ 13 | \min \left(0, v_{i}+\alpha\right) & \text { if } v_{i} \in[-\theta, 0] \\ 14 | v_{i} & \text { otherwise } 15 | \end{array}\right.$$ 16 | 其中$G^{(t)}$是当前参数的梯度,$\eta^{(t)}$是学习率,$\lambda^{(t)}$控制梯度阶段发生的频次,每k次进行一次梯度截断。$\theta$为梯度截断时设置的阈值。通过调节$\lambda,\theta$可以权重参数的稀疏性。 17 | 18 | $$ 19 | \lambda^{(t)}=\left\{ 20 | \begin{aligned} 21 | k\lambda & , & t\ mod\ k = 0 \\ 22 | 0 & , & otherwise 23 | \end{aligned} 24 | \right. 25 | $$ 26 | 27 | ## L1-FOBOS 28 | FOBOS(Forward-Backward Splitting)分两步更新权重。 29 | $$W^{\left(t+\frac{1}{2}\right)}=W^{(t)}-\eta^{(t)} G^{(t)}$$ 30 | $$W^{(t+1)}=\arg \min _{W}\left\{\frac{1}{2}\left\|W-W^{\left(t+\frac{1}{2}\right)}\right\|^{2}+\eta^{\left(t+\frac{1}{2}\right)} \Psi(W)\right\}$$ 31 | 32 | FOBOS的第一步就是正常的梯度下降算法,第二部对W进行调整,引入正则项使得参数具有稀疏性。将以上两部转换为一步,可以有如下表达。 33 | $$W^{(t+1)}=\operatorname{argmin}_{W}\left\{\frac{1}{2}\left\|W-W^{(t)}+\eta^{(t)} G^{(t)}\right\|^{2}+\eta^{\left(t+\frac{1}{2}\right)} \Psi(W)\right\}$$ 34 | 35 | 36 | 实际使用中,将FOBOS中的正则算子$\Psi(W)$替换成$\lambda\Vert W\Vert_{1}$,通过数学推导,最终可以获得如下的梯度新公式。 37 | $$w_i^{(t)}=sgnw_{i}^{(t)}-\eta^{(t)}g_i^{(t)})\max(0, \vert w_{i}^{(t)}-\eta^{(t)}g_i^{(t)}\vert - \eta^{(t+\frac{1}{2})}\lambda)$$ 38 | 从公式中可以发现,一旦权重参数更新后的值$\vert w_{i}^{(t)}-\eta^{(t)}g_i^{(t)}\vert$小于$\eta^{(t+\frac{1}{2})}\lambda$就将改权重参数置0。 39 | 40 | ## L1-RDA 41 | RDA(Regularized Dual Average)是牺牲一定精度,进一步提升权重参数稀疏性的方法,如下是L1-RDA使用的权重参数更新公式。 42 | $$ 43 | W^{(t+1)}=\underset{W}{\arg\min}\{\frac{1}{t}\Sigma_{r=1}^t G^{(r)}\cdot W+\lambda\Vert W\Vert_1 + \frac{\gamma}{2\sqrt t}\Vert W\Vert_{2}^2\} 44 | $$ 45 | 其中$\Sigma_{r=1}^t G^{(r)}$是历史的梯度的平均值。 46 | 通过数学推导L1-RDA有如下等价的参数更新公式。 47 | $$ 48 | w_i^{(t+1)}=\left\{ 49 | \begin{matrix} 50 | 0 \ & , & if \vert \bar{g}_i^{(t)} < \lambda \\ 51 | -\frac{\sqrt{t}}{\gamma}(\bar g _i ^{(t)}-\lambda sgn(\bar g_i^{(t)})) & , & otherwise 52 | \end{matrix} 53 | \right. 54 | $$ 55 | 从公式中可以发现,一旦权重参数的历史平均梯度小于阈值$\lambda$就将该权重参数置0。 56 | ## FTRL 57 | 通常情况下,L1-FOBOS在计算最优解的精度上较高,而L1-RDA在损失一定精度的前提下可以获得更加稀疏的权重参数(W)。FTRL结合L1-FOBOS和L1-RDA的优点而产生的算法。 58 | 通过数学推导,L1-FOBOS可以写为: 59 | $$W^{(t+1)}=\arg \min _{W}\left\{G^{(t)} \cdot W+\lambda\|W\|_{1}+\frac{1}{2 \eta^{(t)}}\left\|W-W^{(t)}\right\|_{2}^{2}\right\}$$ 60 | L1-RDA可以写为: 61 | $$W^{(t+1)}=\arg \min _{W}\left\{G^{(1: t)} \cdot W+t \lambda\|W\|_{1}+\frac{1}{2 \eta^{(t)}}\|W-0\|_{2}^{2}\right\}$$ 62 | $$其中G^{(1: t)}=\Sigma_i^t G^{(i)}$$ 63 | 64 | FTRL结合上两时,可以写作: 65 | $$W^{(t+1)}=\arg \min _{W}\left\{G^{(1: t)} \cdot W+\lambda_{1}\|W\|_{1}+\lambda_{2} \frac{1}{2}\|W\|_{2}^{2}+\frac{1}{2} \sum_{\mathrm{s}=1} \sigma^{(s)}\left\|W-W^{(s)}\right\|_{2}^{2}\right\}$$ 66 | $其中引入\Vert W\Vert_2^2不会影响稀疏性,同时会使解更加“光滑”。$ 67 | 68 | 通过数学推导,FTRL有如下表达形式: 69 | $$w_{i}^{(t+1)}=\left\{\begin{array}{ll} 70 | 0 & \text { if }\left|z_{i}^{(t)}\right|<\lambda_{1} \\ 71 | -\left(\lambda_{2}+\sum_{s=1}^{t} \sigma^{(s)}\right)^{-1}\left(z_{i}^{(t)}-\lambda_{1} \operatorname{sgn}\left(z_{i}^{(t)}\right)\right) & \text { otherwise } 72 | \end{array}\right.$$ 73 | $$Z^{(t)}=G^{(1: t)}-\sum_{s=1}^{t} \sigma^{(s)} W^{(s)}$$ 74 | 75 | ##总结 76 | 本文简单梳理了在线学习中提升权重参数稀疏性的算法的思想,公式较为繁多。对其中的基础知识和公式推导感兴趣的小伙伴可以参考冯扬的《在线最优化求解》【1】,对于FTRL的工程实现感兴趣的小伙伴可以参阅H. Brendan McMahan 等人于2013发表的论文【2】 ,【3】是2011年发表的一篇关于FTRL和FOBOS, RDA比较的论文。 77 | 78 | ##参考文献 79 | 【1】[冯扬————在线最优化解法](https://wenku.baidu.com/view/a76c760c4b7302768e9951e79b89680203d86bcc.html) 80 | 【2】[Ad Click Prediction: a View from the Trenches](https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/41159.pdf) 81 | 【3】[Follow-the-Regularized-Leader and Mirror Descent: Equivalence Theorems and Implicit Updates](https://arxiv.org/abs/1009.3240v1) 82 | 【4】[Adaptive Bound Optimization for Online Convex Optimization](https://arxiv.org/abs/1002.4908) -------------------------------------------------------------------------------- /AI算法/推荐/Graph_Embedding.md: -------------------------------------------------------------------------------- 1 | # Graph Embedding 2 | 在许多推荐场景下,可以用网络结构数据来刻画对象(用户、商品等)之间的关系。例如:可以将用户和商品作为网络中的结点,用户和商品之间的边代表购买关系。 3 | 4 | Graph Embedding 是一种将网络中对象之间的关系转换为每个对象的(向量)特征的一种技术。其主要想法是输入网络后,为每个对象生成一个(向量)特征,满足在网络中越相似的对象,其向量特征之间距离越接近。 5 | 6 | 下面主要介绍DeepWalk和Node2Vec两种Graph Embedding 算法。这两种算法利用网络生成对象序列后,采用word2vec算法生成对象的Graph Embedding。 7 | 8 | ## 1. Deep Walk 9 | DeepWalk 主要由RandomWalk 和 Word2Vec 两部分组成。RandomWalk 用于生成结点(对象)序列,Word2Vec利用结点序列生成对象的Embedding。 10 | 11 | 在RandomWalk中,给定网络中以任意一点为起点,每次在当前结点的邻居中等概率选择一个节点放入已生成的序列中,并把该结点作为下一个结点重复上述采样过程,直到获得的序列长度达到预设的要求。 12 | 13 | 在获得足够多的结点序列后,使用Word2Vec算法生成每个对象的Embedding。在论文中使用Word2Vec中的SkipGram算法。 14 | 15 | 具体算法如下所示。 16 | 17 |
18 | 19 |
20 | 21 | 在DeepWalk中使用深度优先的方式生成对象序列,为了丰富对网络中相似结点的含义,也可以尝试用广度优先的方式生成对象序列。Node2Vec 就是一种在生成对象序列时结合深度优先和广度优先的算法。 22 | 23 | ## 2. Node2Vec 24 | ### 2.1 序列生成算法 25 | Node2Vec 在RandomWalk的基础上引入search bias $\alpha$,通过调节超参数$\alpha$,控制对象序列生成过程中广度优先和深度优先的强度。 26 | 27 | RandomWalk的搜索方法比较朴素。在相邻结点之间根据边的权重或者其他业务理解定义转移概率。特别地,DeepWalk 采用等概率的方式搜索下一个结点。转移概率可以有如下的表达形式。 28 | 29 |
30 | 31 |
32 | 33 | 进一步,Node2Vec在未归一化的转移概率$\pi_{vx}$之前乘以偏置项$\alpha$,来反映序列生成算法对于深度优先和广度优先的偏好。以下是偏置项$\alpha$的具体表达形式。 34 | 35 |
36 | 37 |
38 | 39 | 其中$d_{tx}$为顶点$t$和顶点$x$之间的最短路径长度,$p, q$控制深度优先和广度优先的强度。 40 | 41 | 假设当前随机游走经过边$(t,x)$后达到顶点$v$,以$\pi_{vx}=\alpha_{pq}(t,x)\omega_{vx}$的未归一化概率搜索下一个结点。 42 | 43 |
44 | 45 |
46 | 47 | 偏置项$\alpha$受到超参数p和q的控制,具体来说p, q的大小会对搜索策略产生如下影响。 48 | 49 | Return parameter p的影响: 50 | 1. 超参数p影响回到之前结点t的概率大小。如果p越小,则回到之前结点t的概率越大,搜索策略越倾向于在初始结点的附近进行搜索。 51 | 52 | In-out parameter q的影响: 53 | 1. 超参数q控制着搜索算法对于广度优先和深度优先的偏好。从示意图中,我们可以看到q越小,越倾向于搜索远离初始结点t,与倾向于深度优先的方式。 54 | 55 | ### 2.2 Embedding学习 56 | Node2vec 采用和SkipGram类似的想法,学习从节点到embedding的函数$f$,使得给定结点$u$,其近邻结点$N_S(u)$的出现的概率最大。近邻结点的是由序列生成算法获得的一系列点。具体数学表达如下。 57 | 58 |
59 | 60 |
61 | 62 | 在原文中使用了条件独立性假设和特征空间独立行假设,并使用softmax函数来表示概率,将上述优化问题化简为容易求解的优化问题。采用SGD算法获得生成Embedding的函数$f$。具体的化简过程可以参考原文。 63 | 64 | 如下是Node2Vec的整个算法过程,其中采用了时间复杂度为O(1)的alias采样方法,具体可以参考[2]。 65 | 66 |
67 | 68 |
69 | 70 | ## 面试真题 71 | 1. 请结合业务谈一下怎样在推荐场景中建立网络。 72 | 2. 在Node2Vec建立对象序列的过程中,怎样实现深度优先和广度优先的? 73 | 74 | ## 参考文献 75 | 1. [浅梦的学习笔记——DeepWalk](https://blog.csdn.net/u012151283/article/details/86806922) 76 | 2. [浅梦的学习笔记——Node2Vec](https://blog.csdn.net/u012151283/article/details/87081272) 77 | 3. [《深度学习推荐系统》——王喆著](https://zhuanlan.zhihu.com/p/119248677?utm_source=zhihu&utm_medium=social&utm_oi=26827615633408) 78 | 4. [DeepWalk: Online Learning of Social Representations](http://www.perozzi.net/publications/14_kdd_deepwalk.pdf) 79 | 5. [node2vec: Scalable Feature Learning for Networks](https://arxiv.org/abs/1607.00653) 80 | -------------------------------------------------------------------------------- /AI算法/推荐/collaborative_filtering.md: -------------------------------------------------------------------------------- 1 | Author: Summer; Email: huangmeihong11@sina.com 2 | # 协同过滤(collaborative filtering) 3 | ## 直观解释 4 | 协同过滤是推荐算法中最常用的算法之一,它根据user与item的交互,发现item之间的相关性,或者发现user之间的相关性,进行推荐。比如你有位朋友看电影的爱好跟你类似,然后最近新上了《调音师》,他觉得不错,就会推荐给你,这是最简单的基于user的协同过滤算法(user-based collaboratIve filtering),还有一种是基于item的协同过滤算法(item-based collaborative filtering),比如你非常喜欢电影《当幸福来敲门的时候》,那么观影系统可能会推荐一些类似的励志片给你,比如《风雨哈佛路》等。如下主要分析user-based,item-based同理。 5 | 6 | ## 导图 7 | ![图片](https://uploader.shimo.im/f/8mslGdORa5YzVRXW!thumbnail) 8 | ## 核心公式 9 | * 符号定义 10 | $r_{u,i}$:user $u$ 对 item $i$ 的评分 11 | $\bar{r}_{u}$:user $u$ 的平均评分 12 | $P_{a,b}$:用户$a,b$都有评价的items集合 13 | 14 | * 核心公式 15 | 1. item-based CF 邻域方法预测公式 16 | $$\operatorname{Pred}(u, i)=\overline{r}_{u}+\frac{\sum_{j \in S_{i}}\left(\operatorname{sim}(i, j) \times r_{u, j}\right)}{\sum_{j \in S_{i}} \operatorname{sim}(i, j)}$$ 17 | 18 | 1. 偏差优化目标 19 | $$\min _{b} \sum_{(u, i) \in K}\left(r_{(u, i)}-\mu-b_{u}-b_{i}\right)^{2}$$ 20 | 其中$(u,i) \in K$表示所有的评分,$\mu$总评分均值,$b_u$为user $u$的偏差,$b_i$为item $i$ 的偏差。 21 | 22 | 1. - 加入正则项后的Funk SVD 优化公式 23 | $$\min _{u v} \sum_{(u, i) \in k n o w n}\left(r_{u,i}-u_{u} v_{i}\right)+\lambda\left(|u|^{2}+|v|^{2}\right)$$ 24 | 其中$u_u$为user $u$的偏好,即为user特征矩阵$U$的第$u$行,$v_i$为item $i$的特征,即为特征矩阵$V$的第$i$列 25 | ## 注意要点 26 | * 相似度与距离之间的关系 27 | 距离越大,相似度越小;距离越小,相似度越高。即在求解最大相似度的时候可以转为求解最小距离。 28 | 29 | * 在协同过滤中,常用的相似度函数有哪些,简要说明 30 | * 杰卡德相似度(Jaccard similarity) 31 | 公式: 32 | $$sim_{jaccard}(u_{1}, u_{2})=\frac{ \text {items} \text { bought by } u_{1}\ and\ u_{2}}{ \text { items bought by } u_{1}\ or\ u_{2}}$$ 33 | 适用于二元情况,即定性情况,比如买或者没买,喜欢或者不喜欢,在数据稀疏的情况,可以转为二元应用。 34 | * 余弦相似度 35 | 公式:$$\operatorname{sim}(u_{1}, u_{2})=\frac{r_{u_{1}} \cdot r_{u_{2}}}{\left|r_{u_{1}}\right|_{2}|r_{u_{2}}|_{2}}=\frac{\sum_{i \in P_{u_1,u_2}} r_{u_{1}, i} r_{u_{2}, i}}{\sqrt{\sum_{i \in P_{u_1}} r_{u_{1},i}^{2}} \sqrt{\sum_{i \in P_{u_2}}r_{u_{2},i}^{2}}}$$ 36 | 考虑不同用户的评价范围不一样,比如乐天派一般评分范围一般会高于悲观的人,会将评分进行去中心化再进行计算,即 37 | * 修正余弦相似度,公式变为 38 | $$\operatorname{sim}(u_{1}, u_{2})=\frac{r_{u_{1}} \cdot r_{u_{2}}}{\left|r_{u_{1}}\right|_{2}|r_{u_{2}}|_{2}}=\frac{\sum_{i \in P_{u_1,u_2}} (r_{u_{1}, i}-{\bar{r}_{u_{1}}}) (r_{u_{2}, i}-\bar{r}_{u_2})}{\sqrt{\sum_{i \in P_{u_1}} (r_{u_{1},i}-\bar{r}_{u_{1}})^{2}} \sqrt{\sum_{i \in P_{u_2}}(r_{u_{2},i}-\bar{r}_{u_{2}})^{2}}}$$ 39 | 适用于定量情况,比如评分场景,要求数据具有一定的稠密度。注意如果计算一个评价很少电影的用户与一个评价很多电影的用户会导致相似度为0. 40 | * 皮尔森相关系数 41 | 公式: 42 | $$\operatorname{sim}(u_1, u_2)=\frac{\sum_{i \in P_{u_1.u_2}}\left(r_{u_1, i}-\overline{r}_{u_1}\right)\left(r_{u_2, i}-\overline{r}_{u_2}\right)}{\sqrt{\sum_{i \in P_{u_1.u_2}}\left(r_{u_1, i}-\overline{r}_{u_1}\right)^{2}} \sqrt{\sum_{i \in P_{u_1.u_2}}\left(r_{u_2, i}-\overline{r}_{u_2}\right)^{2}}}$$ 43 | 皮尔森系数跟修正的余弦相似度几乎一致,两者的区别在于分母上,皮尔逊系数的分母采用的评分集是两个用户的共同评分集(就是两个用户都对这个物品有评价),而修正的余弦系数则采用两个用户各自的评分集。 44 | * $L_{p}-norms$ 45 | 公式:$$sim(u_1,u_2) =\frac{1}{ \sqrt[p]{| r_{u_1}-r_{u_2} |^p}+1}$$ 46 | $p$取不同的值对应不同的距离公式,空间距离公式存在的不足这边也存在。对数值比较敏感。 47 | * 有了相似度测量后,那么基于邻域的推荐思路是怎样的呢? 48 | 过滤掉被评论较少的items以及较少评价的users,然后计算完users之间的相似度后,寻找跟目标user偏好既有大量相同的items,又存在不同的items的近邻几个users(可采用K-top、阈值法、聚类等方式),然后进行推荐。步骤如下: 49 | (1) 选择:选出最相似几个用户,将这些用户所喜欢的物品提取出来并过滤掉目标用户已经喜欢的物品 50 | (2) 评估:对余下的物品进行评分与相似度加权 51 | (3) 排序:根据加权之后的值进行排序 52 | (4) 推荐:由排序结果对目标用户进行推荐 53 | 54 | * 协同过滤算法具有特征学习的特点,试解释原理以及如何学习 55 | 1. 特征学习:把users做为行,items作为列,即得评分矩阵$R_{m,n}=[r_{i,j}]$,通过矩阵分解的方式进行特征学习,即将评分矩阵分解为$R=U_{m,d}V_{d,n}$,其中$U_{m,d}$为用户特征矩阵,$V_{d,n}$表示items特征矩阵,其中$d$表示对items进行$d$个主题划分。举个简单例子,比如看电影的评分矩阵划分后,$U$中每一列表示电影的一种主题成分,比如搞笑、动作等,$V$中每一行表示一个用户的偏好,比如喜欢搞笑的程度,喜欢动作的程度,值越大说明越喜欢。这样,相当于,把电影进行了主题划分,把人物偏好也进行主题划分,主题是评分矩阵潜在特征。 56 | 2. 学习方式 57 | 3. - SVD,分解式为 $$R_{m,n}=U_{m,m}\Sigma_{m,n}V_{n,n}^T$$ 58 | 其中$U$为user特征矩阵,$\Sigma$为权重矩阵体现对应特征提供的信息量,$V$为item特征矩阵。同时可通过SVD进行降维处理,如下 59 | ![图片](https://uploader.shimo.im/f/dk4h20R8bkQUajmh!thumbnail) 60 | 奇异值分解的方式,便于处理要目标user(直接添加到用户特征矩阵的尾部即可),然而要求评分矩阵元素不能为空,因此需要事先进行填充处理,同时由于user和item的数量都比较多,矩阵分解的方式计算量大,且矩阵为静态的需要随时更新,因此实际中比较少用。 61 | 4. - Funk SVD, Funk SVD 是去掉SVD的$\Sigma$成分,优化如下目标函数,可通过梯度下降法,得到的$U,V$矩阵 62 | $$J=\min _{u v} \sum_{(u, i) \in k n o w n}\left(r_{u,i}-u_{u} v_{i}\right)+\lambda\left(|u|^{2}+|v|^{2}\right)$$ 63 | Funk SVD 只要利用全部有评价的信息,不需要就空置进行处理,同时可以采用梯度下降法,优化较为方便,较为常用。 64 | 65 | 有了user特征信息和item特征信息,就可用$u_{u} v_{i}$对目标用户进行评分预测,如果目标用户包含在所计算的特征矩阵里面的话。针对于新user、新item,协同过滤失效。 66 | 67 | * 如何简单计算user偏差以及item偏差? 68 | $$b_u=\frac{1}{|I_u|}\sum_{i \in I_u}(r_{u,i}-\mu) \ 69 | b_i=\frac{1}{|U_i|}\sum_{u \in U_i}(r_{u,i}-b_u-\mu) 70 | $$ 71 | 72 | * 如何选择协同过滤算法是基于user还是基于item 73 | 一般,谁的量多就不选谁。然而基于user的会给推荐目标带来惊喜,选择的范围更为宽阔,而不是基于推荐目标当前的相似item。因此如果要给推荐目标意想不到的推荐,就选择基于user的方式。可以两者结合。 74 | 75 | 76 | * 协同过滤的优缺点 77 | 1. 缺点: 78 | (1)稀疏性—— 这是协同过滤中最大的问题,大部分数据不足只能推荐比较流行的items,因为很多人只有对少量items进行评价,而且一般items的量非常多,很难找到近邻。导致大量的user木有数据可推荐(一般推荐比较流行的items),大量的item不会被推荐 79 | (2)孤独用户——孤独user具有非一般的品味,难以找到近邻,所以推荐不准确 80 | (3) 冷启动——只有大量的评分之后,才能协同出较多信息,所以前期数据比较少,推荐相对不准确;而如果没有人进行评分,将无法被推荐 81 | (4)相似性——协同过滤是与内容无关的推荐,只根据用户行为,所以倾向于推荐较为流行的items。 82 | 83 | * 优点: 84 | (1)不需要领域知识,存在users和items的互动,便能进行推荐 85 | (2)简单易于理解 86 | (3)相似度计算可预计算,预测效率高 87 | 88 | * 协同过滤与关联规则的异同 89 | 关联规则是不考虑tems或者使用它们的users情况下分析内容之间的关系,而协同过滤是不考虑内容直接分析items之间的关系或者users之间的关系。两者殊途同归均能用于推荐系统,但是计算方式不同。 90 | 91 | * 实践中的一些注意点 92 | (1) 过滤掉被评价较少的items 93 | (2) 过滤掉评价较少的users 94 | (3) 可用聚类方式缩小搜索空间,但是面临找不到相同偏好的用户(如果用户在分界点,被误分的情况),这种方式通过缩小搜索空间的方式优化协同过滤算法 95 | (4) 使用的时候,可以考虑时间范围,偏好随着时间的改变会改变 96 | 97 | ## 面试真题 98 | 使用协同过滤算法之前,数据应该如何进行预处理? 99 | 协同过滤的方式有哪些? 100 | 如何通过相似度计算设计协同过滤推荐系统? 101 | 请谈谈你对协同过滤中特征学习的理解? 102 | 如何将协同过滤用于推荐系统? 103 | FUNK SVD相对于SVD有哪些优势? 104 | 如何求解FUNK SVD? 105 | 请描述下协同过滤的优缺点? 106 | -------------------------------------------------------------------------------- /AI算法/推荐/deepfm.md: -------------------------------------------------------------------------------- 1 | # DeepFM 2 | 3 | 4 | 5 | 6 | 7 | DeepFM模型是2017年由哈工大与华为联合提出的模型,是对Wide&Deep模型的改进。与DCN不同的是,DeepFM模型是将Wide部分替换为了FM模型,增强了模型的低阶特征交互的能力。关于低阶特征交互,文章的Introduction中也提到了其重要性,例如: 8 | 9 | 1、用户经常在饭点下载送餐APP,故存在一个2阶交互:app种类与时间戳; 10 | 11 | 2、青少年喜欢射击游戏和RPG游戏,存在一个3阶交互:app种类、用户性别和年龄; 12 | 13 | 用户背后的特征交互非常的复杂,低阶和高阶的特征交互都是很重要的,这也证明了Wide&Deep这种模型架构的有效性。DeepFM是一种**端到端的模型**,强调了包括低阶和高阶的特征交互接下来直接对DeepFM模型架构进行介绍,并与其他之前提到过的模型进行简单的对比。 14 | 15 | 16 | 17 | ## 模型结构 18 | 19 | DeepFM的模型结构非常简单,由Wide部分与Deep部分共同组成,如下图所示: 20 | 21 | 22 | 23 | 在论文中模型的目标是**共同学习低阶和高阶特征交互**,应用场景依旧是CTR预估,因此是一个二分类任务($y=1$表示用户点击物品,$y=0$则表示用户未点击物品) 24 | 25 | ### Input与Embedding层 26 | 27 | 关于输入,包括离散的分类特征域(如性别、地区等)和连续的数值特征域(如年龄等)。分类特征域一般通过one-hot或者multi-hot(如用户的浏览历史)进行处理后作为输入特征;数值特征域可以直接作为输入特征,也可以进行离散化进行one-hot编码后作为输入特征。 28 | 29 | 对于每一个特征域,需要单独的进行Embedding操作,因为每个特征域几乎没有任何的关联,如性别和地区。而数值特征无需进行Embedding。 30 | 31 | Embedding结构如下: 32 | 33 | 34 | 35 | 36 | 37 | 文章中指出每个特征域使用的Embedding维度$k$都是相同的。 38 | 39 | 【注】与Wide&Deep不同的是,DeepFM中的**Wide部分与Deep部分共享了输入特征**,即Embedding向量。 40 | 41 | 42 | 43 | #### Wide部分---FM 44 | 45 | 46 | 47 | 48 | 49 | FM模型[^4]是2010年Rendle提出的一个强大的**非线性分类模型**,除了特征间的线性(1阶)相互作用外,FM还将特征间的(2阶)相互作用作为各自特征潜向量的内积进行j建模。通过隐向量的引入使得FM模型更好的去处理数据稀疏行的问题,想具体了解的可以看一下原文。DeepFM模型的Wide部分就直接使用了FM,Embedding向量作为FM的输入。 50 | 51 | $$ 52 | y_{F M}=\langle w, x\rangle+\sum_{j_{1}=1}^{d} \sum_{j_{2}=j_{1}+1}^{d}\left\langle V_{i}, V_{j}\right\rangle x_{j_{1}} \cdot x_{j_{2}} 53 | $$ 54 | 其中$w \in \mathbf{R}^d$,$\langle w, x\rangle$表示1阶特征,$V_i \in \mathbf{R}^k$表示第$i$个隐向量,$k$表示隐向量的维度,$$\displaystyle\sum_{j_{1}=1}^{d} \sum_{j_{2}=j_{1}+1}^{d}\left\langle V_{i}, V_{j}\right\rangle x_{j_{1}} \cdot x_{j_{2}}$$表示2阶特征。 55 | 56 | 具体的对于2阶特征,FM论文中有下述计算(采取原文的描述形式),为线性复杂复杂度$O(kn)$: 57 | $$ 58 | \begin{aligned} & \sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j} \\=& \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j}-\frac{1}{2} \sum_{i=1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{i}\right\rangle x_{i} x_{i} \\=& \frac{1}{2}\left(\sum_{i=1}^{n} \sum_{j=1}^{n} \sum_{f=1}^{k} v_{i, f} v_{j, f} x_{i} x_{j}-\sum_{i=1}^{n} \sum_{f=1}^{n} v_{i, f} v_{i, f} x_{i} x_{i}\right) \\=& \frac{1}{2} \sum_{f=1}^{k}\left(\left(\sum_{i=1}^{n} v_{i, f} x_{i}\right)\left(\sum_{j=1}^{n} v_{j, f} x_{j}\right)-\sum_{i=1}^{n} v_{i, f}^{2} x_{i}^{2}\right) \\=& \frac{1}{2} \sum_{f=1}^{k}\left(\left(\sum_{i=1}^{n} v_{i, f} x_{i}\right)^{2}-\sum_{i=1}^{n} v_{i, f}^{2} x_{i}^{2}\right) \end{aligned} 59 | $$ 60 | 61 | #### Deep部分 62 | 63 | 64 | 65 | Deep部分是一个前向传播的神经网络,用来学习高阶特征交互。 66 | 67 | 68 | 69 | ### Output层 70 | 71 | FM层与Deep层的输出相拼接,最后通过一个逻辑回归返回最终的预测结果: 72 | $$ 73 | \hat y=sigmoid(y_{FM}+y_{DNN}) 74 | $$ 75 | 76 | 77 | 78 | ## 面试相关 79 | 80 | 1、Wide&Deep与DeepFM的区别? 81 | 82 | Wide&Deep模型,Wide部分采用人工特征+LR的形式,而DeepFM的Wide部分采用FM模型,包含了1阶特征与二阶特征的交叉,且是端到端的,无需人工的特征工程。 83 | 84 | 85 | 86 | 2、DeepFM的Wide部分与Deep部分分别是什么?Embedding内容是否共享 87 | 88 | Wide:FM,Deep:DNN; 89 | 90 | Embedding内容是共享的,在FM的应用是二阶特征交叉时的表征。 91 | 92 | -------------------------------------------------------------------------------- /AI算法/推荐/gbdt_lr.md: -------------------------------------------------------------------------------- 1 | # gbdt lr 2 | gbdt+lr是facebook提出在线广告模型,我们知道LR之前在广告和推荐系统由于其快速的计算 3 | 而被广泛使用,使用由于lr是线性模型,其模型表现能力不强,需要做大量的特征工程。 4 | facebook提出提出使用决策树进行特征embedding。 5 | 为了提升线性分类器的准确度,有两种方法进行特征变换: 6 | 1. 对于连续特征。先进行离散化bin,然后把bin的编号作为离散型特征。这样的话,线性模型可以分段的学习到一个非线性的映射,在每一段内的映射是不变的。另外,对于bin边界的学习非常重要 7 | 2. 对于离散特征。做笛卡尔积,生成的是tuple input features。笛卡尔积穷举了所有的特征组合,其中也包含部分没用的组合特征,不过可以筛选出来。 8 | 提升决策树(boosted decision tree)就可以很方便很好的实现上面我们说的这种非线性和tuple特征变换。对于一个样本,针对每一颗树得到一个类别型特征。该特征取值为样本在树中落入的叶节点的编号。举例来说: 9 | 10 | 上图中的提升决策树包含两棵子树,第一棵树包含3个叶节点,第二棵树包含2个叶节点。输入样本x,在两棵树种分别落入叶子节点2和叶子节点1。那么特征转换就得到特征向量[0 1 0 1 0]。也就是说,把叶节点编号进行one-hot编码。 11 | 那么, 怎么样直观的理解这种特征变化: 12 | + 看做是一种有监督的特征编码。把实值的vector转换成紧凑的二值的vector。 13 | + 从根节点到叶节点的一条路径,表示的是在特征上的一个特定的规则。所以,叶节点的编号代表了这种规则。表征了样本中的信息,而且进行了非线性的组合变换。 14 | + 最后再对叶节点编号组合,相当于学习这些规则的权重。 15 | 16 | # 核心思想 17 | 1. 数据更新 18 | > 由于推荐和广告等相关的问题,是一个动态的环境,需要对模型进行实时更新,所有对于lr进行在线学习和更新,gbdt可以每天或者几天更新一次。 19 | 2. 在线学习的学习率如何设置 20 | > 一般情况有很多学习率更新的方法,可以根据当前系统进行实验得到最好的学习率设置策略。论文中给出一下几种方法: 21 | + Per-coordinate learning rate: 22 | $$\eta_{t,i}=\frac{\alpha}{\beta+\sqrt{\sum_{j=1}^{t}}\bigtriangledown_{j,i}^2}$$ 23 | 其中,$\alpha, \beta$是两个超参数. 24 | + Per-weight square root learning rate: 25 | $$\eta_{t,i}=\frac{\alpha}{\sqrt{n_{t,i}}}$$ 26 | 其中,$n_{t,i}$是特征i所有实例的前t次的总和。 27 | + Per-weight learning rate: 28 | $$\eta_{t,i}=\frac{\alpha}{n_{t,i}}$$ 29 | + Global learning rate: 30 | $$\eta_{t,i}=\frac{\alpha}{\sqrt{t}}$$ 31 | + Constant learning rate: 32 | $$\eta_{t,i}=\alpha$$ 33 | 3. 为了保证数据的新鲜性,需要进行在线数据加入,所有的曝光的实例,设置时间t,在时间t内被点击设置为label=1,否则设置label=0,注意时间t不能太大也不能太小,根据现实业务进行设置. 34 | 35 | 4. 样本的均匀采样和负样本数据的下采样,由于负样本太多需要对负样本进行下采样。 36 | 37 | 5. Model Re-Calibration 38 | > 负样本欠采样可以加快训练速度并提升模型性能。但是同样带来了问题:改变了训练数据分布。所以需要进行校准。 39 | $$q=\frac{p}{p+(1-p)/w}$$ 40 | 其中: 41 | + w是采样率 42 | + p是在采样后空间中给出的CTR预估值 43 | + 计算得到的q就是修正后的结果 44 | 45 | # 面试十问 46 | 1. lr的权重个数和gbdt的什么有关? 47 | > lr的权重个数,等于gbdt所有叶子节点的个数. 48 | 49 | 2. 负样本欠采样之后会对模型有什么影响,怎么解决? 50 | > 负样本欠采样可以加快训练速度并提升模型性能。但是同样带来了问题:改变了训练数据分布。所以需要进行校准。 51 | > $$q=\frac{p}{p+(1-p)/w}$$ 52 | 53 | 3. GBDT特征的重要性是如何评估的? 54 | > 特征j的全局重要度通过特征j在单颗树中的重要度的平均值来衡量: 55 | > $$\hat J_j^2=\frac{1}{M}\sum_{m=1}^{M}\hat J_j^2(T_m)$$ 56 | > 其中,M是树的数量,特征j在单棵树中的重要度如下: 57 | > $$\hat J_j^2(T)=\sum_{t=1}^{L-1}\hat i_j^2 I(v_t=j)$$ 58 | 59 | 4. gbdt+lr如何训练 60 | > 一般是先训练gbdt在训练lr,首先将数据data分成两部分a和b,a用来训练gbdt,b用来训练lr。其中用a训练gbdt的时候,需要将a分成train_a, valid_a, test_a, 得到gbdt之后。将b通过gbdt得到所有对应叶子节点的下标进行one-hot编码. 61 | > 继续训练b,将b通过gbdt得到update_b, 将update_b分成训练、验证和测试集,训练得到LR. 62 | 63 | 5. 为什么建树采用ensemble决策树? 64 | > 一棵树的表达能力很弱,不足以表达多个有区分性的特征组合,多棵树的表达能力更强一些。GBDT每棵树都在学习前面棵树尚存的不足,迭代多少次就会生成多少颗树。按paper以及Kaggle竞赛中的GBDT+LR融合方式,多棵树正好满足LR每条训练样本可以通过GBDT映射成多个特征的需求。 65 | 66 | 6. 为什么建树采用GBDT而非RF? 67 | > RF也是多棵树,但从效果上有实践证明不如GBDT。且GBDT前面的树,特征分裂主要体现对多数样本有区分度的特征;后面的树,主要体现的是经过前N颗树,残差仍然较大的少数样本。优先选用在整体上有区分度的特征,再选用针对少数样本有区分度的特征,思路更加合理,这应该也是用GBDT的原因。 68 | 69 | 7. GBDT与LR融合方案 70 | > AD ID类特征在CTR预估中是非常重要的特征,直接将AD ID作为feature进行建树不可行,故考虑为每个AD ID建GBDT树。但互联网时代长尾数据现象非常显著,广告也存在长尾现象,为了提升广告整体投放效果,不得不考虑长尾广告。在GBDT建树方案中,对于曝光充分训练样本充足的广告,可以单独建树,发掘对单个广告有区分度的特征,但对于曝光不充分样本不充足的长尾广告,无法单独建树,需要一种方案来解决长尾广告的问题。 71 | 72 | > 综合考虑方案如下,使用GBDT建两类树,非ID建一类树,ID建一类树。 73 | 74 | > 1)非ID类树:不以细粒度的ID建树,此类树作为base,即便曝光少的广告、广告主,仍可以通过此类树得到有区分性的特征、特征组合。 75 | 76 | > 2)ID类树:以细粒度 的ID建一类树,用于发现曝光充分的ID对应有区分性的特征、特征组合。如何根据GBDT建的两类树,对原始特征进行映射?以如下图3为例,当一条样本x进来之后,遍历两类树到叶子节点,得到的特征作为LR的输入。当AD曝光不充分不足以训练树时,其它树恰好作为补充。 77 | 78 | 79 | # 面试真题 80 | 1. 为什么建树采用GBDT而非RF? 81 | 82 | # 参考 83 | 1. https://blog.csdn.net/u010352603/article/details/80681100 84 | 2. http://www.cbdio.com/BigData/2015-08/27/content_3750170.htm 85 | 3. https://blog.csdn.net/u014297722/article/details/89420421 -------------------------------------------------------------------------------- /AI算法/推荐/向量化搜索.md: -------------------------------------------------------------------------------- 1 | # 向量化搜索 2 | 3 | 在高维空间内快速搜索最近邻(Approximate Nearest Neighbor)。召回中,Embedding向量的搜索。 4 | 5 | FAISS、kd-tree、局部敏感哈希、【Amnoy、HNSW】 6 | 7 | 8 | 9 | ## FAISS 10 | 11 | faiss是Facebook的AI团队开源的一套用于做聚类或者相似性搜索的软件库,底层是用C++实现。Faiss因为超级优越的性能,被广泛应用于推荐相关的业务当中。 12 | 13 | faiss工具包一般使用在推荐系统中的向量召回部分。在做向量召回的时候要么是u2u,u2i或者i2i,这里的u和i指的是user和item。我们知道在实际的场景中user和item的数量都是海量的,最容易想到的基于向量相似度的召回就是使用两层循环遍历user列表或者item列表计算两个向量的相似度,但是这样做在面对海量数据是不切实际的,faiss就是用来加速计算某个查询向量最相似的topk个索引向量。 14 | 15 | **faiss查询的原理:** 16 | 17 | faiss使用了PCA和PQ(Product quantization乘积量化)两种技术进行向量压缩和编码,当然还使用了其他的技术进行优化,但是PCA和PQ是其中最核心部分。 18 | 19 | ### **主要流程** 20 | 21 | - 构建索引`index` 22 | - 根据不同索引的特性,对索引进行训练(`train`) 23 | - `add` 添加`xb`数据到索引 24 | - 针对`xq`进行搜索`search`操作 25 | 26 | ### Example 27 | 28 | 1、数据集 29 | 30 | ```python 31 | d = 64 # dimension 32 | nb = 100000 # 完整数据集 33 | nq = 10000 # 查询数据 34 | np.random.seed(1234) 35 | xb = np.random.random((nb, d)).astype('float32') 36 | xb[:, 0] += np.arange(nb) / 1000. 37 | xq = np.random.random((nq, d)).astype('float32') 38 | xq[:, 0] += np.arange(nq) / 1000. 39 | ``` 40 | 41 | 2、构建索引 42 | 43 | Faiss围绕`Index`对象构建。它封装了数据库向量集,并可选地对其进行预处理以提高搜索效率。索引的类型很多,我们将使用最简单的索引,它们仅对它们执行暴力L2距离搜索:`IndexFlatL2`。 44 | 45 | `d`在我们的例子中,所有索引都需要知道何时建立索引,即它们所操作的向量的维数 46 | 47 | ```python 48 | index = faiss.IndexFlatL2(d) # build the index 49 | ``` 50 | 51 | 3、对索引进行训练 52 | 53 | 然后,大多数索引还需要训练阶段,以分析向量的分布。对于`IndexFlatL2`,我们可以跳过此操作。 54 | 55 | 4、添加数据到索引 56 | 57 | 构建和训练索引后,可以对索引执行两项操作:`add`和`search`。 58 | 59 | 将元素添加到索引,我们称之为`add`上`xb`。我们还可以显示索引的两个状态变量:`is_trained`,指示是否需要训练的布尔值,以及`ntotal`索引向量的数量。 60 | 61 | 一些索引还可以存储与每个向量相对应的整数ID(但不能存储`IndexFlatL2`)。如果未提供ID,则`add`只需将向量序号用作ID,即。第一个向量为0,第二个为1,依此类推。 62 | 63 | ```python 64 | index.add(xb) # add vectors to the index 65 | ``` 66 | 67 | 5、对查询数据进行搜索操作 68 | 69 | 可以对索引执行的基本搜索操作是`k`-最近邻搜索,即。对于每个查询向量,`k`在数据库中找到其最近的邻居。 70 | 71 | 该操作的结果可以方便地存储在一个大小为`nq`-by-的整数矩阵中`k`,其中第i行包含查询向量i的邻居ID(按距离递增排序)。除此矩阵外,该`search`操作还返回一个具有相应平方距离的`nq`按`k`浮点矩阵。 72 | 73 | ```python 74 | k = 4 # we want to see 4 nearest neighbors 75 | D, I = index.search(xb[:5], k) # sanity check, 首先搜索一些数据库向量,以确保最近的邻居确实是向量本身 76 | print(I) 77 | print(D) 78 | D, I = index.search(xq, k) # actual search 79 | print(I[:5]) # neighbors of the 5 first queries 80 | print(I[-5:]) # neighbors of the 5 last queries 81 | ``` 82 | 83 | ### 索引方式 84 | 85 | Faiss中的稠密向量各种索引都是基于 `Index`实现的,主要的索引方法包括: `IndexFlatL2`、`IndexFlatIP`、`IndexHNSWFlat`、`IndexIVFFlat`、`IndexLSH`、`IndexScalarQuantizer`、`IndexPQ`、`IndexIVFScalarQuantizer`、`IndexIVFPQ`、`IndexIVFPQR`等,[每个方法的具体介绍](https://github.com/facebookresearch/faiss/wiki/Faiss-indexes#summary-of-methods)。 86 | 87 | `IndexFlatL2`: 88 | 89 | - 基于L2距离的暴力全量搜索,速度较慢,不需要训练过程。 90 | 91 | `IndexIVFFlat`: 92 | 93 | - 先聚类再搜索,可以加快检索速度; 94 | - 先将`xb`中的数据进行聚类(聚类的数目是超参),`nlist`: 聚类的数目 95 | - `nprobe`: 在多少个聚类中进行搜索,默认为`1`, `nprobe`越大,结果越精确,但是速度越慢 96 | 97 | ```python 98 | def IndexIVFFlat(nlist): 99 | quantizer = faiss.IndexFlatL2(d) 100 | index = faiss.IndexIVFFlat(quantizer, d, nlist) 101 | print(index.is_trained) 102 | index.train(xb) 103 | print(index.is_trained) 104 | index.add(xb) 105 | return index 106 | ``` 107 | 108 | `IndexIFVPQ` 109 | 110 | - 基于乘积量化(product quantizers)对存储向量进行压缩,节省存储空间 111 | - `m`:乘积量化中,将原来的向量维度平均分成多少份,`d`必须为`m`的整数倍 112 | - `bits`: 每个子向量用多少个`bits`表示 113 | 114 | ```python 115 | def IndexIVFPQ(nlist, m, bits): 116 | quantizer = faiss.IndexFlatL2(d) 117 | index = faiss.IndexIVFPQ(quantizer, d, nlist, m, bits) 118 | index.train(xb) 119 | index.add(xb) 120 | return index 121 | ``` 122 | 123 | 124 | 125 | ## kd树 126 | 127 | kd树是一种对k维空间中的实例点进行**存储**以便对其进行**快速检索**的树形数据结构。kd树是**二叉树**,表示对k维空间的一个划分(partition)。**构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域**。kd树的每个结点对应于一个k维超矩形区域。 128 | 129 | ### kd树的结构 130 | 131 | kd树是一个二叉树结构,它的每一个节点记载了【特征坐标,切分轴,指向左枝的指针,指向右枝的指针】。 132 | 133 | 其中,特征坐标是线性空间$\mathbf{R}^n$的一个点$(x_1,...,x_n)$。 134 | 135 | 切分轴由一个整数$r$表示,这里$1\leq r\leq n$,是我们在$n$ 维空间中沿第$n$维进行一次分割。 136 | 137 | 节点的左枝和右枝分别都是 kd 树,并且满足:如果 y 是左枝的一个特征坐标,那么$y_r \leq x_r$并且如果 z 是右枝的一个特征坐标,那么$x_r \leq z_r $。 138 | 139 | ### kd树的构造 140 | 141 | 通过数据集来构造kd树存储空间,在推荐系统中即用物品Embedding池进行构建。 142 | 143 | - 输入:k维空间数据集$T=\left\{x_{1}, x_{2}, \cdots, x_{N}\right\}$,其中$x_{i}=\left(x_{i}^{(1)}, x_{i}^{(2)}, \cdots, x_{i}^{(k)}\right)^{\mathrm{T}},i=1,2,...,N$; 144 | 145 | - 输出:kd树; 146 | 147 | - (1)开始:构造根结点,根结点对应于包含$T$的$k$维空间的超矩形区域。 148 | 149 | 选择$x^{(1)}$为坐标轴,以$T$中所有实例的$x^{(1)}$坐标的**中位数为切分点**【若超平面上没有切分点,可以适当移动位置,使得超平面上有点】,将根结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴$x^{(1)}$垂直的超平面实现。 150 | 151 | 由根结点生成深度为1的左、右子结点:左子结点对应坐标$x^{(1)}$小于切分点的子区域,右子结点对应于坐标$x^{(1)}$大于切分点的子区域。 152 | 将**落在切分超平面上的实例点保存在根结点**。 153 | 154 | - (2)重复:对深度为$j$的结点,选择$x^{(l)}$为切分的坐标轴,$l=j(\bmod k)+1$,以该结点的区域中所有实例的$x^{(l)}$坐标的中位数为切分点,将该结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴$x^{(l)}$垂直的超平面实现。 155 | 由该结点生成深度为$j+1$的左、右子结点:左子结点对应坐标$x^{(l)}$小于切分点的子区域,右子结点对应坐标$x^{(l)}$大于切分点的子区域 156 | 将落在切分超平面上的实例点保存在该结点。 157 | 158 | - (3)直到两个子区域没有实例存在时停止。从而形成kd树的区域划分。 159 | 160 | 最后每一部分都只剩一个点,将他们记在最底部的节点中。因为不再有未被记录的点,所以不再进行切分。 161 | 162 | ![img](https://pic2.zhimg.com/80/v2-93ada931fd95e04f829318d5983aebe5_1440w.png) 163 | 164 | ![img](https://pic1.zhimg.com/80/v2-ef599210d778bc0b11ae7b1d0116c28c_1440w.png) 165 | 166 | ### 搜索kd树 167 | 168 | 在推荐系统中,即通过用户的Embedding向量来查找与其近邻的$K$个物品Embedding向量。 169 | 170 | - 输入:已构造的kd树;目标点$x$; 171 | - 输出:$x$的$k$近邻; 172 | - 设有一个$ k$个空位的列表,用于保存已搜寻到的最近点。 173 | 174 | - (1)在kd树中找出包含目标点$x$的叶结点:从根结点出发,递归地向下访问树。若目标点$x$当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点,直到子结点为叶结点为止; 175 | - (2)如果**“当前k近邻点集”元素数量小于$k$**或者**叶节点距离小于“当前k近邻点集”中最远点距离**,那么将叶节点插入“当前k近邻点集”; 176 | - (3)递归地向上回退,在每个结点进行以下操作: 177 | - 如果“当前k近邻点集”元素数量小于k或者当前节点距离小于“当前k近邻点集”中最远点距离,那么将该节点插入“当前k近邻点集”。 178 | - 检查该子结点的父结点的另一子结点对应的区域是否与以目标点为球心、以目标点与于“当前k近邻点集”中最远点间的距离为半径的超球体相交。如果相交,可能在另一个子结点对应的区域内存在距目标点更近的点,移动到另一个子结点,接着,递归地进行最近邻搜索;如果不相交,向上回退; 179 | - 当回退到根结点时,搜索结束,最后的“当前k近邻点集”即为$x$的k近邻点。 180 | 181 | kd树的平均计算复杂度是$log(N)$。 182 | 183 | 参考资料:[kd 树算法之详细篇](https://zhuanlan.zhihu.com/p/23966698) 184 | 185 | 186 | 187 | ## 局部敏感哈希 188 | 189 | 局部敏感哈希的基本思想: 190 | 191 | > 让相邻对的点落入同一个“桶”,这样在进行最近邻搜索时,仅需要在一个桶内,或相邻的几个桶内的元素中进行搜索即可。如果保持每个桶中的元素个数在一个常数附近,就可以把最近邻搜索的时间复杂度降低到常数级别。 192 | 193 | 首先需要明确一个概念, 194 | 195 | > 在欧式空间中,将高维空间的点映射到低维空间,原本相近的点在低维空间中肯定依然相近,但原本远离的点则有一定概率变成相近的点。 196 | 197 | 所以**利用低维空间可以保留高维空间相近距离关系的性质**,就可以构造局部敏感哈希的桶。 198 | 199 | 对于Embedding向量,可以用内积操作构建局部敏感哈希桶。假设$\mathbf{v}$是高维空间中的$k$维Embedding向量,$\mathbf{x}$是随机生成的$k$维向量。内积操作可以将$\mathbf{v}$映射到1维空间,成为一个数值: 200 | $$ 201 | h(\mathbf{v})=\mathbf{v}\cdot \mathbf{x} 202 | $$ 203 | 因此,可以使用哈希函数$h(v)$进行分桶: 204 | $$ 205 | h^{x,b}(\mathbf{v})=\lfloor x \frac{\mathbf{x}\cdot \mathbf{v}+ b}{w}\rfloor x 206 | $$ 207 | 其中$\lfloor \rfloor$是向下取整,$w$是分桶宽度,$b$是0到$w$间的一个均匀分布随机变量,避免分桶边界固化。 208 | 209 | 如果仅采用一个哈希函数进行分桶,则必然存在相近点误判的情况。有效的解决方法是采用$m$个哈希函数同时进行分桶。同时掉进$m$个哈希函数的同一个桶的两点,是相似点的概率大大增加。找到相邻点集合后,取$K$近邻个。 210 | 211 | 采用多个哈希函数进行分桶,存在一个待解决的问题,到底通过“与”还是“或”: 212 | 213 | - 与:候选集规模减小,计算量降低,但可能会漏掉一些近邻点; 214 | - 或:候选集中近邻点的召回率提高,但候选集的规模变大,计算开销变大; 215 | 216 | 以上是将欧式空间中内积操作的局部敏感哈希使用方法;还有余弦相似度、曼哈顿距离、切比雪夫距离、汉明距离等。 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Daily Interview 2 | 3 | ## 背景 4 | 5 | 牛客网,知乎等众多网站上包含了数以百万计的面经,但往往大而散,面试者在准备面试时候去翻阅不但浪费时间,翻阅材料越多,越觉得自己很多知识点都没有掌握,造成心理上极大的压力,导致面试中不能发挥正常水平甚至面试失败。 6 | 其实,每一位求职者都应该有自己的一份面试笔记,记录笔试中常涉及到的知识点和项目中常被问到的问题。每次面试之前看一遍,做到举一反三,融会贯通,熟捻于心,方能在每次面试中汲取经验,最后从容应对。我个人就有自己的面试笔记,每次面试之前都会翻一遍,边看边想,但求好运。 7 | 8 | ## 宗旨 9 | 不需要大而全,涵盖所有内容,因为知识在不断更新迭代,我们也做不到涵盖所有。 10 | 不提供查漏补缺,因为每个人的短板不尽相同,需要面试者根据自己知识体系,多加思考,自己完善。 11 | 这是一份每一个面试者面试之前必看一遍的小面经。面试之前的半天时间,温故而知新。 12 | 13 | ## 内容 14 | 15 |
16 | 17 |
18 | 19 | 20 | ## 使用指南 21 | 22 | 1. 目前大部分成员是做AI算法,所以主要精力在AI算法一块。若有对开发感兴趣的人员参与整理,十分欢迎。 23 | 24 | 2. 数据结构与算法本来属于计算机基础一部分,但是因为不管面试算法岗还是开发岗,都会问到,所以单独提出来。 25 | 26 | 3. 算法岗:重点是AI算法、数据结构与算法;了解数学、计算机基础。 27 | 28 | 开发岗:重点是开发、数据结构与算法、计算机基础。 29 | 30 | 以面试岗位为梳理主线,整理面试之前必看的面试题目,给出高频的面试知识点和面试题。 31 | 32 | 33 | ## 招募 34 | 35 | 如果你也喜欢这个项目,想参与到面经项目中来,可以与我们联系 E-mail:xiongweinie@foxmail.com 36 | 37 | ## 关注我们 38 |
39 |

扫描下方二维码关注公众号:Datawhale

40 | 41 |
42 | 43 | ## LICENSE 44 | 知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 45 | -------------------------------------------------------------------------------- /_coverpage.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Datawhale面经 4 | 5 | > Datawhale面经 6 | 7 | 8 | 9 | [GitHub](https://github.com/datawhalechina/daily-interview.git) 10 | -------------------------------------------------------------------------------- /_navbar.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/_navbar.md -------------------------------------------------------------------------------- /_sidebar.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - 计算机基础 4 | - [操作系统](./计算机基础/操作系统.md) 5 | - [计算机网络](./计算机基础/计算机网络.md) 6 | - [数据库](./计算机基础/数据库.md) 7 | 8 | - Big data 9 | - [MapReduce](./开发/大数据/mapreduce.md) 10 | - [Technology](./开发/大数据/Technology.md) 11 | - [Questions](./开发/大数据/questions.md) 12 | 13 | - 前端开发 14 | - [基础知识](./开发/前端开发/README.md) 15 | - [JavaScript相关问题](./开发/前端开发/【1】javascript.md) 16 | - [HTML 相关问题](./开发/前端开发/【2】html.md) 17 | - [CSS 相关问题](./开发/前端开发/【3】css.md) 18 | - [网络及浏览器相关问题](./开发/前端开发/【4】网络及浏览器.md) 19 | - [前端框架及打包工具相关问题](./开发/前端开发/【5】前端框架及打包工具.md) 20 | - [NodeJS 相关问题](./开发/前端开发/【6】nodejs.md) 21 | 22 | - Java 后端开发 23 | - [基础知识](./开发/Java后端开发.md) 24 | 25 | - 数学 26 | - [logic题](./数学/统计学/logic.md) 27 | - [probability题](./数学/统计学/logic.md) 28 | 29 | - 数据结构与算法 30 | - [数组](./数据结构与算法/Array.md) 31 | - [排序](./数据结构与算法/sort.md) 32 | - [贪心](./数据结构与算法/greedy.md) 33 | - [字符串](./数据结构与算法/string.md) 34 | - [链表](./数据结构与算法/linklist.md) 35 | - [二叉树](./数据结构与算法/binaryTree.md) 36 | - [图](./数据结构与算法/graph.md) 37 | - [搜索](./数据结构与算法/search.md) 38 | - [动态规划](./数据结构与算法/dp.md) 39 | - 其他 40 | 41 | - 机器学习基础 42 | - [Metrics](./AI算法/machine-learning/metrics.md) 43 | - [过拟合与欠拟合](./AI算法/machine-learning/过拟合与欠拟合.md) 44 | - [梯度下降](./AI算法/machine-learning/梯度下降.md) 45 | - [ABTest](./AI算法/machine-learning/ABTest.md) 46 | 47 | - 机器学习算法 48 | - [线性回归+逻辑回归](./AI算法/machine-learning/线性回归+逻辑回归.md) 49 | - [SVM](./AI算法/machine-learning/SVM.md) 50 | - [Decision Tree](./AI算法/machine-learning/DecisionTree.md) 51 | - [EnsembleLearning](./AI算法/machine-learning/EnsembleLearning.md) 52 | - [Adaboost](./AI算法/machine-learning/Adaboost.md) 53 | - [XGBoost](./AI算法/machine-learning/XGBoost.md) 54 | - [LightGBM](./AI算法/machine-learning/LightGBM.md) 55 | - [Catboost](./AI算法/machine-learning/Catboost.md) 56 | - [KMeans](./AI算法/machine-learning/KMeans.md) 57 | - [KNN](./AI算法/machine-learning/KNN.md) 58 | - [NaïveBayes](./AI算法/machine-learning/NaïveBayes.md) 59 | - [CRF](./AI算法/machine-learning/CRF.md) 60 | - [Apriori](./AI算法/machine-learning/Apriori.md) 61 | - [Prophet](./AI算法/machine-learning/Prophet.md) 62 | 63 | - 图像处理算法 64 | - [CV基础](./AI算法/CV/CV基础.md) 65 | 66 | - 自然语言处理算法 67 | 68 | - [文本结构理解](./AI算法/NLP/文本表示/文本结构理解.md) 69 | - [文本表征方式](./AI算法/NLP/文本表示/文本表征方式.md) 70 | - [特征挖掘-基于深度学习的模型](./AI算法/NLP/特征挖掘/基于深度学习的模型.md) 71 | - [特征挖掘-Bert](./AI算法/NLP/特征挖掘/Bert/Bert面试题.md) 72 | - [NLG应用场景](./AI算法/NLP/应用场景/NLG.md) 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /assert/apr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/apr.png -------------------------------------------------------------------------------- /assert/auc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/auc.png -------------------------------------------------------------------------------- /assert/big-data1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/big-data1.png -------------------------------------------------------------------------------- /assert/bigdata2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/bigdata2.png -------------------------------------------------------------------------------- /assert/conf_matrix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/conf_matrix.png -------------------------------------------------------------------------------- /assert/d1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/d1-1.png -------------------------------------------------------------------------------- /assert/exm6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/exm6.png -------------------------------------------------------------------------------- /assert/filter-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/filter-1.png -------------------------------------------------------------------------------- /assert/filter-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/filter-2.png -------------------------------------------------------------------------------- /assert/formula-word2vec-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/formula-word2vec-1.png -------------------------------------------------------------------------------- /assert/formula-word2vec-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/formula-word2vec-2.png -------------------------------------------------------------------------------- /assert/fp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/fp.png -------------------------------------------------------------------------------- /assert/fptree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/fptree.png -------------------------------------------------------------------------------- /assert/g-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/g-1.png -------------------------------------------------------------------------------- /assert/g-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/g-2.png -------------------------------------------------------------------------------- /assert/gbdt-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/gbdt-1.png -------------------------------------------------------------------------------- /assert/gbdt-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/gbdt-2.png -------------------------------------------------------------------------------- /assert/gbdt-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/gbdt-3.png -------------------------------------------------------------------------------- /assert/gbdt-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/gbdt-4.png -------------------------------------------------------------------------------- /assert/gbdt-lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/gbdt-lr.png -------------------------------------------------------------------------------- /assert/mult_gbdt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/mult_gbdt.png -------------------------------------------------------------------------------- /assert/os1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/os1.jpg -------------------------------------------------------------------------------- /assert/prb10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/prb10.gif -------------------------------------------------------------------------------- /assert/r.jpe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/r.jpe -------------------------------------------------------------------------------- /assert/simain.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/simain.jpg -------------------------------------------------------------------------------- /assert/word2vec-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/assert/word2vec-3.PNG -------------------------------------------------------------------------------- /content.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/content.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Datawhale面经 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /大数据技术/README.md: -------------------------------------------------------------------------------- 1 | ## 背景 2 | 3 | 随着大数据技术的快速发展,大数据也越来越贴近公司的核心业务,从spark开发到数据仓库的建设,大数据涵盖了方法面面,正是这样庞杂的知识体系,给大数据面试带来了很多困扰点,面试者往往需要收集方方面面的资料进行知识体系的巩固。 4 | 5 | 笔者结合自己的工作经验,已经面试经验,整理大数据方面的相关知识点,用于面试与复习,也希望这份资料能同样帮助到你。当然受限于笔者的自身水平,如您在阅读过程中发现问题,麻烦联系我,谢谢。 6 | 7 | ## 笔者联系方式 8 | 9 | E-mail: xiongweinie@foxmail.com 10 | 11 | ## 大数据技术框架 12 | 13 | - Java基础 14 | - Linux基础 15 | - Spark 16 | - Hive 17 | - Hbase 18 | - Hadoop 19 | - Flink 20 | - 数据仓库建设 21 | - 真实面试经验 -------------------------------------------------------------------------------- /开发/Docker+万字教程:从入门到掌握.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/daily-interview/a46161eb2274bf38fd383e374b7c07ba16b1041e/开发/Docker+万字教程:从入门到掌握.pdf -------------------------------------------------------------------------------- /开发/前端开发/【2】html.md: -------------------------------------------------------------------------------- 1 | # 前端开发校招面试问题整理【2】——HTML 2 | 3 | ## 1、HTML 元素(element) 4 | 5 | ### Q:简单介绍下常用的 HTML 元素? 6 | 7 | 块状标签:元素独占一行,可指定宽、高。 8 | 常用的块状元素有: 9 | 10 | ``` 11 |

-