目录
11. quadratic spline(二次样条插值)算法
15. pytorch 和tensorflow的区别,计算图
1. 什么是知识图谱?
是结构化的语义知识库,用于迅速描述物理世界中的概念及其相互关系。它的基本单位是(实体-关系-实体) 就是点-线-点。
存储类型有结构化和非结构化的数据。结构化数据就是关系数据库,一张表格,关系很清楚,非结构化就是图片、音频、文本等。存储非结构化数据的方式:一个是通过RDF(资源描述框架)这样的规范存储格式来进行存储,还有一种方法,就是使用图数据库来进行存储,常用的有Neo4j等。
RDF应该有点像我写过的xml文件,用来放网站数据库的
知识图谱的技术框架如下。分成三个流程:信息抽取、知识融合、知识加工。
2. 什么是图嵌入graph embedding 神经网络
图嵌入就是在建立好一个知识图谱后,在知识图谱上发现新的关联(例如药物与药物之间是否发生新的事件,疾病 预测),在构建的知识图谱的基础上学习实体和关系的表示向量,预测药物治疗疾病的可能性。
模型的输入是三元组,物品-事件-物品。
模型会对实体和关系分别建立embedding,想要知道实体-关系向量,就是将实体向量×关系向量。
图嵌入技术主要分成两类:平移距离模型和语义匹配模型
(1)平移距离模型:基于距离的评分函数进行打分
比如已知(A,e1,B)(B,e2,C) 求(AC)之间的事件,就可以将两个向量相加,得到的向量再与输入计算相似度(如图TransE)
期望是前两个向量相加的结果趋近于ref,loss就是余弦相似度,不断迭代,优化embedding层。
(2)语义匹配模型
基于相似性的评分函数,通过匹配实体的潜在语义和向量空间中包含的关系来度量事实的可信度。
3. 交叉熵损失和平方损失的区别?
为啥二分类问题里面会用到交叉熵损失,而不用平方损失呢? 既然sigmoid输出的是概率值,难道用这个概率值与真实的label0或者1求平方损失,然后更新参数不可以吗?
首先明确概念:
均方误差损失:求平方的平均,一般用在回归任务。
交叉熵损失:描述实际输出与期望输出的概率的距离。
真正能衡量概率分布差异的叫相对熵,也就是KL散度。公式是真实分布与预测分布的比值取log。
交叉熵=信息熵+相对熵
Q。为什么分类不用MSE?
4. 三数之和
5. 有10亿个32位整数,如何找出重复数?
用位图法来做。已知2的31次方>20亿,所以10亿个整数可以用一个数组来存储,0表示出现,1表示不出现。
6. 爬楼梯(动态规划)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
动态规划题首先:确定状态转移方程
爬到第i层的方法=爬到第i-1层的方法+爬到第i-2层的方法,即dp[i] = dp[i-1] + dp[i-2]
再确定初始状态 dp[1] = 1, dp[2] = 2.
太简单了不写代码。然后就是进阶版爬楼梯:
如果每次最多能爬m个台阶,有多少种方法可以到达楼顶?
6-拓展:最小花费爬楼梯(动态规划)
是一样的,都是简单题
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp = [0,0]
n = len(cost)
for i in range(2,n+1):
dp.append( min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]))
return dp[n]
7. KL散度是什么
KL散度的理论意义在于度量两个概率分布之间的差异程度,当KL散度越大的时候,说明两者的差异程度越大;而当KL散度小的时候,则说明两者的差异程度小。
KL散度具备非负性,KL散度不具备对称性。
KL散度公式:
最后得到的第一项称作P和Q的交叉熵(cross entropy),后面一项就是熵。
8. LSTM是什么
LSTM是一种循环网络,和RNN差不多,RNN的变种有Elman Network和Jordan Network,两者区别为:一个输入的是隐藏层,另一个是直接把网络输出结果连接到每一层。
LSTM long-short term memory。他包含三个门,门由信号控制什么时候打开和关闭,控制是由网络学习得到的。
输入4个input:3个门信号,一个输入。输出是一个。中间使用了sigmoid作为激活函数,让门信号的数值在0-1之间,表示门打开的程度。
9. LSTM与GRU的区别?
1. LSTM 有 3 个门控单元(遗忘门、输入门、输出门),而 GRU 只有 2 个门控单元(重置门、更新门)。LSTM 有独立的cell状态,而 GRU 没有独立的cell状态。
2. LSTM 对长期依赖问题更擅长,可以更好地捕捉长期依赖特性。GRU 计算速度更快,对于某些任务可能会得到更好的效果。
3. LSTM 在需要长期记忆的应用场景中表现更好,如语言模型、机器翻译等。GRU 在一些对时间效率要求较高的应用中可能会更合适,如实时语音识别等。
9. 网络early stopping是什么?
网络 early stopping 是一种常用的机器学习模型训练技术,主要用于防止模型过拟合。它的工作原理如下:
-
将原始数据集划分为训练集、验证集和测试集。
-
在训练过程中,除了监控训练集的损失函数,还会监控验证集的损失函数。
-
当验证集的损失函数开始上升时,说明模型开始过拟合训练集。这个时候就可以停止训练,即"early stopping"。
-
最终选择在验证集上表现最好的那个模型参数作为最终模型。
early stopping 的优点包括:
-
可以防止模型过拟合,提高泛化能力。
-
可以减少训练时间,降低训练成本。
-
无需人为设置训练轮数,可自动确定最佳训练轮数。
-
对于不同的模型和数据集,能够自适应地确定最佳的停止时机。
10. RANSAC 随机抽样一致算法
针对数据拟合问题,是对最小二乘法的改善,能够剔除有缺陷的数据,得到干净、正确的拟合结果。
如图,左边是最小二乘法的结果,右边是RANSAC结果。一般这个算法会用在相机的位姿估计,特征点匹配。
具体流程是:所有观测中随机找到几个尽可能少的点去拟合模型,拟合后依次计算模型和所有观测数据的残差,当残差小于给定的阈值时,就将其判断为内点,大于给定的阈值时,就判断为外点,并统计内点的数量,然后再次随机选取几个点拟合模型迭代。如果本次拟合内点数量大于先前的模型,就将旧模型迭代为新的模型。
11. quadratic spline(二次样条插值)算法
一种插值方法,插值节点为网格节点。
12. BERT模型
BERT模型的结构就是transformer的Encoder结构。它是一个self-supervised学习方法。自监督任务是属于无监督任务的一种。它的具体做法就是:将输入文本中随机选择一些词,掩盖住。掩盖的方法有两种:(1)直接用其他随机词替换(2)用一个特殊符号替换。然后,将掩盖后的文本输入到BERT中。BERT的输入和输出都是向量,维度也一样。输出只看被掩盖部分的输出,将输出做Linear和softmax,得到一个输出。将这个输出与没掩盖的原本词汇做loss来训练。
这样的训练就能得到一个pre-trained model。这个model就可以被用到下游任务中,通过fine-tune+一些少量的标签就能得到好的结果。注意,微调(finetune)是有监督的。
他可以做的任务有以下几个例子:
(1)情感分析。输入一个句子,句子前加上CLS。将CLS的输出做分类。finetune的核心在于,BERT模型是通过pretrain训练好的参数,不需要初始化。而Linear是需要随机初始化的。
(2)做词性标注。判断一句话每个单词的词性。就是每个词输出一个class。
(3)NLI neural language Inference。就是判断两个句子是否矛盾。输入两个句子,中间用sep表示间隔。输出CLS的结果,判断。一般会用来做立场分析等。
(4)问答系统。输入文章和问题,输出两个数值s,e。s和e表示在文章的第s到e个字符就是答案。这个系统要保证答案一定在文章里。
13. 引导滤波和双边滤波
双边滤波:同时考虑邻域像素值和距离对该数值的影响
在高斯滤波的基础上加入了像素值权重项,也就是说既要考虑距离因素,也要考虑像素值差异的影响,像素值越相近,权重越大。
为什么双边滤波可以保边?因为在处理边缘信息时,由于边缘与邻居像素值差异很大,导致他们的权重降低,对边缘的滤波作用也会降低。
复杂度显然与窗口大小有关。
引导滤波:复杂度与窗口大小无关。
14. 矩阵置0
如果矩阵某个数为0,就把这个数所在行列所有数都置0
没想出来看的题解,估计后面也会忘。主要思路就是要建立两个标记数组,如果数为0,就把它行列对应标记数组置0。真的很巧妙。
15. pytorch 和tensorflow的区别,计算图
Pytorch的计算图就是动态的,几乎每进行一次运算都会拓展原先的计算图。最后生成完成,进行反向传播,当反向传播完成,计算图默认会被清除,即进行前向传播时记录的计算过程会被释放掉。所以,默认情况下,进行一次前向传播后最多只能用生成的计算图进行一次反向传播。
TensorFlow最初采用的是静态计算图,即需要在构建阶段定义完整的计算图,然后才能执行。这种方式可以进行更多的优化,提高性能,但在调试和开发过程中较为繁琐。
pytorch一个tensor的属性有:
data: 用于存放tensor,是数据本体。
grad: 存放data的梯度值。
grad_fn: 记录生成该张量时所用的方法(函数——如乘法:grad_fn = < MulBackward0 >,加法:grad_fn = < AddBackward0 >),用于反向传播自动求梯度时选择求导方式。
requires_grad: 指示该是否需要梯度,对于需要求导的tensor,其requires_grad属性必须为True,这样自动求导时才会对该张量求梯度。自己定义的tensor的requires_grad属性默认为False。神经网络层中的权值w的tensor的requires_grad属性默认为True,求导对象与被求导对象之间的中间变量也默认True。
is_ leaf : 指示是否是叶子结点(张量),用户创建的结点称为叶子结点(张量)如X与 W,运算生成的则不是。梯度计算时的值来源于叶子节点,即求各节点的梯度值时,都要带入叶子结点的值进表达式,所以在一次反向传播完成前叶子结点的值不能在原地址上被修改(In-place operation)(修改会报错)。is_leaf为True的时候是叶子节点。叶子节点在经过反向传播之后梯度值能够得以保留,非叶子节点的梯度值则为:None,中间虽然算过,但是最后默认都释放了。
计算图就是这个东西:方便链式法则算梯度的,自下而上就能算出梯度。torch要记得每轮梯度清零,叶子节点也就是x和w在算梯度的时候不能修改。