【kaggle比赛记录】SHOPPE商品分类多模态分析
多模态分析比赛
- 写在前面
- 文本方向处理
- TFIDF
- BM25
- 句子向量
- BERT
- 图片方向处理
- 图片哈希值
- 颜色直方图
- 局部特征
- 深度学习特征
- EfficientNet B1-B7
- EfficientDet
- 多模态检索
- CILP
- visualBert
- ECA-Net
- NFNet
- 多模型结合
- 高分模型
- 一些问题
- 比赛的测试及训练集group有没有重合?
- 存在标题相同,但是group不同的商品组合
- Resnet18提升的关键
- 更改CNN特征代码里的RES18到DENSE161
- 公开榜单和本地交叉验证的区别
- 冠军方案
- 编码模型
- 模型框架
- 微调ArcFace
- 图像和文本的匹配-concat&union
- Iterative Neighborhood Blending (INB)
- K近邻搜索
- Min2
- Neighborhood Blending
- 最终模型
- 其它
- 一些提升细节
- 一些比较
- 亚军方案(给了代码)
- Image similarity
- Text similarity
- Multimodal (image + text) similarity
- Graph features
- Score Timeline
写在前面
kaggle的比赛是做工程项目很好的模拟:时间限定,数据集限定,测试环境未知。我也学到几个做数据科学项目的技巧。
- 做好数据分割。在时间限定的比赛下,你可以使用的算力是有限的,因此你不可能做无穷无尽的尝试。一般数据集分割为验证集和测试集之后,你的模型准确度会有一定的损失。因此推荐在一开始就使用KFOLD数据集分割,对其中一个fold进行超参调试,最后训练所有的fold并进行整合,可以更好地利用所有的数据集。
- 做好版本输出。为每一次模型的测试做好标注,统一保存在规定格式的子目录下,并保存权重文件和预测文件,方便事后的分析。
- 做好代码框架。一个可复用、可拓展的代码框架可以大大节省后面新模型的时间。同时,模型、框架、数据处理、自动调参的代码可以上传到github等,作为之后做项目的基础。
- 做好文献调研。一篇新文章是否可以用于你的模型,不一定非要你去亲自做测试,三月份挂到arxiv的文章,如果效果出众的话四月份就会有复现和应用的博客跟进。如果找不到则文章大概率效果注水或者无法轻易复用。
文本方向处理
TFIDF
这个方法就是一个统计词频加逆文档频率的统计学方法,来找出最能代表一篇文章的一组关键词。sklearn提供了包来进行词汇的向量化,向量化之后的词汇向量组大小是 (34250个样本, 32324词汇)。
from sklearn.feature_extraction.text import TfidfVectorizer
model = TfidfVectorizer(stop_words=None, binary=True, max_features=55000, use_idf=True)
并使用KNN聚类来寻找相近的标题。
preds = []
CHUNK = 1024*4print('Finding similar titles...')
CTS = len(train)//CHUNK
if len(train)%CHUNK!=0: CTS += 1
CTS_index = 0
for j in range( CTS ):a = j*CHUNKb = (j+1)*CHUNKb = min(b,len(train))print('chunk',a,'to',b)# COSINE SIMILARITY DISTANCE# cts = np.dot( text_embeddings, text_embeddings[a:b].T).Tcts = torch.matmul(text_embeddings, text_embeddings[a:b].T).Tcts = cts.data.cpu().numpy()print(cts.shape)for k in range(b-a):# IDX = np.where(cts[k,]>0.7)[0]IDX = np.where(cts[k,]>0.7)[0]o = train.iloc[IDX].posting_id.valuespreds.append(o)CTS_index += 1
# del model, text_embeddings
这个方法单独使用的CV如下
简介 | CV |
---|---|
TFIDF-KNN-阈值k0.7 | 0.613 |
TFIDF-KNN-阈值k0.6 | 0.670 |
TFIDF-KNN-阈值k0.7-西语翻译 | 0.551 |
CV达到了0.670
由于这个比赛存在多种外语,我尝试使用seq2seq模型来翻译印尼语
##translation part
if Translation_iden:from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipelinetokenizer = AutoTokenizer.from_pretrained("/database/kaggle/shopee/othercodes/id-en-converter", use_fast=False)txt_model = AutoModelForSeq2SeqLM.from_pretrained("/database/kaggle/shopee/othercodes/id-en-converter")device = torch.device("cuda:2" if torch.cuda.is_available() else "cpu")txt_model.to(device)txt_model.eval()
####################
##translation parttrans_texts = []
CHUNK = 30print('translating texts')
CTS = len(train)//CHUNK
if len(train)%CHUNK!=0: CTS += 1
for j in range(CTS):a = j*CHUNKb = (j+1)*CHUNKb = min(b,len(train))print('chunk',a,'to',b)input_ids = tokenizer(list(train.iloc[a:b].title.values), return_tensors="pt", truncation=True, padding=True).input_ids.to(torch.device('cuda:2'))outputs = txt_model.generate(input_ids=input_ids, num_return_sequences=1) val = tokenizer.batch_decode(outputs, skip_special_tokens=True)trans_texts.extend(val)
但是效果很差啊哈哈哈。
训练集语言的样本分布大概是这样的:
语言 | 样本数 |
---|---|
英语 | 18939 |
印尼语 | 8715 |
马来语 | 2398 |
德语 | 854 |
之后可能考虑使用简单地替换词来完成工作0.0
为了方便介绍BM25并且作比较,简单介绍一下TFIDF算法:
TFIDF = TF*IDF
TF =
TFIDF=TF∗IDFTFIDF = TF * IDF TFIDF=TF∗IDF
TF=freq(i,j)maxlen(j)TF=\frac{freq(i,j)}{max_{len(j)}} TF=maxlen(j)freq(i,j)
在这里freq(i,j)freq(i,j)freq(i,j)是词汇wi在文档dj中出现的频率,maxlen(j)max_{len(j)}maxlen(j)是文档的长度
IDF=log(len(D)n(i))IDF=log{(\frac{len(D)}{n(i)})} IDF=log(n(i)len(D))
这里D表示文档集合中文档的总数,ni表示含有wi这个词的文档的数量
BM25
BM25是增强版的tfidf,通常用来做搜索相关性评分的,也是ES中的搜索算法,通常用来计算queryqueryquery和文本集合DDD中每篇文本之间的相关性。我们用QQQ表示queryqueryquery,在这里QQQ一般是一个句子。在这里我们要对QQQ进行语素解析(一般是分词),在这里以分词为例,我们对QQQ进行分词,得到q1,q2,......,qtq_1,q_2,......,q_tq1,q2,......,qt这样一个词序列。给定文本d∈Dd∈Dd∈D,现在以计算QQQ和ddd之间的分数(相关性),其表达式如下:
Score(Q,d)=∑i=1twi∗R(qi,d)\operatorname{Score}(Q, d)=\sum_{i=1}^{t} w_{i} * R\left(q_{i}, d\right) Score(Q,d)=i=1∑twi∗R(qi,d)
上面式子中 wiw_{i}wi 表示 qiq_{i}qi 的权重, R(qi,d)R\left(q_{i}, d\right)R(qi,d) 为 qiq_{i}qi 和 ddd 的相关性, Score(Q,d)\operatorname{Score}(Q, d)Score(Q,d) 就是每个语素 qiq_{i}qi 和 ddd 的 相关性的加权和。
wiw_{i}wi 的计算方法有很多,一般是用 IDFI D FIDF 来表示的,但这里的 IDFI D FIDF 计算和上面的有所不同,具体的 表达式如下:
wi=IDF(qi)=logN−n(qi)+0.5n(qi)+0.5w_{i}=\operatorname{IDF}\left(q_{i}\right)=\log \frac{N-n\left(q_{i}\right)+0.5}{n\left(q_{i}\right)+0.5} wi=IDF(qi)=logn(qi)+0.5N−n(qi)+0.5
上面式子中 NNN 表示文本集合中文本的总数量, n(qi)n\left(q_{i}\right)n(qi) 表示包含 qiq_{i}qi 这个词的文本的数量, 0.50.50.5 主要是 做平滑处理。
R(qi,d)R\left(q_{i}, d\right)R(qi,d) 的计算公式如下:
R(qi,d)=fi∗(k1+1)fi+K∗qfi∗(k2+1)qfi+k2R\left(q_{i}, d\right)=\frac{f_{i^{*}}\left(k_{1}+1\right)}{f_{i}+K} * \frac{q f_{i}^{*}\left(k_{2}+1\right)}{q f_{i}+k_{2}} R(qi,d)=fi+Kfi∗(k1+1)∗qfi+k2qfi∗(k2+1)
其中
K=k1∗(1−b+b∗dlavgdl)K=k_{1} *\left(1-b+b * \frac{d l}{a v g d l}\right) K=k1∗(1−b+b∗avgdldl)
上面式子中 fif_{i}fi 为 qiq_{i}qi 在文本 ddd 中出现的频率, qfiq f_{i}qfi 为 qiq_{i}qi 在 QQQ 中出现的频率, k1,k2,bk_{1}, k_{2}, bk1,k2,b 都是可调节的参 数, dl,avgdld l, a v g d ldl,avgdl 分别为文本 ddd 的长度和文本集 DDD 中所有文本的平均长度。
一般 qfi=1q f_{i}=1qfi=1, 取 k2=0k_{2}=0k2=0, 则可以去除后一项, 将上面式子改写成:
通常设置 k1=2,b=0.75k_{1}=2, b=0.75k1=2,b=0.75 。参数b的作用主要是调节文本长度对相关性的影响。
然后这个玩意儿在python没有并行处理的库,因此直接放弃了。
句子向量
词向量的聚合也有几种方法:简单聚合,包括mean-polling和max-polling;加权聚合,包括TFIDF和SIF。
BERT
都说到NLP怎么能不说BERT呢。BERT模型原生就支持句子匹配,但是原生权重不适合用于句子相似度的计算。
我查到一个Sentence-Bert模型,但是还没有尝试。
实际上bert模型并不能提高多少,因为这个比赛使用tfidf已经足够好了。
图片方向处理
图片是一种典型的非结构化数据,一般任务分为两种, 图像分类和图像检索
图像特征分为全局特征(例如CNN)和局部特征(SIFT)
图片哈希值
一种无监督的思路,具体方法有DHash、AHash、PHash、WHash。
使用固定长度的字符串来标识图片,可以储存在数据库,计算资源占用少,但同时任何图片的变化都会改变哈希值,存在不同图片哈希值相同。
颜色直方图
统计颜色空间像素点的取值分布,可以抵抗图像的旋转平移,但是对颜色变换非常敏感。
局部特征
比如SIFT,ORB,AKAZE等一些局部特征提取,通过提取图像的关键点进行匹配,可以抵抗图像选转、平移和形变,但是点之间的匹配计算复杂度非常的大,而且容易受到文字的影响。
深度学习特征
主要是基于卷积神经网络的各种衍生网络,
EfficientNet B1-B7
EfficientNet的文章和代码
来自谷歌大脑团队的文章,还有另外一个叫EfficientDet的晚辈。其中B0-B7对应资源消耗的总量提升。我这里一般用到B4或者B5,可以看到,B5已经对准确率几乎没有提升了。
卷积神经网络(ConvNets)通常是在固定的资源预算下发展起来的,如果有更多的资源可用的话,则会扩大规模以获得更好的精度,比如可以提高网络深度(depth)、网络宽度(width)和输入图像分辨率 (resolution)大小。但是通过人工去调整 depth, width, resolution 的放大或缩小的很困难的,在计算量受限时有放大哪个缩小哪个,这些都是很难去确定的,换句话说,这样的组合空间太大,人力无法穷举。基于上述背景,该论文提出了一种新的模型缩放方法,它使用一个简单而高效的复合系数来从depth, width, resolution 三个维度放大网络,不会像传统的方法那样任意缩放网络的维度,基于神经结构搜索技术可以获得最优的一组参数(复合系数)。从下图可看出,EfficientNet不仅比别的网络快很多,而且精度也更高。
对网络的扩展可以通过增加网络层数(depth,比如从 ResNet (He et al.)从resnet18到resnet200 ), 也可以通过增加宽度,比如WideResNet (Zagoruyko & Komodakis, 2016)和Mo-bileNets (Howard et al., 2017) 可以扩大网络的width (#channels), 还有就是更大的输入图像尺寸(resolution)也可以帮助提高精度。如下图所示: (a)是基本模型,(b)是增加宽度,(c)是增加深度,(d)是增大属兔图像分辨率,(d)是EfficientNet,它从三个维度均扩大了,但是扩大多少,就是通过作者提出来的复合模型扩张方法结合神经结构搜索技术获得的。
EfficientDet
EFFDET的 文章 和 代码。这个方法主要用于目标检测。
在EffNet的基础上增加了BiFPN,是一种加权机制,说白了就是对不同分辨率的特征输入引入可学习的权值,来实现更好的多尺度特征融合。他们提出的方法可以统一的对所有的主干路网络、特征网络和预测网络的分辨率、深度和宽度进行缩放。
多模态检索
多模态问题主要是因为不同数据组织的方式不同,特征提取的方法不同,比如说时间序列信息,图片信息,矢量信息,文字信息等等。
结构化的数据比如数值、类别、字符串等等,非结构化就多了,文本图像语音视频时间序列,凡是需要特征处理的都是非结构化数据
多模态检索想要快,就必须进行特征向量化,提取后再使用距离计算方法进行快速检索,比如说MSE和cos相似度。向量化可以代替局部特征1v1的特征对比过程,时间复杂度大幅度下降。下面介绍几个常见的多模态模型。
CILP
文章和代码
将图像和文本进行编码,并且将图像和文本之间进行预训练。
visualBert
文章和代码
对图像进行物体检测,将文本和图像同时输入transformer
ECA-Net
先说ECA-Net的前身,SE-Net Squeeze-and-Excitation Networks 是由自动驾驶公司Momenta在2017年公布的一种全新的图像识别结构,它通过对特征通道间的相关性进行建模,把重要的特征进行强化来提升准确率。这个结构是2017 ILSVR竞赛的冠军,top5的错误率达到了2.251%,比2016年的第一名还要低25%,可谓提升巨大。
自Inception之后,人们已经不再通过暴力的增加网络层数的方法来企图获得更高的准确率了,然而面对复杂的问题,过浅的网络很难达到理想的效果,所以加深网络依然是解决图像分类问题的最佳途径。但是增加网络很容易造成overfiting甚至训练集上得到的效果也比浅层网络要差,所以如何有效的增加网络层数就成了深度学习领域研究的重中之重。
为了解决这个问题,很多学者提出了自己的见解,如resnet所讲述的残差网络就是一例。然而残差网络虽然能够增加层数但是层数增加到三位数之后再增加也就有些无能为力了。此时作者另辟蹊径,提出了一种新型的网络结构SENet,这个网络结构可以对所有网络进行改进然后做到真正有效的增加层数,无论原网络层数有多深,通过加入SENet,都能增加相当数量的深度,并有效的提高实验效果。值得一提的是SENet在2017年的ImageNet挑战赛获得冠军。
从Inception开始,学者们提出网络的时候就主要是提出一个block,然后用这个block像搭积木一样的搭出整个网络。同样,作者也是用这个方法设计网络的,作者提出了一个Squeeze-and-Excitation block,然后用这个SE block搭出了整个网络。
卷积神经网络虽然有诸多的好处,但是卷积神经网络捕捉到的只是局部的信息,假如卷积核是7x7,那么感受野的大小也只有7x7。但是一张图片的每一个像素点之间都是互相有联系的,之前使用局部感受野的网络都忽略掉了全局像素点之间的关联信息,使得实验效果不够理想。Inception通过多尺度的卷积核,找到了提取一张feature map上全局关联信息的方法,然而直到本文网络之前都没有谁考虑各通道之间的全局关联信息。所以作者将关注点放到了通道关联信息上,作者发现提取出通道之间互相关联的信息可以有效的增加神经网络的分类准确率。
也就是说,SE-NET可以通过整合多种卷积核的感受野来找到全局像素点之间的关联信息,并利用这些信息增加神经网络的分类准确率。但是这带来的巨大的算力负担,ECA-Net就是为了改进这个网络,在大幅度降低参数的同时,还能保持高性能。本文提出了一种有效的通道关注(ECA)模块,该模块只增加了少量的参数,却能获得明显的性能增益。通过对SENet中通道注意模块的分析,作者的经验表明避免降维对于学习通道注意力非常重要,适当的跨信道交互可以在显著降低模型复杂度的同时保持性能。因此,足者提出了一种不降维的局部跨信道交互策略,该策略可以通过一维卷积有效地实现。进一步,作者又提出了一种自适应选择一维卷积核大小的方法,以确定局部跨信道交互的覆盖率。 实验证明,本文提出的ECA模块是高效的。
ECA模块与其他注意力模块的比较:这里以ResNets作为骨干模型来进行分类精度,网络参数和FLOPs的比较,以圆来表示。从下图中,我们可以发现,ECA网络模块获得了更高的精度,同时有较少的模型复杂性。
NFNet
然后是抛弃了归一化的模型NFNet,由deepmind推出,可以看到,这个网络又碾压了EffNet
多模型结合
我们暂时使用 parth77 老哥的权重。这个老哥是Coursera的机器学习讲师,我估计这个比赛被Coursera拿去当比赛范例了吧……毕竟模型非常经典。
一般来说有两种方式结合多个模型:
- 拼接两个模型的隐藏层输出,然后用这个拼接的向量放到机器学习模型(比如KNN)去聚类。举个例子,B1的输出是1280,B2是1408,B3是1536(用的全是同一个模型当然效果不好),拼起来是4224的隐藏层向量,使用K近邻算法去聚类。
- 每个模型分别做预测,然后将预测结果聚合去除重复。
高分模型
首先是parth77的几个模型
- ResNext50-32x4d (LB >= 0.72) : https://www.kaggle.com/parthdhameliya77/pytorch-resnext50-32x4d-image-tfidf-inference (Adam+relu activation) 经典的resnet,但是这里可以把池化层换了,效果会更好。
- EfficientNet B3 (LB >= 0.723) : https://www.kaggle.com/parthdhameliya77/pytorch-efficientnet-b3-image-tfidf-inference (Adam+relu activation) EFFnet之前讲过了,限定算力下模型的深度宽度和精度的取舍,用的是Adam优化器加relu激活层的结构,用SGD效果会更好,但是训练更慢
- EfficientNet B5 (LB >= 0.729) : https://www.kaggle.com/parthdhameliya77/pytorch-efficientnet-b3-image-tfidf-inference (Adam+relu activation)
- EfficientNet B5 (LB >= 0.729) : (Ranger+mish activation)
- ECA-NFNET-I0 TFIDF (LB >=0.731) https://www.kaggle.com/parthdhameliya77/pytorch-eca-nfnet-l0-image-tfidf-inference
一些问题
比赛的测试及训练集group有没有重合?
只有小部分重合,这里是参赛选手ranger给出的解释。
因此我们需根据已有的group进行分组训练,然后对未知的group进行聚类。
因此训练完模型之后,在inference时候,引用模型会drop掉最后的全连接层,只用前面的卷积特征部分来提取特征。最后再用测试集数据跑通训练好的模型的arcface来比较他们的相似度。
存在标题相同,但是group不同的商品组合
https://www.kaggle.com/c/shopee-product-matching/discussion/227079
因为他们的图片会不一样
这个比赛,同一个group的商品需要文本和图片都匹配,因此使用投票在组装模型会更好。
Resnet18提升的关键
对特征进行L2正则化,并且使用max-pooling,保证特征被归一化到统一量纲,保证cos距离在1以内,方便比较。max-pooling主要是保证了特征保留更关键的信息。
更改CNN特征代码里的RES18到DENSE161
只需要改变最后的pooling层,保证特征维度相同
他们都是imagenet的模型。输出维度1000维。他们提取的卷积层维度不同。一般是CNN+FC,不同的模型CNN特征维度不同。
公开榜单和本地交叉验证的区别
看这里
冠军方案
比赛结束之后,冠军放出了他们的模型,其实架构大差不差,但是在文本方面使用了更多的模型。
编码模型
- timm中的eca_nfnet_l1s用于图像的编码;
- huggingface中的xlm-roberta-large,xlm-roberta-base, cahya/bert-base-indonesian-1.5G, indobenchmark/indobert-large-p1, bert-base-multilingual-uncased用于文本的编码;
模型框架
使用ArcFace进行模型的训练,图像和文本编码再pooling之后,使用Batchnormalization和feature-wise的正则来输出embedding。和ArcFace论文的思路类似,正则之后的embedding和normalized权重矩阵相乘来生成cosine,最后使用arg margin以及softmax。
微调ArcFace
调整ArCFace是一门学问,足够大的边界对最终获得的embedding质量很重要,
当我们增加它时,模型会遇到收敛问题
我们找到了几种方法来克服这个问题:
- 边训练边逐渐增加margin;
- 使用大的warmup step;
- 对cosinehead使用更大的学习率;
- 使用gradient clipping;
最终我们发现图像模型使用0.8-1.0的margin效果最好;文本模型使用0.6-0.8的margin效果最好。在增加margin时,我们从0.2的margin开始,将图像模型的margin增加到1.0,文本模型的边距增加到0.8。
此外,我们还尝试了class-size自适应margin,思路源于https://arxiv.org/pdf/2010.05350.pdf。对于图像模型,
当margin设置为,对于文本模型,margin设置为是最好的。然而,提升不是很大,因为类是不平衡的,比谷歌的地标识别竞争。
对cosinehead使用较大的学习速率和梯度剪裁,不仅使模型收敛,而且可以使CV值得到更好的结果。
在全局平均池之后添加额外的fc层会损害模型性能,但是在feature-wise normalization前使用batchnorm可以提升我们的分数。
图像和文本的匹配-concat&union
因为本次赛事是多模态的赛事,我们有图像和文本等信息,最终我们需要将这些模态使用好,此处一共尝试了下面几种方案:
从文本embedding生成文本匹配,从图像embedding生成图像匹配,然后对文本匹配和图像匹配进行union;
将文本embedding和图像emebdding进行concat->生成组合的匹配;
对组合匹配、文本匹配和图像匹配进行union;
第二个方法比第一个方法的效果要好很多;第三个方法的效果要比第二个方案好很多。下面是一组参考数据。
- baseline: 0.7(image only), 0.64(text only)
- concat img_emb & txt_emb -> normalize: 0.724
- normalize -> concat img_emb & txt_emb: 0.753
- full data training: 0.757
- union comb, img, txt matches & tune threshold: 0.776
我们对图像embedding和文本embedding进行normalize处理,然后对它们进行concat计算组合相似度。实际上,这与从图像embedding中计算相似度和从文本embedding中计算相似度,然后求平均值是一样的。因此,我们可以将最后一种方法解释为下图。
所以我们接受:图像embedding强烈推荐的商品,文本embedding强烈推荐的商品,以及图像和文本embedding都适度推荐的商品。
Iterative Neighborhood Blending (INB)
除了结合图像和文本匹配之外,正确地利用embedding来产生匹配也至关重要。
基于QE(query expansion)和DBA(database side feature augmentation),我们创建了一个称为INB(iterative neighborhood Blending)的Pipeline。大多数想法都与QE和DBA共享,但有些细节不同。INB Pipeline由这些组件组成。
K近邻搜索
我们使用faiss(https://github.com/facebookresearch/faiss) 对于knn搜索,设置k=51(最多50个non-self匹配+1个self)。我们使用内积作为相似度度量(嵌入被归一化,因此它等价于余弦相似度)
阈值
为了便于实现,我们将余弦相似性转化为余弦距离(=1-cosine similarity),得到(matches,distances)对,它们满足距离<阈值。对于每个商品,我们称这个(matches,distances)pair为“x的邻域”。
Min2
在进行阈值化时,我们可以确保每个查询至少有2个匹配项,因为它是由竞赛描述要求的。只有当距离超过min2阈值时,我们才会拒绝第二个最接近的匹配。
Neighborhood Blending
Neighborhood Blending的想法很简单。
经过knn和min2阈值化,我们得到每个商品的(mathces,similarities)对,我们有一个图,其中每个节点是一个商品,边权重是两个节点之间的相似性。只有邻居是相连的。也就是说,未通过查询节点的阈值条件和min2条件的节点将断开连接。
我们希望利用邻域项的信息来细化查询项的embedding,使聚类更加清晰。为了做到这一点,我们简单地加权和邻域embedding的相似性作为权重,并将其添加到查询嵌入。所以我们混合了邻域embedding。我们称之为NB(Neighborhood Blending)。
最终模型
其它
一些提升细节
对于图像模型,概率为0.1的cutmix有帮助;
对于图像增强,只使用水平翻转效果更好;
madgrad优化器(https://github.com/facebookresearch/madgrad)与Adam和SGD相比表现更好或相似
使用完整的数据进行培训提高效果;
ArcFace的效果更好些。
一些比较
baseline: 0.7(image only), 0.64(text only)
concat img_emb & txt_emb -> normalize: 0.724
min2: 0.743
normalize -> concat img_emb & txt_emb: 0.753
full data training: 0.757
union comb, img, txt matches & tune threshold: 0.776
INB & add diverse txt models: 0.784
use img, txt, comb emb at INB stage 1 & tune threshold jointly: 0.793
亚军方案(给了代码)
亚军的方案非常的朴实,多种开源框架的结合…… 这里是代码
Image similarity
Cosine similarities of NFNet-F0, ViT embeddings
Loss: CurricularFace (better than ArcFace and others)
Optimizer: SAM (better than Adam, SGD, and others)
Concatenate the similarities like F.normalize(torch.cat([F.normalize(emb1), F.normalize(emb2)], axis=1))
Text similarity
Cosine similarities of Indonesian-BERT, Multilingual-BERT, and Paraphrase-XLM embeddings
TF-IDF as in many public kernels
Multimodal (image + text) similarity
Trained model with NFNet-F0 and Indonesian BERT (concatenated at final feature layers)
Graph features
Avg and std of top-K cosine similarities of each item, K=5, 10, 15, 30, etc
Normalized avg to be mean=0 and std=1. To handle the distribution difference between train and test
Pagerank
Score Timeline
After team-merge: 0.777
TF-IDF and image embeddings
Simple LightGBM model on 2nd stage
- Indonesian-BERT similarities: 0.780
- multi-modal similarities: 0.783
- multilingual-BERT and Paraphrase-XLM and misc: 0.788
- pagerank feature: 0.789
- Query Expansion: 0.790
- GAT model for ensembling: 0.792
【kaggle比赛记录】SHOPPE商品分类多模态分析相关推荐
- Kaggle比赛记录和总结
Kaggle比赛 这个比赛我觉得是半年来收获最大的 过程 开始做这个比赛的时候,还有两个月的时间,花了一些时间看相关论文,当时看的是PVNet和CDPN,最后决定用CDPN试一下 CDPN CDPN的 ...
- Kaggle比赛记录(四)Instant Gratification
这应该是找到工作前的最后一个kaggle比赛经历了,最终排名是45/1839,在前3%范围内.其实kaggle的比赛只要认真去做了,基本上拿个前10%不是什么难事. 选择了Instant ...
- kaggle比赛记录——ieee_fraud_detection问题
文章目录 题目 简单尝试版 0. 所需python包 1. 数据 1.1 导入数据并显示 1.2 分析数据 2. 岭回归 2.1 学习曲线 2.2 岭回归模型 2.3 数据预处理:样本不平衡 2.4 ...
- 【第一次参加kaggle比赛记录-Quora Insincere Questions Classification】- Word Embedding
In summary, word embeddings are a representation of the *semantics* of a word, efficiently encoding ...
- 第一次参加kaggle比赛的一些收获与心得,记录一下
#摘要 虽然陆陆续续接触过深度学习的一些相关知识,但是从来没有系统地学习和总结过.加上之前研究的领域是SLAM(实时建图和定位),没有很好的机会直接应用深度学习技术,实践深度学习的机会也比较少.近段时 ...
- 【记第一次kaggle比赛】PetFinder.my - Pawpularity Contest 宠物预测
目录 前言 一.数据介绍 二.我的探索 2.1.基于Classification Head的方案 2.1.1.删除重复数据(打分差别很大) 2.1.2.数据增强 2.1.3.损失函数 2.1.4.优化 ...
- 干货:图像比赛的通用套路有哪些?Kaggle比赛金牌团队为你解答
雷锋网(公众号:雷锋网) AI 研习社按: Kaggle 是全世界首屈一指的数据科学.机器学习开发者社区和竞赛平台,来看看 Kaggle 亚马逊雨林比赛金牌团队的经验分享吧. 日前,雷锋网 AI 研 ...
- Kaggle比赛—预测 DNA、RNA 和蛋白质测量如何在单细胞中共同变化
Kaggle比赛-预测 DNA.RNA 和蛋白质测量如何在单细胞中共同变化 本次比赛的目标是预测随着骨髓干细胞发育成更成熟的血细胞,DNA.RNA 和蛋白质测量值如何在单个细胞中共同变化.您将开发一个 ...
- 数据分析: kaggle比赛 - 销量预测
目录 Part 0: 数据读取 0.1 数据内容简述-Data Files: 0.2 数据读入 Part I: 抽检单个商品的销量分布 Part II:时间纬度 - 查看不同时间颗粒度下的分布 Par ...
- Kaggle比赛心得
正文共5453个字,5张图,预计阅读时间14分钟. 最近参加了两场Kaggle比赛,收获颇多,一直想写篇文章总结一下.接触Kaggle到现在不到一年,比赛成绩一个银牌(5%)一个铜牌(9%),勉强算入 ...
最新文章
- r语言和python-r语言和python学哪个?
- 用python画动图_Python使用matplotlib画动态图
- C# 8中的Async Streams
- 第一节: Timer的定时任务的复习、Quartz.Net的入门使用、Aop思想的体现
- 作者:郑勇,山东省农业信息中心副主任、高级工程师。
- 数据结构中的堆和操作系统里的堆不一样为什么都叫堆呢?
- Android基础学习第二篇—Activity
- linux 切换pip路径_【Python基础】PIP 镜像源配置轻松搞定
- VS2012下基于Glut 绘制立方体示例程序:
- 谷歌浏览器插件自动点击程序
- 关闭计算机的正确操作方法,电脑基础知识启动和关闭电脑的正确方法
- 思维导图组件@hellowuxin/mindmap的基本使用
- 无需Root 手机装电脑系统 虚拟机
- UVA 1598 Exchange
- D3.js中文版api-接口文档
- Ceres Solver从零开始手把手教学使用
- JAVAWEB校园二手平台项目
- Leet Code知识点总结 - 594
- logism电路仿真实验(三)——串行加减法器、先行进位加法器、阵列乘除法器、ALU运算器组成实验
- si7051高精度温度传感器驱动程序