-
clip-based的局限性
a)文本模型的最大长度为77, 限制了长文本的表达
b)导致细粒度信息丢失 -
LongClip提出高效的微调方案(支持长文本+改进模型对属性间关系的理解),即插即用
a)KPS(Knowledge-Preserved Stretching): 引入新的可学习参数posisitonal_embedding_new,保留前20个pos_emb不变(不需要进行梯度更新), 对后(248-20)=228个pos_emb进行插值
20:当文本长度超过20时, 模型精度增长缓慢, 对于过长的文本,clip无法更有效地利用额外的信息
# # 插值代码
positional_embedding_pre = model.positional_embedding.type(model.dtype)
length, dim = positional_embedding_pre.shape
keep_len = 20
posisitonal_embedding_new = torch.zeros([4*length-3*keep_len, dim], dtype=model.dtype)
for i in range(keep_len):
posisitonal_embedding_new[i] = positional_embedding_pre[i]
for i in range(length-1-keep_len):
posisitonal_embedding_new[4*i + keep_len] = positional_embedding_pre[i + keep_len]
posisitonal_embedding_new[4*i + 1 + keep_len] = 3*positional_embedding_pre[i + keep_len]/4 + 1*positional_embedding_pre[i+1+keep_len]/4
posisitonal_embedding_new[4*i + 2+keep_len] = 2*positional_embedding_pre[i+keep_len]/4 + 2*positional_embedding_pre[i+1+keep_len]/4
posisitonal_embedding_new[4*i + 3+keep_len] = 1*positional_embedding_pre[i+keep_len]/4 + 3*positional_embedding_pre[i+1+keep_len]/4
posisitonal_embedding_new[4*length -3*keep_len - 4] = positional_embedding_pre[length