Skip to content

深度学习入门(基于py)

神经网络的学习

定义

由数据自动决定权重参数的值

分类模型的softmax函数

杂项

PIL(Python Image Library)模块显示数据图像

Python有 pickle这个便利的功能。这个功能可以将程序运行中的对 象保存为文件。如果加载保存过的 pickle文件,可以立刻复原之前 程序运行中的对象

epoch是一个单位。一个 epoch表示学习中所有训练数据均被使用过 一次时的更新次数。比如,对于 10000笔训练数据,用大小为 100 笔数据的mini-batch进行学习时,重复随机梯度下降法 100次,所 有的训练数据就都被“看过”了A。此时,100次就是一个 epoch。

神经网络的正向传播中进行的矩阵的乘积运算在几何学领域被称为“仿 射变换”A。因此,这里将进行仿射变换的处理实现为“Affine层”

预处理

对神经网络的输入数据 进行某种既定的转换称为预处理(pre-processing)。将数据整体的分布形状均匀化的方法,即数据白化(whitening)。把数据限定到某 个范围内的处理称为正规化(normalization)

Batch

x, t = get_data()
network = init_network()
batch_size = 100 # 批数量
accuracy_cnt = 0
for i in range(0, len(x), batch_size):
 x_batch = x[i:i+batch_size]
 y_batch = predict(network, x_batch)
 p = np.argmax(y_batch, axis=1) #矩阵的第0维是列方向,第1维是行方向
 accuracy_cnt += np.sum(p == t[i:i+batch_size])#p == t[i:i+batch_size]返回例子:[True True False True ...]
print("Accuracy:" + str(float(accuracy_cnt) / len(x)))

训练数据(监督数据)和测试数据

泛化能力:指处理未被观察过的数据(不包含在训练数据中的数据)的能力。

loss function: 一般 均方误差和交叉熵,反映了神经网络对监督数据在多大程度上不拟合

均方误差: $$ \text{MSE} = \frac{1}{2} \sum_{k}^{} (y_k - \hat{t}_k)^2\ (y_k:神经网络的输出,t_k:监督数据) $$ 交叉熵误差(tk中只有正确解标签的索引为1,其他均为0(one-hot表示))

$$ E = - \sum_{k}t_k*lny_k $$ 注:上述均为单个数据的公式

假设有N个数据: 交叉熵误差: $$ E = - \frac{1}{N}\sum_{n}\sum_{k}t_{nk}*lny_{nk}\ $$

$$ 针对one-hot,事实上,如果不是one-hot形式,可能只需要\ E = - \frac{1}{N}\sum_{n}\sum_{k}lny_{nk} $$ mini-batch: 从全部数据中选取一部分作为近似进行学习

学习率(learning rate)(人工设定): $$ x_0=x_0-n\frac{\partial f}{\partial x_0}\ x_1=x_1-n\frac{\partial f}{\partial x_1}\ 其中n就是学习率的意思,即为更新量 $$

学习算法的实现

mini-batch学习,就是从训练数据中随机选择一部分数据(称为mini-batch), 再以这些mini-batch为对象,使用梯度法更新参数的过程。

随机梯度下降学习法(SGD):对随机选择的数据进行的梯度下降法

误差反向传播法

与学习相关的技巧

更新方法

Momentum方法

Adagrad

实际上,如果无止境地学习,更新量就会变为 0, 完全不再更新。为了改善这个问题,可以使用 RMSProp [7]方法。 RMSProp方法并不是将过去所有的梯度一视同仁地相加,而是逐渐 地遗忘过去的梯度,在做加法运算时将新梯度的信息更多地反映出来。 这种操作从专业上讲,称为“指数移动平均”,呈指数函数式地减小 过去的梯度的尺度

Adam

是融 合了Momentum和AdaGrad的方法

参数初始值的设定

sigmod函数学习初始值

假设每个层输出都接近0,那么梯度相当于0 * 0 * 0 * 0非常接近0

Relu函数学习初始值

Batch Normalization

思想:为了使各层拥有适当的广度,“强制性”地调整激活值的分布

Batch norm的反向传播的介绍:“Understanding the backward pass through Batch Normalization Layer”

解决过拟合

权值衰减是一直以来经常被使用的一种抑制过拟合的方法。该方法通过 在学习的过程中对大的权重进行惩罚,来抑制过拟合。很多过拟合原本就是 因为权重参数取值过大才发生的。

1.

image-20241029015142479

\(W^2\) 应该是L2范数的平方意思叭。(也可能就是平方

2.

Dropout是一种在学习的过程中随机删除神经元的方法。训练时,随机 选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递,

超参数(hyper-parameter)是指,比如各层的神经元数量、batch大小、参 数更新时的学习率或权值衰减等

为什么不能用测试数据评估超参数的性能呢?这是因为如果使用测试数 据调整超参数,超参数的值会对测试数据发生过拟合。换句话说,用测试数 据确认超参数的值的“好坏”,就会导致超参数的值被调整为只拟合测试数据。 这样的话,可能就会得到不能拟合其他数据、泛化能力低的模型。 因此,调整超参数时,必须使用超参数专用的确认数据。用于调整超参 数的数据,一般称为验证数据(validation data)。我们使用这个验证数据来 评估超参数的好坏。如果是MNIST数据集,获得验证数据的 最简单的方法就是从训练数据中事先分割20%作为验证数据。当然,要记得打乱数据集,因为数据集可能按某个顺序排列,我们不能随便找20%

这里介绍的超参数的最优化方法是实践性的方法。不过,这个方 法与其说是科学方法,倒不如说有些实践者的经验的感觉。在超 参数的最优化中,如果需要更精炼的方法,可以使用贝叶斯最优 化(Bayesian optimization)。贝叶斯最优化运用以贝叶斯定理为中 心的数学理论,能够更加严密、高效地进行最优化。详细内容请 参 考 论 文“Practical Bayesian Optimization of Machine Learning Algorithms”

卷积层

全连接层存在什么问题呢?那就是数据的形状被“忽视”了。比如,输 入数据是图像时,图像通常是高、长、通道方向上的3维形状。但是,向全 连接层输入时,需要将3维数据拉平为1维数据。MNIST数据集的例子中,输入图像就是1通道、高28像素、长28像素 的(1, 28, 28)形状,但却被排成1列,以784个数据的形式输入到最开始的 Affine层。

对抗样本(adversarial examples)PGD攻击算法

链接:https://arxiv.org/pdf/1706.06083

very small changes to the input image can fool state-of-the-art(最先进的) neural networks with high confidence.

encapsulate:封装

什么是PGD 攻击:projected gradient descent 投影梯度下降

Optimization View on Adversarial Robustness:

the saddle point problem(鞍点模型)?

ERM:一种寻找具有小的总体风险的分类器的方法,但是在对抗攻击下不具有鲁棒性

how to be robust to adversarial attacks:

  1. specify an attack model,and give a guarantee:比如对该模型应当抵御的某种攻击类型的精确定义

  2. 对输入进行扰动,并引出核心研究问题:

\[ \min_{\theta} \rho(\theta), \quad \text{where} \quad \rho(\theta) = \mathbb{E}_{(x, y) \sim D} \left[ \max_{\delta \in S} L(\theta, x + \delta, y) \right] \]

意思就是寻找theta,使得对于一组分布在D的(x,y)(x是样本数据向量,y是对应的标签),在x受到微小扰动 δ后(某个扰动范围 S 内,找到一个 δ),使得最大化损失函数的期望最小,换言之,在最坏的情况下让损失函数期望(所有样本的一个损失平均)最小化.(不过S是一个p范数球的分布,p到底是多少呢)

那么,这就是两个方面(攻击和防御)的考虑:

  1. 内部的Loss最大,就是找到一个最厉害的扰动

  2. 外部的rho最小,就是找到一个模型参数,使用对抗性训练使得模型防御性更强。

FGSM

FGSM(Fast Gradient Sign Method):针对无限边界的对抗攻击(L∞-bounded adversary),linearizing the inner maximization problem

这个大概是无穷阶范数的意思,我猜。就是针对这组数据向量所围成一个超正方体。(数学原理不明)

例如对于二维平面,无穷范数为一个正方形。因为对于一个向量, $$ ||x||\inf=\max{{1}<=i<={n}}|x_i| $$ 那么(x,y)里的x和y一定小于一个最大值max(注意不是每个元素的平方和开根),因此是四条直线x=max,x=-max,y=max,y=-max围成的正方形。

同理,三维空间是正方体。

how to computes an adversarial example : $$ x + \epsilon \cdot \text{sgn}\left( \nabla_x L(\theta, x, y) \right) $$ 简单来说,就是把损失函数相对于输入x的梯度归一化为1,0,-1三种类型,然后epsilon是个无穷阶范数,就是足够小。

目的: maximizing the inner part of the saddle point formulation(不懂,朝着梯度方向去做,是损失函数变化的最快的,那么有利于损失函数的变大?),对应于上文 $$ \max_{\delta \in S} L(\theta, x + \delta, y) $$

PGD(projected gradient descent):

上面的FGSM是one-step,那么PGD就是multi-step。 $$ x_{t+1} = \Pi_{x + S} \left( x_t + \alpha \cdot \text{sgn}\left( \nabla_x L(\theta, x, y) \right) \right) $$ better :training against multiple adversaries针对多个对手训练,如不同的p 范数约束,不同的攻击策略等。

那么对于投影函数的解释: $$ \Pi_{S(x)}=arg \min_{y∈S} ∥y−x∥ $$ 在集合 S 中找到一个点 y,使得 y与x之间的距离最小。

Universally Robust Networks:

attaining small adversarial loss,giving a guarantee:意思是使得rho非常小,那么即使在最坏情况仍有很好的表现。

所以how to be robust to adversarial attacks转化为了how to obtain a good solution

待解决:non-concave,

PGD:可解的。

尽管神经网络的损失函数有许多局部极小\大值,但这些局部最小\大的损失值非常接近,这也是为什么神经网络的训练是可行的。

The Landscape of Adversarial Examples

实验操作:在数据点的无穷阶范数的球边界的许多点运行PGD,以探索损失函数的大部分位置。

发现:

  1. 在x+S 内随意选取起始点进行PGD时,发现损失值以相当一致的方式增加,并且逐渐收敛,并且在测试的时候loss values比其它训练要低。
  2. 大量的随机启动后,最终迭代的损失遵循一个良好的集中分布,没有极端异常值

First-Order Adversaries

PGD发现的局部最大值在正常训练的网络和对抗训练的网络中都有着相似的损失值。(应该意思是说明局部最大值非常集中,因此会比较相似。但是PGD理论上应该会使得loss更大?可能是因为其它方法的loss也会在PGD的附近,因此差别不大)

这也说明,只要能够防御住PGD,就会对所有的一阶攻击手段具有鲁棒性。在黑盒中更强。

机器学习中的绝大多数优化问题都是通过一阶方法解决的。