2026年7月2日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

Embedding空间中的时序异常检测

发布日期:2024-08-07 18:07:55 浏览次数: 2933
作者:百度Geek说

微信搜一搜,关注“百度Geek说”



导读 
introduction
本文深入探讨了如何在Embedding空间中运用先进的时序异常检测技术,针对安全、反作弊等业务场景下的流量与用户行为进行精准监控。通过向量化处理和Embedding技术,将多维度的业务数据映射至高维空间,并基于此空间中的样本分布特征进行异常检测。实验验证了该方法在不同异常类型下的有效性,为快速定位和处理异常提供了有力支持。同时,文章还讨论了算法在实际应用中的调整与优化方向,展望了未来在异常检测领域的进一步应用与发展。

全文5887字,预计阅读时间15分钟。

GEEK TALK

01

背景

在安全、反作弊等业务场景下,对流量、用户行为进行异常检测是基本的刚需。通常的做法是,在各个业务维度上,对流量、用户行为进行统计分析,提取出相应的指标特征,然后在时间维度上,对这些指标特征进行建模分析。再利用相关的算法来检测当前的指标值是否背离了该指标在历史数据中的分布规律。


GEEK TALK

02

示例
假设某业务场景下,用户有100个来源渠道,用户使用产品时,有10种不同的操作方式,对于用户的行为,我们可以简单的撮取出PV、UV、失败率等指标。那么我们可以建立这样一个监控:

监控的维度:来源渠道 * 操作方式 = 100 * 10 = 1000个维度

监控的指标:PV、UV、失败率...

统计周期: 小时

然后针对每个维度、时刻、指标,收集过去30天的数据做为训练样本,训练异常检测模型(如EllipticEnvelope等),然后对当前时刻的指标值,进行异常检测。

上面的方法,通过合理的拆分监控维度,一方面可以有效的提高检测的灵敏度,避免较少的异常流量淹没在大盘监控在随机波动中;另一方面,也可以对异常流量进行快速的定位,便于及时处理。


GEEK TALK

03

问题

上面的方法也存在诸多的限制,比如:

  • 监控维度必需是离散、可枚举的,否则无法建立历史数据的统计模型;
  • 监控维度的粒度必须合适,否则或是灵敏度不足,或是噪声太多,无法有效检测异常。

显然,不是所有的业务场景都能满足上述的要求。即便是能满足上述要求的业务场景中,随着对攻击者的对抗不断深入,攻击者会尝试降低攻击的规模,并尽量将攻击行为分散到更多的维度中,从而躲避我们的检测手段。


GEEK TALK

04

解决思路

那么,能否不依赖业务维度拆分,直接对指标进行异常检测呢?

首先,我们需要把待检测的每一条日志、数据当做一个独立的样本。接下来,不难联想到,这些样本都可以映射到某个高维空间中,我们把这个空间叫做样本空间。可以通过向量化、Embedding等方法,得到样本在这个空间中的坐标。

样本在这个空间中的分布必然不是完全随机的,而是会存在一定的特点(分布特征)。若当前时刻样本在这个空间中的分布特征与历史数据中的分布特征不一致,则说明当前样本存在异常。而分布在差异最大的区域中的样本,则可以认为是异常样本。

接下来的问题就变成了如何对这种分布特征进行建模?

最先想到的是,我们可以通过聚类算法,来对样本进行划分,再对每个Cluster,提取出统计特征。但在具体实现时还需要考虑以下问题:

  • 支持的样本数量要足够多;
  • 支持的Cluster数量要足够多;
  • 每个Cluster的样本数量要尽可能均匀;
  • Cluster的划分要尽可能稳定,才能在时间维度上执行异常检测。
再进一步,其实我们不需要执行完整的聚类算法,我们只需要对样本空间设置足够多的采样点进行采样,计算出采样点附近的样本的统计特征做为采集采样点的分布特征,再对采样点的特征进行时间维度的异常检测,即可完成对整个样本空间的异常检测了。


GEEK TALK

05

算法实验

5.1 数据准备

取某业务场景下近30天的用户行为日志,约160万条,利用其中的UserAgent信息,对其进行向量化处理。每条日志的向量长度为128维。

向量化算法:

def to_vector(ua):if isinstance(ua, (list, tuple)):return [to_vector(c) for c in ua]else:vec = np.zeros(128)for c in ua:vec[ord(c) % 128] += 1# UserAgent中的字符绝大多数都是Ascll字符,所以取余128l2 = np.sqrt(np.sum(vec * vec))if l2 != 0:vec /= l2return vec.tolist()
将清洗好的数据保存到向量DB中备用:
for day in days:for hour in hours:event_day = day.strftime("%Y%m%d")event_hour = "{:02d}".format(hour)collection = chroma_client.get_or_create_collection(name="{}_{}_{}".format(name_prefix, event_day, event_hour))sub_df = df_ua_pv[(df_ua_pv.event_day == event_day) & (df_ua_pv.event_hour == event_hour)]ids = [hashlib.md5(bytes(str(row), "utf-8")).hexdigest() for _, row in sub_df.iterrows()]docs = [row.ua for _, row in sub_df.iterrows()]metadatas = [{"pv": row.pv} for _, row in sub_df.iterrows()]embeddings = [to_vector(row.ua) for _, row in sub_df.iterrows()]batch_size = 10000for batch_id in range(0, len(docs), batch_size):collection.upsert(ids=ids[batch_id : batch_id + batch_size],documents=docs[batch_id : batch_id + batch_size],metadatas=metadatas[batch_id : batch_id + batch_size],embeddings=embeddings[batch_id : batch_id + batch_size],)print("{:>8d} / {}".format(batch_id + batch_size, len(docs)))collections[event_day + event_hour] = collection

为了更方便的验证算法的有效性,在数据集中,人工构造了一些异常样本,包括:

  • 个别随机UA,PV增长:10%, 20%, 50%, 100%, 200%, 500%,1000%;数量:5;min_pv=100。

  • 部分相似UA,PV增长:5%,10%,20%, 50%, 100%;数量:10, 20, 50, 100;min_pv=10。

  • 生成相似UA,PV同比增长,数量:10, 20, 50, 100。

  • 生成相似UA,整体PV不增长,数量:10, 20, 50, 100;min_pv=1。

5.2 算法实现

随机生成采样点:

query_ua_list = (df_ua_pv[(df_ua_pv.event_day == event_day) & (df_ua_pv.event_hour == event_hour)].sample(100)["ua"].to_list())

在样本空间进行邻近采样:

results = []query_ua_vec = to_vector(query_ua_list)for day in days:for hour in hours:res = get_collection(day, hour).query(query_embeddings=query_ua_vec, n_results=n_results)for i in range(len(query_ua_list)):for j in range(n_results):row = [query_ua_list[i],res["metadatas"][i][j]["event_day"],res["metadatas"][i][j]["event_hour"],res["documents"][i][j],res["metadatas"][i][j]["pv"],res["distances"][i][j],]if extra_fields:for field in extra_fields:row.append(res["metadatas"][i][j].get(field))results.append(row)cols = ["ua", "day", "hour", "doc", "pv", "dist"]if extra_fields:cols += extra_fieldsdf_results = pd.DataFrame(results, columns=cols)

定义要检测的字段:

AREA_EXP = [0, 2, 8]MODEL_FIELDS = ["pv", "dist"]MODEL_FIELDS += [f"dens_{i}" for i in AREA_EXP]MODEL_FIELDS += ["dens_s"]MODEL_AGGS = {}for col in MODEL_FIELDS:MODEL_AGGS[f"{col}_mean"] = (col, "mean")MODEL_AGGS[f"{col}_std"] = (col, "std")

进行天维度的异常检测:

df_query_results["dens_s"] = 1 / (df_query_results["dist"] ** 0.5 + 1)df_res_agg = df_query_results.groupby(["ua", "day"], as_index=False).agg(pv=("pv", "sum"),dist=("dist", "mean"),dens_s=("dens_s", "mean"),)for i in AREA_EXP:df_res_agg["area_{}".format(i)] = (df_res_agg["dist"] * 10) ** idf_res_agg["dens_{}".format(i)] = df_res_agg["pv"] / df_res_agg["area_{}".format(i)]df_model = df_res_agg[df_res_agg.day <= last_event_day].groupby("ua").agg(**MODEL_AGGS)df_check = df_res_agg.join(df_model, on="ua")for col in MODEL_FIELDS:df_check[f"{col}_sigma"] = (df_check[col] - df_check[f"{col}_mean"]) / df_check[f"{col}_std"]df_check["dens_avg_sigma"] = df_check[["dens_s_sigma"] + [f"dens_{i}_sigma" for i in AREA_EXP]].mean(axis=1)df_check["dens_max_sigma"] = df_check[["dens_s_sigma"] + [f"dens_{i}_sigma" for i in AREA_EXP]].max(axis=1)df_check["dens_min_sigma"] = df_check[["dens_s_sigma"] + [f"dens_{i}_sigma" for i in AREA_EXP]].min(axis=1)

GEEK TALK

06

实验效果

6.1 实验一

个别随机UA,PV增长:10%, 20%, 50%, 100%, 200%, 500%,1000%;数量:5;min_pv=100。

异常样本与原始样本的异常置信度分布对比如下图,由上到下分别为:

  • 天级检测下异常样本的置信度分布;

  • 天级检测下正常样本的置信度分布;

  • 小时级检测下异常样本的置信度分布;

  • 小时级检测下正常样本的置信度分布。

天级检测不同阈值下的准召情况:

小时级检测不同阈值下的准召情况:

6.2 实验二

部分相似UA,PV增长:5%,10%,20%, 50%, 100%;数量:5, 10, 20;  min_pv=10。

异常样本与原始样本的异常置信度分布对比如下图,由上到下分别为:

  • 天级检测下异常样本的置信度分布;

  • 天级检测下正常样本的置信度分布;

  • 小时级检测下异常样本的置信度分布;

  • 小时级检测下正常样本的置信度分布。

天级检测不同阈值下的准召情况:

小时级检测不同阈值下的准召情况:

6.3 实验三

生成相似UA,PV同比增长,数量:5, 10, 20, 50, 100。

异常样本与原始样本的异常置信度分布对比如下图,由上到下分别为:

  • 天级检测下异常样本的置信度分布;

  • 天级检测下正常样本的置信度分布;

  • 小时级检测下异常样本的置信度分布;

  • 小时级检测下正常样本的置信度分布。

天级检测不同阈值下的准召情况:

小时级检测不同阈值下的准召情况:

6.4 实验四

生成相似UA,整体PV不增长,数量:10, 20, 50, 100;min_pv=1。

异常样本与原始样本的异常置信度分布对比如下图,由上到下分别为:

  • 天级检测下异常样本的置信度分布;

  • 天级检测下正常样本的置信度分布;

  • 小时级检测下异常样本的置信度分布;

  • 小时级检测下正常样本的置信度分布。

天级检测不同阈值下的准召情况:

小时级检测不同阈值下的准召情况:

GEEK TALK

07

总结与展望
通过实验,验证了该算法的有效性,但在后续的工程化应用中,还需要结合具体的应用场景进行适当的调整。比如采样点的数量、采样点的选取方法、样本Embedding方法、距离计算方法等。

此外,在实践中,若要发挥出异常检测的真正价值,还需要考虑以下问题:

  • 检测到异常后,如何快速定位到异常样本;

  • 异常样本定位后,如何快速度评估分析,确定异常是否需要进一步处理;

  • 若需要进一步处理,如何快速定位到异常样本来源特征,制定出相应的攻防策略等。

 END


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅