AI/机器学习(计算机视觉/NLP)方向面试复习3

1. Pooling 有哪些方式?pytorch的实现?

Pooling可以分成:最大池化,平均池化,全局平均池化,随机池化,空间金字塔池化。

1. 最大池化(Max Pooling)

最大池化是最常用的池化技术之一。它将输入图像划分为若干非重叠的矩形区域,然后对每个区域输出最大值。这种方法在实践中非常有效,能够很好地捕捉图像中的显著特征

2. 平均池化(Average Pooling)

平均池化也将输入划分为多个区域,但它输出的是这些区域内的平均值。相较于最大池化,平均池化更平滑,但可能会丢失一些细节信息,因为它不像最大池化那样能突出显著特征。

3. 全局平均池化(Global Average Pooling)

全局平均池化是一种极端形式的平均池化,它计算整个特征图的平均值,通常用于卷积神经网络的最后阶段,直接输出用于分类的特征。这种方法能够显著减少模型的参数数量。

4. 随机池化(Stochastic Pooling)

随机池化是一种概率论的池化方法,不是简单地取最大值或平均值,而是根据预定义的概率分布(通常基于输入特征的大小)来选择池化区域内的元素。这种方法有助于增加模型的泛化能力,因为它引入了随机性。

6. 空间金字塔池化(Spatial Pyramid Pooling)

空间金字塔池化(SPP)是一种灵活的池化策略,它可以保持空间层次结构,允许网络接收任意大小的输入。SPP 通过在多个尺度上实现池化来捕获多层次的特征,这在一些特定的场景中非常有用,比如在需要处理不同分辨率的图像时。

2. attention的各种变形

self-attention里存在的问题是,当序列长度N非常大时,通过query(N,S) key(S,N) 相乘得到的Attention matrix(N,N)矩阵非常大。这里的计算过程非常复杂,就需要对self-attention进行简化。

而且这种简化经常会用在图像处理上,因为图像输入256×256的patch时,按像素为1个单位,N=256*256,过于大了。

一个方法是用感受野。把Attention matrix除了感受野以外的值设为0:(local attention

但是这样设置感受野后,就和CNN没什么区别了。所以不太好。

Stride Attention:类似空洞卷积。每次看多几格的内容,例如空两格看三格以外的内容。

Local Attention:在原来的sequence里加上一个特殊的token。只有global token能获取所有的信息,其他token之间就不有attention了。Longformer用到了Global attention和striding attention, Big Bird用了global attention+striding attention和random attention。

Reformer:如何在Attention Matrix里,判断哪些地方有比较大的attention value,哪些地方的attention value比较小?然后把value比较大的取出来,当成attention。

这样做的方式是对query和key进行clustering聚类。clustering的加速方法有很多,可以快速将相近的query和key放在一起。只计算同类的query和key的attention,不同类的query和key的attention位为0,可以加速。

但这样是人类判断方式,根据任务判断两者之间是否相近。同样,也可以实现一个神经网络来判断key,value之间是否相近:Sinkhorn Sorting Network。

Linformer:本质在说attention matrix是一个低秩矩阵,列之间相关性很大,根本不需要构建这么大的attention matrix。就对列进行压缩。具体做法是从key中找到representative keys。

具体的压缩方法有:(1)对key做卷积进行压缩,(2)key是N维的,直接乘一个(N×K)的矩阵

k,q first -> v,k first 最后一个点是,当matrix相乘的顺序不同时,计算的效率也不一样。KQ先相乘再乘V比下面:先V乘K再乘Q的效率大很多。

3. 如何输入数据同时包括float类型的数据和文本数据,如何将它们都输入到网络里?

首先分别处理:

(1)对浮点数进行归一化和标准化处理

(2)对文本数据进行向量化处理,如使用词袋模型(BOW)、TF-IDF、词向量(如Word2Vec、GloVe)或更高级的BERT等方式。

然后进行特征合并:

将预处理后的浮点数和文本数据连接起来

可以用一个embedding层提取文本数据,再用一个dense层处理浮点型数据,然后用concatenate层连接起来。

4. 如何判断两个句子之间的相似性?

(1)余弦相似度。将两个向量之间的夹角。可以用来比较两个句子在向量之间的相似性。首先把句子转成TF-IDF向量,计算余弦相似度。

(2)Jaccard相似度:比较两个句子的词的集合的相似性。它是度量两个集合交集和并集的比率。

(3)基于词向量的方法:word2vec,转成向量后计算词向量的平均值。

(4)基于深度学习的方法:BERT

5. 如何去除噪声或异常点?

(1)统计方法,可以用均值和标准差来计算。

均值去除方法:计算数据的均值,减去均值来中心化数据。

标准化方法:将数据减去均值后除以标准差,使得数据具有零均值和单位标准差。

Z-Score:利用zscore检测异常值,通常设定一个阈值,超出这个阈值的点被视为异常点。

四分位数计算法:(IQR)计算数据的四分位数和四分位距,低于Q1-1.5*IQR或者高于Q3+1.5*IQR的点被视为异常。

(2)滤波方法:

简单移动平均(SMA):计算一个窗口内数据点的平均值,并且用这个平均值平滑数据。

找一个滤波核,无论是一维二维都可以通过移动窗口进行平滑。

卡尔曼滤波:一种递归滤波器。

(3)机器学习方法:

聚类 K-means方法:检查哪些数据点不属于任何聚类中心。

孤立森林:基于决策树的方法,构建树并且根据树的深度检测异常点。

(4)小波变换:

将数据转换到频域,根据频域计算

6. 使用pytorch实现一个cross attention模块

7. c++一些记不起来的用法(先写在这,后面汇总)

(1)unordered_map 和set 自定义比较函数

优先队列是放一组数据并且根据某个值排序,unordered map是不能直接排序的,要取出来放在vector里再做排序:

bool cmp(pair<int, vector<int>> a, pair<int, vector<int>> b) {
	return a.first > b.first;
}
int main() {
	vector<pair<int, vector<int>>> a;
	sort(a.begin(), a.end(), cmp);
}

(2)vector初始化

	vector<vector<int>> n = vector<vector<int>>(n, vector<int>(m, 0));

(3)int二维数组初始化

(4)int怎么转long long

(5)vector判断一个元素是否在里面

(6)unordered_map迭代

8. python的ACM输入形式

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值