0%

session

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。

多头注意力机制

从第二张图中可以多头函数看出:attention函数输入为由原来的Q,K,V变成了QW(上标为Q,下标为i),KW(上标为K,下标为i),VW(上标为V,下标为i);即3个W都不相同;将Q,K,V由原来的512维度变成了64维度(因为采取了8个多头);然后再拼接在一起变成512维,通过W(上标为O)进行线性转换;得到最终的多头注意力值;

个人最终认为:多头的本质是多个独立的attention计算,作为一个集成的作用,防止过拟合;从attention is all your need论文中输入序列是完全一样的;相同的Q,K,V,通过线性转换,每个注意力机制函数只负责最终输出序列中一个子空间,即1/8,而且互相独立;

LSTM

长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。

人人都能看懂的LSTM - 知乎 (zhihu.com)

  • 利用真实的下一个行为作为正样本;
  • 负例的选择或是从用户未交互过的商品中随机抽取,或是从已展示给用户但用户没有点击的商品中随机抽取;

具体来讲,就是利用 t 时刻的行为 b(t+1) 作为监督去学习隐含层向量 ht。正负样本分别代表了用户 点击/未点击 的第 t 个物品embedding向量。

关于mask的作用,这里结合 Transformer 再说一下:

mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。其中,padding mask 在所有的 scaled dot-product attention 里面都需要用到,而 sequence mask 只有在 decoder 的 self-attention 里面用到。

Padding Mask

什么是 padding mask 呢?因为每个批次输入序列长度是不一样的也就是说,我们要对输入序列进行对齐。具体来说,就是给在较短的序列后面填充 0。但是如果输入的序列太长,则是截取左边的内容,把多余的直接舍弃。因为这些填充的位置,其实是没什么意义的,所以attention机制不应该把注意力放在这些位置上,需要进行一些处理。

具体的做法是,把这些位置的值加上一个非常大的负数(负无穷),这样的话,经过 softmax,这些位置的概率就会接近0!而我们的 padding mask 实际上是一个张量,每个值都是一个Boolean,值为 false 的地方就是我们要进行处理的地方。

Sequence mask

sequence mask 是为了使得 decoder 不能看见未来的信息。也就是对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。

那么具体怎么做呢?也很简单:产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的。

对于 decoder 的 self-attention,里面使用到的 scaled dot-product attention,同时需要padding mask 和 sequence mask 作为 attn_mask,具体实现就是两个mask相加作为attn_mask。

其他情况,attn_mask 一律等于 padding mask。

DIN这里使用的是padding mask。

placeholder

函数形式:image-20211005211038432

参数:

dtype:数据类型。常用的是tf.float32,tf.float64等数值类型

shape:数据形状。默认是None,就是一维值,也可以是多维(比如[2,3], [None, 3]表示列是3,行不定)

name:名称

使用原因: Tensorflow的设计理念称之为计算流图,在编写程序时,首先构筑整个系统的graph,代码并不会直接生效,这一点和python的其他数值计算库(如Numpy等)不同,graph为静态的,类似于docker中的镜像。然后,在实际的运行时,启动一个session,程序才会真正的运行。这样做的好处就是:避免反复地切换底层程序实际运行的上下文,tensorflow帮你优化整个系统的代码。我们知道,很多python程序的底层为C语言或者其他语言,执行一行脚本,就要切换一次,是有成本的,tensorflow通过计算流图的方式,帮你优化整个session需要执行的代码,还是很有优势的。

​ 所以placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,它只会分配必要的内存。等建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。

get_variable

该函数共有十一个参数,常用的有:名称name、变量规格shape、变量类型dtype、变量初始化方式initializer、所属于的集合collections。

该函数的作用是创建新的tensorflow变量,常见的initializer有:常量初始化器tf.constant_initializer、正太分布初始化器tf.random_normal_initializer、截断正态分布初始化器tf.truncated_normal_initializer、均匀分布初始化器tf.random_uniform_initializer。

张量

关于张量的学习,可参考:

什么是张量? - 知乎 (zhihu.com)

convert_to_tensor

将给定值转换为张量。

1
2
3
4
5
6
tf.convert_to_tensor(
value,
dtype=None,
dtype_hint=None,
name=None
)

该函数将各种类型的Python对象转换为张量对象。它接受张量对象、数字数组、Python列表和Python标量。

参数:

value:类型具有注册张量转换函数的对象。
dtype:返回张量的可选元素类型。如果缺少,则从值的类型推断类型。
dtype_hint:返回张量的可选元素类型,当dtype为None时使用。在某些情况下,调用者在转换为张量时可能没有考虑到dtype,因此dtype_hint可以用作软首选项。如果不能转换为dtype_hint,则此参数没有效果。
name:创建新张量时使用的可选名称。

返回值:

一个基于值的张量。

embedding_lookup()

用途主要是选取一个张量里面索引对应的元素。

tf.nn.embedding_lookup() 详解 - 简书 (jianshu.com)

expand_dims()

tf.expand_dims()函数用于给函数增加维度。

1
2
3
4
5
6
tf.expand_dims(
input,
axis=None,
name=None,
dim=None
)
参数:
  • input是输入张量。
  • axis是指定扩大输入张量形状的维度索引值。
  • dim等同于轴,一般不推荐使用。

函数的功能是在给定一个input时,在axis轴处给input增加一个维度。

(5条消息) tf.expanddims()函数解析(最清晰的解释)种树最好的时间是10年前,其次是现在!!!-CSDN博客_tf.expand_dim

tf.tile()

tensorflow中的tile()函数是用来对张量(Tensor)进行扩展的,其特点是对当前张量内的数据进行一定规则的复制。最终的输出张量维度不变。

1
2
3
4
5
tf.tile(
input,
multiples,
name=None
)

input是待扩展的张量,multiples是扩展方法。
假如input是一个3维的张量。那么mutiples就必须是一个1x3的1维张量。这个张量的三个值依次表示input的第1,第2,第3维数据扩展几倍。

tf.tile()函数理解 - chamie - 博客园 (cnblogs.com)

concact

tensorflow中用来拼接张量的函数tf.concat(),用法:

1
tf.concat([tensor1, tensor2, tensor3,...], axis)

axis=0 代表在第0个维度拼接

axis=1 代表在第1个维度拼接

对于一个二维矩阵,第0个维度代表最外层方括号所框下的子集,第1个维度代表内部方括号所框下的子集。维度越高,括号越小。

tf.layers.batch_normalization

用来构建待训练的神经网络模型,方法接口如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
tf.layers.batch_normalization(
inputs,
axis=-1,
momentum=0.99,
epsilon=0.001,
center=True,
scale=True,
beta_initializer=tf.zeros_initializer(),
gamma_initializer=tf.ones_initializer(),
moving_mean_initializer=tf.zeros_initializer(),
moving_variance_initializer=tf.ones_initializer(),
beta_regularizer=None,
gamma_regularizer=None,
beta_constraint=None,
gamma_constraint=None,
training=False,
trainable=True,
name=None,
reuse=None,
renorm=False,
renorm_clipping=None,
renorm_momentum=0.99,
fused=None,
virtual_batch_size=None,
adjustment=None
)

这里有几个重要参数需要注意:

  • axis的值取决于按照input的哪一个维度进行BN,例如输入为channel_last format,即[batch_size, height, width, channel],则axis应该设定为4,如果为channel_first format,则axis应该设定为1.
  • momentum的值用在训练时,滑动平均的方式计算滑动平均值moving_mean和滑动方差moving_variance
  • centerTrue时,添加位移因子beta到该BN层,否则不添加。添加beta是对BN层的变换加入位移操作。注意,beta一般设定为可训练参数,即trainable=True
  • scaleTrue是,添加缩放因子gamma到该BN层,否则不添加。添加gamma是对BN层的变化加入缩放操作。注意,gamma一般设定为可训练参数,即trainable=True
  • training表示模型当前的模式,如果为True,则模型在训练模式,否则为推理模式。要非常注意这个模式的设定,这个参数默认值为False。如果在训练时采用了默认值False,则滑动均值moving_mean和滑动方差moving_variance都不会根据当前batch的数据更新,这就意味着在推理模式下,均值和方差都是其初始值,因为这两个值并没有在训练迭代过程中滑动更新。
  • tf.layers.batch_normalization 介绍 - 大雄fcl - 博客园 (cnblogs.com)

dense

dense,即全连接网络,layers 模块提供了一个 dense() 方法来实现此操作,定义在 tensorflow/python/layers/core.py 中,下面我们来说明一下它的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dense(
inputs,
units,
activation=None,
use_bias=True,
kernel_initializer=None,
bias_initializer=tf.zeros_initializer(),
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None,
reuse=None
)

参数说明如下:
inputs:必需,即需要进行操作的输入数据。
units:必须,即神经元的数量。
activation:可选,默认为 None,如果为 None 则是线性激活。
use_bias:可选,默认为 True,是否使用偏置。
kernel_initializer:可选,默认为 None,即权重的初始化方法,如果为 None,则使用默认的 Xavier 初始化方法。
bias_initializer:可选,默认为零值初始化,即偏置的初始化方法。
kernel_regularizer:可选,默认为 None,施加在权重上的正则项。
bias_regularizer:可选,默认为 None,施加在偏置上的正则项。
activity_regularizer:可选,默认为 None,施加在输出上的正则项。
kernel_constraint,可选,默认为 None,施加在权重上的约束项。
bias_constraint,可选,默认为 None,施加在偏置上的约束项。
trainable:可选,默认为 True,布尔类型,如果为 True,则将变量添加到 GraphKeys.TRAINABLE_VARIABLES 中。
name:可选,默认为 None,卷积层的名称。
reuse:可选,默认为 None,布尔类型,如果为 True,那么如果 name 相同时,会重复利用。
返回值: 全连接网络处理后的 Tensor。

reshape()

tf.reshape(tensor, shape, name=None)
函数的作用是将tensor变换为参数shape的形式。 其中shape为一个列表形式,特殊的一点是列表中可以存在-1。

转换为一般的shape(也就是不涉及-1的)我这里就不说了,主要说一下对-1的理解。
-1代表的含义是不用我们自己指定这一维的大小,函数会自动计算,但列表中只能存在一个-1。
(当然如果存在多个-1,就是一个存在多解的方程了)

我理解的要点是:首先shape就是reshape变换后的矩阵大小,先不管-1的那一个维度,先看其它维度,然后用原矩阵的总元素个数除以确定的维度,就能得到-1维度的值。

我们来看例子。

M=np.array([[[[1,2,3]]],[[[4,5,6]]],[[[7,8,9]]]]) #M是[3,1,1,3]的四维矩阵

我想把M重组成若干个3维的向量,那么直接tf.reshape(M,[-1,3])

那么会得到几个3维向量呢? M一共有9个元素,9/3=3,那么得到3个三维向量,那么结果就是[3,3]的矩阵。

image-20211006175936881

那么我想得到若干个[3,3]的矩阵,那么我们tf.reshape(M,[-1,3,3])

那么结果就是[1,3,3]的矩阵

image-20211006175946915

tf.reduce_mean

tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。

1
2
3
4
5
reduce_mean(input_tensor,
axis=None,
keep_dims=False,
name=None,
reduction_indices=None)

第一个参数input_tensor: 输入的待降维的tensor;
第二个参数axis: 指定的轴,如果不指定,则计算所有元素的均值;
第三个参数keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
第四个参数name: 操作的名称;
第五个参数 reduction_indices:在以前版本中用来指定轴,已弃用;

tf.nn.sigmoid_cross_entropy_with_logits

tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,,labels=None,logits=None,name=None)

对于给定的logits计算sigmoid的交叉熵。

tf.trainable_variables()

顾名思义,这个函数可以也仅可以查看可训练的变量,在我们生成变量时,无论是使用tf.Variable()还是tf.get_variable()生成变量,都会涉及一个参数trainable,其默认为True。以tf.Variable()为例:

1
2
3
4
5
6
7
__init__(
initial_value=None,
trainable=True,
collections=None,
validate_shape=True,
...
)

对于一些我们不需要训练的变量,比较典型的例如学习率或者计步器这些变量,我们都需要将trainable设置为False,这时tf.trainable_variables() 就不会打印这些变量。

tf.train.GradientDescentOptimizer

TensorFlow中损失优化方法

  • tf.train.GradientDescentOptimizer(learningrate, uselocking, name):原始梯度下降方法,唯一参数就是学习率。

tf.gradients()

参数如下:

1
2
3
4
5
6
7
8
tf.gradients(ys, xs, 
grad_ys=None,
name='gradients',
colocate_gradients_with_ops=False,
gate_gradients=False,
aggregation_method=None,
stop_gradients=None)

tf.gradients()实现ysxs求导,接受求导值ysxs不仅可以是tensor,还可以是list

tf.clip_by_global_norm

tf.clip_by_global_norm函数的作用就是通过权重梯度的总和的比率来截取多个张量的值。

tf.gather

tf.gather(params,indices,axis=0 )

从params的axis维根据indices的参数值获取切片

NAS

神经结构搜索(Neural Architecture Search,简称NAS)是一种自动设计神经网络的技术,可以通过算法根据样本集自动设计出高性能的网络结构,在某些任务上甚至可以媲美人类专家的水准,甚至发现某些人类之前未曾提出的网络结构,这可以有效的降低神经网络的使用和实现成本。

NAS的原理是给定一个称为搜索空间的候选神经网络结构集合,用某种策略从中搜索出最优网络结构。神经网络结构的优劣即性能用某些指标如精度、速度来度量,称为性能评估。这一过程如下图所示。

image-20211001131823612

在搜索过程的每次迭代中,从搜索空间产生“样本”即得到一个神经网络结构,称为“子网络”。在训练样本集上训练子网络,然后在验证集上评估其性能。逐步优化网络结构,直至找到最优的子网络。

搜索空间,搜索策略,性能评估策略是NAS算法的核心要素。搜索空间定义了可以搜索的神经网络结构的集合,即解的空间。搜索策略定义了如何在搜索空间中寻找最优网络结构。性能评估策略定义了如何评估搜索出的网络结构的性能。对这些要素的不同实现得到了各种不同的NAS算法,本节将选择有代表性的进行介绍。

基于梯度的神经架构优化算法

前面介绍的NAS算法都存在计算量大的问题,虽然存在改进方案。强化学习、遗传算法等方案低效的一个原因是结构搜索被当作离散空间(网络结构的表示是离散的,如遗传算法中的二进制串编码)中的黑箱优化问题,无法利用梯度信息来求解。

其中一种解决思路是将离散优化问题连续化。文献[6]提出了一种称为可微结构搜索(Differentiable Architecture Search,简称DARTS)的算法,将网络结构搜索转化为连续空间的优化问题,采用梯度下降法求解,可高效地搜索神经网络架构,同时得到网络的权重参数。

DARTS将网络结构、网络单元表示成有向无环图,对结构搜索问题进行松弛,转化为连续变量优化问题。目标函数是可导的,能够用梯度下降法求解,同时得到网络结构和权重等参数。算法寻找计算单元,作为最终网络结构的基本构建块。这些单元可以堆积形成卷积神经网络,递归连接形成循环神经网络。

教师-学生网络

教师—学生网络的方法,属于迁移学习的一种。迁移学习也就是将一个模型的性能迁移到另一个模型上,而对于教师—学生网络,教师网络往往是一个更加复杂的网络,具有非常好的性能和泛化能力,可以用这个网络来作为一个soft target来指导另外一个更加简单的学生网络来学习,使得更加简单、参数运算量更少的学生模型也能够具有和教师网络相近的性能,也算是一种模型压缩的方式。

较大、较复杂的网络虽然通常具有很好的性能,但是也存在很多的冗余信息,因此运算量以及资源的消耗都非常多。而所谓的Distilling就是将复杂网络中的有用信息提取出来迁移到一个更小的网络上,这样学习来的小网络可以具备和大的复杂网络想接近的性能效果,并且也大大的节省了计算资源。这个复杂的网络可以看成一个教师,而小的网络则可以看成是一个学生。

知识蒸馏

一般认为模型的参数保留了模型学到的知识,因此最常见的迁移学习的方式就是在一个大的数据集上先做预训练,然后使用预训练得到的参数在一个小的数据集上做微调(两个数据集往往领域不同或者任务不同)。例如先在Imagenet上做预训练,然后在COCO数据集上做检测。在这篇论文中,作者认为可以将模型看成是黑盒子,知识可以看成是输入到输出的映射关系。因此,我们可以先训练好一个teacher网络,然后将teacher的网络的输出结果 [公式] 作为student网络的目标,训练student网络,使得student网络的结果 [公式] 接近 [公式] ,因此,我们可以将损失函数写成 [公式] 。这里CE是交叉熵(Cross Entropy),y是真实标签的onehot编码,q是teacher网络的输出结果,p是student网络的输出结果。

但是,直接使用teacher网络的softmax的输出结果 [公式] ,可能不大合适。因此,一个网络训练好之后,对于正确的答案会有一个很高的置信度。例如,在MNIST数据中,对于某个2的输入,对于2的预测概率会很高,而对于2类似的数字,例如3和7的预测概率为 [公式][公式] 。这样的话,teacher网络学到数据的相似信息(例如数字2和3,7很类似)很难传达给student网络。由于它们的概率值接近0。因此,文章提出了softmax-T,公式如下所示:

[公式]

这里 [公式] 是student网络学习的对象(soft targets),[公式] 是神经网络softmax前的输出logit。如果将T取1,这个公式就是softmax,根据logit输出各个类别的概率。如果T接近于0,则最大的值会越近1,其它值会接近0,近似于onehot编码。如果T越大,则输出的结果的分布越平缓,相当于平滑的一个作用,起到保留相似信息的作用。如果T等于无穷,就是一个均匀分布。

知识蒸馏,可以将一个网络的知识转移到另一个网络,两个网络可以是同构或者异构。做法是先训练一个teacher网络,然后使用这个teacher网络的输出和数据的真实标签去训练student网络。知识蒸馏,可以用来将网络从大网络转化成一个小网络,并保留接近于大网络的性能;也可以将多个网络的学到的知识转移到一个网络中,使得单个网络的性能接近emsemble的结果。

EMD

对于离散的概率分布,Wasserstein距离也被描述为推土距离(EMD)。如果我们将分布想象为两个有一定存土量的土堆,那么EMD就是将一个土堆 转换 为另一个土堆所需的最小总工作量。工作量的定义是 单位泥土 的总量乘以它移动的距离。

有很多种推土的方式,我们的目标是找到其中工作量最少的那一种,这是个优化问题。

BERT

BERT(Bidirectional Encoder Representation from Transformers)

MLPS

MPLS(Multiprotocol Label Switch)是使用标签为了做出数据转发决策的数据包转发技术。利用 MPLS 技术,只需一次(当数据包进入 MPLS 域时)即可完成第 3 层报头分析。标签检查可推动后续的数据包转发。MPLS 可为以下应用带来益处:虚拟专用网络 (VPN)
流量工程 (TE)
服务质量 (QoS)
任何基于 MPLS 的传输 (AToM)
另外,它还可减少核心路由器上的转发开销。MPLS 技术适用于任何网络层协议。

embedding

​ 简单来说,embedding就是用一个低维的向量表示一个物体,可以是一个词,或是一个商品,或是一个电影等等。这个embedding向量的性质是能使距离相近的向量对应的物体有相近的含义,比如 Embedding(复仇者联盟)和Embedding(钢铁侠)之间的距离就会很接近,但 Embedding(复仇者联盟)和Embedding(乱世佳人)的距离就会远一些。  
  除此之外Embedding甚至还具有数学运算的关系,比如Embedding(马德里)-Embedding(西班牙)+Embedding(法国)≈Embedding(巴黎)
  从另外一个空间表达物体,甚至揭示了物体间的潜在关系,上次体会这样神奇的操作还是在学习傅里叶变换的时候,从某种意义上来说,Embedding方法甚至具备了一些本体论的哲学意义。
  言归正传,Embedding能够用低维向量对物体进行编码还能保留其含义的特点非常适合深度学习。在传统机器学习模型构建过程中,我们经常使用one hot encoding对离散特征,特别是id类特征进行编码,但由于one hot encoding的维度等于物体的总数,比如阿里的商品one hot encoding的维度就至少是千万量级的。这样的编码方式对于商品来说是极端稀疏的,甚至用multi hot encoding对用户浏览历史的编码也会是一个非常稀疏的向量。而深度学习的特点以及工程方面的原因使其不利于稀疏特征向量的处理(这里希望大家讨论一下为什么?)。因此如果能把物体编码为一个低维稠密向量再喂给DNN,自然是一个高效的基本操作。

pooling

池化过程在一般卷积过程后。池化(pooling) 的本质,其实就是采样。Pooling 对于输入的 Feature Map,选择某种方式对其进行降维压缩,以加快运算速度。

激活函数

激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。

sigmoid和softmax

sigmoid:image-20210927183028016

softmax:image-20210927183115523

sigmoid将一个real value映射到(0,1)的区间(当然也可以是(-1,1)),这样可以用来做二分类。而softmax把一个k维的real value向量(a1,a2,a3,a4…)映射成一个(b1,b2,b3,b4…)其中bi是一个0-1的常数,然后可以根据bi的大小来进行多分类的任务,如取权重最大的一维。

神经网络的Attention机制

注意力机制也称为:“神经网络的注意力”,或者更简单的:“注意力”。

人脑在工作时,其实是由一定的注意力的,比如我们在浏览器上搜索时,大部分的注意力都集中在搜索结果的左上角,这说明大脑在处理信号的时候是有一定权重划分的,而注意力机制的提出正是模仿了大脑的这种特性。神经网络的注意力就是说,神经网络具有将注意力集中到一部分输入(或特征)的能力。

(1)为什么引入注意力机制呢?

计算能力的限制:目前计算能力依然是限制神经网络发展的瓶颈,当输入的信息过多时,模型也会变得更复杂,通过引入注意力,可以减少处理的信息量,从而减小需要的计算资源。
优化算法的限制:虽然局部连接、权重共享以及 pooling 等优化操作可以让神经网络变得简单一些,有效缓解模型复杂度和表达能力之间的矛盾;但是,如循环神经网络中的长序列输入,信息“记忆”能力并不高。
(2)注意力机制的分类

注意力机制一般分为两种:

聚焦式(Focus)注意力:是一种自上而下的有意识的注意力,“主动注意” 是指有预定目的、依赖任务的、主动有意识地聚焦于某一对象的注意力;
显著性(Saliency-Based)注意力:是一种自下而上的无意识的注意力,“被动注意” 是基于显著性的注意力,是由外界刺激驱动的注意,不需要主动干预,也和任务无关;池化(Max Pooling) 和 门控(Gating) 可以近似地看作是自下而上的基于显著性的注意力机制。

在神经网络结构中加入注意力模型主要是基于三点考虑:首先是这些模型在众多的任务中取得了非常好的性能,比方说机器翻译、问答系统、情感分析、词性标注选民分析和问答系统。然后,在提升模型性能的同时,注意力机制增加了神经网络结构的可解释性。由于传统的神经网络是一个黑盒模型,因此提高其可解释性对机器学习模型的公平性、可靠性和透明性的提高至关重要。第三,其能够帮助缓解递归神经网络中的一些缺陷,比方说随着输入序列长度的增加导致的性能下降和对输入的顺序处理所导致的计算效率低下。

DIN模型

基准模型:基准模型就是比较常见的多层神经网络,即:(1)先对每个特征进行Embedding操作,得到一系列Embedding向量;(2)将不同Group的特征拼接组合起来之后得到一个固定长度的用户Embedding向量,和候选商品Embedding向量;(3)然后将(2)中的向量输入后续的全连接网络,最后输出pCTR值。具体网络结构见下图:

image-20210927194204860

base模型缺点:(1)用户的历史行为特征和当前的候选广告特征在全都拼起来给神经网络之前,是一点交互的过程都没有。

(2)拼起来之后给神经网络,虽然有了交互,但也丢失了部分信息,并引入了噪声。

DIN模型:DIN模型在基准模型的基础上,增加了注意力机制,就是模型在对候选商品预测的时候,对用户不同行为的注意力是不一样的。“相关”的行为历史看重一些,“不相关”的历史甚至可以忽略。下图展示了DIN模型的网络结构图。DIN的模型结构中增加了 Activation Unit模块,该模块主要提取当前候选商品与历史行为中的商品的权重值。image-20210927194403979

单层注意力模型与多层注意力模型

在最一般的情形下,注意力权重是仅仅是由注意力模型的原始的输入序列算出来的,这一注意力模型可被称为单层注意力模型。另一方面,我们可对输入序列进行多次抽象,这样可以使得底层抽象的上下文向量成为下一次抽象的查询状态。这种对输入数据叠加若干层注意力模块实现对序列数据多层抽象的方法可被称为多层注意力模型。更具体地来说,多层注意力模型又可按照模型的权重是自顶向下学习还是自底向上学习的方式进行划分。

多层注意力机制的一个典型应用是通过对文本进行两层抽象实现对文本的分类。这一模型称为“层次和注意力模型(Hierarchical Attention Model,HAM)”。文本是由不同的句子组合而成的,而每个句子又包含不同的单词,HAM能够对文章这种自然的层次化结构进行抽取。具体来说,其首先对每个句子建立一个注意力模型,该注意力模型的输入是每个句子中的基本单词,从而得到这个句子的特征表示;然后将句子的特征的表示输入到后续的注意力模型中来构建整段文本的特征表示。这一最后得到的整段文本的特征表示可以用于后面分类任务分类器的输入。

特征表示的数量

在大多数的应用场景下,我们只会对输入数据进行一种特征表示。然而在有些场景下,对输入数据进行单一的特征表示可能不能够为后续的过程提供足够的信息。在这种情形下,我们可以对同样的输入数据进行多种特征表示。利用注意力机制可以为这些不同的特征表示指定相关的权重,从而丢弃掉输入数据中的噪声信息和重复冗余信息。我们称这种模型为多表示注意力模型\。这种多表示注意力模型能够决定不同特征表示的权重从而有助于后面对这一表示的应用。最后得到的输入的特征表示是多个特征表示的加权组合,这一模型的一个优势在于针对不同的后处理任务能够决定哪些特征表示更适合当前的任务场景。

基于类似的想法,还有一种称为多维度注意力模型\的方法。其核心观点是对特征表示向量的各个维度之间的依赖关系进行建模,这样我们便能够选择特征中更为有用的属性来帮助我们处理后续的任务。这一思想在自然语言处理领域至关重要因为相同的单词往往会出现多义性。

AUC

本质是一个概率值,简单来说就是随机抽出一对样本(一个正样本一个负样本),然后用训练得到的分类器对这两个样本进行预测,预测得到正样本的概率大于负样本的概率的概率。

GAUC

优点:实现了用户级别的AUC计算

缺点:用户行为没有那么多的时候,GAUC会抖动,所以大部分公司还是会采用AUC

multi-hot编码

在做用户画像或为用户做兴趣标签的时候,往往会遇到这样的问题,就是multi-hot特征的处理。 multi-hot编码之后每个id对应的是多个的1,而且不同样本中1的个数还不一样。 对multi-hot特征的处理无非也是一种稀疏矩阵的降维压缩,因此可以使用embedding的方法。对于某个属性对应的分类特征,可能该特征下有多个取值,比如一个特征表示对哪些物品感兴趣,那么这个特征不是单个值,而是有多个取值。 例如我们现在有3个样本: - 样本1 在该属性下取值有1,2两种特征 - 样本2 在该属性下有2一种特征 - 样本3 在该属性下有3,4 两种特征。我们以multi-hot编码的形式来定义特征应为 - 样本1 [1,1,0,0] - 样本2 [0,1,0,0] - 样本3 [0,0,1,1] 但是这种变量不能够直接用 embedding_lookup 去做, embedding_lookup 只接受只有一个1的onehot编码,那么为了完成这种情况的embedding需要两个步骤:

  1. 将输入属性转化为类型one-hot编码的形式, 在tensorflow中这个过程是通过 tf.SparseTensor 来完成的,实际上就是构建了一个字典矩阵,key为坐标,value为1或者0表示是否有值,对于一个样本 如样本1来说就是构建了一个矩阵[[1,1,0,0]]表示有物品1和2,这个矩阵的规模为 [batch_size,num_items] ,这个过程即为 multi-hot 编码
  2. 将构建好的类似于one-hot编码的矩阵与embedding矩阵相乘, embedding矩阵的规模为 [num_items, embedding_size] ,相乘之后得到的输出规模为 [batchi_size, embedding_size] , 即对多维多属性的特征构建了embedding vector

CTR模型整理

说明

参考部分所列出的为遵循原论文所整理,若原论文中有源码则均以附出,实现基本均为tf实现。

pytorch统一接口部分所给出的链接,是一个pytorch实现的ctr库。

参考

1
2
3
4
https://github.com/shenweichen/DeepCTR
https://github.com/DSXiangLi/CTR
https://github.com/shenweichen/DeepCTR-Torch
https://github.com/qiaoguan/deep-ctr-prediction

Convolutional Click Prediction Model(卷积点击预测模型CCPM)

1
[CIKM 2015]A Convolutional Click Prediction Model

论文链接

1
http://wnzhang.net/share/rtb-papers/cnn-ctr.pdf

算法细节

数据集

1
2
3
Avazu:包括数天的广告点击数据,按时间顺序排列。在每一份点击数据中,有17个数据字段
如广告ID,网站ID,点击等。
Yoochoose:包含了一个在线零售商的许多浏览和购买事件的会议。其中每个会话封装了单个用户的点击事件。

结果分析

1
CCPM和其他竞争性方法在单一广告印象和连续广告印象上的点击预测性能相比较优。(FM,LR.RNN)

超参数

1
2
3
the parameter impacts of the filter width w and the number of feature map m in corresponding layer are studied
filter width 与feature map
具体在论文第四页有提及,没有说明修正位置、默认值以及可设置范围。

Factorization-supported Neural Network(因子分解支持的神经网络FNN)

1
[ECIR 2016]Deep Learning over Multi-field Categorical Data: A Case Study on User Response Prediction

论文链接

1
https://arxiv.org/pdf/1601.02376.pdf

带有演示数据的源代码

1
https://github.com/wnzhang/deep-ctr

算法细节

数据集

1
2
iPinYou:iPinYou数据集是一个公开的真实世界的显示广告数据集,其中有每个广告显示信息和相应的
用户点击反馈。

各种细节

1
2
3
4
5
6
1.使用随机梯度下降法来学习所有模型的大部分参数。
2.学习率,从1、0.1、0.01、0.001到0.0001
3.尝试了每个领域的负样本数m=1、2和4,并发现m=2在大多数情况下产生最好的结果。
4.对于激活函数(如公式(3)和(2)),我们尝试了线性函数、sigmoid函数和tanh函数,并发现tanh函数的结果是最优的。
5.通过固定3、4和5个隐藏层来研究架构,具有3个隐藏层(即总共5层)的架构在AUC性能方面是最好的。
6.每个隐藏层的训练范围是隐含单元的范围从100到500,增量为100。

Product-based Neural Network(PNN)

1
[ICDM 2016]Product-based neural networks for user response prediction

论文链接

1
https://arxiv.org/pdf/1611.00144.pdf

可重复的实验代码

1
2
https://github.com/Atomu2014/product-nets 
tensorflow

数据集

1
Criteo:一个著名的广告技术行业的基准数据集。

各种细节

1
2
3
4
1.在这个数据集上应用了负向下采样。定义下采样率为w,预测的CTR为p,重新校准的CTR q
2.在实验中比较了7个模型,它们是用TensorFlow4实现(LR,FM,FNN,CCPM,IPNN,OPNN,PNN),用随机梯度下降法(SGD)进行训练。采用了dropout作为正则化方法来防止训练神经网络时的过度拟合。
3.we set dropout rate at 0.5 on networkhidden layers.将网络隐层的滤除率设置为0.5。

使用方法

Follow the instructions and update the soft link data:

1
XXX/product-nets$ ln -sfn XXX/make-ipinyou-data/2997 data

run main.py:

1
2
cd python
python main.py

Wide & Deep

1
[DLRS 2016]Wide & Deep Learning for Recommender Systems

论文链接

1
https://arxiv.org/pdf/1606.07792.pdf

各种细节

1
1.模型训练时为每个分类特征学习一个 32 维嵌入向量

DeepFM

1
[IJCAI 2017]DeepFM: A Factorization-Machine based Neural Network for CTR Prediction

论文链接

1
https://www.ijcai.org/proceedings/2017/0239.pdf

数据集

1
2
Criteo:包括4500万用户的点击记录。
Company

各种细节

1
2
1.for FNN and PNN: (1)dropout: 0.5; (2) network structure: 400-400-400; (3) optimizer: Adam; (4) activation function: tanh for IPNN, relu forother deep models.
2.研究了不同深度模型的不同超参数,对公司数据集的影响。顺序是:1)激活函数;2)辍学率;3)每层的神经元数量;4)隐藏层数量;5)网络形状。dropout设置为1.0、0.9、0.8、0.7。每层的神经元数量200,400,800。网络形状:constant, increasing,decreasing, and diamond.

注:这篇文章对于超参数进行了大量实验

Piece-wise Linear Model

1
[arxiv 2017]Learning Piece-wise Linear Models from Large Scale Data for Ad Click Prediction

论文链接

1
https://arxiv.org/abs/1704.05194

各种细节

1
2
1.LS-PLM是一个分片线性模型,割数m控制模型的容量。尝试m=6、12、24、36。m=12的测试AUC明显好于m=6,而m=24,36的改善相对较小。
温和。因此,在下面的所有实验中,LS-PLM模型的参数m被设定为12。

Deep & Cross Network

1
[ADKDD 2017]Deep & Cross Network for Ad Click Predictions

论文链接

1
https://arxiv.org/abs/1708.05123

数据集

1
Criteo Display Ads2

各种细节

1
2
3
4
5
1.batch size is set at 512
2.gradient clip norm was set at 100.
3.隐层的数量从2到5不等。
4.隐藏层大小从32到1024
5.初始学习率从0.0001到0.001,增量为0.0001

最佳超参数选择

1
2
ŒThe optimal hyperparameter seŠings were 2 deep layers of size 1024 and 6 cross layers for
the DCN model, 5 deep layers of size 1024 for the DNN, 5 residual units with input dimension 424 and cross dimension 537 forthe DC, and 42 cross features for the LR model

注:本文对于超参数有详细的实验,具体请参考原文。所列不全。

Attentional Factorization Machine(AFM)

1
[IJCAI 2017]Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks

论文链接

1
https://www.ijcai.org/proceedings/2017/0435.pdf

一个对该论文的实现

1
https://github.com/hexiangnan/attentional_factorization_machine

数据集

1
2
Frappe :被用于情境感知推荐,它包含了96,203个不同情境下的用户应用日志。该数据集包含96,203个用户在不同情境下的使用日志。
MovieLens:被用于个性化标签推荐

各种细节

1
1.对于AFM,Frappe和MovieLens上的最佳滤波率是0.2和0.5

to use

代码

1
2
3
AFM.py
FM.py
LoadData.py

数据

1
2
3
4
ml-tag
ml-tag.train.libfm
ml-tag.validation.libfm
ml-tag.test.libfm

训练

1
2
3
4
5
6
# step into the code folder
cd code
# train FM model with optimal parameters
python FM.py --dataset ml-tag --epoch 20 --pretrain -1 --batch_size 4096 --hidden_factor 16 --lr 0.01 --keep 0.7
# train AFM model with optimal parameters
python AFM.py --dataset ml-tag --epoch 20 --pretrain 1 --batch_size 4096 --hidden_factor [16,16] --keep [1.0,0.5] --lamda_attention 100.0 --lr 0.1

注:该复现非原作者

参考文章

1
https://zhuanlan.zhihu.com/p/110375283

Neural Factorization Machine

1
[SIGIR 2017]Neural Factorization Machines for Sparse Predictive Analytics

论文链接

1
https://arxiv.org/pdf/1708.05027.pdf

论文开源代码

1
https://github.com/hexiangnan/neural_factorization_machine

数据集

1
2
Frappe:包含96,203个应用程序在不同背景下的用户使用日志。
MovieLens

各种细节

1
2
3
1.学习率都在[0.005, 0.01, 0.02, 0.05],在[0, 0.1, 0.2, ..., 0.9]的辍学率
2.辍学率为NFM最重要的超参数,后设置为0.5
3.ReLU作为激活函数

to use

1
python NeuralFM.py --dataset frappe --hidden_factor 64 --layers [64] --keep_prob [0.8,0.5] --loss_type square_loss --activation relu --pretrain 0 --optimizer AdagradOptimizer --lr 0.05 --batch_norm 1 --verbose 1 --early_stop 1 --epoch 200

数据集

1
2
3
We use the same input format as the LibFM toolkit (http://www.libfm.org/).

Split the data to train/test/validation files to run the codes directly (examples see data/frappe/).

xDeepFM

1
[KDD 2018]xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems

论文链接

1
https://arxiv.org/pdf/1803.05170.pdf

源代码

1
https://github.com/Leavingseason/xDeepFM

数据集

1
2
3
Criteo:一个著名的行业基准数据集用于开发预测广告点击率的模型,并且可以公开访问
Dianping:中国最大的消费者评论网站。
Bing News:微软的必应搜索引擎的一部分

各种细节

1
2
3
1.学习率被设置为0.001
2.每一层的神经元数量的默认设置是。(1) 400个用于DNN层;(2)Criteo数据集的CIN层为200,大众点评和必应的CIN层为100。
3.对于超参数设置不同数据集有不同设置,详见论文第8页Q3

Deep Interest Network

1
[KDD 2018]Deep Interest Network for Click-Through Rate Prediction

论文链接

1
https://arxiv.org/pdf/1706.06978.pdf

源代码

1
https://github.com/zhougr1993/DeepInterestNetwork

数据集

1
Amazon

各种细节

1
2
1.学习率从1开始,衰减率设置为0.1。
2.小批量学习率从0.001开始,衰减率设置为0.001。

注:DIN这篇论文中,代码质量较差,不建议使用该版本,在后期DIEN论文中会进行调整。

Deep Interest Evolution Network

1
[AAAI 2019]Deep Interest Evolution Network for Click-Through Rate Prediction

论文链接

1
https://arxiv.org/pdf/1809.03672.pdf

源代码

1
https://github.com/mouna99/dien

数据集

1
public and industrial datasets

to use

准备数据

法一

从亚马逊网站获取数据,并使用脚本进行处理

1
sh prepare_data.sh

法二,推荐

解压后直接使用

1
2
3
4
5
6
tar -jxvf data.tar.gz
mv data/* .
tar -jxvf data1.tar.gz
mv data1/* .
tar -jxvf data2.tar.gz
mv data2/* .

训练模型

1
python train.py train [model name] 

AutoInt

1
[CIKM 2019]AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks

论文链接

1
https://arxiv.org/abs/1810.11921

数据集

1
2
3
4
Criteo:一个CTR预测的基准数据集,它有4500万用户的点击广告的记录。
Avazu:包含用户的移动行为,包括一个显示的移动广告是否被用户点击。
KDD12
MovieLens-1M

各种细节

1
2
1.在{0.1 - 0.9}范围内为MovieLens-1M数据集选择辍学率
2.文章分析了Influence of Residual Structure,nfluence of Network Depths.Influence of Different Dimensions.

ONN

1
[arxiv 2019]Operation-aware Neural Networks for User Response Prediction

论文链接

1
https://arxiv.org/pdf/1904.12579.pdf

数据集

1
2
Criteo
Tencent Ad

各种细节

1
2
3
4
1.非线性隐藏层的数量对于Criteo数据集,隐藏的大小被设置为[400, 400, 400],而非线性隐藏层的数量被设置为3。
2.对于腾讯广告数据集,隐藏尺寸被设置为[200,200, 200].
3.Adam学习率是通过网格搜索从[0.0001,0.00025, 0.0005, 0.00075, 0.001],

FiBiNET

1
[RecSys 2019]FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction

论文链接

1
https://arxiv.org/pdf/1905.09433.pdf

数据集

1
2
Criteo
Avazu:由数天的广告点击数据组成。

细节

1
2
3
4
5
6
7
对于嵌入层,Criteo数据集的嵌入层维度被设置为10,Avazu数据集的嵌入层维度被设置为50。
Avazu数据集为50。对于优化方法,我们使用Adam。
对于Criteo数据集和Avazu数据集,小型批次大小为1000,Avazu数据集为500。
学习率被设置为0.0001。对于所有的深度模型,层的深度设置为3,所有的激活函数都是RELU,每层的神经元数量为400。
每层的神经元数量在Criteo数据集为400个,在Avazu数据集为2000个。
数据集的每层神经元数量为400个,Avazu数据集为2000个,辍学率设置为0.5。对于SENET部分,两个FC的激活函数为
对于SENET部分,两个FC中的激活函数是RELU函数,还原率设置为3。

IFM

1
[IJCAI 2019]An Input-aware Factorization Machine for Sparse Prediction

论文链接

1
https://www.ijcai.org/Proceedings/2019/0203.pdf

源代码链接

1
https://github.com/gulyfish/Input-aware-Factorization-Machine

数据集

1
2
Frappe
MovieLens

各种细节

1
2
3
4
5
1.学习率:0.01
2. the number of hidden layers,the dropout ratio, activation functions
3.IFM的性能在开始时随着网络的增加而提高。然而,当网络的深度大于2(Frappe)或3(Movielens)时,模型的性能开始下降。
4.Fraith的Frappe和MovieLens的最佳辍学率分别为0.3和0.4,
5.ReLU更适合这两个数据集

注:本文进行了详细的超参数实验

DCN V2

1
[arxiv 2020]DCN V2: Improved Deep & Cross Network and Practical Lessons for Web-scale Learning to Rank Systems

论文链接

1
https://arxiv.org/abs/2008.13535

数据集

1
2
3
Criteo
MovieLen-1M
Production

各种细节

1
2
3
4
1. learning rate was tuned from 10−4 to 10−1 ,再到10-4到5×10-4
2.隐蔽层的数量在{1,2,3,4}之间,大小为{562, 768, 1024}。
3.正则化参数𝜆的范围为{0, 3 × 10−5, 10−4}
4.研究的超参数:depth of cross layers,matrix rank of DCN-Mix,number of experts in DCN-Mix

DIFM

1
[IJCAI 2020]A Dual Input-aware Factorization Machine for CTR Prediction

论文链接

1
https://www.ijcai.org/Proceedings/2020/0434.pdf

数据集

1
2
Avazu
Criteo

各种细节

1
2
3
4
5
6
7
8
1.所有模型的学习都是通过使用Adam(学习率:0.001)
2.Criteo和Avazu的嵌入大小分别被设定为20和40。
3.批量大小对这两个数据集都设置为2000
4.所研究的超参数:the number of attention heads n,the attention key size dk, activation functions (the vector-wise part),the number of hidden layers in DNNs
5.the number of attention heads n,进行了从1-16的实验,最后将数量固定在16
6.the attention key size dk,在Avazu上将注意因子的大小从20增加到100时,Avazu数据集的模型性能稳步提高,而在Criteo数据集上,80是一个更合适的注意因子大小设置。为避免模型过于复杂,我们将Avazu的注意力系数固定为100,Criteo为80。
7.Relu作为向量部分的神经元的激活函数
8.对于Avazu最好的性能是我们只使用一个隐藏层,对于Criteo数据集采用两个

AFN

1
[AAAI 2020]Adaptive Factorization Network: Learning Adaptive-Order Feature Interactions

论文链接

1
https://arxiv.org/pdf/1909.03276.pdf

源代码

1
https://github.com/WeiyuCheng/AFN-AAAI-20

数据集

1
2
3
4
Criteo
Avazu
Movielens
Frappe

各种细节

1
2
1.超参数Number of logarithmic neurons,Depth of hidden layers,Number of neurons in hidden layers
2.Number of neurons in hidden layers超过600性能开始下降touse

to use

1
2
3
4
5
6
数据集
cd src
python download_criteo_and_avazu.py
代码
cd src
sh ./run_experiments.sh

pytorch统一接口

链接

1
https://github.com/shenweichen/DeepCTR-Torch

image-20220118172936135

统一视角

DeepCTR通过对现有的基于深度学习的点击率预测模型的结构进行抽象总结,在设计过程中采用模块化的思路,各个模块自身具有高复用性,各个模块之间互相独立。 基于深度学习的点击率预测模型按模型内部组件的功能可以划分成以下4个模块:输入模块,嵌入模块,特征提取模块,预测输出模块。

image-20220118173022237

初等模型

双层玻璃的功效

北方城镇的有些建筑物窗户是双层的,窗户上装两层玻璃且中间留有一定的空隙,两层厚度为d的玻璃夹着一层厚度为l的空气。我们要建立一个模型来描述热量通过窗户的传导过程,并将双层玻璃制成同样多材料的单层玻璃,进行,热量传导对比,对双层玻璃能够减少多少热量损失给出定量分析结果。

模型假设

(1)热量的传播过程只有传导,没有对流。即假定窗户的密封性能很好,两层玻璃之间的空气是不流动的。

(2)室内温度T1和室外温度T2保持不变,热传导过程已处于稳定状态,即沿热传导方向,单位时间内通过单位面积的热量是常数。

(3)玻璃材料均匀,热传导系数是常数。

模型构成

在上述假设下热传导过程遵从以下物理定律:

厚度为d的均匀介质,两侧温度差为img,则单位时间内由温度高的一侧向温度低的一侧通过单位面积的热量Q与img成正比,与d成反比,即img

k为热传导系数。

其余步骤省略。

模型应用

这个模型具有一定应用价值。制作双层玻璃窗虽然工艺复杂会增加一些费用,但它减少的热量损失确实相当可观的。通常,建筑规范要求g=l/d≈4.按照这个模型,Q1/Q2≈3%,即双层窗比用同样多的玻璃材质制成的单层窗节约热量97%左右。不难发现,之所以有如此高的功效主要是由于层间空气的极低的热传导系数k2,而这要求空气是干燥,不流通的。作为模型假设这个条件在实际情况下当然不能完全满足,所以实际上双层窗户的功效会比上述结果差一些。

Latex入门教程

在编辑框中输入一下内容

1
2
3
4
5
\documentclass{article}
% 这里是导言区
\begin{document}
Hello, world!
\end{document}

则会有如下显示

image-20210729082909909

同时会自动生成PDF文件在.tex文件所保存的目录下。

此处的第一行\documentclass{article}中包含了一个控制序列(或称命令 / 标记)。所谓控制序列,是以反斜杠\开头,以第一个空格或非字母 的字符结束的一串文字,他们并不被输出,但是他们会影响输出文档的效果。这里的控制序列是documentclass,它后面紧跟着的{article}代表这个控制序列有一个必要的参数,该参数的值为article. 这个控制序列的作用,是调用名为 “article” 的文档类

其后出现了控制序列begin,这个控制序列总是与end成对出现。这两个控制序列以及他们中间的内容被称为“环境”;他们之后的第一个必要参数总是一致的,被称为环境名。

只有在 “document” 环境中的内容,才会被正常输出到文档中去或是作为控制序列对文档产生影响。因此,在\end{document}之后插入任何内容都是无效的。

\begin{document}\documentclass{article}之间的部分被称为导言区。导言区中的控制序列,通常会影响到整个输出文档。

中英混排

在编辑框中输入

1
2
3
4
\documentclass[UTF8]{ctexart}
\begin{document}
你好,world!
\end{document}

会产生以下结果

image-20210729083704740

相较于之前的例子,代码有了细微的差别:

1.文档类从 article 变为 ctexart

2.增加了文档类选项 UTF8

组织文章

article/ctexart 中,定义了五个控制序列来调整行文组织结构。他们分别是:

\section{.}

\subsection{.}

\subsubsection{.}

\paragraph{.}

\subparagraph{.}

在编辑框输入以下文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
\documentclass[UTF8]{ctexart}
\title{你好,world!}
\author{李凯杰}
\date{\today}
\begin{document}
\maketitle
\section{你好中国}
中国在 East Asia.
\subsection{Hello Beijing}
北京是 capital of China.
\subsubsection{Hello Dongcheng District}
\paragraph{Tian'anmen Square}
is in the center of Beijing
\subparagraph{Chairman Mao}
is in the center of 天安门广场。
\subsection{Hello 北京}
\paragraph{北京} is an international city。
\end{document}

会产生以下结果:

image-20210729084810750

文献引用

公式

为了使用 AMS-LaTeX 提供的数学功能,我们需要在导言区加载amsmath宏包:

1
\usepackage{amsmath}

数学模式

LaTeX 的数学模式有两种:行内模式 (inline) 和行间模式 (display)。前者在正文的行文中,插入数学公式;后者独立排列单独成行。

在行文中,使用可以插入行内公式,使用\[ ... \]可以插入行间公式,如果需要对行间公式进行编号,可以使用equation环境: \begin{equaion} … \end{equation}

Latex在线工具编辑器:

1
https://www.codecogs.com/latex/eqneditor.php

表格

Latex在线表格编辑器

1
https://www.tablesgenerator.com/

图片

在 LaTeX 中插入图片,有很多种方式。最好用的应当属利用graphicx宏包提供的\includegraphics命令。比如你在你的 TeX 源文件同目录下,有名为 a.jpg 的图片,你可以用这样的方式将它插入到输出文档中:

1
2
3
4
5
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{a.jpg}
\end{document}

图片可能很大,超过了输出文件的纸张大小,或者干脆就是你自己觉得输出的效果不爽。这时候你可以用

\includegraphics控制序列的可选参数来控制。比如

1
\includegraphics[width = .8\textwidth]{a.jpg}

这样图片的宽度会被缩放至页面宽度的百分之八十,图片的总高度会按比例缩放。