深度学习入门:基于 Python 的理论与实现笔记
在 VS Code 中运行代码
- 替换库搜索路径
# sys.path.append(os.pardir) # 为了导入父目录而进行的设定
sys.path.append(os.getcwd())
- 替换文件路径
# with open("sample_weight.pkl", 'rb') as f:
with open(os.getcwd()+"/ch03/sample_weight.pkl", 'rb') as f: # 注意需要带上子项目路径 ch03
一些数学知识
-
张量 tensor
- 0维 标量
- 1维 向量,如果是 2 个点,就是个坐标,可以从原点画个箭头到这个坐标,就是个方向
- 2维 矩阵
- 3维及以上 张量 tensor
-
线性空间:由直线分割而成的空间
-
非线性空间:曲线分割而成的空间
-
线性函数:一条直线,或一个面,满足如下特性:
f(x)=kx+bf(x1+x2)=f(x1)+f(x2)f(kx)=kf(x)\begin{align} \tag{线性函数}f(x) &= kx + b \\ \tag{特性1}f(x_1 + x_2) &= f(x_1) + f(x_2) \\ \tag{特性2}f(kx) &= kf(x) \end{align}f(x)f(x1+x2)f(kx)=kx+b=f(x1)+f(x2)=kf(x)(线性函数)(特性1)(特性2) -
收敛:最终会趋近某个数值
-
线性回归:利用数理统计中的回归分析,来确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法之一
-
拟合:拟合就是把平面上一系列的点,用一条光滑的曲线连接起来
-
导数:表示函数的增长率,曲线的斜率(切线),某个瞬间的变化量
- d = differential 微分
- df(x)/dx = dy/dx:无穷小量函数与无穷小量自变量之比,亦即微商(导数)
df(x)dx=limh→0f(x+h)−f(x)h(4.4)\tag{4.4} \frac {df(x)} {dx} = \lim\limits_{h \rarr 0} \frac {f(x+h) - f(x)} {h}dxdf(x)=h→0limhf(x+h)−f(x)(4.4)
-
离散:输入不是连续的点
-
非离散:定义域是连续集合的函数称为非离散函数。其函数图像是连续的曲线或曲面
-
阶跃函数:指一旦输入超过阈值,就切换输出的函数,它的图形值呈阶梯式变化
- 导数在绝大多数地方(除了0以外的地方)均为0,会抹去微小参数的变化
-
sigmoid 函数(如下公式 3.6):e 是纳皮尔常数 2.7182 …
- 导数在任何地方都不为 0
h(x)=11+e−x(3.6)\tag{3.6} h(x) = \frac 1 {1 + e^{-x}}h(x)=1+e−x1(3.6)
- 导数在任何地方都不为 0
-
ReLU 函数(如下公式 3.7):在输入大于 0 时,直接输出该值;在输入小于等于 0 时,输出 0
h(x)={x(x>0)0(x⩽0)(3.7)\tag{3.7} h(x) = \begin{cases} x &\text (x > 0) \\ 0 &\text (x \leqslant 0) \end{cases}h(x)={x0(x>0)(x⩽0)(3.7) -
dot 点积:矩阵的乘积,可以通过一次运算就计算出结果,如果不使用np.dot,就必须单独计算Y 的每一个元素(或者说必须使用 for 语句),非常麻烦
-
分类问题:是数据属于哪一个类别的问题
- 预测一个离散类别,通常是多个类别输出
- 分类的目的是寻找决策边界,用于对数据集中的数据进行分类
- 分类的结果很明确,分类正确即为对,分类错误即为错,没有逼近,最终结果只有一个。
-
回归问题:是根据某个输入预测一个(连续的) 数值的问题
- 估计一个连续值,是单连续数值输出
- 回归的目的是通过回归算法得到一个最优拟合线,这个线可以最好的接近数据集中的各个点
- 回归是对真实值的一种逼近预测,当预测值与真实值相近时,误差较小时,认为这是一个好的回归
-
逼近理论:是将如何将一函数用较简单的函数来找到最佳逼近,且所产生的误差可以有量化的表征
-
高斯分布:正态分布(Normal distribution)
-
求导链式法则(chain rule):
y=f(g(x))y′=f′(g(x))∗g′(x)\begin{align} \tag{原函数}y &= f(g(x)) \\ \tag{链式求导}y' &= f'(g(x)) * g'(x) \end{align}yy′=f(g(x))=f′(g(x))∗g′(x)(原函数)(链式求导) -
矩阵求导:与标量四则运算求导一致
-
范数(norm):是具有“长度”概念的函数,用来度量向量的大小
- 几何意义:衡量到原点的距离
- L0范数:非0元素个数
- L1范数:绝对值之和
- L2范数:绝对值平方和开方
- L∞范数/MAX范数:最大绝对值
- Lp范数:绝对值p次方和开方
一些 Python 知识
- python pickle:序列化功能
- python
*位置参数的解包语法
x = (1, 2, 3) # 元组:(1, 2, 3)
def func(a, b, c):
print(a, b, c) # 打印:1 2 3
func(*x) # 解单个变量 x 为3个变量 a=1 b=2 c=3 然后再将 a b c 按顺序传入函数
- python
/在函数定义中来明确指定/之前的参数都是位置参数,不能按k=v传递参数/前的参数不能使用k=v传递/后的参数可以但不强制使用k=v传递
- python 可变参数语法:1个
*表示接收转成元组参数,2个*表示接收转成字典参数
# 可变参数:
# 必须先 a, b, c
# 后 *args:元组类型
# 最后 **kwargs:字典类型
def func(a, b, c, /, *args, **kwargs):
print(a, b, c) # 打印:1 2 3
print(args) # 打印:(4, 5, 6)
print(kwargs) # 打印:{'x': 7, 'y': 8, 'z': 9}
func(1, 2, 3, # a, b, c
4, 5, 6, # args
x=7, y=8, z=9) # kwargs
- python 2个斜杆
//:整除语法、地板除(Floor Division)运算符
print(7 // 2) # 3
print(8 // 3) # 2
print(-7 // 2) # -4
print(-8 // 3) # -3
- python 数组 [start:stop:step]
一些 NumPy 知识
- NumPy 中存在使用 for 语句后处理变慢的缺点(NumPy 中,访问元素时最好不要用 for 语句
- 多维数组访问
x[0, 0] = x[0][0]
import numpy as np
x = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(x[0, 1]) # 打印 2
print(x[0][1]) # 打印 2
- 冒号访问数组
[:, :, 1],选择第2维度的所有下标索引为1的元素
import numpy as np
x = np.array([ [1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(x[:, 1]) # 打印 [2 5 8]
- np.random.choice(60000,10):从 60000 个数据中随机选择 10 个
- np.meshgrid 输入多个独立维度空间坐标数组,输出所有可能组合的空间坐标向量的矩阵
- 输出比如第1个是 x 的坐标值 [1,2,3],第2个是 y 第坐标值 [4,5]
- 输出[array([[1, 2, 3],
- [1, 2, 3]]),
- array([[4, 4, 4],
- [5, 5, 5]])]
- 2个矩阵,第1个矩阵对应的下标值和第2个矩阵对应的下标值组合起来就是空间坐标向量
- {1, 4} {2, 4} {3, 4}
- {1, 5} {2, 5} {3, 5}
- np.random.randn:返回一个正态分布样本的多维数组
层次结构
- 整体结构:输入层、中间层(隐藏层)、输出层
- 神经网络包含:全连接层(fully-connected):Affine 层、ReLU 层、Softmax-with-Loss 层
- 卷积神经网络包含:卷积层(Convolution 层)、池化层(Pooling 层)、全连接层(fully-connected)
- 深度学习:是加深了层的深度神经网络
- 正规化层(Norm 层):输入、输出时
- 局部正规化的LRN(Local Response Normalization)层:输入、输出时
- Softmax-with-Loss 层:softmax 层 + 交叉熵误差称为Cross Entropy Error 层
- 子采样层(subsampling):在池化层(Pooling 层)
第2章
-
逻辑电路:
- θ:阈值参数
- r = (w1x1, w2x2) = w1x1 + w2x2
- w1、w2:权重参数,控制输入信号的重要性
- x1、x2:输入
- y = 1 if r > θ else 0
- 另一种形式:
- y = 1 if (r - θ > 0) else 0
- 令 b = -θ(b:偏置,调整神经元被激活的容易程度(输出信号为 1 的程度)的参数):
- y = 1 if (r + b > 0) else 0
- 根据上下文,有时也会将 b、w1、w2 这些参数统称为权重
- 以上可以实现:与门、与非门、或门,但无法实现异或门
-
感知机:决定参数的并不是计算机,而是我们人
- 感知机的局限性就在于它只能表示由一条直线分割的空间
-
机器学习:决定参数值的工作交由计算机自动进行
-
单层感知机无法表示异或门,即单层感知机无法分离非线性空间
AND 都是 1 // 单层感知机
NAND 存在 0 // 单层感知机
OR 存在 1 // 单层感知机
XOR 存在 1 和 0 = AND( NAND , OR ) // 多层感知机
-
加法器的实现:https://zhuanlan.zhihu.com/p/552064099
-
单层感知机只能表示线性空间,而多层感知机可以表示非线性空间
-
多层感知机必须非线性函数的才有意义
第3章
-
神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数
-
中间层 = 隐藏层
-
激活函数 h(x):y=h(b+w1x1+w2x2)y = h(b + w_1x_1 + w_2x_2)y=h(b+w1x1+w2x2),是连接感知机和神经网络的桥梁
-
神经元 = 节点
-
朴素感知机是指单层网络,激活函数使用了阶跃函数 A 的模型
-
多层感知机”是指神经网络,即使用 sigmoid 函数(后述)等平滑的激活函数的多层网络
-
这样对应的表示法:
- w(1) 1> 2
- a(1) 1>
-
输出层所用的激活函数:输出层的激活函数用 σ() 表示读作 sigma
- 回归问题可以使用恒等函数
- 二元分类问题可以使用 sigmoid 函数
- 多元分类问题可以使用 softmax 函数
-
神经网络的实现惯例,只把权重记为大写字母 W1
-
神经网络计算:
- forward:前向处理,从输入到输出
- backward:从输出到输入方向
-
矩阵乘法的方式:第一个行 * 第二个列是为数据准备的书写方便
[W1-1, W1-2, W1-3] 这是 x1 的权重
[x1, x2, x3, ...] * [W2-1, W2-2, W2-3] 这是 x2 的权重
[W3-1, W3-2, W3-3] 这是 x3 的权重
...
+ [B1, B2, B3]
得到 Z1 [Z1-1, Z1-2, Z1-3]
然后可以继续按上面的方式准备数据
-
σ():恒等函数
-
softmax 函数(可以理解为概率),表示假设输出层共有 n 个神经元,计算第 k 个神经元的输出 yk
- 计算可以对每个 a 减去最大的 a,这样避免数据过大导致的溢出
- 输出值的总和是 1
- 输出总和为 1 是 softmax 函数的一个重要性质。正因为有了这个性质,我们才可以把 softmax 函数的输出解释为“概率”
- e^n:单调递增
- 所以 softmax 对输出值最大的神经元的位置也不会变
yk=eak∑i=1neai(3.10)\tag{3.10}y_k= \frac {e^{a_k}} {\displaystyle\sum_{i=1}^ne^{a_i}}yk=i=1∑neaieak(3.10)
- 所以 softmax 对输出值最大的神经元的位置也不会变
-
一般而言,神经网络只把输出值最大的神经元所对应的类别作为识别结果,故输出层的 softmax 函数可以省略,且另一方面可以减少计算机运算量
-
求解机器学习问题的步骤
- 学习阶段(训练阶段):进行模型的学习,指使用训练数据、自动调整参数的过程
- 推理阶段:用学到的模型对未知的数据进行推理(分类)
-
图像的通道:描述一个像素点,如果是灰度图,只须用一个数值来表示,就是单通道。如果一个像素点有RGB三种颜色来描述,就是三通道,如果用RGB+alpha来描述,就是4通道
-
正规化(normalization):把数据限定到某个范围内的处理,如将图像的各个像素值除以 255,使得数据的值在 0.0~1.0 的范围内
-
预处理(pre-processing):对神经网络的输入数据进行某种既定的转换
-
数据白化(whitening):将数据整体的分布形状均匀化的方法
-
批处理更高效:大多数处理数值计算的库都进行了能够高效处理大型数组运算的最优化。并且, 在神经网络的运算中,当数据传送成为瓶颈时,批处理可以减轻数据总线的负荷(严格地讲,相对于数据读入,可以将更多的时间用在计算上)
第4章
-
损失函数
-
利用了函数斜率的梯度法
-
神经网络:可以由数据自动决定权重参数的值
-
线性可分问题,第 2 章的感知机是可以利用数据自动学习的。 根据“感知机收敛定理”,通过有限次数的学习,线性可分问题是可解的
-
非线性可分问题则无法通过(自动)学习来解决
-
特征量
-
深度学习有时也称为端到端机器学习(end-to-end machine learning):从原始数据(输入)中获得目标结果(输出)的意思
-
训练数据 = 监督数据
-
过拟合(over fitting):只对某个数据集过度拟合的状态
- 虽然训练数据中的数字图像能被正确辨别,但是不在训练数据中的数字图像却无法被识别的现象
- 发生的原因:
- 模型拥有大量参数、表现力强
- 训练数据少
-
损失函数(loss function):当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致
- 一般用均方误差和交叉熵误差
-
均方误差:如下公式 4.1
- yk 是表示神经网络的输出
- tk 表示监督数据
- k 表示数据的维数
- 单调递减
E=12∑k(yk−tk)2(4.1)\tag{4.1} E = \frac 1 2 \sum_{k} (y_k - t_k)^2E=21k∑(yk−tk)2(4.1)
-
交叉熵误差:如下公式 4.2
- log 以 e 为底数的自然对数(log e)
- tk 正确解标签,必须是 one-hot 表示,只有一个 1,其它都为 0,所以由正确的那个值决定
- yk 神经网络的输出
- 单调递减
E=−∑ktk logyk(4.2)\tag{4.2} E = - \sum_{k} t_k \space \log y_kE=−k∑tk logyk(4.2)
-
one-hot 表示:bit 位,只有一个是1,其它都为 0
-
mini-batch 学习:小批量学习,神经网络的学习也是从训练数据中选出一批数据,然后对每个 mini-batch 进行学习
-
使用损失函数做为指标的原因:
- 不能用识别精度作为指标,是因为这样一来绝大多数地方的导数都会变为 0,导致权重参数无法更新
- 如果调整参数则结果是不连续、离散的,可能会抹去微小参数的变化
- 为了找到使损失函数的值尽可能小的地方
- 如果调整参数则结果是连续、非离散的,可以体现微小参数的变化
- 需要计算参数的导数(确切地讲是梯度)(对该权重参数的损失函数求导)
- 然后以这个导数为指引, 逐步更新参数的值
- 导数为负:权重参数向正方向改变,可以减小损失函数的值
- 导数为正:权重参数向负方向改变,可以减小损失函数的值
- 导数为0:无论权重参数向哪个方向变化,损失函数的值都不会改变,此时该权重参数的更新会停在此处
- 不能用识别精度作为指标,是因为这样一来绝大多数地方的导数都会变为 0,导致权重参数无法更新
-
解析性求解、解析性求导:
- 真的导数
- 基于数学式的推导求导数的过程
-
数值微分(数值梯度):numerical differentiation
- 近似切线
- 所谓数值微分就是用数值方法近似求解函数的导数的过程
- 利用微小的差分求导数的过程
df(x)dx=limh→0f(x+h)−f(x)h(4.4)\tag{4.4} \frac {df(x)} {dx} = \lim\limits_{h \rarr 0} \frac {f(x+h) - f(x)} {h}dxdf(x)=h→0limhf(x+h)−f(x)(4.4)
-
中心差分:x+h 和 x-h
-
前后差分:x+h 和 x
-
偏导数:有多个变量的函数的导数
- f(x0,x1)=x02+x12f(x_0, x_1) = x_0{^2} + x_1{^2}f(x0,x1)=x02+x12 的偏导数:∂f/∂x0,∂f/∂x1\partial f/\partial x_0,\partial f/ \partial x_1∂f/∂x0,∂f/∂x1
- 就是它关于其中一个变量的导数而保持其他变量恒定(相对于全导数,在其中所有变量都允许变化)
-
梯度(gradient):由全部变量的偏导数汇总而成的向量(坐标)
- 如 f(x1,x2)=32x12+2x22f(x_1,x_2)=\frac 3 2 x_1{^2} + 2 x_2{^2}f(x1,x2)=23x12+2x22 的梯度{3∗x1,4∗x23*x_1, 4*x_23∗x1,4∗x2}
- 如果 x1=x2=1x_1=x_2=1x1=x2=1,则梯度为{3, 4}(可以理解为增量,箭头大小为 sq(32+42)=5sq(3^2+4^2)=5sq(32+42)=5就是 x增加1,y增加1就前进多少步)
- 1、基于数值微分计算参数的梯度
- 2、基于误差反向传播法计算参数的梯度(更高速)
-
负梯度:负梯度方向是梯度法中变量的更新方向
- 梯度指向原点坐标
-
梯度指示的方向是各点处的函数值减小最多的方向
-
方向导数=cos(θ) × 梯度(θ是方向导数的方向与梯度方向的夹角)。因此,所有的下降方向中,梯度方向下降最多
-
梯度法(gradient method):通过巧妙地使用梯度来寻找函数最小值 (或者尽可能小的值)的方法
- 函数的取值从当前位置沿着梯度方向前进一定距离,然后在新的地方重新求梯度,再沿着新梯度方向前进, 如此反复,不断地沿梯度方向前进,通过不断地- 沿梯度方向前进, 逐渐减小函数值
- 是解决机器学习中最优化问题的常用方法,特别是在神经网络的学习中经常被使用
- 在复杂的函数中,梯度指示的方向基本上都不是函数值最小处
- 公式:x0=x0−η∗x0x_0=x_0-η*x_0x0=x0−η∗x0的偏导数
- x1=x1−η∗x1x_1=x_1-η*x_1x1=x1−η∗x1的偏导数
- η:更新量、学习率(learning rate),决定在一次学习中,应该学习多少,以及在多大程度上更新参数,比如 0.01 或 0.001,一边改变学习率- 的值,一边确认学习是否正确进行了
-
超参数(hyper-parameter):各层的神经元数量、batch 大小、参数更新时的学习率或权值衰减等
-
学习率:像学习率这样的参数称为超参数,需要人工设定的
- 一般来说,超参数需要尝试多个值,以便找到一种可以使学习顺利进行的设定
-
函数的极小值(梯度为0):局部最小值,也就是限定在某个范围内的最小值
-
函数的最小值(梯度为0):
-
鞍点(saddle point)(梯度为0):是从某个方向上看是极大值,从另一个方向上看则是极小值的点
-
梯度为 0 不一定是极小值
-
学习高原:当函数很复杂且呈扁平状时,学习可能会进入一个(几乎)平坦的地区, 陷入被称为“学习高原”的无法前进的停滞期
-
梯度下降法(gradient descent method):寻找最小值的梯度法
- 神经网络(深度学习)一般使用,因为要使损失函数结果最小
-
梯度上升法(gradient ascent method):寻找最大值的梯度法
-
神经网络的梯度:∂L∂W=偏导数集合=(∂L∂w11∂L∂w12∂L∂w13∂L∂w21∂L∂w22∂L∂w23)\frac {\partial L} {\partial W} = 偏导数集合 = (\frac {\partial L}{\partial w_{11}} \frac {\partial L}{\partial w_{12} }\frac {\partial L}{\partial w_{13} }\frac {\partial L}{\partial w_{21} }\frac {\partial L}{\partial w_{22} }\frac {\partial L}{\partial w_{23}})∂W∂L=偏导数集合=(∂w11∂L∂w12∂L∂w13∂L∂w21∂L∂w22∂L∂w23∂L)
- W 权重 = (w11 w12 w13 w21 w22 w23)(w_{11} \space w_{12} \space w_{13} \space w_{21} \space w_{22} \space w_{23})(w11 w12 w13 w21 w22 w23)
- L 损失函数
-
随机梯度下降法(stochastic gradient descent)简称SGD:这个方法通过梯度下降法更新参数,不过因为这里使用的数据是随机选择的mini batch数据
- 对随机选择的数据进行的梯度下降法
- SGD 的函数
-
epoch:是一个单位。一个 epoch 表示学习中所有训练数据均被使用过一次时的更新次数。
- 比如,对于 10000 笔训练数据,用大小为 100 笔数据的 mini-batch 进行学习时,重复随机梯度下降法 100 次,所有的训练数据就都被“看过”了 A。此时,100 次就是一个 epoch
第5章
-
误差反向传播法BP(error BackPropagation):解析性地求解数学式的方法,即通过已确认的公式反向求梯度,这样更快
- 实现很复杂,容易出错,所以,经常会比较数值微分的结果和误差反向传播法的结果,以确认误差反向传播法的实现是否正确
-
计算图(computational graph):
-
正向传播(forward propagation):“从左向右进行计算”是一种正方向上的传播
-
反向传播(backward propagation):“从右向左进行计算”是一种反方向上的传播
- 传递“局部导数”
- 计算顺序:将信号 E 乘以节点的局部导数 E∂y/∂x,然后将结果传递给下一个节点
- 加法:只是将上游的值传给下游
- 乘法:乘以输入信号的翻转值,传播时的输入信号值
-
局部计算:无论全局发生了什么, 都能只根据与自己相关的信息输出接下来的结果
- 虽然局部计算非常简单,但是通过传递它的计算结果,可以获得全局的复杂计算的结果
-
复合函数的导数:如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示
-
梯度确认(gradient check):确认数值微分求出的梯度结果和误差反向传播法求出的结果是否一致(严格地讲,是非常相近)的操作
-
142页 5.10 公式:
y=1x(原函数)\tag{原函数}y=\frac 1 xy=x1(原函数) ∂y∂x=−1x2=−y2\tag{5.10}\begin{equation}\begin{split}\frac {∂y} {∂x}&=-\frac {1} {x^2}\\&=-y^2\end{split}\end{equation}∂x∂y=−x21=−y2(5.10)
解:由原函数平方得 y2=1x2y^2=\frac 1 {x^2}y2=x21
两边乘 -1 则 −y2=−1x2-y^2=-\frac 1 {x^2}−y2=−x21 -
仿射变换:几何中,仿射变换包括一次线性变换和一次平移,分别对应神经网络的加权和运算与加偏置运算
-
Affine 层:将进行仿射变换的处理实现(矩阵)
-
T:矩阵转置,元素 (i, j) 换成元素 (j, i)
-
矩阵为对象的反向传播:需要把矩阵转置后才能运算,同时需要注意保持顺序一致
- 偏置矩阵需要对(N0, N1)矩阵变成(N1, )矩阵,即对原矩阵求和
-
神经网络:
- 学习阶段:需要 Softmax 层
- 推理(inference)阶段:通常不需要 Softmax 层
-
Softmax-with-Loss层:Softmax 函数和交叉熵误差(cross entropy error)
-
神经网络学习中的重要性质:神经网络的反向传播会把这个差分表示的误差传递给前面的层
-
请注意反向传播时,将要传播的值除以批的大小(batch_size)后,传递给前面的层的是单个数据的误差
-
ReLU 层、Softmax-with-Loss 层、Affine 层、Softmax 层:实现了 forward 和 backward 方法,通过将数据正向和反向地传播,可以高效地计算权重参数的梯度
第6章
- 最优化(optimization):寻找最优参数的问题的过程
- 随机梯度下降法(stochastic gradient descent)简称SGD:适合函数的形状均向,梯度指向同一位置,即X小幅度移动不会导致Y结果大幅度变化
- Momentum(动量)SGD:小球在斜面上滚动,可以列个v-w表格看出 w 变化规律:(近似 w - n∂L/∂W - n∂L/∂W - n∂L/∂W …)
- 适合函数的形状非均向(anisotropic),梯度的方向并没有指向最小值的方向,即X小幅度移动会导致Y结果大幅度变化
- 初始一个速度 v,第二个偏导数如果是正数,v-,第三个如果偏导数如果是负数,v-+,这样就抵消了部分速度
- AdaGrad(Adaptive Grad):会为参数的每个元素适当地调整学习率,与此同时进行学习
- 学习率衰减(learning rate decay):即随着学习的进行,使学习率逐渐减小
- W - 偏导数/偏导数的平方和累加开根号,这样可以控制参数的元素中变动较大(被大幅更新)的元素的学习率将变小
- 缺点:实际上,如果无止境地学习,更新量就会变为 0, 完全不再更新,为了改善这个问题,可以使用 RMSProp 方法
- RMSProp 方法:并不是将过去所有的梯度一视同仁地相加,而是逐渐地遗忘过去的梯度,在做加法运算时将新梯度的信息更多地反映出来
- 指数移动平均:呈指数函数式地减小过去的梯度的尺度
- Adam
- Momentum(动量)SGD + AdaGrad(Adaptive Grad)
- Adam会设置3个超参数。一个是学习率(论文中以α出现),另外两个是一次momentum系数β1和二次momentum系数β2。根据论文,标准的设定值是β1为0.9,β2为0.999。设置了这些值后,大多数情况下都能顺利运行
- 函数的形状非均向(anisotropic):比如呈延伸状
- 权值衰减(weight decay):抑制过拟合、提高泛化能力
- 将权重初始值设为 0 的话/不能将权重初始值设成一样的值,将无法正确进行学习:因为在误差反向传播法中,所有的权重值都会进行相同的更新
- 为了防止“权重均一化” (严格地讲,是为了瓦解权重的对称结构),必须随机生成初始值
- 梯度消失(gradient vanishing):权重初始为1的正态分布,偏向 0 和 1 的数据分布会造成反向传播中梯度的值不断变小,最后消失,导致无法根据梯度学习
- 表现力受限:权重初始为0.01的正态分布,如果 100 个神经元都输出几乎相同的值,那么也可以由 1 个神经元来表达基本相同的事情
- 会导致学习可能无法顺利进行
- Xavier 初始值:如果前一层的节点数为 n,则初始值使用标准差为 sqrt(1/n) 或 1/sqrt(n) 的分布
- 适合激活函数是sigmoid 函数和 tanh 函数等 S 型曲线函数左右对称
- He初始值:当前一层的节点数为 n 时,He 初始值使用标准差为 sqrt(2/n) 的高斯分布
- 因为 ReLU 的负值区域的值为 0,为了使它更有广度,所以需要 2 倍的系数
- 激活函数使用 ReLU 时
- Batch Normalization:
- Batch Norm层:对数据分布进行正规化的层
- 正则化项:L2 范数、L1 范数、L∞范数都可以用作正则化项
- 权值衰减:通过在学习的过程中对大的权重进行惩罚,来抑制过拟合
- 这里使用 L2范数:损失函数+1/λW^2,使用1/2是因为:求导结果变成 λW 的调整用常量
- λ 设置得越大,对大的权重施加的惩罚就越重
- 缺点:如果网络的模型变得很复杂,只用权值衰减就难以应对了
- Dropout:是一种在学习的过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除
- 通过在学习过程中随机删除神经元,从而每一次都让不同的模型进行学习
- 即便是表现力强的网络,也可以抑制过拟合
- 集成学习:就是让多个模型单独进行学习,推理时再取多个模型的输出的平均值
- 验证数据(validation data):调整超参数时,必须使用超参数专用的确认数据
- 不能使用测试数据评估超参数的性能
- 3个数据的关系:
- 训练数据:用于参数(权重和偏置)的学习
- 验证数据:用于超参数的性能评估。
- 测试数据:为了确认泛化能力,要在最后使用(比较理想的是只用一次) 测试数据
- 超参数的最优化:通过识别精度的评估
- 贝叶斯最优化(Bayesian optimization)
第7章
-
卷积神经网络(Convolutional Neural Network,CNN)
-
卷积层(Convolution 层):不会忽视形状
- 滤波器的通道数(C, FH, FW)必须和输入数据(N, C, H, W)的通道数一致(batch_num,channel, height, width)
- 滤波器是正方形的 H=W
- 只有1个滤波器:输出数据固定是 1 通道(N, 1, H, W):是 1 张特征图
- 有 FN 个滤波器:输出数据是 FN 通道(N, FN, H, W):是 FN 张特征图(这里用 FN,N 专门表示 mini-batch 的数量)
- 编程时多个滤波器变量的写法:滤波器的权重数据要按 (output_channel, input_ channel, height, width)的顺序书写
- 偏置:每个通道只有一个偏置,偏置的形状是 (FN, 1, 1)
- 在进行卷积层的反向传播时,必须进行 im2col 的逆处理(col2im)
- 滤波器的通道数(C, FH, FW)必须和输入数据(N, C, H, W)的通道数一致(batch_num,channel, height, width)
-
池化层(Pooling 层)
- 池化是缩小高、长方向上的空间的运算
- 一般来说,池化的窗口大小会和步幅设定成相同的值
- 池化层没有要学习的参数,就是个 NxN 的格子,池化只是从目标区域中取最大值(或者平均值),所以不存在要学习的参数
- 输入数据和输出数据的通道数不会发生变化
- 对微小的位置变化具有鲁棒性(健壮):输入数据发生微小偏差时,池化仍会返回相同的结果
- Max 池化:是获取最大值的运算,在图像识别领域,主要使用 Max 池化
- Average 池化:计算目标区域的平均值
-
全连接(fully-connected):神经网络中,相邻层的所有神经元之间都有连接,用 Affine 层实现
-
神经网络:输入 -> Affine -> ReLU/Sigmoid -> … -> Affine -> Softmax
-
卷积神经网络:输入 -> Conv -> ReLU/Sigmoid -> Pooling -> … -> Conv -> ReLU/Sigmoid -> 输入到神经网络
- (Pooling层有时会被省略)
-
全连接层(Affine 层):相邻层的神经元全部连接在一起,输出的数量可以任意决定
- 数据的形状被“忽视”,需要将图形 3 维数据拉平为 1 维数据
-
特征图(feature map):将卷积层的输入输出数据
-
输入特征图(input feature map):卷积层的输入数据
-
输出特征图(output feature map):卷积层的输出数据
-
卷积运算:卷积层进行的处理,卷积运算相当于图像处理中的“滤波器(Filter)运算”
- 对于输入数据,卷积运算以一定间隔滑动滤波器的窗口并应用
- 乘积累加运算:(从左到右,从上到下)将各个位置上滤波器的元素和输入的对应元素相乘,然后再求和,然后,将这个结果保存到输出的对应位置。将这个过程在所有位置都进行一遍,就可以得到卷积运算的输出
- 滤波器的参数就对应之前的权重
- 偏置通常只有 1 个:这个值会被加到应用了滤波器的所有元素上
-
填充(padding):在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如 0 等)
- 使用填充主要是为了调整输出的大小,避免在某个时刻输出大小就有可能变为 1,导致无法再应用卷积运算
- 因此,卷积运算就可以在保持空间大小不变的情况下将数据传给下一层
- 增大填充后,输出大小会变大
-
幅度为 1 的填充:指用幅度为 1 像素的 0 填充周围
-
步幅(stride):应用滤波器的位置间隔,每次跳几个格子(从左到右、从上到下都要一样步幅)
- 增大步幅后,输出大小会变小
-
必须保证输出的 OH、OW 都可以除尽,不能有小数
-
实际的卷积运算中,滤波器的应用区域几乎都是重叠的
-
im2col(image to column):从图像到矩阵
- 使用 im2col 的实现存在比普通的实现消耗更多内存的缺点
- 通过归结到矩阵计算上,可以有效地利用线性代数库
-
卷积层和池化层是图像识别中必备的模块
-
训练后得出的滤波器(权重参数)可以转换为图像,从而可视化各个卷积层滤波器(权重参数)
- 含有块状区域(称为 blob)的滤波器等
- 卷积层的滤波器会提取边缘或斑块等原始信息。而刚才实现的 CNN 会将这些原始信息传递给后面的层
- 随着层次加深,提取的信息也愈加复杂、抽象、高级
- 随着层次加深,神经元从简单的形状向“高级”信息变化
-
CNN 代表性网络结构:
- (1998年提出)CNN 元祖 LeNet:有连续的卷积层和池化层(正确地讲,是只“抽选元素”的子采样层),最后经全连接层输出结果
- 激活函数:sigmoid 函数,当今 CNN 网络普遍使用 ReLU 函数
- 池化层:子采样(subsampling),当今 CNN 网络普遍使用 MAX 池
- (LeNet 问世20多年后提出)AlexNet:叠有多个卷积层和池化层,最后经由全连接层输出结果
- 激活函数使用ReLU
- 使用进行局部正规化的LRN(Local Response Normalization)层
- 使用Dropout
- (1998年提出)CNN 元祖 LeNet:有连续的卷积层和池化层(正确地讲,是只“抽选元素”的子采样层),最后经全连接层输出结果
第8章
- 深度学习:是加深了层的深度神经网络
- Data Augmentation:基于算法“人为地”扩充输入图像(训练图像)
- 感受野(receptive field):给神经元施加变化的某个局部空间区域
- 加深层:层越深,识别性能也越高
- 一个好处就是可以减少网络的参数数量
- 一次 5 × 5 滤波器的卷积运算的区域可以由两次 3 × 3 滤波器的卷积运算抵充,从5x5=25个参数减少到了3x3x2=18个参数
- 叠加小型滤波器来加深网络的好处是可以减少参数的数量,扩大感受野
- 通过叠加层,将 ReLU 等激活函数夹在卷积层的中间,进一步提高了网络的表现力
- 这是因为向网络添加了基于激活函数的“非线性” 表现力,通过非线性函数的叠加,可以表现更加复杂的东西
- 使学习更加高效
- 可以减少学习数据,从而高效地进行学习
- 一个好处就是可以减少网络的参数数量
- VGG网络:它的特点在于将有权重的层(卷积层或者全连接层)叠加至 16 层(或者 19 层)
- 结构简单,应用性强
- GoogLeNet网络:GoogLeNet 的特征是,网络不仅在纵向上有深度,在横向上也有深度(广度)
- GoogLeNet 在横向上有“宽度”,这称为“Inception 结构”:使用了多个大小不同的滤波器(和池化), 最后再合并它们的结果
- 1 × 1 的滤波器的卷积层:通道 C 是一样的,但是滤波器个数 FN 可能比较小,这样相当于通过在输出数据通道方向上减小大小,有助于减少参数和实现高速化处理
- ResNet网络:以VGG 网络为基础,导入了“快捷结构”(也称为“捷径”或“小路”)
- 就可以随着层的加深而不断提高性能了(当然,层的加深也是有限度的),原因:通过快捷结构,反向传播时信号可以无衰减地传递,之前因为加深层而导致的梯度变小的梯度消失问题就有望得到缓解
- 迁移学习:将学习完的权重(的一部分)复制到其他神经网络,进行再学习(fine tuning)
- 迁移学习在手头数据集较少时非常有效
- 正规化层(norm):
- 学习阶段、推理阶段卷积层中都会耗费大量时间
- 相比按小规模的单位进行计算,GPU 更擅长计算大规模的汇总好的数据
- 分布式学习:在多个 GPU 或者多台机器上进行分布式计算
- 神经网络的健壮性:即便输入图像附有一些小的噪声,输出结果也仍然保持不变
- 16 位的半精度浮点数(half float)
- 32 位单精度浮点数
- 64 位双精度浮点数
- SVM(支持向量机)
- 物体检测:R-CNN
- Selective Search的方法
- Faster R-CNN方法
- 图像分割:
- FCN(Fully Convolutional Network)全部由卷积层构成的网络的方法:通过一次 forward 处理,对所有像素进行分类
- 没有全连接层,全连接层使用卷积层代替了,空间容量可以保持原样直到最后的输出
- 基于双线性插值法:通过去卷积(逆卷积运算)来实现的
- FCN(Fully Convolutional Network)全部由卷积层构成的网络的方法:通过一次 forward 处理,对所有像素进行分类
- 图像标题的生成:
- NIC(Neural Image Caption)的模型:由深层的CNN和处理自然语言的RNN(Recurrent Neural Network)构成
- RNN(Recurrent Neural Network):是具有循环连接的网络, 经常被用于自然语言、时间序列数据等连续性的数据上
- R 表示 Recurrent(循环的)。这个循环指的是神经网络的循环的网络结构
- 多模态处理:组合图像和自然语言等多种信息进行的处理
- GAN(Generative Adversarial Network)生成对抗网络
- 无监督学习(unsupervised learning):不需要监督数据(标签数据)
- 强化学习(reinforcement learning)
- Deep Q-Network(通称 DQN)方法:基于被称为 Q 学习的强化学习算法
- 为了确定最合适的行动,需要确定一个被称为最优行动价值函数的函数
- Deep Q-Network(通称 DQN)方法:基于被称为 Q 学习的强化学习算法
1278

被折叠的 条评论
为什么被折叠?



