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)小波变换:
将数据转换到频域,根据频域计算