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

前言

在上一篇文章中 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仓库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot中使用mail邮件

Springboot中使用mail邮件发送 1、配置邮箱的POP3/SMTP服务和IMAP/SMTP服务2、导入依赖和一些默认#配置新的3、发送邮件4、整合工具类 1、配置邮箱的POP3/SMTP服务和IMAP/SMTP服务 这里使用的是QQ邮箱,进入设置-账户&#xff0c;开启下服务。 开启后获取授权码&#xff0c;保存…

智能路由器开发之OpenWrt简介

智能路由器开发之OpenWrt简介 1. 引言 1.1 智能路由器的重要性和应用场景 智能路由器作为网络通信的核心设备&#xff0c;具有重要的地位和广泛的应用场景。传统的路由器主要提供基本的网络连接功能&#xff0c;但随着智能家居、物联网和大数据应用的快速发展&#xff0c;对于…

Typora+PicGo+阿里云OSS搭建博客图床

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 程序日常 ✨特色专栏&…

每日一题——删除字符串中的所有相邻重复项

每日一题 删除字符串中的所有相邻重复项 题目链接 思路 这是一道用栈解决的典型题目 我们先来看看栈的基本性质&#xff1a; 栈&#xff1a;是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端称为栈顶&#xff0c…

【PC迁移与管理】上海道宁为每个用户和每个 PC 传输和迁移场景提供解决方案——PCmover

PCmover 是一款 可以自动将所有选定文件、 文件夹、设置、用户配置文件 甚至应用程序 从旧PC传输、恢复和升级到 新PC或操作系统的软件 而且由于 大多数迁移的应用程序 都已安装在新PC上即可使用 通常无需查找旧CD 以前下载的程序 序列号或许可证代码 开发商介绍 La…

Zookeeper学习---2、客户端API操作、客户端向服务端写数据流程

1、客户端API操作 1.1 IDEA 环境搭建 前提&#xff1a;保证 hadoop102、hadoop103、hadoop104 服务器上 Zookeeper 集群服务端启动。 1、创建一个工程&#xff1a;Zookeeper 2、添加pom文件 <?xml version"1.0" encoding"UTF-8"?> <project …

Android Studio 2022.3 新版 flamingo 安装步骤及遇到的问题

下载地址: https://developer.android.google.cn/studio D盘中新建一个 Android 文件夹, 用来存储 Android studio 和 SDK 文件. 下载好之后, 运行 exe 文件, 点击 next 注意这个路径最好不要有空格,比如 program files这种目录,不然后面安装sdk的时候会有问题. 点击 instal…

【Linux】线程概述、创建线程、终止线程

目录 线程概述1、创建线程函数解析代码举例 2、终止线程函数解析代码举例 橙色 线程概述 与进程类似&#xff0c;线程是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。 进程是 CPU 分配资源的最小单位&#xff0c;线程是操作系统调度执行的最小单位。…

Qt与Excel:从底层原理到上层应用的全面探索

Qt与Excel&#xff1a;从底层原理到上层应用的全面探索 一、Qt与Excel文件的交互基础&#xff08;Basics of Qt and Excel Interaction&#xff09;1.1 Qt与Excel文件的基本概念&#xff08;Basic Concepts of Qt and Excel Files&#xff09;1.2 Qt读取Excel文件的基本方法&am…

Python文件打包成exe文件

文章目录 背景安装pyinstaller开始打包总结 背景 今天因为在线将pdf转为word被收费了&#xff0c;有点不爽&#xff0c;所以自己动手撸一个pdf转word的小工具&#xff0c;想着打包成exe给朋友使用&#xff0c;万一哪天会用到呢&#xff1f; 安装pyinstaller 打开cmd命令窗口…

Homeassistant --openwrt docker 安装

openwrt homeassistant安装教程 前提&#xff1a;在N1盒子上面烧录 f大的openwrt系统 (安装81o 或者82o都可以) 一.进入openwrt系统 通常为192.168.1.1 打开网络配置 点击网络点击接口然后修改 这样网络是属于旁路由上网了 可以联通网络了 主要需要填写正确 二.点击docker …

【群智能算法改进】一种改进的沙丘猫群优化算法 改进沙丘猫群算法 改进SCSO[2]【Matlab代码#36】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始沙丘猫群优化算法2. 改进沙丘猫群算法2.1 非线性自适应参数2.2 Cauchy变异策略2.3 最优邻域扰动策略 3. 部分代码展示4. 仿真结果展示5. 资源获取6. 参考文献 【获取资源请见文章第5节&#xff1a;资源获取】 1.…

Java反射概述

2 反射 2.1 反射概述 Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展2.2 反射获取Class类的对象 我们要想通过反…

chatgpt赋能python:使用Python关闭所有子进程

使用Python关闭所有子进程 如果您使用Python编写了多进程应用程序&#xff0c;那么您可能会遇到一些关闭所有子进程的问题。这种情况可能是您的主进程已经完成了&#xff0c;但是子进程却没有关闭&#xff0c;从而导致资源浪费和程序崩溃。在这篇文章中&#xff0c;我们将讨论…

智能网联环境下数据安全分析与建设思考

01安全概况 随着智能化程度不断提升&#xff0c;汽车正逐渐从传统意义上的交通工具演化为公路上的智能终端&#xff0c;核心部件也从发动机、变速箱、底盘上升为芯片、软件与数据。相关机构研究表明&#xff0c;目前全球市场搭载智能网联功能的新车渗透率约为45%&#xff0c;预…

使用WordPress提高企业敏捷性

喜欢WordPress的原因有很多&#xff1a;该平台非常适合内容管理以及控制预算。此外&#xff0c; 在 提高开发效率和简化项目管理方面&#xff0c;WordPress可以通过多种方式提供帮助。 对于任何企业业务&#xff0c;目标始终是在不影响质量的情况下更快地启动项目、发布修复和…

我是如何将家里的台式机改成服务器的

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 文章目录 前言准备工作电脑宽带公网ip光猫给成桥接方式设置路由器设置服务器静态ip地址前言 搞研发的伙伴们,都知道服务器是个什么东西,以及服务器的作用、费用,相信都一清二楚。一般,我们用服务器说的简单点就是放一…

【CMake 入门与进阶(1)】一个例子搞懂什么是CMakeLists——从“Hello World”开始(附代码)

在前面两篇内容中&#xff0c;我们编写了很多示例程序&#xff0c;但这些示例程序都只有一个.c 源文件&#xff0c;非常简单。因此&#xff0c;编译这些示例代码其实都非常简单&#xff0c;直接使用 GCC 编译器编译即可&#xff0c;连 Makefile 都不需要。但是&#xff0c;在实…

Qt概述和项目文件介绍

注意&#xff1a;学习本专栏的内容需要了解C相关知识&#xff0c;会涉及到C基础语法和相关特性&#xff0c;可以参考我的另一个专栏 c从零开始_小梁今天敲代码了吗的博客-CSDN博客 目录 一.什么是Qt 二.Qt的案例 三.项目文件介绍 一.什么是Qt 是一个跨平台的 C 应用程序…

运维小白必学篇之基础篇第一集:Linux相关命令实验

Linux相关命令实验 实验者&#xff1a;胡 阳 命令提示符 【rootlocalhost ~】# 【当前登录系统的用户主机名 当前工作目录】提示符 &#xff08;# 表示 管理员&#xff09; &#xff08;&#xff04; 表示 普通用户&#xff09; 基本格式&#xff1a;命令 【选项】 【…