亚马逊AWS官方博客

多模态大模型应用实践(二)- 基于 ViT 和 Pairwise 的智能酒店首图选择

需求背景

酒店预订平台中,挑选用于展示的第一张酒店图片,即首图,对提高转化率至关重要。然而,从大量图片中人工筛选最佳首图不仅主观,而且耗时耗力,难以满足大规模酒店上架的需求。本文将介绍如何利用 Amazon SageMaker 平台,构建 Learning to Rank 模型,实现图片和文本对齐的排序逻辑,用于智能化的酒店首图选择。通过这种方法,我们可以将人工运营积累的经验快速复制到大量酒店中,实现酒店首图选择的智能化和规模化。这不仅能够提高平台的运营效率,还能为用户提供更好的浏览体验,最终提升酒店预订转化率。

方案介绍

对于选择高质量的首图,运营人员有许多的考量,比如华美的大堂、漂亮的泳池、整洁的房间等等,并没有统一标准和单一量化指标可以使用,通常是要经过合理的运营和曝光测试得到相对可靠的选择。因而,我们参考网页排序算法的逻辑,创造性的把酒店评分模型转换为基于对比学习的模型训练,即从酒店图片中选择相对得分最高的图片作为首图,我们基于历史业务数据构造比较数据对,通过训练让模型具有接近于业务人员的打分能力。

模型架构

Figure 1 Learning to Rank Architecture

模型的架构由以下部分组成:

文本编码器:使用固定的 BAAI/bge-large-zh-v1.5 模型

图像编码器:使用 openai/clip-vit-large-patch14-336 ViT 模型

投影层:一个线性映射层,用于将编码特征映射到共同空间

评分:为每对文本-图像组合产生得分

损失函数:使用 BCE Loss(二元交叉熵损失)

训练过程:

  1. 准备成对的文本-图像组合,并基于业务指标(如转化率高低)标记哪个更好,更好的为 1,低的为 0,并控制正负样本比例小于 1:5
  2. 将这些对通过模型传递,为每对计算得分
  3. 根据模型是否正确地将更好的选项排序更高来计算损失
  4. 反向传播并更新模型的可训练部分(projector 和 vit encoder)

推理过程(用于图片打分):

  1. 对给定的文本和图像进行编码,将这些编码通过投影层,计算每个文本-图像对的得分
  2. 用户选择得分最高的图像作为最佳匹配(首图)

这种方法允许灵活地比较任何文本和图像,而无需绝对分数。它学习相对排序,更加稳健。使用预训练的编码器(CLIP ViT 和 BGE)利用了迁移学习,使模型能够建立在现有的图像和文本语义理解之上进一步增强特定任务的表现。

完整代码参考 Git,读者可根据特定场景灵活选用模型组合,下面依次介绍重点部分。

数据准备

  • 有效的酒店首图作为正样本,建议大于 300 张;
  • 对非首图样本,每组酒店图片达到 10 张以上;
  • 得到 30 组酒店图片组 3000+ 图片,划分 80% 为训练集,10% 为测试集,10% 为验证集。

参与训练的数据集包含了首图与非首图的图片名称和各自的描述,以及本次数据集中首图的标识,让 ViT Encoder 更能理解选择首图的标准。

数据格式示例:

{‘text1’ : HOTEL1_DESCRIPTION,
‘picture1’: PICTURE_HOTEL1,
‘text2’: HOTEL2_DESCRIPTION,
‘picutre2’: PICTURE_HOTEL2,
‘label’: LABEL #0 OR 1}
PowerShell

模型训练

推荐使用至少 a10 机型的 GPU 训练(ML.G5.Xlarge),本代码也支持基于 accelerate 的分布式训练。

训练代码示例:

!python train_CLIP_ViT_pairwise.py --model_name 'openai/clip-vit-large-patch14-336' --train_data_file '../data/train_vit_pairwise.json' --test_data_file '../data/test_vit_pairwise.json' \
--image_dir '../data/imgs' --max_epoch 1 --batch_size 4
PowerShell

训练脚本是基于 accelerate 开发,核心的模型结构模块如下:

class PairwiseViT(nn.Module):
    def __init__(self, vision_tower, num_labels=2):
        super(PairwiseViT, self).__init__()
        self.vit = vision_tower
        self.score_layer = torch.nn.Linear(1024, 1)
    def forward(self, x1, x2):
        x1 = self.vit(x1, output_hidden_states=True)['last_hidden_state']
        # Use the embedding of [CLS] token
        output1 = self.score_layer(x1[:, 0, :])
        x2 = self.vit(x2, output_hidden_states=True)['last_hidden_state']
        # Use the embedding of [CLS] token
        output2 = self.score_layer(x2[:, 0, :])
        output = torch.sigmoid(output1 - output2)
        return output, output1, output2
PowerShell

训练完成后的 checkpoint 保存在本地,上传到 S3,用于部署推理端点。

模型评估

模型训练后,我们使用提前准备的测试集进行验证评估,评估代码如下:

!python eval.py --data_path 'vit_pairwise_clip_model/pred_single_sample.csv'
PowerShell

我们使用 rank@n 的计算指标来比较不同的方法在测试集上的表现,结果如下表:

模型类别 模型细节 首图准确率 首图召回率 首图 F1
分类模型 LLaVA 0.68 0.57 0.62
分类模型 google-ViT 0.57 0.57 0.57
分类模型 Clip-ViT 0.75 0.5 0.6
Learning to rank Pairwise ViT 0.96 0.95 0.95
Learning to rank Pairwise ViT with embedding 0.98 0.98 0.98

可以看到:

  • 我们创新性的使用 learning to rank 的模型结构,提升模型精度 40%+;
  • 文本 embedding 对于首图的选择有增益性收益。

模型部署

这段代码使用 Amazon SageMaker 的 Model 类来创建和部署模型。我们指定了模型镜像、模型数据位置、IAM 角色等信息,然后调用 deploy 方法来创建推理端点。

from sagemaker import Model, image_uris, serializers, deserializers

model = Model(image_uri=inference_image_uri, model_data=model_uri, role=role)

instance_type = "ml.g5.xlarge"
endpoint_name = sagemaker.utils.name_from_base("firstpic-4batch")

model.deploy(initial_instance_count=1,
             instance_type=instance_type,
             endpoint_name=endpoint_name
            )

# our requests and responses will be in json format so we specify the serializer and the deserializer
predictor = sagemaker.Predictor(
    endpoint_name=endpoint_name,
    sagemaker_session=sagemaker_session,
    serializer=serializers.JSONSerializer(),
)
PowerShell

模型推理

部署完成后,我们可以测试推理端点。以下是一个测试示例,请求包含一张图片的 URL 地址,模型将分析图片并给出首图得分。

推理结果样例:

data = {
    "input_image" : image_url
}
output = predictor.predict(data)
print(output)
b'{\n  "score":"1.0"\n}'
PowerShell

成本估算

每千张图片的推理时间约 107s,结合 g5.xlarge 的实例价格,千张图片的推理成本约为 $0.04,对应 GPT4o 的价格约 $5.54,成本优势显著。

items ml.g5.xlarge($/hour) GPT4o($/M Tokens)
price 1.408 2.5
Time 107s /
tokens / 2180000
cost 0.04 5.54

总结与展望

通过利用多模态大模型,我们成功实现了酒店首图的智能化选择,显著提升了运营效率和用户体验。尽管当前模型已经取得了不错的效果,但我们仍然看到了进一步优化的空间:

  • 数据增强:通过图像旋转、裁剪等技术扩充训练集,提高模型的鲁棒性。
  • 模型结构优化:根据实际业务需求测试不同的文本和图像编码器基座。
  • 动态更新:建立在线学习机制,根据用户实际点击行为动态调整模型,适应用户偏好变化。
  • 个性化推荐:结合用户画像信息,为不同用户群体定制首图选择策略。

未来,我们将继续探索这些优化方向,进一步发挥 AI 技术在旅游行业的潜力。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

参考资料

本篇作者

林益龙

亚马逊云科技解决方案架构师,专注于在企业中推广云计算与人工智能的最佳实践。曾担任运维经理、解决方案架构师等岗位,拥有多年的企业 IT 运维和架构设计经验。

刘俊逸

亚马逊云科技资深应用科学家,毕业于康奈尔大学数据科学专业,负责基于开源大模型调优构建生成式 AI 解决方案在行业的落地应用,具有十年机器学习领域工作经验,主要研究方向为多模态算法、模型微调、模型小型化。