《Python深度学习》备忘录

271 阅读9分钟

此文章为《Python深度学习》的备忘录。

第1章 什么是机器学习

  • 机器学习: 在预先定义好的可能性空间中,利用反馈信号的指引来寻找输入数据的有用表示。
  • 深度学习(分层表示学习/层级表示学习): 从数据中学习表示的一种新方法,强调从连续的层(layer)中进行学习,这些层对应于越来越有意义的表示。层数即为深度,这些分层表示几乎总是通过叫做神经网络的模型来学习得到的。
  • 权重: 各层用一串数字作为权重对数据进行变换,其初始值为随机赋值。
  • 损失函数/目标函数: 衡量输出与预期值的距离。
  • 优化器: 利用损失函数作为反馈信号对各层的权重进行微调。

机器学习的三大要素:

  • 硬件: GPU(图像处理器)作为大规模并行芯片,而深度神经网络主要由许多小矩阵乘法组成,也是高度并行化的,故GPU很适合用来进行神经网络的训练。Google的TPU(张量处理器)项目是专门为运行深度神经网的。
  • 数据
  • 算法: 神经层激活函数(activation function), 权重初始化方案(weight-initialization scheme), 优化方案(optimization scheme), 批标准转化, 残差连接,深度可分离卷积等。

Theano和TensorFlow是两个符号式的张量运算的Python框架,都支持自动求微分。Keras等用用户友好型库则使深度学习变得简单。

第2章 神经网络的数学知识

深度学习的Hello World



epoch: 轮次,在所有训练数据上迭代一次叫做一个轮次。

数学表示

  • 标量/0D张量: 常量。
  • 向量/1D张量: 一维数组。
  • 矩阵/2D张量: 二维数组。

nD = n维 = n个轴(numpy.ndim属性)

张量运算

keras.layers.Dense(512, activation=‘relu’) 等同于 output = relu(dot(W, input) + b)。 dot指点积运算,relu(x)等于max(x, 0)。 W和p都是张量,属于神经层的属性,称为该层的权重(weight)或可训练参数(trainable parameter),分别对应kernel和bias属性。

基于梯度的优化

随机梯度下降

神经网络中无法通过f'(w) = 0直接算得最小损失值,因为参数个数不会少于几千个。需使用梯度下降算法,将参数沿着梯度的反方向移动一点(移动步长即step,也称学习率),此方法称为***随机梯度下降算法(stochastic gradient descent/SDG)***。

  • 小批量SGD(小批量随机梯度下降/mini-batch SDG):每次抽取训练样本的数据批量,以批计算损失。
  • 真SGD:每次迭代只抽取一个样本和目标。
  • 批量SGD:每次迭代都在所有数据上运行,会使每次更新都更加准确单计算代价也高得多。
  • 其他SGD变体:计算下一次权重更新时还要考虑上一次权重更新而不仅仅考虑当前梯度值。比如带动量的SGD、Adagrad、RMSProp等,这些变体被称为优化方法(optimization method)或优化器(optimizer)。

动量解决了SDG的两个问题:收敛速度和局部极小点。其主要思想是除了考虑当前斜率值(加速度),还要考虑当前的速度(来自于之前的加速度),实践中是指更新参数w时不仅要考虑当前的梯度值,还要考虑上一次的参数更新。

链式求导:反向传播算法

假定网络f包含3个张量运算a、b和c和三个权重矩阵W1、W2和W3。

f(W1, W2, W3) = a(W1, b(W2, c(W3))))

根据链式法则(chain rule):

(f(g(x)))' = f'(g(x)) * g'(x)

将链式法则应用于神经网络梯度值的计算,得到的算法称为***反向传播(backpropagation/反式微分/reverse-mode differentiation)***。这个函数可将当前参数和当前数据批量映射为一个梯度值.

第3章 神经网络入门

  • 简单的向量数据保存在(samples, features)的2D张量中,通常用密集连接层(densely connected layer/全连接层/fully connected layer/密集层/dense layer, 对应Keras的Dense类)处理。
  • 序列数据保存在(samples, timesteps, features)的3D张量中,通常用循环层(recurrent layer, 比如Keras中的LSTM层)来处理。
  • 图像数据保存在唉4D张量中,通常用二维卷积层(Keras的Conv2D)来处理。

选择正确的网络架构更像是一门艺术为不是科学。

损失函数:

  • 二分类问题:可使用二元交叉熵(binary crossentropy)
  • 多分类问题:可使用分类交叉熵(categorical crossentropy)
  • 回归问题:可使用均方误差(MSE/mean-squared error), 对应于metrics: 平均绝对误差/MAE/mean absolute error
  • 序列学习问题:可使用联结主义时序分类(CTC/connectionist temporal classification)

精度指标:

  • 精度
  • 接受者操作特征曲线下面积(area under the receiver operating characteristic/ROC AUC)
  • 准确率
  • 召回率
  • 平均准确率均值(mean average precision)

relu: 整流线性单元/rectified linear unit。

激活函数: relu等激活函数用于取消绝对的线性变换,以拓展假设空间。

多分类的标签编码:

  • 分类编码(one-hot 编码):categorical_crossentropy
  • 整数编码:sparse_categorical_crossentropy

如果输入数据的特征具有不同的取值范围,应该进行预处理,对每个特征单独进行缩放。

第4章 机器学习基础

机器学习的四个分支

  • 监督学习: 最常见的类型,前文所述问题均属于监督学习,主要包括分类和回归。
  • 无监督学习: 在没有目标的额情况下寻找输入数据的有趣变换,其是数据分析的必备技能。例如降维(dimensionality)和聚类(clustering)。
  • 自监督学习
  • 强化学习: AlphaGo

1. 评估机器学习模型

网络的层数与每层的大小称为超参数,与模型参数(权重)相区别。

当数据量很少时:

  1. 简单的留出验证:注意一般需要先打乱顺序。
  2. K折验证:将数据划分为大小相同的K个分区,分别已每一个分区作为验证集,最终取平均值。
  3. 带有打乱数据的重复K折验证(iterated K-fold validation with shuffling):分区之前先将数据打乱,重复多个K折验证过程。最终取每次K折验证的平均值。

数据预处理:

  • 向量化:神经网络的所有输入和目标必须是浮点数张量(特定情况下可以是整数张量)。
  • 值标准化:输入数据应该满足取值较小、同质性(homegenous/所有特征的取值都应该在大致相同的范围)。如将每个特征的分别标准化,使其平均值为0,标准差为1(x -= x.mean(axis=0), x /= x.std(axis=0))。
  • 处理缺失值:设置为0往往是安全的。

特征工程:以正确合适的方式作为输入。比如给出时针的坐标比输入时钟的图片进行训练要好很多。

深度学习模型通常很擅长拟合训练数据,但真正的挑战在于泛化。

解决过拟合的方法:

  1. 获取更多的训练数据。
  2. 减小的网络大小(参数/超参数)
  3. 添加权重正则化(weight regularization):依据***奥卡姆剃刀(Occam's razor)原理,强制让模型权重只能取较小的值从而限制模型的复杂度,这使得权重值的分布更加规则。其实现方法为向损失函数中添加与较大权重值相关的成本(cost),其形式包含***L1正则化(L1 regularization/添加的成本与权重系数的绝对值[权重的L1范数(norm)]成正比)、L2正则化(L2 regularization/权重衰减/weight decay/添加的成本与权重系数的平方[权重的L2范数])成正比。使用方法为在增加layer时添加kernel_regularizer=regularizers.l2/l1/l1_l2(0.001)作为参数。
  4. 添加dropout正则化:在训练过程中随机将该层的输出特征舍弃(置0)。测试时没有单元被舍弃,该层的输出值需要按dropout比率缩小以加以平衡。使用方法为添加layers.Dropout(0.5)层。Note: layer_output *= np.random.randint(0, high=2, size=layer_output.shape), layer_output *= 0.5, layer_output /= 0.5。
  5. 数据增强:利用多种能够生成可信图像的随机变换来增加(augment)样本。
问题类型 最后一层激活 损失函数
二分类问题 sigmoid binary_crossentropy
多分类、单标签问题 softmax categorical_crossentropy
多分类、多标签问题 sigmoid binary_crossentropy
回归到任意值 mse
回归到 0~1 范围内的值 sigmoid mse 或 binary_crossentropy

第5章 深度学习用于计算机视觉

5.1 卷积神经网络简介

5.3 使用预训练的卷积神经网络

有两种方法使用预训练网络

5.3.1 特征提取(feature extraction)

5.3.2 微调模型(fine-tuning)

5.4 卷积神经网络的可视化

第6章 深度学习用于文本和序列

6.1 处理文本数据

将文本分解而成的单元(单词、字符或n-gram)叫做***标记(token)***,此过程称为***分词(tokenization)***。

将文本转换为张量:

  1. one-hot编码(one-hot encoding): 单词级别,字符级别,keras实现,使用散列技巧的单词级。
  2. 标记嵌入(token embedding)

6.2 循环神经网络

将输入转化成大向量进行一次性处理,这种网络叫做***前馈网络(feeforward network)*** 循环神经网络(RNN/recurrent neural network)遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息。

SimpleRNN不擅长处理长序列如文本。

LSTM(长短期记忆/long short-term memory)算法

GUR(门控循环单元/gated recurrent unit): 工作原理与LSTM相同,但做了一些简化,运算代价更低同时表达能力变差。

双向RNN(bidirectional RNN): 对于时间久远无关的序列数据,如一句话,反向RNN往往是有用的。而天气数据等时间更近的数据往往导向性更强,故反向RNN想过并不理想。CNN也适用于时间久远无关的序列数据。

[To Be Continued]

Referenced

  • optimizer:
    • rmsprop