初识深度学习

初识深度学习


注:

1、本文为个人学习笔记,所以内容大多比较简练不做过多解释

2、文章参考书籍:1、《python深度学习》[美] 弗朗索瓦·肖莱 著 张亮 译;2、《深度学习》(花书)

3、部分内容自己阅读参考文献进行补充

4、大部分代码都是基于pytorch进行编写<先学原理后学代码>

n、后续用到什么就继续继续补充


[toc]

一、初识神经网络

1.1 神经网络的工作原理

1680779540890

  • 优化器:随机梯度下降、牛顿法
  • 层:可以取类比多层感知机模型中的隐藏层
  • 数据变换:激活函数

进一步解释见:2.2.3 基于梯度优化

1.2 神经网络基础知识

1.2.1 张量

关于张量的了解其实没必要过多去解释他到底是个什么样子的,python编程过程中可以直接将其与numpy的矩阵一起了解(下以pytorch为例)

1
2
3
4
5
6
import torch
a = torch.ones(3,2)
a
>tensor([[1., 1.],
[1., 1.],
[1., 1.]])

但是张量的一些基本性质还是需要了解:

  • 轴的个数(阶)。例如,3D 张量有 3 个轴,矩阵有 2 个轴。这在 Numpy 等 Python 库中也叫张量的 ndim。
  • 形状。这是一个整数元组,表示张量沿每个轴的维度大小(元素个数)。例如,上述列子就是一个二维的3x2
  • 数据类型。这是张量中所包含数据的类型,例如,张量的类型可以是 float32、uint8、float64 等。在极少数情况下,你可能会遇到字符(char)张量。注意,Numpy(以及大多数其他库)中不存在字符串张量,因为张量存储在预先分配的连续内存段中,而字符串的长度是可变的,无法用这种方式存储。

pytorch的具体语法,后续继续补充

1.2.1.1 时间序列数据

以股票交易为例:每时每刻都存在交易,并且每时每刻对于不同的股票也都存在买入、卖出。那么我们可以借助3D张量进行表示:

202306041904592
  • 时间步长:可以假设是1分钟内进行交易
  • 特征:某一个股票进行的交易
  • 样本:不同的层可以表示是不同股票:茅台。。。。。
1.2.1.2 图像数据

一张彩色图片可以由3部分构成:高度、宽度、颜色深度(灰度图像只有一个颜色通道可以取消颜色深度),那么图片也是3D张量:

202306041905909

假设图片为彩色,大小为256x256。那么我们张量可以如此表示:(n, 256, 256, 3)。n:图片数目;3:彩色图片一般3种颜色(光的3原色)

三原色原理_百度百科 (baidu.com)

$$
\textcolor{red}{注意}\text{:PyTorch 模块要求张量排列为 C×H×W(分别表示通道、高度和宽度)而tensorflow则是:H×WxC}
$$

1.2.1.3 视频数据

视频是一帧一帧所构成的,也就是说我们看到的视频都是一张一张的图片,也就是说一个视频是一个4D张量(不同视频构成5D张量)

1.2.2 张量的运算

后续补充!

1、PyTorch是什么?_w3cschool

1.2.3 基于梯度优化

在此引用神经网络工作原理图:

202306041900967

在多层感知机模型中有3类常用的激活函数:Sigmoid、Relu、Tannh。假设卷积神经网络只有2层:$f(x)=f^{(1)}(f^{(2)}(x,w,b))$此处我们的$f^{(2)}$就是我们的激活函数,而$w,b$就是我们的权重。一开始,这些权重矩阵取较小的随机值,这一步叫作随机初始化,他们肯定不会得到任何有用的表示。虽然得到的表示是没有意义的,但这是一个起点。下一步则是根据反馈信号逐渐调节这些权重。这个逐渐调节的过程叫作训练,也就是机器学习中的学习。

上述过程发生在一个训练循环(training loop)内,其具体过程如下。必要时一直重复这些步骤。

  • (1) 抽取训练样本 x 和对应目标 y 组成的数据批量。
  • (2) 在 x 上运行网络[这一步叫作前向传播],得到预测值 y_pred。
  • (3) 计算网络在这批数据上的损失,用于衡量 y_pred 和 y 之间的距离。
  • (4) 更新网络的所有权重,使网络在这批数据上的损失略微下降

关于权重深度学习有何不同

先前的机器学习技术(浅层学习)仅包含将输入数据变换到一两个连续的表示空间,通常使用简单的变换,比如高维非线性投影(SVM)或决策树。但这些技术通常无法得到复杂问题所需要的精确表示。因此,人们必须竭尽全力让初始输入数据更适合用这些方法处理,也必须手动为数据设计好的表示层。这叫作特征工程,深度学习完全将这个步骤自动化。

上述步骤复杂在于更新权重!我们更新权重的目的:使得损失函数最小。我们使用得方法是:随机梯度下降:

  • (1) 抽取训练样本 x 和对应目标 y 组成的数据批量。
  • (2) 在 x 上运行网络,得到预测值 y_pred。
  • (3) 计算网络在这批数据上的损失,用于衡量 y_pred 和 y 之间的距离。
  • (4) 计算损失相对于网络参数的梯度[一次反向传播]。
  • (5) 将参数沿着梯度的反方向移动一点,比如 W -= step * gradient,从而使这批数据上的损失减小一点。

前向传播和反向传播:

  • 前向传播:输入提供的初始信息x,然后传播给每一层得隐藏单元,最终产出输出y
  • 反向传播:允许来自代价函数的信息通过网络向后流动,以便计算梯度

设存在模型:$\widehat{y}=wx+b$,设损失函数为:$J=\frac{1}{2}(y-\widehat{y})^2$。

前向传播:我们直接输入$x$最后返回y

反向传播:我们在初始化参数:$w,b$时候所得到$\widehat{y}$损失函数值比较大。那么根据梯度下降我们需要对$w,b$进行更新于是就有:梯度:$\nabla_{w}J =\dfrac{\partial J}{\partial \widehat{y}}\dfrac{\partial \widehat{y}}{\partial {w}}$,所以:$w=w-\epsilon\nabla_{w}J$,我们计算梯度的过程就是反向传播过程

二、机器学习补充

2.1 机器学习模型评估

机器学习的目的是得到可以泛化的模型,即在前所未见的数据上表现很好。在机器学习过程中我们经常需要对数据进行切分:划分训练集、测试集。

1
2
from sklearn.model_selection import train_test_split 
x_train, x_test, y_train, y_test= train_test_split(x,y,test_size=0.2) #选取20%的数据作为测试数据

切分有两种:

1、简单的留出验证(上述代码)

2、K 折验证

将数据划分为大小相同的 K 个分区。对于每个分区 i,在剩余的 K-1 个分区上训练模型,然后在分区 i 上评估模型。最终分数等于 K 个分数的平均值。

1680867838870

我们最终的目的是我们设计的模型在测试集上、训练集上的测试效果都满足我们的要求。在此过程中涉及两个问题:1、欠拟合:模型不能再训练集上或者足够低的误差;2、过拟合:训练误差和测试误差之间差距过大。

2.2 正则化

为了防止模型从训练数据中学到错误或无关紧要的模式,最优解决方法是获取更多的训练数据。模型的训练数据越多,泛化能力自然也越好。如果无法获取更多数据,次优解决方法是调节模型允许存储的信息量,或对模型允许存储的信息加以约束。如果一个网络只能记住几个模式,那么优化过程会迫使模型集中学习最重要的模式,这样更可能得到良好的泛化。这种降低过拟合的方法叫作正则化。

2.2.1 添加权重正则化

L2正则化:

$$
\widehat{J}(w,x,y)=J(w,x,y)+\frac{\alpha}{2}||w||^2
$$

L1正则化:

$$
\widehat{J}(w,x,y)=J(w,x,y)+\alpha||w||
$$

上述函数:$J$:损失函数,$||w||$:我们添加正则化项。在此过程中我们只对权重做惩罚而不对偏置做惩罚。

2.3 机器学习流程

1、定义问题,收集数据集

2、选择衡量成功的指标

选择合适评价指标:RMSE、准确率、召回率等

3、确定评估方法

验证集、K折交叉验证等

4、准备数据

5、建立模型并优化

正则化、调节超参数

三、推荐文献

1、LECUN Y, BENGIO Y, HINTON G. Deep learning[J/OL]. Nature, 2015, 521(7553): 436-444. https://doi.org/10.1038/nature14539.

2、RUMELHART D E, HINTON G E, WILLIAMS R J. Learning representations by back-propagating errors[J/OL]. Nature, 1986, 323(6088): 533-536. https://doi.org/10.1038/323533a0.