CTR预估之DNN系列模型:FNN/PNN/DeepCrossing

news2024/11/19 14:44:39

前言

在上一篇文章中 CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM,介绍了FMs系列模型的发展过程,开启了CTR预估系列篇章的学习。FMs模型是由线性项和二阶交互特征组成,虽然有自动学习二阶特征组合的能力,一定程度上避免了人工组合特征的问题,但却缺少高阶的特征组合,这篇文章的主题则是介绍deep neural networks (DNNs)下的ctr模型,能够自动学习高阶特征组合模式。如下图为最基础的DNN框架。

DNN框架
(本文模型代码:GitHub)

FNN

论文:Deep Learning over Multi-field Categorical Data: A Case Study on User Response Prediction

地址:https://arxiv.org/pdf/1601.02376.pdf

论文指出对于特征交互的自动学习,FMs模型是通过内积的方法,Gradient boosting trees则是通过生成树的方式。这些模型无法用到所有的特征组合可能,并且许多模型特征工程是人工设计,还有另外的问题是大部分ctr模型是浅层的结构,大部分是显式的学习模式,限制了隐式模式的建模能力,影响了模型的泛化能力,由此,论文提出了Factorisation-machine supported Neural Networks(FNN)模型。

模型结构

FNN结构

FNN的结构如上图所示,首先老生常谈地介绍下one-hot编码用于类别特征输入,对于每个field,会有多个单位(units),对应该filed的每种具体的取值feature,并且只会存在一个正单位(positive unit)赋值为1,其他都为负的,赋值为0,比如city=Landon,见上图中Sparse Binary Features(x)。下面我们从上往下一步步进行拆解学习FNN模型。

1. 最顶层是模型的输出。 预测的点击率 y ^ ∈ ( 0 , 1 ) \hat{y}\in (0,1) y^(0,1)。例如在特定的上下文场景下,特定的点击一个广告的概率:

y ^ = s i g m o i d ( W 3 l 2 + b 3 ) \hat{y}=sigmoid(W_3l_2+b_3) y^=sigmoid(W3l2+b3)

​ 其中 s i g m o i d ( x ) = 1 / ( 1 + e − x ) sigmoid(x)=1/(1+e^{-x}) sigmoid(x)=1/(1+ex) W 3 ∈ R 1 × L , b 3 ∈ R , l 2 ∈ R L 。 l 2 W_3\in \mathbb{R}^{1\times L},b_3\in \mathbb{R},l_2\in \mathbb{R}^L。l_2 W3R1×Lb3Rl2RLl2便是该层网络的输入

2. 第2层隐藏层 l 2 l_2 l2的计算。 l 2 = t a n h ( W 2 l 1 + b 2 ) l_2=tanh(W_2l_1+b_2) l2=tanh(W2l1+b2)

​ 其中, t a n h ( x ) = ( 1 − e − 2 x ) / ( 1 + e − 2 x ) , W 2 ∈ R L × M , b 2 ∈ R L , l 1 ∈ R M tanh(x)=(1-e^{-2x})/(1+e^{-2x}),W_2\in \mathbb{R}^{L\times M},b_2\in \mathbb{R}^L,l_1\in \mathbb{R}^M tanh(x)=(1e2x)/(1+e2x)W2RL×Mb2RLl1RM。论文实验 t a n h ( ⋅ ) tanh(\cdot) tanh()比其他的激活函数表现更好。

3. 第1层隐藏层 l 1 l_1 l1的计算。 l 1 = t a n h ( W 1 z + b 1 ) l_1=tanh(W_1z+b_1) l1=tanh(W1z+b1)

​ 其中, W 1 ∈ R M × J , b 1 ∈ R M , z ∈ R J W_1\in \mathbb{R}^{M\times J},b_1\in \mathbb{R}^M,z\in \mathbb{R}^J W1RM×Jb1RMzRJ

4. Dense Real Layer(z)。 z = ( w 0 , z 1 , z 2 , . . . , z i , . . . , z n ) z=(w_0,z_1,z_2,...,z_i,...,z_n) z=(w0,z1,z2,...,zi,...,zn)

​ 其中, w 0 w_0 w0是一个全局标量参数,n是fields的数目。 z i ∈ R K + 1 z_i\in \mathbb{R}^{K+1} ziRK+1

5. Initialised by FM’s Weights and Vectors。 z i = W 0 i ⋅ x [ s t a r t i : e n d i ] = ( w i , v i 1 , v i 2 , . . . , v i K ) z_i=W^i_0\cdot x[start_i:end_i]=(w_i,v^1_i,v^2_i,...,v^K_i) zi=W0ix[starti:endi]=(wi,vi1,vi2,...,viK)

​ 其中, s t a r t i 和 e n d i start_i和end_i startiendi是第i个field的feature索引起点和终点, W 0 i ∈ R ( K + 1 ) × ( e n d i − s t a r t i + 1 ) W^i_0\in \mathbb{R}^{(K+1)\times (end_i-start_i+1)} W0iR(K+1)×(endistarti+1)。即** z i z_i zi由一个偏置项 w i w_i wi和向量 v i v_i vi组成,分别对应FMs中第i个filed的权重和对应取值feature的隐向量embedding,是由经过预训练的FMs模型加载初始化 [ 1 ] ^{[1]} [1],使用了公开数据集进行训练得到泛化性的FMs向量embeddings。**

6. pre-training。 除了上述提到Dense Real Layer的参数z是由FMs预训练得到,FNN模型上层网络的参数也是使用contrastive divergence [ 2 ] ^{[2]} [2]进行RBM(restricted Boltzmann machine)预训练 [ 3 ] ^{[3]} [3],细节详见 [ 4 , 5 ] ^{[4,5]} [4,5]

7. ctr微调。 使用交叉熵进行最小化训练: L ( y , y ^ ) = − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) L(y,\hat{y})=-ylog(\hat{y})-(1-y)log(1-\hat{y}) L(y,y^)=ylog(y^)(1y)log(1y^),y为真实标签0/1,代表是否点击。

总体来看,FNN其实是一个最基础的通用CTR深度神经网络框架,one-hot编码的输入,经过embedding layer层(特征embedding类似于上图[FNN结构]FMs的权重+向量),然后通过多个DNN全连接层,最后通过sigmoid函数得到预测的点击概率。

SNN

论文还提出了另外一个模型Sampling-based Neural Networks(SNN),与FNN的不同之处只是底层网络的结构和训练方法不同。SNN的底层网络是一个带sigmoid激活函数的全连接网络,而不是从FMs加载的向量

为了初始化这部分的权重参数,论文使用了restricted Boltzmann machine (RBM) [ 6 ] ^{[6]} [6]和denoising auto-encoder (DAE) [ 7 ] ^{[7]} [7]两种预训练方法,这里的RBM训练方法与上述FNN中的一样是使用contrastive divergence,而DAE则是使用非监督的SGD方法,如下图:

SNN结构及预训练

其实RBM和DAE的训练思路大致都是通过投影(Projection) ->重构来学习参数,训练目标是让重构前后的向量空间尽量靠近。

这里再来理解下论文提出的采样(sampling-based)预训练方法:

  • 对于每个训练实例中的每个field,比如city,只会存在一个正值的feature,比如city=London;
  • 此时,不是对整个特征集进行建模,而是随机采样m个非正值feature(negative units)并将它们置为0,比如当m=1时,采样了city=Paris这个negative units,这些正值feature和negative units的feature则分别对应上图[SNN结构及预训练]-(b)和©中的白色单元1和0;
  • 而其他未被采样到的negative units则会忽略,不作为输入,对应其中的黑色单元。

L2正则化

实验使用了 iPinYou数据集,第一列为广告主的数量。

不同模型效果

不同dnn结构效果

论文中提及的参考文献:

  1. Rendle, S.: Factorization machines with libfm. ACM TIST 3(3), 57 (2012)
  2. Hinton, G.E.: Training products of experts by minimizing contrastive divergence. Neural computation 14(8), 1771–1800 (2002)
  3. Bengio, Y., Lamblin, P., Popovici, D., Larochelle, H., et al.: Greedy layer-wise training of deep networks. NIPS 19, 153 (2007)
  4. Hinton, G.: A practical guide to training restricted boltzmann machines. Momentum 9(1), 926 (2010)
  5. Hinton, G.E., Salakhutdinov, R.R.: Reducing the dimensionality of data with neural networks. Science 313(5786), 504–507 (2006)
  6. Hinton, G.: A practical guide to training restricted boltzmann machines. Momentum 9(1), 926 (2010)
  7. Bengio, Y., Yao, L., Alain, G., Vincent, P.: Generalized denoising auto-encoders as generative models. In: NIPS. pp. 899–907 (2013)

PNN

论文:Product-based Neural Networks for User Response Prediction

地址:https://arxiv.org/pdf/1611.00144.pdf

论文认为FNN中embeddings初始化的质量存在很大局限,大大取决于FMs模型。更重要的是,FNN中的feature embeddings到MLP全连接层是“加法”(add)操作,在这种multi-fields的类别数据上交互效果可能不如“乘积”(product)操作,提出了Product-based Neural Network(PNN):

  • embeddings的初始化不通过FMs预训练;
  • 特征向量使用product layer来对特征交互进行建模;
  • 通过全连接MLPs更深入的提炼高阶特征模式

模型结构

PNN结构

PNN模型的结构如上图,其中Hidden Layer1-Fully Connected -> Hidden Layer2-Fully Connected -> CTR这三个部分与FNN模型基本上是相同,就是普通的全连接网络层,唯一不同的是隐藏层1和2使用的relu激活函数,而不是tanh:

而于FNN模型的最大区别,也是PNN模型的创新之处就在于Hidden Layer1的输入是由product layer的乘积操作得到: l 1 = r e l u ( l z + l p + b 1 ) l_1=relu(l_z+l_p+b_1) l1=relu(lz+lp+b1)

首先,定义内积(tensor inner product)公式,并得到 l z 、 l p l_z、l_p lzlp

其中 W z n , W p n W_z^n,W_p^n Wzn,Wpn是product layer的权重,维度自然分别于z和p相同; D 1 D_1 D1为第一层隐藏层的维度。

f i ∈ R M f_i\in \mathbb{R}^M fiRM是第i个field的embedding vector: f i = W 0 i x [ s t a r t i : e n d i ] f_i=W^i_0x[start_i:end_i] fi=W0ix[starti:endi],即对应取值的feature的向量,这里与FNN模型是一样的,只是没有加入第i个field的权重。

p i , j = g ( f i , f j ) p_{i,j}=g(f_i,f_j) pi,j=g(fi,fj),论文设计了两种不同的操作g,对应两种PNN变体:IPNN和OPNN。

IPNN

首先介绍第一种: Inner Product-based Neural Network(IPNN),这里的向量内积操作为: p i , j = g ( f i , f i ) = < f i , f j > , p ∈ R N × N p_{i,j}=g(f_i,f_i)=<f_i,f_j>,p\in \mathbb{R}^{N\times N} pi,j=g(fi,fi)=<fi,fj>pRN×N,那么可以得到 l p n l_p^n lpn,并且对上述 l z n , l p n l_z^n,l_p^n lzn,lpn的式子进行展开:

l z n = W z n ⊙ z = ∑ 1 N ∑ 1 M ( W z n ) i , j z i , j l_z^n=W^n_z\odot z=\sum^N_1\sum^M_1(W_z^n)_{i,j}z_{i,j} lzn=Wznz=1N1M(Wzn)i,jzi,j

l p n = W p n ⊙ p = ∑ 1 N ∑ 1 N ( W p n ) i , j p i , j l_p^n=W^n_p\odot p=\sum^N_1\sum^N_1(W_p^n)_{i,j}p_{i,j} lpn=Wpnp=1N1N(Wpn)i,jpi,j

可以算出 l 1 l_1 l1的空间复杂度为 O ( D 1 N ( M + N ) ) O(D_1N(M+N)) O(D1N(M+N)),时间复杂度为 O ( N 2 ( D 1 + M ) ) O(N^2(D_1+M)) O(N2(D1+M)) D 1 D_1 D1是Hidden Layer1的输入的size,M是embeddings的size,都属于模型的超参数,N则是field的数量。

一阶分解。 受到FM的启发,论文使用矩阵因子分解的方法,令 W p n = θ n θ n T , θ ∈ R N W_p^n=\theta^n\theta^{nT},\theta\in \mathbb{R}^N Wpn=θnθnTθRN,将 l 1 l_1 l1的计算简化为如下:其中, δ i n ∈ R M \delta_i^n\in \mathbb{R}^M δinRM代表特征向量乘上一个权重: δ i n = θ i n f i , δ n = ( δ 1 n , δ 2 n , . . . , δ i n , . . . , δ N n ) ∈ R N × M \delta_i^n=\theta_i^nf_i,\delta^n=(\delta^n_1,\delta^n_2,...,\delta^n_i,...,\delta^n_N)\in \mathbb{R}^{N\times M} δin=θinfiδn=(δ1n,δ2n,...,δin,...,δNn)RN×M

随着第n个node的一阶分解, l p l_p lp最终的公式如下,空间和时间复杂度 都降到了 O ( D 1 M N ) O(D_1MN) O(D1MN)

K阶分解。 更普遍的分解方法,即K阶分解,如下式:

其中, δ n i ∈ R K \delta^i_n\in \mathbb{R}^K δniRK,K阶分解表现更好,但也会带来K倍的计算度。

OPNN

第二种则为Outer Product-based Neural Network(OPNN),与IPNN唯一不同的只是p的内积方式,OPNN使用的内积操作是: g ( f i , f i ) = f i f j T g(f_i,f_i)=f_if_j^T g(fi,fi)=fifjT,因此对于p的每个元素是一个矩阵: p i , j ∈ R M × M p_{i,j}\in \mathbb{R}^{M\times M} pi,jRM×M l 1 l_1 l1的时间复杂度和空间复杂度都变为了 O ( D 1 M 2 N 2 ) O(D_1M^2N^2) O(D1M2N2)

为了降低复杂度,论文使用了superposition(叠加)的方法,重新定义了p的计算:

通过简化p的计算 p ∈ R M × M p\in \mathbb{R}^{M\times M} pRM×M,对应的 W p ∈ R D 1 × M × M W_p\in \mathbb{R}^{D_1\times M\times M} WpRD1×M×M l 1 l_1 l1的空间和时间复杂度都降低为 O ( D 1 M ( M + N ) ) O(D_1M(M+N)) O(D1M(M+N))

KPNN & PIN

论文:Product-based Neural Networks for User Response Prediction over Multi-field Categorical Data

地址:https://arxiv.org/pdf/1807.00311.pdf

原团队作者在后来又发表了一篇PNN的论文,去掉了上述针对复杂度的公式优化,使用FMs的特征对交互操作,提出了不同框架形式的PNN,包括下图中的三种PNN:新PNN结构图

PNN组合

并且统一了PNN的一般框架,由特征向量(embeddings)、特征向量的交互(product)、embeddings和product拼接后输入DNN:

再结合上图[新PNN结构图]和图[PNN组合],可以看出,新提出的PNN其实就是使用不同的feature extractors,即使用不同的特征向量交互(product)操作。

Inner Product-based Neural Network(IPNN). 这里的product操作其实就完全跟FMs模型一样,使用内积的操作。

Kernel Product-based Neural Network(KPNN). KPNN使用的product操作则包括两种:FFM、FM的扩展-FM+linear kernel。

Product-network In Network (PIN). PIN使用的product操作则是FM的另外一种扩展形式:FM+micro network kernel。

实验结果

  • IPNN和OPNN与FM对比效果更优,且收敛更快;
  • 使用IPNN和OPNN拼接的product layer,相比单独的product layer效果反而下降。

KPNN和PIN的效果对比如下图:

Deep Crossing

论文:Deep Crossing - Web-Scale Modeling without Manually Crafted Combinatorial Features

地址:https://www.kdd.org/kdd2016/papers/files/adf0975-shanA.pdf

虽然这篇论文是在解决用户在搜索场景下的广告点击问题,但其实这本质还是与推荐系统的ctr任务一样的,item对应广告。论文尝试使用残差网络来替代普通的DNN网络,其他与基础的ctr-DNN框架基本一致,Deep Crossing的网络框架如下图:

Deep Crossing

Embedding and Stacking Layers

  • 首先,还是常规的特征进行one-hot编码,然后进行embeddings映射,以此来大大减少one-hot向量的维度。不过论文对embeddings加入了bias,并且使用了非线性变换ReLU;
  • 接着不同输入的embeddings进行拼接,即stacked (concatenated)

Residual Layers

残差网络的优点在于能够缓解梯度消失,可以使用更深的网络层数,建模更高阶的特征,增强模型的表达能力。

总结

本文介绍的三种ctr模型框架的出发点都是为了解决人工构造组合特征的问题,并且希望加入深层网络(DNN)来隐式挖掘高阶特征:

  • PNN与基础的DNN网络框架一致,只是embeddings是从FM模型预训练进行加载;
  • FNN则是保留特征product这样的显式建模,与embeddings拼接输入到DNN,并且提出多种product操作;
  • Deep Crossing则是用残差网络来代替DNN。

代码实现:GitHub仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/569113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Springboot】集成百度地图实现定位打卡功能

目录 第一章 需求分析 第二章 概要设计 第三章 详细设计 3.1 环境搭建 3.1.1 获取百度地图ak 3.1.2 创建springboot项目 3.2 配置application.properties 3.3 配置pox.xml 3.4 创建定位接口 3.5 创建前端页面 3.6 映射静态文件 第一章 需求分析 如图&#xff0c;当…

BERT论文核心点记录

BERT适合分类任务&#xff08;整段分类后者词分类&#xff09;&#xff0c;对生成任务不友好 使用BERT的方法&#xff1a;只需要在预训练好的BERT基础上新增一个输出层&#xff0c;然后用标记好的数据进行有监督微调 Bidirectional Encoder双向Encoder实质上就是指Transforme…

【分享】用java和pathon实现小红书(Red Booklet)客服自动回复功能、技术实现分析

技术栈&#xff1a;python、java、android&#xff0c;进程管理、socket通信 客户需求&#xff1a; 客户需要在Red Booklet平台做一个可以24小时自动回复用户私信、评论、回关用户等行为的客服软件。他说他们公司有50个小红书号&#xff0c;十几个客服&#xff0c;急需一款代…

正则表达式和文本三剑客题型练习

​ 1、显示/etc/passwd文件中以bash结尾的行&#xff1b; 解释&#xff1a;使用 grep 工具来搜索文件 /etc/passwd 中匹配模式 bash$ 的行。bash$ 是一个正则表达式&#xff0c;其中 $ 表示行结尾。因此&#xff0c;bash$ 匹配以 bash 结尾的行。 grep bash$ /etc/passwd 运…

四元数转换为欧拉角(多解问题)

车辆行驶状态估计&#xff08;4&#xff09;中车辆横摆角信息在顺时针转向时存在明显的错误&#xff0c;进行记录输出 2023-05-25-aft02.txt 四元数&#xff1a; -0.00201210.00115721 -0.0005967610.999997 欧拉角&#xff1a;3.14039四元数&#xff1a; -0.00170584 -0.00…

RabbitMQ(2)、MQ的问题、消息可靠性

一、MQ的问题 基于上篇存在的问题 1. 问题说明 MQ在分布式项目中是非常重要的&#xff0c; 它可以实现异步、削峰、解耦&#xff0c;但是在项目中引入MQ也会带来一系列的问题。 今天我们要解决以下几个常见的问题&#xff1a; 消息可靠性问题&#xff1a;如何确保消息被成功送…

MySQL — SQL 优化

文章目录 SQL 优化一、插入数据二、主键优化2.1 数据组织方式2.2 页分裂2.3 页合并2.4 主键设计原则 三、 Order by 优化3.0 排序方式讲解3.1 升序/降序联合索引结构图示3.2 总结 四、Group by优化五、limit优化六、 count优化七、update优化七、update优化 SQL 优化 一、插入…

【MySQL 数据库】5、存储引擎

目录 一、MySQL 体系结构二、存储引擎简介三、InnoDB 存储引擎四、MyISAM五、Memory六、三大存储引擎比较七、存储引擎的选择 一、MySQL 体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主…

07:MYSQL----多表查询

目录 1:多表查询概述 2:多表查询分类 3:内连接 3:外连接 4:自连接 5:联合查询-union&#xff0c;union all 6:子查询 1:多表查询概述 select * from emp , dept; emp:表中有6条数据, dept表中有5条数据只查询出来的数据为:30条 概述:指从多张表中查询数据 笛卡尔积…

在vite或者vue-cli中使用.env[mode]环境变量

在项目中总会遇到一些默认的配置,需要我们配置到静态文件中方便我们去获取,这时候就可以用到这个.env环境变量文件,在cli创建的项目中顶层的nodejs会有一个process对象,这个对象可以根据不同的环境获取不同的环境配置文件,但是vite中获取变量的方式不一样。 创建变量文件.env.…

如何编写接口自动化框架系列之requests详解(三)

目录 1.http协议 2.requests介绍 3.requests的主要功能 3.requests的主要功能 3.1 场景1-常用方法 3.2 场景2-通用方法 3.3 场景3-cookies认证方式 4.requests 在项目中的实践 4.1 在接口层实现一个接口 4.2 在测试用例层调用 4.3 项目总结 本文是接口自动化测试框架…

IOC初始化 IOC启动阶段 (Spring容器的启动流程)

[toc](IOC初始化 IOC启动阶段 (Spring容器的启动流程)) IOC初始化 IOC启动阶段 (Spring容器的启动流程) Resource定位过程&#xff1a;这个过程是指定位BeanDefinition的资源&#xff0c;也就是配置文件&#xff08;如xml&#xff09;的位置&#xff0c;并将其封装成Resource对…

Makefile基础教程(make的隐式规则)

文章目录 前言一、什么是make的隐式规则二、makefile中出现同名目标时三、一些常见的隐式规则四、查看隐式规则五、隐式规则缺点六、禁用隐式规则1.全局禁用2.局部禁用 总结 前言 本篇文章将给大家介绍make的隐式规则。 一、什么是make的隐式规则 Make 的隐式规则是指 Make …

css选择器及其权重

1. 类型选择器 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

【ZYNQ】裸机 PS + PL 双网口实现之 ZYNQ 配置

目前&#xff0c;在 ZYNQ 中进行以太网开发的方案&#xff0c;大部分都是基于通过 PS 的 MIO 以 RGMII 接口连接外部 PHY 芯片的方式。但是&#xff0c;由于使用 PS 的 MIO 只能以 RGMII 接口连接外部 PHY 芯片&#xff0c;这就限制了支持其他接口 PHY 芯片的使用&#xff0c;如…

分文件实现温湿度数据管理系统项目

目标&#xff1a; 了解分文件的概念&#xff0c;要依次从C语言的函数声明、变量的存储类别、C语言编译预处理&#xff0c;说起。这些知识点我们之前或多或少接触过&#xff0c;这里做个总结与拓展。经过总结&#xff0c;最后我们归纳出一个实现C语言模块化编程的技巧&#xff…

03-bootstrap-响应式布局-栅格系统

一、概述 1、栅格系统是 Bootstrap 中响应式布局的重要组成部分&#xff0c;旨在实现页面元素的自适应排版。Bootstrap 栅格系统将屏幕宽度分为 12 列&#xff0c;通过在 HTML 元素上添加相应的类名&#xff0c;可以让元素占据指定数量的列数&#xff0c;从而实现灵活的布局效…

5种易实现的Linux和 Windows VPS速度提升方法

​  无论是Linux VPS还是Windows VPS&#xff0c;网站速度的提高都是非常重要的。它们在提高网站速度方面都有很多的优化方法。下面我们将介绍 5 种提高网站速度的方法。 1.通过缓存加速 缓存通常是用来加快商业网站加载时间的技术&#xff0c;因此它也可以用在 VPS 上。没有…

车架号查车辆信息-vin查车辆信息api接口

接口地址&#xff1a; https://登录后显示/pyi/88/264(支持:http/https)) 在线查询&#xff1a;https://www.wapi.cn/car_vin.html 网站地址&#xff1a;https://www.wapi.cn 返回格式&#xff1a;json,xml 请求方式&#xff1a;GET,POST 请求说明&#xff1a; Md5验证方式-…

字符串、字符串列表,倒序生成字典。

带数字的字符串以数字为key倒序生成字典&#xff0c;字符串列表按其元素索引为key倒序生成字典。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简…