人工智能学习相关笔记

阅读文献的一些思路、经验

Question:首先,要阅读论文,就要先理解论文存在的意义是什么?
Answer:就我个人理解而言,论文就是一篇报告,向全社会描述一个课题的背景,论文作者对该课题的研究成果(可以是一些创新的方法、技术、理论分析,或具有实用价值的应用实现),并提供相应的实验、分析对这些成果进行验证。

因此,阅读一篇文献,就是为了弄清楚以下几个问题:

  • 这篇论文的课题背景是什么?
    课题背景包括该课题涉及的领域是什么,该课题要解决的是什么问题,该课题解决这些问题有什么重要的意义和作用。这些问题能在论文的“摘要”、“相关工作”、“讨论”、“总结(结束语)”中找到答案。

  • 该课题的研究现状如何?
    了解清楚课题的研究现状一方面可以帮助我们对课题有个框架性的认识和把握,对改进方法的构思有所依据;另一方面可以顺藤摸瓜寻找该课题的相关论文,避免盲目地在SCI HUB上搜索关键字海选。研究现状在“前言”、“介绍”、“相关工作”一般都会进行系统性的梳理。

  • 这篇论文有什么学术贡献(方法、概念、技术、理论)?它们是怎么验证的?
    这是整篇论文的核心和干货,一般在论文的中间一个或多个章节顺序阐述,关于这些部分的所有内容,都必须完全理解才算读懂一篇论文。该部分最复杂的莫过于符号的理解和公式推导,一定不能因为繁琐复杂而放弃或草草了事。完成了这部分的梳理,就能对整篇论文信手拈来。加油!

  • 这篇论文进行了哪些实验?验证了什么?结论是什么?
    这部分的内容同样不能放过,通过整理这些问题的答案,我们至少能有以下收获:
    (1)了解优秀论文的实验方法,这可以帮助我们衡量自身的科研实力(判断自己是否能完成相同的实验,或者类似实验,或者更轻量的实验,再或者改进的实验)
    (2)了解该论文的学术成果的实际指标(可以了解该课题一般使用什么指标来衡量成果的优劣,该指标下,现有研究的程度是多少)。
    (3)该文作者是怎么总结、分析这些实验结果数据的。
    (4)该文作者是怎么行文,组织论文实验部分的结构。

对于阅读摘要(Abstract)
通过阅读摘要,我们可以快速了解两个最关键的信息:
(1)该论文做了什么?
(2)该论文是否是我们想要的?如果不是,出门左转~

摘要部分一般由以下三个部分组成:
(1)课题背景及存在的问题
(2)该论文的学术贡献
(3)该论文进行了什么实验,以及根据实验结果得出的结论

留出法(hold-out)

留出法的含义是:直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另外一个作为测试集T,即D=S∪T,S∩T=0。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的评估。其中T也叫held-out data。

需要注意的问题:

  • 训练/测试集的划分要尽可能的保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响;
  • 在给定训练/测试集的样本比例后,仍然存在多种划分方式对初始数据集D进行划分,可能会对模型评估的结果产生影响。因此,单次使用留出法得到的结果往往不够稳定可靠,在使用留出法时,一般采用若干次随机划分、重复进行实验评估后取得平均值作为留出法的评估结果
  • 此外,我们希望评估的是用D训练出的模型的性能,但是留出法需划分训练/测试集,这就会导致一个窘境:若训练集S包含大多数的样本,则训练出的模型可能更接近于D训练出的模型,但是由于T比较小,评估结果可能不够稳定准确;若测试集T包含多一些样本,则训练集S与D的差别更大,被评估的模型与用D训练出的模型相比可能就会有较大的误差,从而降低了评估结果的保真性(fidelity)。因此,常见的做法是:将大约2/3~4/5的样本用于训练,剩余样本作为测试

来源于周志华的西瓜书。

Artifact (error)

In natural science and signal processing, an artifact is any error in the perception or representation of any information introduced by the involved equipment or technique(s).
在自然科学和信号处理中,“artifact”是指相关设备或技术引入的任何信息的感知或表示中的任何错误。

In computer science, digital artifacts are anomalies introduced into digital signals as a result of digital signal processing.
在计算机科学中,数字伪影是由于数字信号处理而引入数字信号中的异常现象。

理解交叉熵损失函数(CrossEntropy Loss)

深度学习代码中经常看见“交叉熵损失函数”,它是“分类问题”中常用的一种损失函数,而且在使用交叉熵作为损失函数时,模型的输出层总会接一个softmax函数。交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性,要理解交叉熵,先解释以下几个名词。

信息量

在这里插入图片描述

信息熵

在这里插入图片描述
在这里插入图片描述

相对熵(KL散度)

在这里插入图片描述

交叉熵

在这里插入图片描述

交叉熵在单分类问题中的应用

在这里插入图片描述

回顾知识蒸馏公式

在这里插入图片描述

对抗学习

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5. 对抗学习的科研前沿
目前,对抗攻击中攻击与防御的方式也是“道高一尺,魔高一丈”,已经经过了许多轮的迭代,演变出了许多攻防方式。随着各种攻击方法的产生,提出的防御方法看似抵御了这些攻击,但是新出现的攻击却又不断躲避着这些防御方法。
至今,人们仍不完全清楚神经网络这个黑盒的本质特性。甚至有研究指出,神经网络完成的分类任务仅是靠辨别局部的颜色和纹理信息,这使得自然的对抗样本,即便不是人为加入的扰动,而是真实采集到的图像,也能够成功地欺骗神经网络。
这也支持了许多研究者的观点,即神经网络只是学习了数据,而非知识,机器学习还无法像人一样学习。这项难题的最终解决,或许依赖于对神经网络的透彻理解,以及对神经网络结构的改进。
弄清楚神经网络内部的学习机制,并据此进行改进,或许才能真正解决目前神经网络对于对抗攻击的脆弱性。因此对抗机器学习不仅是机器学习被更加广泛地被应用的一道门槛,也是促使人们研究如何解释机器学习模型的动力。

抑制过拟合的方法

过拟合指的是只能拟合训练数据,但不能很好地拟合不包含训练数据的其他数据。神经网络要求模型能够具有较高的泛化能力,也就是对不包含训练数据的未观测数据也能进行正确识别。所以在训练表现力强的模型同时,抑制过拟合的技巧也很重要。

防止过拟合的方法:(1)人为增加训练数据集;(2)正则化 regularization(权值衰减);(3)Dropout;(4)早停(early stopping)

  1. 人为增加训练数据集
    发生过拟合的原因主要有:
  • 模型拥有大量参数,表现力强;
  • 训练数据少。

所以通过增加训练数据可以抑制过拟合,提高模型的泛化能力。例如增加图像数据集可以对原始图像进行旋转、镜像。

  1. 正则化(权值衰减)
    在这里插入图片描述
    def loss(self, x, t):
        # 前向传播
        y = self.predict(x)
 
        weight_decay = 0
        # 计算所有权重的L2范数
        for idx in range(1, self.hidden_layer_num + 2):
            W = self.params['W' + str(idx)]
            weight_decay += 0.5 * self.weight_decay_lambda * np.sum(W ** 2)
 
        return self.last_layer.forward(y, t) + weight_decay
 
 
    def gradient(self, x, t):
        # 计算损失函数
        self.loss(x, t)
 
        # backward
        dout = 1
        dout = self.last_layer.backward(dout)
 
        layers = list(self.layers.values())
        layers.reverse()
        for layer in layers:
            dout = layer.backward(dout)
 
        # 梯度
        grads = {
    
    }
        for idx in range(1, self.hidden_layer_num+2):
            grads['W' + str(idx)] = self.layers['Affine' + str(idx)].dW + self.weight_decay_lambda * self.layers['Affine' + str(idx)].W
            grads['b' + str(idx)] = self.layers['Affine' + str(idx)].db
 
        return grads
  1. Dropout
    上面介绍的损失函数加上权重的L2范数的权值衰减方法,在某种程度上可以抑制过拟合。但是,如果网络模型变得复杂,只有权值衰减就显得力不从心了。在这种情况下,往往使用Dropout方法。
    Dropout是一种在学习过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号传递。如下图所示。训练时,每传递一次数据,就会随机选择要删除的神经元。然后,测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出。
    在这里插入图片描述
    下面来实现Dropout,这里注重理解实现的方法比较简单:
class Dropout:
    def __init__(self, dropout_ratio=0.5):
        self.dropout_ratio = dropout_ratio
        self.mask = None
 
    def forward(self, x, train_flg=True):
        if train_flg:
            self.mask = np.random.rand(*x.shape) > self.dropout_ratio
            return x * self.mask
 
    def backward(self, dout):
        return dout * self.mask

说明:每次正向传播时,self.mask中都会以False的形式保存要删除的神经元。self.mask会随机生成和x形状相同的数组,并将值比dropout_ratio大的元素设为True。传播行为和RuLU相同。

在搭建神经网络时可以这样使用Dropout:

def __init__(self, input_size, hidden_size_list, output_size,
                 activation='relu', weight_init_std='relu', weight_decay_lambda=0, 
                 use_dropout = False, dropout_ration = 0.5):
        self.input_size = input_size
        self.output_size = output_size
        self.hidden_size_list = hidden_size_list
        self.hidden_layer_num = len(hidden_size_list)
        self.use_dropout = use_dropout
        self.weight_decay_lambda = weight_decay_lambda
        self.params = {
    
    }
 
        # 权重初始化方法
        self.__init_weight(weight_init_std)
 
        # 每层网络生成
        activation_layer = {
    
    'sigmoid': Sigmoid, 'relu': Relu}
        self.layers = OrderedDict()
        for idx in range(1, self.hidden_layer_num+1):
            self.layers['Affine' + str(idx)] = Affine(self.params['W' + str(idx)],
                                                      self.params['b' + str(idx)])
 
            if self.use_dropout:
                self.layers['Dropout' + str(idx)] = Dropout(dropout_ration)
 
        idx = self.hidden_layer_num + 1
        self.layers['Affine' + str(idx)] = Affine(self.params['W' + str(idx)], self.params['b' + str(idx)])
 
        self.last_layer = SoftmaxWithLoss()

也就是一个全连接层后面使用Dropout。

  1. 早停(early stopping)
    将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值;验证集用来估计误差。若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。

  2. 拓展
    机器学习中经常使用集成学习。所谓集成学习,就是让多个模型单独进行学习,推理时再取多个模型的输出的平均值。用神经网络的语境来说,比如,准备5个结构相同的网络,分别进行学习,测试时,以这5个网络的输出的平均值作为答案。通过实验可以发现,使用集成学习,神经网络的识别精度可以提高好几个百分点。
    这个集成学习与Dropout有密切的关系。这是因为可以将Dropout理解为,通过在学习过程中随机删除神经元,从而每一次都让不同的模型进行学习。并且,推理时,通过对神经元的输出乘以删除比例(比如0.5),可以取模型的平均值。也就是说,可以理解成,Dropout将集成学习的效果通过一个网络实现了。

随机投影(Random Projection)

概述

随机投影是一种比较有效的降维方法,在计算上比主成成分分析更有效。它通常应用于当数据有太多维度,假定运行程序的资源有限,主成成分分析无法有效计算的时候。

一个简单化的案例,对PCA 和 随机投影。如下图:

PCA:将一个数据集从二维降至一维,PCA的做法是寻找方差最大化的方向,然后将数据投影到最大化方差的方向。该过程将产生最小损伤。

随机投影:在数据有很多维度时,会消耗一定的资源。通常情况下会随机选择一条直线,任何一条进行投影。在某些情景下没有太大的意义,但在更高维度下效果比较好,且效率高。

在这里插入图片描述

基本实现

随机投影的基本前提是:用数据集乘以一个随机矩阵来减少其中的维度。在某种程度上讲,这就是随机投影。
在这里插入图片描述
一个简单的案例。如下图:

假如数据集有 12000 列,1500 个样本。这已经可以说是高维度数据集了。将数据集输入到sklearn中随机投影,返回到结果是6268 列、1500 个样本的数据集:

在这里插入图片描述
在随机投影中,其实是将原数据集乘以一个随机矩阵就可以被映射成低维的空间。在这种程度下,每两点之间的距离、每对之间的距离在某种程度下得到了保留。这很重要,因为在非监督学习和监督学习中,很多算法都与点之间的距离有关,所以需要保证距离有些失真,但可以保留。

如何保证投影之后的距离得以保留?Johnson-Lindenstrauss引理指出:投影后两点的距离平方值稍有压缩。它大于原数据集两点之间的平方值乘以 (1 - eps) ;小于原数据集两点之间的平方值乘以(1 + eps) 。

如果两点之间距离的平方值为 125.6 。 eps 为 0 ~ 1 之间的值,在sklearn中默认为 0.1。
在这里插入图片描述
eps 如同一个操作杆,用于计算产生了多少列,并在此维度是可接受的失真水平。eps 是输入到函数中,用此来在此程度下保证距离。

sklearn中的随机投影

sklearn 中随机投影的案例:http://lijiancheng0614.github.io/scikit-learn/auto_examples/plot_johnson_lindenstrauss_bound.html#example-plot-johnson-lindenstrauss-bound-py

sklearn 中随机投影API:http://lijiancheng0614.github.io/scikit-learn/modules/generated/sklearn.random_projection.SparseRandomProjection.html#sklearn.random_projection.SparseRandomProjection
在这里插入图片描述

独立成分分析(ICA)

独立成分分析(ICA) 是同主成成分分析(PCA) 和 随机投影相似的方法。同样会通过一些数据集特征产生另一个作用数据集。但不同的是PCA用于最大化方差,ICA 则假设这些特征是独立源的混合。并尝试分离这些独立源。

假定有三个朋友参加艺术展览,展览会上同时有着钢琴声、小提琴声、电视声。三个人各在不同声音的旁边,同时用手机录取下来听到的声音。

在这里插入图片描述

三个朋友录取的声音都有不同的来源,靠近钢琴的朋友,录取到的钢琴声比较明显;而其他声音则比较弱。其他两个也是,一个录取的小提琴声音比较明显,一个录取电视声比较明显。

在这里插入图片描述

是否可以运用ICA剥离出源声音呢?答案是可以。输入收集的三种数据集,利用ICA算法剥离出源数据。这里的源组成分(这里等于3)

在这里插入图片描述

ICA算法

简单介绍 ICA 算法的原理。不会涉及复杂的数学知识。详细的信息可查看论文“独立成分分析:算法与应用”。
现在假设有数据集 X , 假设 X 数据集是由源信号 S 乘以混合矩阵 A 产生的, X = AS。如下图:
在这里插入图片描述
但是现在有数据集 X ,也就是原录音。S 信号源是需要计算得到的结果,A 为混合矩阵。如此需要变换公式,即 S = WX 。 W 为 A 的倒数,如果A是混合矩阵,W 即为非混合矩阵。

在 S = WX 公式中, X 为输入的源数据集。需要得到想要的 S 结果,就需要计算 W ,所以独立分析算法和其过程全部目标是趋近 W ,或者给出最佳的 W 与 X 相乘来产生原始信号。论文“独立成分分析:算法与应用”对算法做出了清楚的解释。
在这里插入图片描述

ICA 应用

ICA 被广泛应用于医学扫描仪。一个叫做 EEG或MEG的脑部扫描仪的例子。论文:Independent Component Analysis of Electroencephalographic Data

将 ICA 应用于金融中的因子模型。论文:Applying Independent Component Analysis to Factor Model in Finance

sklearn 中的ICA

sklearn 中 ICA 的API:http://lijiancheng0614.github.io/scikit-learn/modules/generated/sklearn.decomposition.FastICA.html

在这里插入图片描述

项目

使用 ICA 提取混合的音频信号。与上述例子一样。在此下载 文件,使用 jupyter notebook 打开查看。
链接: https://pan.baidu.com/s/10SkvkM9dJPMJSzTRIpiPuQ?pwd=6wnn 提取码: 6wnn

范数

  1. 维基百科-范数
  2. 向量与矩阵的范数(比较1-范数、2-范数、无穷范数、p-范数、L0范数 和 L1范数等)

猜你喜欢

转载自blog.csdn.net/Waldocsdn/article/details/127899604