生物探针与行为神经网络风控
本文依据公开专利 CN112580005B、围绕生物探针的技术讨论及业界公开材料整理。全部资料围绕移动端行为采集、本人识别、人机识别和连续认证展开;本文据此将神经网络行为表征 作为当前的工程实现路线,讨论从原始时序、预处理、客户端推理到服务端决策的链路。
专利定义了采集与预处理的数据层:采什么、按何种场景采、如何处理缺失值。神经网络部分讨论这些行为时序进入模型后的表征和决策机制。具体 SDK 是否部署模型、模型位于客户端还是服务端,仍需以样本中的调用链、模型产物或网络协议为准。完整风控通常还会联合设备指纹、账号历史、网络环境和业务行为序列。
来源
专利 CN112580005B:<633K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3j5i4c8W2L8Y4c8K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3!0E0i4K6u0r3M7r3q4@1k6h3&6@1i4K6u0r3b7@1^5I4x3e0t1#2z5o6l9H3x3o6g2n7i4K6t1$3k6%4c8Q4x3@1t1`.
讨论原文:<e35K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0K9r3q4@1k6%4m8@1i4K6u0W2j5$3!0E0i4K6u0r3M7$3S2S2M7X3g2Q4x3V1j5$3j5e0S2U0x3e0m8S2x3g2)9J5k6o6q4U0j5K6c8Q4x3X3b7^5x3$3g2U0i4K6u0V1z5e0b7$3x3q4)9J5k6r3x3^5x3X3b7K6z5e0j5@1j5e0u0U0y4q4)9J5y4X3N6@1i4K6y4n7
京东金融安全 / 安全内参《风控实战:生物探针技术》:<54eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2K6k6h3y4J5M7%4y4Q4x3X3g2U0L8$3#2Q4x3V1k6S2M7Y4c8A6j5$3I4W2M7#2)9J5c8U0b7K6y4o6g2Q4x3U0k6Y4N6q4)9K6b7R3`.`.
《风控要略:互联网业务反欺诈之路》5.1 生物探针(马传雷等):<68eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0L8%4k6W2M7W2)9J5k6i4q4I4i4K6u0W2j5$3!0E0i4K6u0r3M7X3g2S2k6q4)9J5c8U0p5H3x3K6x3K6z5o6p5H3x3U0q4Q4x3V1j5K6y4q4)9K6c8Y4y4G2N6i4u0U0k6g2)9K6c8r3#2Q4y4h3k6B7N6h3#2H3i4K6t1$3k6%4c8Q4x3@1t1`.
风控笔记仓库(账户安全手段与信贷反欺诈数据源):<d7eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6X3k6%4W2W2j5i4y4G2L8W2)9J5c8X3q4D9k6$3!0J5K9i4c8Z5L8g2)9J5k6r3q4F1k6q4)9J5k6s2u0A6M7$3E0Q4x3X3c8E0j5h3&6S2k6$3g2E0k6h3&6@1i4K6t1$3k6%4c8Q4x3@1t1`.
目录
专利范围与业界定位
从采集链路到客户端与服务端模型
黑盒分析、表征空间与行为分布
训练过程与部署模型
冻结模型的语义断层与逆向方法
结论与术语
附录:A. 专利采集字段速查 · B. 一张图看完全文
1. 专利范围与业界定位
整体链路与分析重点
生物探针负责采集行为与传感器数据 :在登录、注册,以及业界常扩到的支付等操作里,把触摸、输入节奏、焦点停留,以及加速度、陀螺仪、方向等传感器序列收下来,做缺失值处理和格式转换。专利默认场景是登录 / 注册;业界叙述里它还可以做连续认证,不限于登录那一下。
在本文采用的实现路径中,触摸、输入节奏、焦点与传感器时序经过预处理后进入神经网络,被压缩为高维表示(embedding);后续模型再结合该表示与历史或群体分布评估风险。
服务端负责最终决策 :embedding 通常与设备、账号、IP、历史行为和交易上下文联合计算风险。客户端神经网络只是整套风控中的一个特征来源。
业界产品叙述里,探针至少同时回答两问:像不像真人(人机识别) ,以及 像不像这个账号本人(本人识别) 。后者对应后文的个体模型和“专属行为画像”。
可以把整套链路概括为:神经网络学习行为表征,服务端结合该表征判断当前行为与历史或群体分布的关系。逆向分析的困难来自语义载体变化:传统算法的判断通常写在控制流和常量中,神经网络的行为则隐含在预处理、网络结构与训练参数 θ 中。
专利范围与实现内容
著录信息
项
内容
公开号
CN112580005B
申请号
CN202011547604.XA
名称
一种基于生物探针技术的移动端用户行为采集方法及系统
申请日 / 优先权日
2020-12-23
公开日(A)
2021-03-30
授权公告日(B)
2024-05-24
分类号
G06F21/316(通过观察计算机使用模式进行用户认证)
适用系统
Android 或 iOS
专利原文链接:<1d4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3j5i4c8W2L8Y4c8K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3!0E0i4K6u0r3M7r3q4@1k6h3&6@1i4K6u0r3b7@1^5I4x3e0t1#2z5o6l9H3x3o6g2n7i4K6t1$3k6%4c8Q4x3@1t1`.
专利要解决的问题
专利背景将移动端身份欺诈概括为以下典型形态:
以猫池设备为代表的模拟器欺诈
以薅羊毛为代表的群控欺诈
以反复点击为代表的程序欺诈
当时主流防控主要靠设备指纹 :用设备信息生成唯一标识,判断设备有没有潜在风险。专利认为这条路有几个硬伤:
设备指纹只能识别设备,不能识别设备上的异常操作行为。
对“正常设备挂脚本 / 物理外挂”这类黑产方式缺少有力检测。
设备指纹本身可以被人为篡改;虚假设备信息的生成成本越来越低,只靠设备指纹识别机器操作,可靠性会持续下降。
所以它提出:用生物探针把移动端用户行为采准,方便后续建模,从而防控机器欺诈。
专利反复描述的是采集、预处理以及为后续计算或建模准备数据 ,没有把客户端分类器直接给出 bot / human 作为权利要求内容。
方法主流程
专利方法可以概括为四步:获取界面场景,判断是否进入指定界面,选择对应模板采集用户行为和设备信息,随后进行空值处理与格式转换,形成供后续计算或建模使用的数据。
指定界面默认是登录、注册,但实施例写明:其他需要用户操作的界面也可以定义为指定场景,可按需求灵活设定。
数据采集模板
模板不是全局一套,而是按场景一对一配置 。设置过程:
根据不同界面场景,选定要采的用户行为种类和设备信息种类。
用这些种类生成与该场景一一对应的采集模板。
进入场景后,按模板采,不采模板外的东西。
这样登录和注册可以采不同字段,后续如果扩展到支付、改密、绑卡,也可以各用各的模板。
用户行为信息
权利要求和说明书列出的行为字段包括下面一类或几类:
密码输入速度
密码输入框获取焦点时间
验证码输入速度
验证码获取焦点时间
实施例另外明确提到:还包括用户触摸屏幕的屏幕轨迹信息 。
这些字段的共同特点:它们描述的是“人怎么操作界面”,不是“这台设备叫什么”。
移动端设备信息
设备侧字段包括下面一类或几类,且都通过内置传感器获取:
字段
专利写明的获取方式
线性加速度
加速度传感器
重力加速度
重力传感器
角加速度
陀螺仪传感器
方向状态
方向传感器
地理位置
磁力传感器(专利原文如此表述)
这里的“设备信息”不是 IMEI、Android ID 那种静态标识,而是操作当下的运动/姿态时间序列 。这一区别决定了后续模型的输入类型。
“地理位置 ← 磁力传感器”按字面很别扭:磁力计给出的是地磁强度和航向,不是 GPS 经纬度。记录时按专利原文来;分析真实 SDK 时,更常见的是磁力计当姿态/航向通道,定位另走 GPS / 网络。分析“地理位置”字段时,不应只检查 LocationManager。
空值处理
采集序列里经常有空洞:传感器短暂丢包、某段没触摸、焦点事件缺失等。专利给了一套很具体的填补规则:
出现空值时,先判断是不是连续空值 。
若是连续空值:整段填 0。
若不是连续空值:取空值处前后各 5 次 连续有效采集值,算均值,用均值填进去。
专利自己解释这套处理的目的:有效简化数据,便于后续计算或建模 ,提升处理效率。
这套规则对应典型的时序预处理:连续缺失当成“这段没有信号”,孤立缺失当成“插值补上”。
格式转换
预处理之后还要做格式转换。实施例写的是:把用户行为信息从 JSON 转成 CSV ,方便后续数据分析。
这说明专利设想的下游更接近“将采集结果送入分析或建模流水线”,而非在采集模块内执行深度网络。JSON → CSV 也更接近服务端或离线数仓步骤;客户端 SDK 中更常见内存缓冲、二进制或 protobuf 上传,未必存在 CSV 写入逻辑。
系统模块
对应方法,系统拆成:
场景判断模块
模板选择模块
信息采集模块
数据处理 / 信息处理模块
模板设置模块
用户行为信息预处理模块
空值判断模块
连续空值处理模块
非连续空值处理模块
格式转换模块
专利的技术边界
从技术范围看,专利覆盖的是:Touch(轨迹、按压)、Timing(速度、焦点)和 Sensor(加速度、陀螺仪、方向)等数据的采集,经空值处理和格式转换后交给后续计算、建模或风控模块。
技术定性 :CN112580005B 描述的是 Sensor / Behavior Acquisition SDK 的采集层。它为行为建模提供输入和预处理约束;本文后续讨论的神经网络表征属于以这些数据为基础的工程实现层。
从采集层到神经网络表征
生物探针为后续建模提供统一的数据入口:
场景:登录、注册及其他需要身份判断的操作界面;
行为:密码或验证码输入速度、焦点停留、触摸轨迹;
传感器:线性加速度、重力、角加速度、方向等;
处理:缺失值处理、格式转换和供后续计算使用的数据组织。
在此基础上,工程链路可以延伸为 采集 → 张量 → 推理 → 表征或分数 → 风控决策 。公开材料对采集对象、产品目标和连续认证场景提供了直接依据;模型结构、部署位置和具体参数则属于实现层,需要结合目标样本确认。这个区分用于界定证据来源,不改变本文以神经网络表征为主线的讨论。
业界对生物探针的定位
专利详细描述了采集过程,但未展开完整反欺诈产品架构。下列公开材料补充了其在产品体系中的位置,结论彼此一致。
京东金融安全科普(安全内参转载):<5f6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2K6k6h3y4J5M7%4y4Q4x3X3g2U0L8$3#2Q4x3V1k6S2M7Y4c8A6j5$3I4W2M7#2)9J5c8U0b7K6y4o6g2Q4x3U0k6Y4N6q4)9K6b7R3`.`.
《风控要略:互联网业务反欺诈之路》5.1 节,马传雷等:<e36K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0L8%4k6W2M7W2)9J5k6i4q4I4i4K6u0W2j5$3!0E0i4K6u0r3M7X3g2S2k6q4)9J5c8U0p5H3x3K6x3K6z5o6p5H3x3U0q4Q4x3V1j5K6y4q4)9K6c8Y4y4G2N6i4u0U0k6g2)9K6c8r3#2Q4y4h3k6B7N6h3#2H3i4K6t1$3k6%4c8Q4x3@1t1`.
风控笔记仓库(账户安全手段与信贷反欺诈数据源):<9d2K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6X3k6%4W2W2j5i4y4G2L8W2)9J5c8X3q4D9k6$3!0J5K9i4c8Z5L8g2)9J5k6r3q4F1k6q4)9J5k6s2u0A6M7$3E0Q4x3X3c8E0j5h3&6S2k6$3g2E0k6h3&6@1i4K6t1$3k6%4c8Q4x3@1t1`.
设备指纹、生物探针与业务行为序列
京东金融在反消费信贷套现里,把三件事并列:
技术
看什么
拦住什么
设备指纹
给账户绑定唯一设备 ID
冒用身份、非常用设备登录
生物探针
按压力度、设备仰角、手指触面等使用习惯,建专属行为模型
当前操作不像这个人
行为序列
本次购买 / 浏览等业务动作 vs 历史习惯
交易模式突然变了
三类技术关注的对象不同:设备指纹判断“是否为同一台设备”;生物探针判断“操作方式是否符合本人”;业务行为序列判断“业务习惯是否异常”。三者可以共同进入风控决策。 公开材料中“行为序列”有两种含义,需要区分:
传感器时间序列 :touch / gyro / accel 按时间排好的矩阵。专利和后文神经网络部分说的都是这个。
业务行为序列 :浏览、加购、下单、还款这些业务事件串,和历史购买习惯比。安全内参里的“行为序列技术”指后者。
生物探针处理前者;后者通常位于服务端,并与 embedding、设备和账号信息联合使用。
消费金融套现案例里,平台看到的是:短时间多个账号从几台移动终端登录、分期买数码、购买习惯和以往不同。设备指纹、生物探针、行为序列是叠着用的,不是只靠探针一个分数。
人机识别与本人识别
《风控要略》将链路概括为:采集传感器和屏幕轨迹,经特征工程和机器学习建立多维度生物行为特征模型,形成专属画像,用于 人机识别 和 本人识别 。
除“像不像真人 / 像不像脚本”外,业界产品还强调另一类问题:当前操作是否符合该账户本人的历史行为。
这和后文的群体模型、个体模型是对上的:
人机识别 ≈ 和大量真人比(群体)
本人识别 ≈ 和这个账号自己的历史比(个体 / 专属画像)
安全内参给的演示也是这个口径:非本人操作分数很低,换成用户本人后分数到 80 以上,两类分得很开。这里的 0–100 是本人分 (越高越像本人);后文的 0.02 / 0.91 按 0–1 风险分 举例(越高越像 bot),两种分数不是同一量纲。
从一次登录校验到连续认证
身份认证的演进,这几份材料写的是同一条线:
用户名 + 密码:只在登录时验一次,密码被盗就全线失守。
指纹 / 面容:仍是登录或支付瞬间的一次匹配,而且要用户主动配合。
生物探针:在使用过程中持续采习惯,不必额外硬件,用户无感知,可以连续判断。
所以它不只是登录页的采集模板。专利默认场景是登录 / 注册,业界叙述则扩到支付中途、盗号后的操作、免密还是加验。
不同操作对应的传感器信号
用户在手机上的动作大体三类:
每一类操作都会产生不同的传感器变化。公开材料指出,不同用户的滑动位置及对应传感器曲线存在可观差异,这构成“专属画像”的经验基础:差异不仅存在于人机之间,也存在于用户之间。
采集对象和专利一致,只是业界常多写几项手感:
《风控要略》还补了一句产品边界:用的是非敏感生物学特征 ,不采集人脸、声纹等敏感隐私,靠算法保证唯一性,并用来对抗伪造和复制。
公开材料中的流程、优点与缺点
安全内参将产品流程概括为:手机端采集传感器和屏幕轨迹 → 特征工程 → 训练好的算法 → 本人 / 非本人 。这与专利中的“采集与预处理,供后续建模使用”,以及后文的“客户端输出 embedding 或分数,服务端执行 G”属于同一条链路的不同表述。安全内参写的是“特征工程 + 训练好的算法”,没有指定一定是深度网络;《风控要略》写的是特征工程和机器学习。风控笔记 也只强调“需要一定的算法支持”。深度网络是其中一种实现,不是业界唯一口径。
优点(风控笔记归纳,和连续认证叙述一致):
无需其他硬件支持
用户无感知
行为习惯不易改变
可以进行连续判断
缺点:
应用场景(安全内参):
账户安全 :账号被盗后,当前操作数据进后端算法,判定非本人,阻断资金流失。
体验 :支付时若判定本人,可走免密;若不是本人,则加验。
生物探针在风控数据栈中的位置
风控笔记把生物探针放在信贷反欺诈常用数据里,旁边还有:
数据
大致干什么
设备指纹
标识“是哪台设备”
生物探针
标识“怎么用这台设备”
设备行为
安装列表、打开卸载、通话短信等
Wi-Fi 列表
名称、接入时间、时长
LBS
IP / 基站 / Wi-Fi / 证件与卡的地理映射
运营商
在网时长、通话短信、访问与位置
关联数据
社会关系、团伙
多头
信贷全周期:注册、申请、审批、放款、还款、逾期
账户安全手段也不止探针:WAF、设备指纹、验证码、生物探针、数字证书、安全 SDK。原理上常被收成两类:加密 / 解密 ,和 人机识别 。生物探针落在后一类,但产品上又多承担本人识别。
还有一个容易混的点:主动式设备指纹有时也会采传感器(麦克风、加速度计)来做设备唯一性。同一颗陀螺仪,可以同时服务两件事:
设备指纹:这颗传感器的硬件噪声 / 设备特征像不像这台机
生物探针:用户操作时传感器曲线像不像这个人
看的硬件可以重叠,问题不是同一个
2. 从采集链路到客户端与服务端模型
从采集到决策的实现链路
公开资料中的设备指纹、生物探针与业务行为序列共同构成风控数据栈。本文以生物探针接入神经网络的链路 X → f_θ → Z → G 为主线:客户端将行为时序编码为 Z,服务端再把 Z 与设备、账号、网络、历史和业务上下文合并决策。
工程上的典型链路为:App 中的生物探针 / SDK 采集 touch、accel / gyro、focus / time、device state 等原始时序 → normalize、window、resample 等预处理 → [T × N] tensor → Neural Network → embedding / score → 风控决策引擎 。
和传统规则风控比,判断逻辑不再是一串容易读的:
if (isEmulator) risk += 10 ;
if (hasFrida) risk += 30 ;
而可能收成:
score = model.run(input )
if (score > threshold) ...
“为什么判异常”的主要依据已不再集中在少量 if 中。
模型的输入与输出
一次操作窗口中的原始序列
假设登录时采 3 秒陀螺仪,采样间隔 10 ms:
timestamp gyro_x gyro_y gyro_z
0.000 0.013 -0.021 0.004
0.010 0.015 -0.019 0.006
0.020 0.010 -0.024 0.003
...
同时还可以采:
accelerometer(加速度)
touch position(触摸坐标)
touch pressure(压力)
touch size(触点面积)
touch velocity(滑动速度)
key interval(按键/输入间隔)
focus duration(焦点停留)
拼起来就是一个矩阵:
X = [
gx, gy, gz,
ax, ay, az,
touch_dx, touch_dy,
velocity,
pressure,
...
]
若 3 秒、约 100 Hz、12 个特征:
300 samples × 12 features
X ∈ R^(300 ×12 )
也就是 3600 个数字。如果字段更多,比如 20 维,就是 300 × 20 = 6000 个数字。
输入模型后的处理路径
常见前向路径:
300 × 12
│
▼
1D CNN ← 抽局部时序模式
│
▼
LSTM / GRU / Transformer ← 抽较长依赖
│
▼
Embedding ← 压成固定长度向量
│
▼
MLP
│
▼
risk_score
输出可以非常简单:
分数
一种常见解释(这里按 0–1 风险分)
0.02
更像真人
0.31
可疑
0.91
更像 bot / 自动化
同一套采集也可以服务于本人分 :安全内参演示里本人通常在 80 分以上、非本人较低。输出头可以是 human / bot、本人 / 非本人,也可以仅输出 embedding,将最终评分留给服务端。
从调用者视角,它就是:
float detect_behavior(Input x) {
return neural_network(x);
}
内部推理可以包含多层算子,对调用方仍表现为单一函数。
多路时序的联合结构
生物探针的价值不在于替代设备指纹,而在于补充设备属性难以表达的操作过程。IMEI、Android ID、Build.FINGERPRINT、机型、分辨率和时区等静态或半静态标识能够描述设备;触摸轨迹、输入节奏、焦点变化、陀螺仪和加速度序列则描述设备被如何使用。专利背景指出,设备信息的伪造成本持续下降,风控因而需要同时观察操作行为。
这些信号的判别价值主要来自联合时序关系 。真人操作时,手指运动、设备微小转动、触摸坐标、陀螺仪和加速度往往同步变化。模型不必为每一通道单独设置阈值,而可以从整体输入 X 中学习与任务相关的关联结构;概率符号 P(touch, gyro, accel, timing) 只是一种理解该结构的视角,实际判别网络通常直接学习 P(y | X) 或 score = f_θ(X)。
例如,自动化输入可能表现为近似直线的触摸轨迹和严格均匀的时间间隔,同时附带一段彼此无关的陀螺仪抖动:
Touch: (100 ,500 ) (150 ,500 ) (200 ,500 ) (250 ,500 )
Time: 100ms 100ms 100ms 100ms
gyro: 0.01 , 0.02 , 0.01 , 0.02
单看任一路都可能落在常见数值范围内;将各通道按时间对齐后,触摸速度、设备姿态和点击节奏之间却缺少应有的耦合。真实操作的多路曲线通常存在相互关联的局部变化:
touch ───────╮
╲
gyro ~~~~~~~~╲~~~~
╲
accel ~~╱╲~~~~~╲~~
因此,异常更适合描述为时序关系不一致 ,而非某个原始值单独越界。后续模型利用的是多路输入的联合结构,而不是简单地将 gyro、touch 或 timing 分别与固定阈值比较。
客户端模型的规模
移动端风控模型通常受到启动时延、内存占用和功耗约束,因此不必采用数百 MB 的大模型。
客户端常见体量:
一个可行的小型网络可以写成:Input → Conv1D(32) → Conv1D(64) → GlobalAveragePooling → Dense(32) → Dense(1)。 参数量可能只有几十万。INT8 量化后,体积可以到 1 MB 以下 ,完全塞得进 .so 或 assets。
所以“有没有神经网络”不能只靠“有没有一个很大的模型文件”来判断。
客户端模型的落盘与执行形态
显式模型文件
Android 上有时能直接看到:
assets/*.tflite
assets/*.onnx
assets/*.bin
assets/*.model
assets/*.pb
res/raw/model.dat
不显式落盘的模型
SDK 也可能不将模型以明文文件形式落盘。例如,libxxx.so 的 .rodata 可保存加密 blob,运行时解密到内存后交由 TFLite 或自研 interpreter 执行;模型还可以由服务端以加密形式下发并在内存加载。因此,磁盘上未出现明文模型文件并不能排除本地推理路径。
手写推理实现
可先检查常见运行时库:
TensorFlow Lite
ONNX Runtime
NCNN
MNN
但运行时库的检索结果不能单独决定结论;小型网络也可以直接以原生代码实现:
for (int i = 0 ; i < 32 ; i++) {
float sum = bias[i];
for (int j = 0 ; j < 64 ; j++)
sum += input [j] * weights[i][j];
hidden[i] = relu(sum );
}
float score =
hidden[0 ] * w0 +
hidden[1 ] * w1 +
...
在反编译结果中,前向计算常表现为密集的:
FMUL / FADD / FMLA / FCMP
ARM64 上再配 NEON:
FMLA / LD1 / FMUL / FADD / FMAX
因此,二进制中未必存在名为 neural_network() 的直观符号。
客户端只输出 embedding 的设计
在本文采用的客户端路径中,sensor sequence 进入 neural network 后可输出固定维度的 embedding,而非直接给出 human / bot 标签。以下以 128 维 为例;真实输出也可以是 32 / 64 / 256 / 512 维向量、sequence embedding、多个 head、logits 或 feature map。
例如:
[0.214 , -0.183 , 0.022 , ..., 0.761 ]
客户端上传的载荷可能只包含 behavior_feature 与 embedding 字段。服务端再将 embedding 与 device fingerprint、account history、IP、transaction graph 和历史行为组合,交由风控模型计算风险。即便把客户端模型完整恢复成 input → embedding,embedding → risk 的后半段仍在服务端。
这里需要区分三个对象:X 是采集后形成的输入矩阵,θ 是模型在训练阶段得到的权重与偏置,Z = f_θ(X) 是本次推理产生的输出表征。若上传的是 embedding,Z 的某个分量 Z_i 既不是某一项原始采集字段,也不是模型参数 θ_i;它通常是多个传感器、触摸、时序特征及其非线性交互共同作用后的结果。
这 128 个数对人基本不可读。可以类比:
照片
↓
人脸网络
↓
[128 维人脸特征]
传感器时间序列
↓
行为网络
↓
[128 维行为特征]
向量本身没有“第 0 维 = 是否真人”这种说明书。它只是把这次操作压成了一个点。
客户端小模型与服务端大模型
客户端模型将一次操作窗口编码为 behavioral embedding,服务端模型再结合上下文输出 risk score。职责通常划分如下:
端
更适合做什么
客户端小模型
实时传感器分析、活体/行为压缩、初步异常、把原始序列压成向量
服务端大模型
本人识别 / 专属画像、账户关系、设备图谱、历史欺诈、跨设备/跨账号、交易上下文、业务行为序列
客户端描述当前操作窗口的行为特征;服务端将其置于账号、设备、历史和交易上下文中完成风险判断。
真机行为库与前端模型下发
这里的“真机库”可以理解为后端长期沉淀的可信真实设备与正常行为样本、账号历史行为及其派生表征。它未必是一个可直接查询的单一数据库;实际形态可以是原始时序、清洗后的训练集、embedding、用户画像、群体原型或分布统计。后端以这些数据完成训练与版本迭代,并保留完整的决策上下文。
在这一架构下,下发到前端的通常不是完整真机库,而是其压缩后的可执行或可计算产物,例如:
轻量化或蒸馏后的客户端编码器 f_θ;
采集字段定义、预处理常数和模型版本配置;
用于本地粗筛的阈值、原型向量或归一化统计;
按版本更新的模型 blob 或加密权重。
链路可表示为:
后端真机行为库 / 历史数据
↓ 离线训练、聚合与版本管理
模型参数 θ、预处理配置、原型或统计量
↓ 按需下发 / 客户端拉取
客户端 f_θ(X) → Z
↓ 上发 Z 与必要上下文
服务端 G(Z, 历史、账号、设备、网络、交易)
因此,“把部分能力拉到前端”更准确地说是将后端训练得到的模型或统计产物部署到客户端,用于实时编码和初步判断;完整样本库、长期历史和最终决策函数仍保留在服务端。具体目标 SDK 是否存在模型更新、配置拉取或原型下发,应通过模型下载接口、配置协议、版本字段和内存加载路径确认。
这里还要区分“真机库中的样本”与“由真机库训练出的模型产物”。前者是大量原始行为或清洗后的行为记录,后者是对这些记录进行训练、聚合、蒸馏后留下的参数和统计量。客户端拉取的通常是后者,而不是把整套真机样本复制到手机上:
真机样本 / 历史行为
↓ 训练、聚合、蒸馏
编码器参数 θ、归一化参数、原型、阈值、版本配置
↓ 下发
客户端输入 X → f_θ(X) → Z
↓
上发 Z(或 Z 的序列 / 多个窗口结果)
单个窗口经过编码后,Z 常表现为一个向量,例如 Z ∈ R^128;如果模型保留时间步或同时输出多个窗口,线上载荷也可能是矩阵或一组向量,例如 Z ∈ R^(T'×d)。无论最终序列化成向量、矩阵还是二进制字段,Z[i] 表示的都是模型表征空间中的一个坐标,不是“第 i 个传感器字段”。它通常由多路输入、多个时间点、预处理结果以及网络中的权重组合共同产生。
3. 黑盒分析、表征空间与行为分布
把神经网络当成黑盒
从调用者和前期分析的视角,可以先把它看成:
y = f(x)
在生物探针场景中,x 可以由触摸轨迹、点击间隔、加速度、陀螺仪、屏幕方向、焦点停留时间和输入速度构成,黑盒 f(x) 输出 y。 模型通常输出的不是“一个行为”,而是对行为的表示或判断 ;网络处理并编码行为序列。
直接分类
直接分类可以表示为 NN(touch, gyro, accel, timing) → [0.97, 0.03],例如读作真人概率 0.97、自动化概率 0.03;也可以输出单一风险分。
这一阶段不必先恢复全部内部算子。模型的目标是通过训练得到 θ,使计算结果具有区分能力;其决策依据通常不是人手编写的可读规则。
行为指纹
输出可以不是标签,而是固定维度向量。服务器将当前 embedding 与历史正常行为比较相似度,再计算风险。
黑盒分析应先确认:
x 是什么?
x 从哪里采?
x 怎么预处理?
f 在哪里调用?
y 是什么?
y 去哪里?
谁最终用 y 做决策?
甚至不必反编译网络,也可以做控制变量实验:其它输入不变,只换一类 gyro,看分数从 0.12 跳到 0.91。这就已经能知道:模型对某类 gyro 分布很敏感 。
分析可按“黑盒分析 → 灰盒分析 → 模型提取 → 离线 inference → 输入扰动 / 敏感度分析 → decision boundary 理解”的顺序推进。 这一阶段可将神经网络抽象为由训练得到内部参数的复杂函数:给定输入,输出分类、分数或特征向量。生物探针负责采集,神经网络负责从时序数据中提取表示或判断。
网络计算的基本形式
从计算图继续下钻,前向计算由常规线性变换与非线性激活组成。极简示例如下:
x1 = touch 速度
x2 = gyro 变化
x3 = accel 变化
x4 = 点击间隔
h1 = ReLU(w11*x1 + w12*x2 + ... + b1)
h2 = ReLU(w21*x1 + w22*x2 + ... + b2)
...
risk = sigmoid(...)
本质就是大量线性变换:
Wx + b
再叠非线性,例如:
ReLU(x) = max (0 , x)
层层叠起来:
x → f1 → f2 → f3 → y
落到机器码,仍然是 load、mul、add、fmla、max、store。它不是 CPU 无法理解的特殊对象,只是参数太多、语义不在源码注释里。
训练参数与业务语义
这是理解神经网络最关键的一步。
传统检测:
if (touch_speed > 1000 ) risk += 10 ;
if (gyro_variance < 0.01 ) risk += 20 ;
if (click_interval == 100 ) risk += 30 ;
读完代码就能做注释:gyro 太稳定会被加分。语义和控制流绑在一起。
神经网络的抽象形式则是:
risk = NN(touch, gyro, accel, timing);
其中可能包含几十万到几百万个 weight。权重不是开发者以 gyro > 0.123 → bot 形式手写,而是由大量真人与机器 / 异常操作样本经过训练获得。 不宜将其理解为“许多 if 被压缩进 weights”。更准确的表述是:
训练数据中对任务有用的统计结构,被训练过程编码进模型参数;模型行为同时受 architecture、preprocessing 和参数共同决定。
落盘时看到的往往是:
model.bin / weights.bin / model.tflite
所以:
机制可以还原:卷积、ReLU、矩阵乘
语义往往还原不了:某个权重为什么是 0.718294,通常没有对应的业务注释。这就是难点。
客户端函数与服务端决策边界
完整抽象
完整抽象可写为:原始 touch / gyro / accel / timing / device 数据经过预处理和对齐形成 [T × N] 输入矩阵 X;客户端网络计算 Z = f(X) 并上传 embedding;服务端模型或风控系统据此输出 risk / action。客户端有机会完整恢复 f(X),但通常不可见服务端部分。 中间那个“看不懂的矩阵”,更准确说通常是一个向量。例如:
X ∈ R^(300 ×20 )
Z = f(X)
Z ∈ R^128
即使把 f 百分之百恢复,也不必然知道 Z[37] = 0.81 代表什么。网络没有义务规定:
Z[0 ] = 是否真人
Z[1 ] = 是否模拟器
Z[2 ] = 是否自动化
每个维度常常没有人类可直接朗读的语义。
服务端通常联合使用的上下文
更接近的形式:
Risk = G(Z, D, A, N, H, T, ...)
符号
含义
Z
当前行为 embedding
D
device / device graph
A
account
N
network / IP / ASN / proxy
H
historical behavior
T
transaction / context
客户端神经网络只是整个风控系统的一只眼睛。这和“业务最终判定不在客户端”是同一类问题:可以完整恢复客户端如何产生证据,但如果服务器掌握最终状态、历史数据和决策函数,就不能只靠客户端静态分析恢复完整判定。
客户端完整模型时的分析边界
如果完整模型都在客户端:
X → NN → risk_score → if
那么模型结构、参数、输入、预处理、输出、阈值都还在本地,分析对象是闭合的。
较复杂的边界是:客户端执行 X → f(X) → Z 并经 HTTPS 上传;客户端不可见的服务端将 Z、历史、账号和设备关系等输入 G(),计算最终结果。 此时可恢复的是 f(X),而分析目标通常是:
G(f(X), server context)
而 G 和 server context 都不在 APK 里。
三个不同的问题
分析对象可分为三类问题:① Acquisition:采集了什么;② Representation:客户端如何将数据转换为 embedding;③ Decision:服务器如何利用 embedding。
①、② 属于客户端侧问题。
③ 已经变成黑盒系统辨识,不再是单纯的二进制还原。
因此,把客户端网络完整恢复,并不是项目终点。只是从“不知道上传的是什么”,推进到“准确知道如何计算 Z,但不知道服务器如何解释 Z”。这两者差别明显。
表征空间分析
进入的领域叫 Representation Analysis(表征分析)/ Model Interpretability(模型可解释性)。
设定:客户端模型已经完整恢复:
X ∈ R^(300 ×20 )
Z = f(X) ∈ R^128
问题变成:Z[0] ... Z[127] 在表征什么,能否通过实验建立可验证的解释?
可以,但目标是确定输入扰动、表征方向和输出区域之间的关系,而不是为每个维度强行指定唯一的业务标签。
分析期待的边界
实际分析时不宜预设内部存在如下固定语义:
Z[0 ] = 手指速度
Z[1 ] = 是否真人
Z[2 ] = 陀螺仪真实性
Z[3 ] = 是否自动化
深度网络通常是 distributed representation(分布式表征) :
一个 latent dimension 往往对应多个输入因素的组合。
一个输入因素可能影响几十个 latent dimensions。
例如 Z[17] 可能同时吃 touch velocity、gyro、accel、timing;Z[83] 可能同时吃 gyro、pressure、touch curvature。
控制变量扰动
把模型当实验对象:
Z = unknown(X)
既然 f、weights、X、Z 都可控可观测,就可以做 Controlled Perturbation。
先造一个 baseline X0(touch / gyro / accel / timing / pressure 都正常),得到 Z0 = f(X0)。再只改 gyro:
X1 = X0 + Δgyro
Z1 = f(X1)
ΔZ = Z1 - Z0
若发现只有 Z[37]、Z[91] 大幅跳动,只能说:
Z[37]、Z[91] 对当前这种 gyro 扰动高度敏感。
在这里,Z[37] 和 Z[91] 只是输出向量的下标;若输出是 128 维向量,它们分别表示第 38 个和第 92 个坐标(代码通常从 0 开始计数)。这个结果只能说明这些坐标对当前这种 gyro 扰动高度敏感,不能据此把任一坐标等同于 gyro。换一种扰动方式,或改变 touch、accel、timing 的组合,敏感坐标和变化幅度都可能不同。
Jacobian:局部敏感度地图
模型恢复后,甚至不必一个个手工试,可以算:
J = ∂Z / ∂X
简化成 4 个输入、3 个输出时,Jacobian 直接告诉你每个 zk 对 touch / gyro / accel / timing 有多敏感。一张表就能看出:
Z[0] 对 timing 敏感
Z[1] 对 gyro + accel 敏感
Z[2] 对 touch 敏感
这已经是在给 embedding 画局部语义地图。
时间维度
真实输入为 X ∈ R^(T×F),例如 300 个时间点 × 多个 sensor feature。分析对象应扩展到:
∂z_k / ∂x_{t,f}
也就是:第 k 个 embedding 分量,对第 t 个时间点、第 f 个特征有多敏感。
于是可以画出二维 heatmap。得到的信息不再只是“gyro 很重要”,而可能是:
例如,实验可能表明模型对手指开始滑动后约 100–300 ms 内 touch 与 gyro/accel 的联合变化更敏感。
这个粒度比“gyro 方差小就加分”精细得多。
群体样本上的 embedding 分析
采集大量输入 X1 ... X10000,全部跑模型,得到:
Z ∈ R^(10000 ×128 )
高维 embedding 可通过 PCA / UMAP / t-SNE 降到 2D/3D。若出现“真人一团、自动化一团”,说明:
客户端 embedding 本身已经把两类行为分开了。
即使完全不知道服务器的 G(),也知道 f(X) 已经在编码非常明显的行为差异。
再给样本打实验标签,事情更清楚:
组
含义
A
真人正常操作
B
固定间隔自动化
C
随机间隔自动化
D
无传感器数据
E
sensor replay
F
不同持握姿势
做聚类后,可能看到 normal human 和 different grip 比较近,automation 和 no sensor 比较近。此时仍不知道 risk = G(Z),但已经知道 embedding space 的几何结构 。
距离与几何关系
服务端可以使用复杂分类器,也可以先以简单相似度或距离函数为例:
d = || Z_current - Z_history ||_2
或余弦相似度:
cos(Z1, Z2) = (Z1 · Z2) / (||Z1|| ||Z2||)
这说明,直接为每个 embedding 维度赋予唯一业务含义并不可靠。若对 embedding 做一次旋转 Z' = RZ,只要后续模型同步适配,系统功能可以保持不变;原先与 gyro 更相关的 Z17 会与其他维度混合,空间整体表达的信息并未消失。
更合适的分析问题是:哪些输入因素控制 embedding 的哪些方向和区域?
能力边界
客户端分析可以很准确地恢复:
X 是什么
预处理
f 的结构
weights
Z
X → Z 的敏感性
embedding space 的几何
但不能因此直接推出:
G 的完整结构
服务器 threshold
服务器账户历史
设备关系图
其他用户训练数据
模型当前版本
如果只能观察服务端最终结果,那就变成 System Identification / Black-box Analysis:通过受控实验看输入变化和输出变化的关系,而不是把服务器代码还原出来。
与传统数据流分析的对应关系
普通 native 函数:
registers + memory → f() → registers + memory
神经网络:
input tensor → f() → embedding tensor
要回答的仍是:
来源是什么?
↓
经过什么变换?
↓
产生什么结果?
↓
结果流向哪里?
↓
谁消费这个结果?
以前可能追:
X0 → LDR → ADD → EOR → STR
现在变成:
Sensor → normalize → tensor → Conv → LSTM → Dense → embedding → protobuf → network
本质仍是 provenance + transformation + sink 。
从大量行为样本到表征空间
“偏移”可作为 representation space 的一阶解释,但不是最终风控算法的定义。
大量行为样本被压缩到一个行为空间,当前行为也映射到其中;一种直观分析方式是观察它与正常行为区域的距离。真实系统完全可能是:
risk = G(Z)
而不是:
risk = distance(Z, μ)
G 里可以有维度交叉、非线性边界、attention、树模型、历史序列、图特征。于是完全可能出现:
A:离中心 0.7 → risk 0.9
B:离中心 1.2 → risk 0.1
因为方向不同 。所以前面的距离公式用于解释空间几何,不表示神经网络风控一定要计算到正常中心的距离。
“偏移”本身也不是看某一个原始数值差了多少,而是看整个高维行为表示在空间里的位置变了多大 ——这仍然只是一阶直觉。
二维空间中的直观例子
假设最后只抽两个特征:
x1 = 点击节奏稳定性
x2 = 手机运动与触摸的协调程度
大量正常用户聚成一团,当前行为如果落在很远的地方,系统就可以说:这个点离正常区域太远。二维时距离可以是:
d = sqrt( (x1 - μ1 )^2 + (x2 - μ2 )^2 )
真实系统不会停在 2 维,更可能是:
Z ∈ R^128
d = || Z_current - Z_normal ||
距离发生在高维空间中,无法目视,但几何意义相同。
正常行为是一片分布
同一个真人:
今天:Z1
明天:Z2
走路时:Z3
坐着时:Z4
不可能完全重合。服务端更可能学的是一片区域。当前点仍落在里面就正常,明显跑出去才异常。“跑出去多少”就是偏移。
大量行为数据的作用
系统首先得知道:什么叫正常波动。
用户 A 的点击间隔可能是 121, 150, 133, 180 ms,用户 B 可能是 250, 310, 210, 270 ms。只看一次 180 ms,根本不知道正不正常。
积累大量数据后,模型才能学到类似:
真人点击不是固定间隔
但也不是完全随机
而且和触摸轨迹、加速度、页面内容等有一定关系
它学的不是:
点击间隔 > 200ms = 正常
而是这些变量之间的联合结构。用概率视角可以写成:
P(touch, gyro, accel, timing, ...)
这帮助理解“关系对不对”。判别模型本身更常学 P(y|X) 或直接出分,不一定显式估计这个联合分布。
系统关心的是:当前数据是否符合过去学习到的正常行为结构。
神经网络作为压缩器
原始数据可以很大:
3 秒 × 100Hz × 20 字段 = 6000 个数
网络把它们压成:
Z ∈ R^128
这 128 个数像是模型自己总结的:
运动节奏
触摸平滑程度
sensor-touch 协调性
时间规律
行为稳定性
这些语义不是人工规定的,所以人直接读数字读不懂。
比欧氏距离更细的服务端判断
最简单:
d(Z, Z_normal)
更合理的常见选择是马氏距离(Mahalanobis distance):
d_M = sqrt( (Z - μ)^T Σ^{-1 } (Z - μ) )
它会考虑:不同方向的正常波动范围不一样。
例如某用户点击速度平时变化很大,gyro 特征却一直很稳定。那么:
点击速度偏一点,系统可能不在意
gyro 特征偏同样的“绝对大小”,反而更异常
因为点击维度的正常方差大,gyro 维度的正常方差小。普通欧氏距离做不到这种“按方向加权”。
真实系统的决策形式
欧氏距离和马氏距离只是用于理解空间几何的典型模型 ,真实决策可以是任意 G(Z, …)。
更完整的说法:
神经网络把复杂行为映射成一个高维表示,后续模型根据这个表示相对于历史分布、群体分布和其他上下文的关系,计算异常程度。
G 可能同时看:
距离
方向(同样远,一边正常、一边高风险)
密度
时间变化
聚类归属
账号历史
设备关系
网络环境
交易上下文
以及和 Z 无关、但会和 Z 拼在一起的业务特征
群体模型与个体模型
行为风控既可与全体用户的群体分布比较,也可与该账户自身的历史分布比较。
群体模型
群体模型将当前行为与大量正常用户比较,回答“是否像真人”。
个体模型
个体模型将当前行为与该账号的历史操作比较,回答“是否符合该用户既有行为”。
两种模型可并行使用并合并为 risk。一种自动化操作即使整体上像真人,也可能因不符合该账号的既有操作方式而被判为高风险。
业界材料里的说法更产品化:京东金融写“为用户建立专属行为模型”,《风控要略》写“用户专属画像”。那就是这里的个体模型。安全内参演示的“非本人分数低、本人 80 分以上”,走的也是本人识别,不是单纯的 bot 分。
服务端还可以给每个用户建历史模板:用前几十次行为估计均值 μ_u 和协方差 Σ_u,把该用户近似成:
Z_u ~ N(μ_u, Σ_u)
以后每次当前行为 Z_t 都算相对于这个用户分布的马氏距离。于是同一个行为:
也可以出风险。
行为漂移
这里的偏移与机器学习中的 drift 概念接近。
若一个用户过去半年 embedding 都集中在 μ_old,最近整体移到 μ_new:
Δ = μ_new - μ_old
这就是行为漂移。系统可能看:
单次异常:● ● ● × ● ●
连续多次慢慢移动:点一串往外爬
两种模式的含义和处理策略不同:单次尖刺可能是误操作或脚本,持续漂移则可能对应换人、设备使用方式变化或账号被逐步接管。
工程实践中的三类脱敏对抗场景
金融反欺诈、账户安全和电商反自动化中,公开技术材料已经反复出现以下几类问题:单独伪造某一路信号并不难,难的是同时满足多路信号之间的时序关系,以及满足某个账号长期形成的行为基线。下面的案例不是对某一家厂商单一项目的逐字复原,而是基于公开披露的攻防机制做的脱敏重构。采样频率、窗口长度、模型层数和阈值属于具体产品参数,不能从这些典型场景直接反推。
案例一:电商抢购中的群控识别
在高价值商品抢购、秒杀等场景中,黑产常使用定制 Android ROM、自动化脚本或群控设备生成点击操作。为了绕过仅检查固定坐标和固定时间间隔的规则,脚本还可能给触摸坐标加入微小随机扰动,例如对坐标偏移加入高斯噪声。这样生成的轨迹在表面上不再完全重复,但它只改变了触摸事件的数值分布,并没有生成真实触摸带来的设备运动反馈。
一种典型探针组合是同时采集:
touch 序列及点击位置;
点击前后的 gyro、accel 微扰;
点击间隔、触摸持续时间和页面事件时间戳。
真实的物理点击通常会在触摸事件附近引起设备姿态或加速度的短暂变化,变化幅度、衰减过程和触摸时序之间存在一定耦合。自动化脚本即使把坐标打散,底层设备可能仍近似静止;如果脚本另外注入陀螺仪噪声,噪声的相位、持续时间和触摸力度也未必与真实运动一致。
可以将输入写成:
X = [touch, touch_velocity, gyro, accel, timing]
Z = f_θ(X)
客户端小模型(例如轻量 1D-CNN 或其他时序编码器)将这段窗口压缩为 Z。服务端的群体模型再将当前表征与大量真人和自动化样本比较:
G_group(Z, device, account, network, context) → risk
此处发挥作用的不是“某个 gyro 数值超过阈值”,而是触摸、设备运动和时间节奏的联合结构 。脚本可以伪造坐标的边际分布,却很难同时复现真实点击的多通道相位关系。因此,即使设备指纹本身看起来干净,当前行为仍可能落入群体模型中的自动化区域。
这个场景对应前文的两个概念:
联合分布 / 联合结构 :判断 touch、gyro、accel 和 timing 是否形成合理的时序关系;
群体模型 :将当前操作与大量真人、脚本和群控样本比较,回答“像不像真人”。
案例二:银行 App 的 ATO 与个体行为漂移
账户接管(ATO)场景中,攻击者可能通过钓鱼页面、恶意软件或社工手段取得账号、密码和短信验证码,再从异地设备发起登录、改密或大额转账。即使攻击者伪造了部分设备标识,设备上的实际操作习惯仍可能与账户原使用者不同。
银行 App 可以在登录、输入金额、收款人编辑等步骤采集输入节奏和持握状态,例如:
按键停留时间(dwell time);
相邻按键之间的间隔(flight time);
输入过程中的重力方向、设备倾角和姿态变化;
页面切换、焦点停留和操作耗时。
客户端先把当前窗口编码为:
Z_current = f_θ(X_current)
服务端为账户 u 维护历史行为的均值与协方差:
μ_u, Σ_u
在采用距离模型的一种实现中,可以计算:
d_M(Z_current, μ_u)
= sqrt((Z_current - μ_u)^T Σ_u^-1 (Z_current - μ_u))
如果当前输入节奏、持握姿势和历史表征同时发生明显偏移,风险引擎可以提高风险等级,阻止免密转账,或触发人脸活体、人工审核等加强认证。这里识别的重点不是“这个设备是否曾经出现过”,而是“当前操作是否符合该账号形成的行为基线”。
ATO 中的异常还可能表现为行为漂移,而不是一次孤立尖刺:账号被接管后,连续多次操作的输入节奏、持握方式、页面路径和交易习惯整体移向另一片区域。服务端通常需要结合时间窗口、设备变化、地理位置和交易上下文判断,避免把用户换手机、受伤或输入环境改变误判为接管。
这个场景主要对应:
个体模型 :与账户 u 的历史分布比较,而不是只与全体用户比较;
行为漂移 :观察一段时间内的表征中心是否从 μ_old 移向 μ_new;
服务端决策 :客户端提供当前表征,账户历史、协方差和加强认证策略仍由服务端掌握。
案例三:社交平台的传感器重放识别
当攻击者逆向出客户端预处理逻辑,确认平台会采集陀螺仪后,可能采用“录制—重放”方式:先录制真人滑动时的传感器数据,再将这段数据附加到机器批量点赞、关注或浏览请求中。
相比直接注入静止值,重放数据的单路统计特征可能更接近真人。防守重点因此从“这段 gyro 是否像真人”转向“这段 gyro 是否与当前触摸事件属于同一次物理操作”。例如,模型同时使用:
touch_velocity
touch_distance
touch_duration
gyro_y
accel
如果黑产为了完成业务动作修改了滑动距离和时长,而继续重放原始陀螺仪片段,就可能形成如下错位:触摸表现为长距离、快速滑动,陀螺仪却只呈现与另一段短操作对应的微弱变化。两路信号分别看都可能合理,按时间对齐后却缺少应有的耦合。
采用对比学习的一种实现可以将同一真实行为的自然扰动视为正样本,将跨行为拼接、重放错配或语义不一致的组合视为负样本:
f_θ(X_real) ≈ f_θ(perturb(X_real))
f_θ(X_real) far from f_θ(X_replay_mismatch)
因此,重放攻击的关键缺陷往往不是某个传感器值异常,而是边际分布看似正常,联合时序关系不成立 。经过编码后,错配样本可能远离正常行为空间,或进入低密度区域,再由服务端模型结合账号、设备和请求上下文识别为重放或自动化。
这个场景对应:
联合结构 :触摸速度、距离、时长和设备旋转的相位关系;
Contrastive Learning :区分自然噪声与会改变行为语义的跨通道错配;
表征空间分析 :通过 ΔZ、距离、密度或分类结果观察重放样本的位置变化。
三个场景与模型层级的对应关系
场景
主要对抗点
主要模型或训练概念
客户端与服务端分工
电商抢购群控
坐标加入随机性,但设备运动与触摸不匹配
联合时序结构、群体模型、自动化聚类
客户端编码 Z;服务端与群体样本及设备上下文联合判断
银行 ATO
凭证和验证码被窃取,当前操作偏离账户历史
个体模型、马氏距离、行为漂移
客户端提取当前行为;服务端维护 μ_u、Σ_u 和加强认证策略
传感器重放
单路传感器数据接近真人,但与新触摸事件错配
联合结构、对比学习、重放检测
客户端提取多路表征;服务端根据表征位置和业务上下文决策
三个案例共同说明:
匹配单路信号不等于匹配联合分布。 触摸坐标、gyro 或输入节奏分别看起来正常时,跨通道的时间关系仍可能暴露自动化或重放。
群体模型和个体模型解决不同问题。 群体模型判断“像不像真人”,个体模型判断“像不像这个账号”。实际风控可以并行使用两者。
Z 通常是多路因素的组合表示。 一个 embedding 分量不应直接等同于某个传感器;真正有用的证据往往体现在多个维度、多个时间点和多个通道的联合变化上。
真机行为库可以通过模型产物参与前端推理。 后端可以将蒸馏后的编码器、归一化统计、原型或阈值按版本下发到客户端,但完整原始样本、账户历史和最终决策函数仍可保留在服务端。
资料与证据边界
公开材料通常会说明产品目标、采集类型和攻防方向,但很少披露完整的采样参数、训练数据、模型权重和服务端阈值。因此,本文将上述内容作为“公开工程机制的脱敏复合案例”使用:
这些资料分别支撑行为生物识别、连续认证、客户端 / 服务端分层、多传感器联合建模和重放防护等机制,但不应把案例中的“1D-CNN”“高斯噪声”“马氏距离”或具体传感器通道理解为某一家产品已经公开确认的固定实现。对真实 SDK 的判断仍应回到可观测证据:采集入口、预处理、模型产物、客户端上发字段、配置版本和服务端响应。
4. 训练过程与部署模型
Loss 如何塑造表征空间
训练通过优化指定的 Loss 更新 θ。分类任务通常追求类别可分;Triplet、Contrastive 等度量学习则更直接地约束相似样本靠近、不同样本远离。分类 Loss 本身并不要求同类样本在 embedding 空间中收缩成一个紧团。交叉熵直接优化的是:
min_θ L(y, f_θ(X))
也就是让预测任务的 loss 降低。它没有 直接规定:
d(Z_human1, Z_human2) → 0
除非另外用了 contrastive loss、triplet loss、center loss、supervised contrastive 之类。分类训练常常会形成可分离的 representation,但“同类一定聚紧”不是 Cross Entropy 本身的硬要求。
记:
Z = f_θ(X)
X:原始行为矩阵(touch / gyro / accel / timing ...)
θ:全部可训练参数(权重)
Z:embedding
训练开始时 θ 基本随机,输出没有我们要的区分能力。然后用带标签或带关系的数据,按选定的 Loss 去改 θ。
监督分类
样本带标签。常见有两套,实际至少有以下两套:
人机:真人 / 自动化
本人:这个账号本人 / 非本人
模型算 Z_i = f_θ(X_i),再接分类头:
p = softmax(W Z + b)
若一个真人被预测成“自动化 0.79”,交叉熵
L = -log p(y)
会很大。反向传播算出 ∂L/∂θ,再更新:
θ ← θ - η ∂L/∂θ
重复大量步数后,不同类别在决策空间里通常更可分。可分不等于同类一定挤成一个紧团——那是度量学习才会直接要求的。这个分界面不是开发者写 if gyro < 0.02 画出来的,是样本加 loss 塑出来的。人机分类拉开的是真人和脚本;本人分类拉开的是“这个人”和“换了个人”,和后文个体模型是同一件事。
Triplet Loss:直接约束距离
每次拿三个样本:
Anchor A:某个真人行为
Positive P:和 A 相似的正常行为
Negative N:异常 / 自动化行为
希望:
d(f(A), f(P)) < d(f(A), f(N))
常见损失:
L = max ( d(A,P) - d(A,N) + m, 0 )
m 是 margin。距离不够大,loss 就继续推动:A 与 P 拉近,A 与 N 推远。
这种训练适合 embedding。它不一定需要固定的“真人/机器”标签,而是约束相似行为接近、不相似行为远离。这与人脸识别中的同一人接近、不同人远离的训练思路相近。
Contrastive Learning:处理无意义扰动
对同一次真实行为做自然扰动:
版本 A:加一点 sensor noise
版本 B:时间轻微拉伸
版本 C:少量采样缺失
它们本质上还是同一种行为,训练会要求:
f(X_A) ≈ f(X_B)
模型由此学习忽略无意义的小噪声。
如果出现触摸轨迹一致而 gyro 完全不匹配等重要变化,训练会拉开两个 embedding 的距离,从而区分:
哪些变化是正常抖动,哪些变化是行为语义变化。
最终服务器判断偏移,不是在原始空间里看“gyro 差了 0.03”,而是在模型学出来的空间里看 d(Z1, Z2)。这个距离已经包含了:哪些差异重要,哪些不重要。
决策边界
训练一直在做的事,是调整网络,让样本在 embedding 空间里更容易被某个边界分开。最后的分类器可以非常简单,例如一条超平面:
w^T Z + b = 0
复杂的是前面的 X → Z:它把原本混在一起的真人和自动化,揉成两团。这是深度学习的核心能力之一。
风控标签也可以远不止 human / bot,而包括:
normal user
automation
emulator
replay
account takeover
device farm
scripted interaction
sensor anomaly
于是空间里会出现多个簇。新点进来时可以问:离哪个 cluster 最近?离 normal cluster 多远?是不是落在低密度区域?risk 不必是简单二分类。
训练完成后的链路
训练链路为:大量训练行为按 Objective 训练 f_θ,形成任务相关 representation;分类学习提高类别可分性,度量学习直接约束同类接近、异类远离。当前行为 X 经 f_θ(X) 得到 Z,再由服务端 G(Z, context) 计算 risk。 “观察 Z 相对正常分布的位置”是空间几何的一种解释,并非该链路的必经定义。
度量学习的关键在于,原始空间中“差 1”没有统一的行为语义;经过距离约束训练后,d(Z1, Z2) 才可能具有行为相似度的解释。若只使用交叉熵分类,更稳妥的表述是:训练决定了类别在决策空间中如何分离 ;距离是否可解释为相似度,还取决于是否存在额外的度量约束,以及服务端 G 对 Z 的使用方式。
θ 与训练产物
如果只讨论网络内部的可训练部分:
训练 = 寻找一组好的 θ
从部署和逆向角度,θ 并不构成完整模型;实际上线的是:
Model = Preprocessing + Architecture + θ + Postprocessing
也就是:
Z = Postprocess( f_θ( Preprocess(X) ) )
在抽象层面,网络可写为:
Z = f_θ(X)
但在 App 中,X 往往不是原始 gyro,而是经过 resample、去均值、归一化、clip 和量化后的张量。
符号
含义
X
送进网络的张量,通常已经过预处理
f
网络结构(CNN / LSTM / Transformer ...)
θ
所有可训练参数
Z
网络输出,后面往往还有后处理
Preprocess
resample、滑窗、归一化、量化等
Postprocess
dequantize、L2 normalize、打包成协议字段等
θ 的组成
最简单一层:
Y = WX + b
θ = {W, b}
W 是权重矩阵,b 是偏置。真实模型由各层的 weights / bias 组成,参数规模可达数十万、数百万甚至更多。.tflite / .onnx / .bin 中大量的 float 或 INT8 数值,主要承载的就是 θ。
初始化
初始化后,真人和机器的输出混成一团,没有区分能力。
通过梯度更新 θ
取一个样本,真实标签是“真人”,模型却输出 0.23。Loss 衡量“这次错得有多严重”。然后算:
∂L / ∂θ
直觉是:这些参数分别往哪个方向调,错误会变小。再:
θ_new = θ_old - η ∂L/∂θ
η 是学习率。循环就是:
θ0 → 看数据 → 算错 → Loss → 反向传播 → 调 θ → θ1 → ... → θ_final
Loss 与空间结构
如果希望真人和自动化分开,就用分类 Loss。如果希望同类靠近、异类拉远,就用 Triplet Loss。空间被拉开,是 θ 被训练出来之后自然产生的结果。
θ 与训练数据的区别
从本地恢复:
仍需复现同一套预处理,才能比较:
同一个原始输入 → 同一个 Z
若分析实现输入原始 gyro,而 App 输入 normalized / resampled gyro,则:
f_θ^{analysis}(X_raw) ≠ f_θ^{App}(X_prep)
即使 Architecture 和 θ 均已恢复,预处理不一致仍会使输出偏离 App。冻结函数的复现必须将预处理一并对齐。
但仍然可能不知道:
θ 当初用了什么训练数据
真人 / 异常样本从哪来
标签怎么产生
用了什么 hard negative
训练集分布是什么
服务器怎么解释 Z
因为:
θ ≠ training dataset
θ 是训练数据经过优化后留下来的参数结果,不是原始数据本身。可以理解为:
海量训练数据通过训练压缩为 θ_final,最终部署为几 MB 到几十 MB 的模型。可概括为:
大量带有标签或关系的行为数据,通过 Loss 定义训练目标,不断调整 θ。分类 Loss 让类别更可分;度量学习才会更直接地规定谁近谁远。
所以:
采什么 / 特征定义 决定它有没有机会看见某路信号
+ 预处理 决定原始值如何变成张量
+ Architecture 决定能表达什么样的函数族
+ Loss 决定它想学什么
+ 训练得到 θ
部署到手机里的,通常是:
Preprocess + Architecture + θ + Postprocess
训练过程和原始训练集通常不会随模型下发。 模型能表达什么,首先受采集通道和预处理约束,再由网络结构与参数决定:未进入输入张量的信号不会被模型利用。这正对应后文的 Data Provenance → Representation → Decision 三层分析。
Architecture、θ、Loss 与部署链路
分析神经网络时,可将训练侧的三项与部署侧的预处理、后处理分开:
特征定义 / 采集
哪些通道根本不会进模型
│
▼
Preprocess
resample / window / normalize / clip / quantize
│
▼
Architecture
网络长什么样:CNN?LSTM?Transformer?
│
▼
θ
所有训练出来的 weights / bias
│
▼
Postprocess
dequantize / 归一化 / 打包
│
▼
Objective / Loss ← 通常只在训练侧,不随模型下发
训练时希望它学会什么
类比一个函数:
output model(raw) {
x = preprocess(raw);
x = layer1(x, W1, b1);
x = layer2(x, W2, b2);
x = layer3(x, W3, b3);
return postprocess(x);
}
preprocess / postprocess 经常不在“模型文件”里,而在旁边的 native 代码
函数结构 layer1 → layer2 → layer3 是 Architecture
W1,b1,W2,b2,W3,b3 是 θ
这些数字为什么是这些值,答案在:训练数据 + 标签/关系 + Loss + Optimizer
Architecture 是机器的结构;θ 是机器最终调好的状态;Loss 是训练方向;预处理决定这台机器实际吃什么。
5. 冻结模型的语义断层与逆向方法
冻结模型与训练语义的分离
传统逆向中常见的“代码已恢复但决策仍难解释”,源于语义载体的变化。
逆向神经网络与逆向普通算法的差异集中体现在这一点:模型并非没有逻辑,而是缺少人手编写、可直接映射为业务规则的逻辑。其行为由网络结构、训练参数 θ、预处理和特征定义共同决定:
Architecture + θ + Preprocessing + Feature Definition
模型的可表达性首先受输入定义约束:若 gyro 未进入输入张量,后续参数无法利用该信号。采集通道、预处理、tensor 组织方式、Architecture 和 θ 共同定义了模型实际能够表达什么;这与后文的采集、表征与决策三层相对应。
部署的是固定训练产物
训练阶段通常在服务器或 GPU 集群完成:训练数据、标签或正负样本关系通过 Loss 和反向传播反复更新 θ,得到 θ_final;随后将 Architecture 与 θ_final 部署为固定模型。 推理时通常已经不训练了 :
Z = f_{θ_final}(X)
同一个确定性的模型、相同预处理、相同输入,一般会得到相同输出(忽略某些随机 / 硬件数值差异)。
所以可以把 .tflite / .onnx / 模型 blob 理解成一个冻结的函数 。但完整的冻结函数应写成:
Z = Postprocess( f_{θ_final}( Preprocess(X) ) )
只恢复 Architecture 和 θ,而漏掉 resample 100 Hz、window=300、去均值、归一化、clip 或 INT8 量化,离线结果就会与 App 不一致。预处理对齐是模型复现的核心条件。
为什么反编译后仍难以理解
普通检测函数通常较为直观:
if (is_root())
risk += 20 ;
if (is_frida())
risk += 50 ;
if (gyro_variance < 0.01 )
risk += 10 ;
逆出来马上能写注释:
这是 root 检测
这是 Frida 检测
这是 sensor 检测
因为这里的语义和控制流高度绑定 。
神经网络可能变成:
x = conv(x, W1, B1);
x = relu(x);
x = conv(x, W2, B2);
x = relu(x);
x = matmul(x, W3);
x = add(x, B3);
return x;
再往机器码下面:
LDR
LD1
FMLA
FMLA
FADD
FMAX
...
可以把算法恢复到:
Y = ReLU(WX + b)
但问题是:
为什么这个 W 里的某个数是 0.718294?
通常没有一段业务代码可以继续追过去找到:
weight = 0.718294 ; // 因为 gyro 异常,所以设成这个值
不存在这种来源。
它是训练优化:
θ_{t+1 } = θ_t - η ∇_θ L
经过大量迭代最后得到的。
计算机制与模型语义
仍然能逆出非常完整的计算机制 :
Input
↓
Normalization
↓
Conv1D
↓
ReLU
↓
LSTM
↓
Dense
↓
embedding
甚至可以恢复:
输入 shape ✓
每层 shape ✓
网络结构 ✓
全部 weights ✓
全部 bias ✓
激活函数 ✓
量化参数 ✓
输出 ✓
从程序恢复角度,f_θ 可能已被 100% 还原 。
但还是回答不了:
为什么这种行为会让 Z[71] 从 0.13 变成 0.82?
或者:
模型为什么认为这种 gyro + touch 组合比较特殊?
因为这属于模型语义 / 表征 问题,而不是传统 CFG / Data Flow 问题。
此外,若上面清单中的“输入 shape / 输出”仅指网络文件内部张量,仍可能遗漏网络外部的预处理。完整程序恢复的终点应为:
Preprocess ✓
Architecture ✓
θ ✓
Postprocess ✓
同一原始输入下 Z 对齐 ✓
若最后一项未完成,恢复的仍只是网络文件,而非 App 中完整的冻结函数。
预处理对齐
模型可能期待如下预处理:gyro → resample 100 Hz → window = 300 → mean removal → normalization → clip → quantize INT8 → tensor。 即使 Architecture 和 θ 已全部恢复,若分析实现输入原始 gyro,而 App 输入 normalized / resampled gyro,则:
f_θ^{RE}(X) ≠ f_θ^{App}(X)
对分析人员而言,完整的冻结函数是:
Z = Postprocess( f_θ( Preprocess(X) ) )
不是只写 Architecture + θ。
语义断层与分析方法
传统算法与神经网络的区别
传统逆向:
机器码
↓
CFG
↓
数据流
↓
if gyro < threshold
↓
异常
所以不断往下逆,通常能找到:
开发者写下来的判断规则。
神经网络逆向:
机器码
↓
Preprocess
↓
Tensor operators
↓
Architecture
↓
Weights θ
↓
f_θ(Preprocess(X))
静态恢复通常可到此为止;若预处理尚未对齐,冻结函数的复现仍未完成。
进一步的问题是:
为什么 θ 是这样?
答案在:
训练数据
+
标签
+
Loss
+
训练过程
而这些通常根本不在 App 里 。
传统逆向中的语义断层
可以把这一区别表述为:
传统算法:
机器码
↓
算法
↓
业务规则
↓
业务语义
基本可以一路追
神经网络:
机器码
↓
Inference Engine
↓
Architecture
↓
θ
↓
──────────────
语义断层
──────────────
↓
训练数据 / Loss / 标签
即使完整恢复上半部分,也无法仅凭静态二进制推导下半部分。
原因是下半部分属于训练历史 ,而非程序执行历史。
逆向结果如何转入实验分析
静态恢复仍然有价值,但分析方法需要转换。
传统 RE 更偏:
Static Analysis
CFG
Data Flow
Value Provenance
Call Graph
模型分析则转为:Model Extraction → Offline Inference → Controlled Perturbation → Ablation → Sensitivity Analysis → Embedding Analysis 。 例如不知道 gyro 有多重要。那就实验:
Z0 = f(X)
只改 gyro:
Z1 = f(X + Δgyro)
ΔZ = Z1 - Z0
再只改 touch,只改 timing:
ΔZ_touch
ΔZ_timing
实验结果可以整理为:
输入扰动 embedding 变化
gyro 0.82
accel 0.63
touch 1.27
timing 0.31
pressure 0.04
即使没有训练集,实验仍可用于推断冻结模型对哪些输入模式敏感。分析重心因而从“读代码理解作者写了什么”转向“对已经训练好的函数做实验,理解它学到了什么”。
这类工作已经从纯 Binary RE 延伸到 ML model interpretability / model analysis 。
因此,即使代码已被正确恢复,模型判断仍可能难以解释;缺失的是训练产生的语义,而不是更多汇编指令。
表征空间分析和偏移分析是跨过语义断层后的主要工作;即使客户端冻结函数完全对齐,服务端的 G 仍可能不在 APK 中。
逆向分析的三个层级
分析这类 SDK 可采用以下分层:
第一层:Data Provenance
Sensor / Touch / Timing
↓
采了什么?怎么预处理成 X?
第二层:Representation
Preprocess(X)
↓
Client NN f_θ
↓
Z
研究:Jacobian / Sensitivity / PCA·UMAP / Clustering / Ablation
第三层:Decision
Z
↓
Server Context
+ Account / Device / History
+ 设备指纹 / 业务行为序列
↓
G
↓
Risk
三层分别回答:采集了什么、从输入中提取了什么,以及最终为何形成风险判断。 即使服务器不可见,前两层仍可深入分析;但客户端 embedding 的理解不等于恢复服务器的风控决策。
Behavioral ML Pipeline 的分析入口
传统分析常聚焦 root check、frida check、emulator check 和 device id。面对生物探针类 SDK,还应单独分析 Behavioral ML Pipeline 。以 Android 为例,其链路通常为:SensorManager / MotionEvent / TextWatcher / onFocusChanged / SystemClock → buffer / ring buffer → resample / normalize → matrix / tensor → NN inference / feature extraction → serialize → network;iOS 对应 Core Motion、UITouch、UITextField 等组件。 尤其值得单独记住这一条链:
SensorManager → buffer → 大量浮点 / NEON 运算 → 序列化 → 网络请求
这类链路通常表明模块可能在执行行为建模,而非仅生成普通设备指纹。
Behavioral ML 可以纳入传统 RE 的 Source → Transform → Sink 骨架:Sensor → Preprocess → Tensor → f_θ(X) → Z → Serialize → Network。 分析目标不是继续寻找单个检测函数,而是按层明确:
层
分析目标
Sensor
provenance:采了什么
Preprocess
feature semantics:原始值怎么变成张量
f_θ
model extraction:结构和 θ
Z
representation analysis:空间几何、敏感度
Serialize
protocol:Z 怎么被打包
Network
server boundary:客户端到哪里结束
Response
black-box system identification:只能观察服务端结果时怎么办
和传统 Hook 检测还有一个交叉:高级风控未必需要明确得到“Frida = true”,而可能把运行环境扰动、操作行为异常、传感器异常一起丢进模型,最后只出一个异常分数。这时难度会明显高于只找检测函数。
和传统检测函数的对比可以记成:
规则检测
行为神经网络
典型形态
一串 if
Preprocess → f_θ(X) → Z / score
语义在哪
控制流和常量
采集定义、预处理、结构和训练历史
本地能否看到最终判定
常常可以
常常只有 embedding
伪造成本
改标识、改返回值
要同时伪造多路相关时序
分析终点
读懂规则
机制对齐之后还要做实验;决策可能在服务端
Behavioral ML 链的拆解清单
本节整理一份分析清单 ,列出各层需要确认的问题及完成标准。
假设本地存在类似 libbehavior.so 的行为模块,分析目标是明确以下链路:
X_App → Preprocess → f_θ → Z → serialize → G
步
需要确认的问题
完成标准
1
采集入口在哪
能指认传感器、触摸、输入、时钟如何进入该模块
2
原始点如何被攒起来
能说明存在窗口 / 环形缓冲,以及窗口多长
3
张量长什么样
能写出 T × N 的时间轴、通道轴,以及通道顺序
4
预处理常数是什么
resample 频率、去均值、归一化、clip、量化参数都能对上 App
5
前向由哪些算子组成
能识别 Conv / MatMul / activation 等,画出 Architecture
6
θ 是什么
weights / bias 从模型文件或只读数据里被完整取出
7
分析环境能否复现 f_θ
同一套 Preprocess + Architecture + θ 能离线跑通
8
是否和 App 对齐
同一原始输入下,分析实现的 Z 与 App 侧一致
9
各通道有多敏感
分别扰动 gyro / touch / timing,观察 ΔZ
10
敏感落在何时何路
得到通道 × 时间的 sensitivity map,而不是一句“gyro 重要”
11
Z 怎么出门
找到序列化格式和字段,确认上传的是向量、logits 还是分数
12
客户端边界在哪
确认之后是服务端 G,本地不再有最终 risk 公式
对应回三层:
1–4:Acquisition(看了什么,怎么变成 X)
5–10:Representation(提取了什么,对什么敏感)
11–12:Decision 的客户端边界(Z 交给谁,G 还在不在本地)
完成后可得到如下链路:
X_App
→ Preprocess
→ f_θ
→ Z
→ protobuf / 自定义二进制
→ G(Z, device, account, history, ...)
在第 8 步完成前,应先处理输入与输出对齐;否则后续实验混杂的是机制误差,而非表征差异。若第 12 步确认 G 不在客户端,分析终点应设在 server boundary,随后转入黑盒系统辨识。
6. 结论与术语
结论
核心结论:
神经网络并非缺少逻辑,而是将逻辑编码在采集定义、预处理、网络结构和参数 θ 中,而非少量可直接阅读的业务分支。本地可复现的对象是完整冻结函数 Z = Postprocess(f_θ(Preprocess(X))),而不是孤立的 Architecture + θ。计算机制可以还原并验证;训练语义仍保留在训练数据、标签和目标函数所构成的历史中。分析重心因此从阅读规则转为对冻结函数进行受控实验。
其余结论如下:
CN112580005B 定义生物探针的数据层。 场景触发、模板采集、空值处理和 JSON→CSV 为后续计算或建模提供输入约束;本文在这一基础上展开神经网络表征路线。
设备指纹与生物探针回答不同问题。 前者识别设备,后者分析设备使用方式;主动式设备指纹也可采传感器,但目的仍是设备识别。
设备指纹、生物探针和业务行为序列通常联合使用。 生物探针评估当前操作方式,业务行为序列评估业务习惯与历史是否一致。
生物探针同时支持人机识别和本人识别。 这使其可参与连续认证、免密决策和异常操作加验。
模型能力来自多路信号的联合结构。 touch / gyro / accel / timing 单独伪造相对容易,同时保持相关时序更难;模型无需显式建模 P(X) 也可利用这种关系。
客户端模型可以较小、手写实现,或只输出 embedding。 模型文件、运行时库和原生浮点算子需要结合调用链共同判断。
初期分析可将网络视为黑盒 y = f(x)。 需要明确输入来源、预处理、输出形式、输出去向和最终消费者。
服务端保留真机行为库、长期历史与最终决策上下文。 客户端可按版本拉取轻量模型、预处理配置或原型统计,用 f 完成实时编码;但无法仅由客户端恢复 G(f(X), server context) 或完整后端数据资产。
客户端上发的 embedding 通常不是采集字段的逐项副本。 X 是输入矩阵,θ 是训练得到的模型参数,Z = f_θ(X) 才是本次推理输出;单个 Z_i 往往由多路信号、多个时间点及其非线性交互共同形成。
embedding 很少具有“一维对应一个语义”的可读映射。 因此,分析重点应放在输入控制的方向和空间区域,而非为单维附会中文标签。
“偏移”用于说明 representation space 的几何关系,不等于最终风控算法。 真实系统可以是任意 G(Z),离中心更近也可能风险更高。
θ 是训练的核心产物,但不是部署模型的全部。 部署模型包括 Preprocess、Architecture、θ 与 Postprocess;训练过程和训练集通常不下发。
分类训练优化任务 Loss,不天然要求“同类聚紧”。 直接约束距离的是度量学习。
采集、表征和决策应分层分析。 理解客户端 embedding 不等于恢复服务器风控;拆解清单按这一顺序组织。
公开对抗实践反复体现同一规律。 群控和重放主要破坏多路信号的联合结构,ATO 主要表现为当前行为偏离账户个体基线;客户端可负责实时编码,群体分布、个体历史和最终策略仍通常由服务端联合使用。
术语表
术语
含义
生物探针
在指定界面采集行为与传感器时序的技术/SDK,专利里的数据采集层;业界也用来做本人识别和连续认证
数据采集模板
按场景配置“采哪些字段”的方案,登录/注册等可以不同
设备指纹
用静态或半静态设备信息生成的标识,判断“是哪台设备”;有时也会采传感器,但目的不是行为画像
真机行为库
后端沉淀的可信真实设备、正常行为与历史行为数据及其派生表示;可用于训练、群体分布估计、个体画像和模型版本迭代,通常不以完整原始样本库形式下发客户端
本人识别
当前操作像不像这个账号历史上的那个人,不是只问像不像真人
人机识别
当前操作像不像真人,还是像脚本 / 群控 / 自动化
风险分
常见 0–1,越高越像 bot / 异常;和本人分不是同一把尺子
本人分
常见 0–100,越高越像账号本人;安全内参演示里本人在 80 以上
连续认证
不在登录瞬间验一次,而是在使用过程中持续用习惯判断身份
专属行为画像
为单个用户建立的行为模型,业界对个体模型的产品说法
业务行为序列
浏览、加购、下单等业务事件串,与历史购买习惯比较;需与传感器时间序列区分
非敏感生物学特征
触摸、姿态、传感器习惯等,不采集人脸、声纹等敏感生物特征
时间序列 / tensor
按时间排好的多路特征,形如 [T × N]
预处理
对齐、重采样、归一化、空值填充、格式转换
神经网络 / NN
由训练得到的参数化函数 Z = f_θ(X)
embedding / Z
一次推理得到的行为表征;不是原始采集字段的逐项副本,也不是模型参数 θ。单个分量通常混合多路输入及其时序关系;真实实现可以使用不同维度,或输出非单一向量
θ
所有可训练权重和偏置,训练的核心产物,但不是部署模型的全部
Architecture
网络结构本身,不含具体数值
Preprocess
resample / 滑窗 / 归一化 / 量化等,常在模型文件外,是模型复现中常见的对齐问题
Postprocess
反量化、向量归一化、打包进协议
冻结函数
Z = Postprocess(f_θ(Preprocess(X))),不是只等于 Architecture + θ
Loss / Objective
训练目标。分类 Loss 让类别可分;度量学习才直接规定谁近谁远
偏移
当前点相对正常区域的位置,可用于解释表征空间;并不等于 risk = distance(Z, μ) 的定义
联合结构 / 联合分布
多路信号之间的相关关系。P(A,B,C,D) 是理解它的概率视角;判别网络更常学 P(y|X) 或直接出分
分布式表征
一个维度混合多个因素,一个因素散落在多个维度
Jacobian
输出对输入的偏导,用来画局部敏感度
PCA / UMAP / t-SNE
把高维 embedding 降到可观察空间的方法
欧氏距离
普通直线距离,不区分各维波动尺度
马氏距离
按协方差加权的距离,能表达“这个方向本来就不该动”
群体模型
和大量正常人比,像不像真人
个体模型
和这个账号的历史比,像不像本人
drift / 行为漂移
正常中心随时间整体移动,和单次尖刺不同
Triplet Loss
拉近相似对、推远不相似对的损失
Contrastive Learning
用同一行为的不同扰动学“什么变化不该改变语义”
决策边界
把空间分成正常/异常(或多类)的分界面
语义断层
程序机制已经还原,训练语义却不在二进制里
f / G
客户端表示函数 / 服务端决策函数
sensor replay / 传感器重放
复用历史传感器片段并拼接到另一段操作中;单路统计可能正常,但跨通道时序关系可能不一致
dwell time / flight time
按键停留时间 / 相邻按键之间的间隔,常用于输入节奏和个体行为建模
附录 A. 专利采集字段速查
行为
密码输入速度
密码输入框焦点时间
验证码输入速度
验证码焦点时间
触摸屏幕轨迹(实施例)
业界材料里多写、专利权利要求没单列的手感
传感器 / 设备状态
线性加速度 ← 加速度计
重力加速度 ← 重力传感器
角加速度 ← 陀螺仪
方向状态 ← 方向传感器
地理位置 ← 专利写磁力传感器(更宜理解成地磁 / 航向,不是 GPS)
预处理
连续空值 → 填 0
非连续空值 → 前后各 5 个有效值的均值
JSON → CSV(实施例)
触发场景
登录、注册
以及其他需要用户操作、可被定义为指定场景的界面
附录 B. 一张图看完全文
指定界面(登录 / 注册 / 支付 / 连续认证 ...)
│
▼
生物探针按模板采集
touch / 输入速度 / 焦点 / 传感器
│
▼
空值处理 + 对齐 + 标准化
(形成供神经网络表征使用的输入张量)
│
▼
X ∈ R^(T×N)
│
▼
客户端 f_θ(冻结的训练成果)
│
▼
Z ∈ R^128 或 本人分 / 风险分
│
├─ 可选:本地先出粗分
│
▼
上传
│
┌──────┼──────────────┐
│ │ │
设备指纹 Z / 特征 业务行为序列
│ │ │
└──────┼──────────────┘
▼
服务端 G(Z, 账号, 设备, 历史, 网络, 交易, ...)
│
▼
相对正常分布的距离 / 密度 / 趋势
(人机 或 本人,口径可能不同)
│
▼
risk / 免密 / 加验
采集层对应专利与业界材料;f_θ 和 G 共同构成本文讨论的工程化行为表征与决策链路。实际产品还会并入设备指纹(识别设备)和业务行为序列(识别业务习惯)。图中的“相对正常分布的距离”用于说明空间几何,真实 G 并不限定为 distance(Z, μ)。分析时应按“看了什么 / 提取了什么 / 如何形成风险判断”三层组织证据。
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!