神经网络-B站-Notes
介绍
机器学习流程:
- 数据获取
- 特征工程
- 建立模型
- 评估与应用
深度学习极大地加快特征工程的完成.
特征工程的作用:
- 数据特征决定了模型的上限
- 预处理和特征提取是最核心的
- 算法与参数选择决定了如何逼近这个上限
将深度学习当作黑盒子来学习比较容易.
神经网络这个黑盒能够对输入进行 特征提取(各种特征), 从而让计算机认识, 计算机会选择哪些特征是最合适的.
因此深度学习解决的就是如何提取特征.
应用, 主要在计算机视觉和自然语言处理方面:
- 检测和识别, 如人脸, 车辆
深度学习的一个缺点: 计算量大. 因此在移动端的普及还比较缓慢.
深度学习在医学方面的应用: 基因组合, 癌细胞检测等.
- 换脸
- 分辨率重构
(有监督问题, 指有分类和标签的输入)
在数据规模较小时, 用 传统的人工智能算法 即可, 只有当数据规模极大时, 才考虑 深度学习 算法.
对于提高数据量 – 将输入数据, 如一张图片进行翻转等操作, 相当于得到另一个数据.
计算机视觉上的示例
在计算机中, 一张图片被表示成三维数组的形式, 每个像素被表示成三维数组的形式, 每个像素的值从 0 到 255. 数值越低表明其越暗, 越高则越亮.
注意 颜色通道 的概念. 如 RGB
表示 Red, Green, Blue 的 3 颜色通道.
如:
1 |
|
这里的 3 表示的就是 3 颜色通道.
计算机识别遇到的困难有:
- 部分遮蔽
- 背景混入
需解决这些问题, 还是需要数据量 (带标签).
机器学习常规套路
- 收集数据并给定标签
- 训练一个分类器
- 测试, 评估
K 近邻算法
计算流程:
- 计算已知类别数据集中的点与当前点的距离
- 按照距离一次排序
- 选取与当前点距离最小的 K 个点
- 确定前 K 个点所在类别的出现概率
- 返回前 K 个点出现频率最高的类别作为当前点预测分类
可自己利用的数据集
CIFAR-10
特点:
- 10 类标签
- 50000 个训练数据
- 10000 个测试数据
- 大小均为 32 * 32
2 得分函数
也就是一个 线性函数.
每一个特征都对应一个权重参数.
$$
\displaylines
{
\begin{aligned}
f(x,W) = Wx + b
\end{aligned}
}
$$
( x
指代像素点, W
指代权重参数, b
是偏置参数, 这里的 W
, x
, b
都是矩阵 )
权重参数和偏置参数:
- 权重参数起决定性因素
- 偏置参数起微调的作用
如上面的例子, 由于有 $32 \times 32 \times 3 = 3072$ 个像素点, 因此有 $3072$ 个权重参数, 也就是说:
$$
\displaylines
{
\begin{aligned}
W = 某矩阵 (1 \times 3072 的矩阵)
\end{aligned}
}
$$
而所有的像素点可以表示为:
$$
\displaylines
{
\begin{aligned}
x = 某矩阵 ( 3072 \times 1 的矩阵 )
\end{aligned}
}
$$
对于不同的类别, 可以得到不同的 W 矩阵, 如类别猫对应 $W_1$, 类别狗对应 $W_2$…
通过:
$$
\displaylines
{
\begin{aligned}
f(x,W) = W_n x + b
\end{aligned}
}
$$
来得到不同类别的得分:
权重参数中, 值比较大的位表示与其相乘的像素点对于这个特征比较重要. 且正值代表促进, 负值代表抑制.
权重参数矩阵如何得来
以这里举例.
先随机构造一个 $3 \times 4$ 的矩阵.
由于输入 (这里指图片) 是不变的, 可以通过优化 (调整) W 矩阵来使结果符合预期 (如这里应该判断为猫, 即猫的 score 应该最高)
而神经网络的周期 (迭代) 过程中, 就是不断优化 W 矩阵, 来满足对数据的判断.
决策边界
决策边界 , 大概就是判断输入属于什么类别的临界值.
W
对这个临界值起决定作用.
3 损失函数
如何定义损失函数, 会改变神经网络是做分类还是回归之类的.
损失函数相当于一个指导模型, 来告诉神经网络当前的得分是好是坏, 从而改进.
如:
(这里有各个类别对应的得分)
损失函数需要在得到一个结果后再对其进行评估.
损失函数的结果应该越低越好, 如:
$$
\displaylines
{
\begin{aligned}
L_i = \sum_{j \ne y_i} max(0, s_j - s_{y_i} + 1)
\end{aligned}
}
$$
( $L_i$ 就是 loss 值 )
$s_j$ 表示错误类别的得分.
$s_{y_i}$ 表示正确类别的得分.
$\sum$ 表示每个错误类型都需要计算.
$+1$ 表示容忍程度, 应该是可以变的. 这里表示损失函数只要小于 1 就能接受.
损失函数的值为 0 时表示没有损失.
可以看出, 损失函数是用来评估得分函数得到的结果.
需注意, 损失函数的值相同, 并不能代表两个模型一样
在训练网络模型的过程中, 最好是使模型趋于稳定, 如两个模型:
$$
\displaylines
{
\begin{aligned}
模型A:\omega_1 = [1,0,0,0] \newline~ \newline
模型B:\omega_2 = [0.25,0.25,0.25,0.25]
\end{aligned}
}
$$
这里的模型 B 就更稳定.
一般的损失函数的定义
1 |
|
这里的 “正则化惩罚项” 作用于数据中的 “变异项”, 用于削减 “变异项” 对数据拟合的影响:
$$
\displaylines
{
\begin{aligned}
L = \frac{1}{N} \sum_{i = 1}^N \sum_{j \ne y_i} max(0,f(x_i, W)_j - f(x_i, W)_{y_i} + 1) + \lambda R(W) \newline~ \newline
R(W) = \sum_k \sum_l W^2_{k,l}
\end{aligned}
}
$$
这里的 $\lambda R(W)$ 就是正则惩罚项. 其和数据没关系, 只和权重参数相关. $\lambda$ 是惩罚系数. $\lambda$ 比较大表明要 “杀死变异项”, 比较小则表明 “削弱变异项”.
4 向前传播整体流程
可以看出这是一个反馈模型.
如何将得分值转化成一u个概率值
用一个函数, 如:
$$
\displaylines
{
\begin{aligned}
g(z) = \frac{1}{1 + e^{-z}}
\end{aligned}
}
$$
这个函数的特点就是其值的范围是 $[0,1]$.
实际神经网络的分类
一个输入, 通过得分函数得到一个 scores, 将 scores 做放大处理 (放大差异), 最后进行归一化处理 (总概率唯一).
归一化指:
$$
\displaylines
{
\begin{aligned}
\frac{24.5}{24.5 + 164.0 + 0.18} = 0.13 \newline~ \newline
\frac{164.0}{24.5 + 164.0 + 0.18} = 0.87 \newline~ \newline
\frac{-1.7}{24.5 + 164.0 + 0.18} = 0.00 \newline~ \newline
\end{aligned}
}
$$
实际公式为:
$$
\displaylines
{
\begin{aligned}
P(Y = k | X = x_i) = \frac{e^s k}{e^s j}, s = f(x_i, W)
\end{aligned}
}
$$
( 分子分母中的 $e^s$ 就是放大的步骤 )
这里只需关心正确类别的概率值 (这里是 cat, 概率为 0.13)
通过这个概率来计算损失, 计算公式为:
$$
\displaylines
{
\begin{aligned}
L_i = -log P(Y=y_i | X = x_i) \newline~ \newline
L_i = -log(0.13) = 0.89
\end{aligned}
}
$$
回归任务, 用得分值计算损失.
分类任务, 用概率值计算损失.
神经网络分为两个模块:
- 前向传播, 数据输入, 得到损失
- 反向传播
5 反向传播
这里的 A, B, C 代表不同的改变得到不同的输入, 也就是不同的侧重点.
注意偏导的求法.
逐层, 按顺序, 从后往前.
定义
反向传播(Backpropagation)是一种用于训练神经网络的算法。它通过计算网络的输出误差,然后将误差反向传播回网络中的每个神经元,以更新它们的权重和偏置,从而提高网络的性能。
也就是说, 先通过正向传播得到一个 loss 值, 用这个 loss 值一个一个往回更新权重和偏置的值.
梯度下降算法
梯度下降算法是一种常用的优化算法,也是神经网络中最基本的优化算法之一。它的作用是通过计算损失函数关于权重和偏置的梯度,来更新网络的参数,从而使损失函数最小化。
在神经网络中,我们通常使用反向传播算法来计算损失函数关于权重和偏置的梯度。然后,通过梯度下降算法来更新权重和偏置,从而最小化损失函数。
梯度
梯度是一个向量,它表示某个多元函数在某一点的变化率。在数学上,梯度是一个向量,其方向指向函数值增加最快的方向,大小表示函数值增加的速率
当提到让网络学习, 实质上就是让代价函数的值最小.
梯度的另一个理解, 如一个函数的梯度为:
$$
\displaylines
{
\begin{aligned}
\begin{bmatrix}
3 \
1
\end{bmatrix}
\end{aligned}
}
$$
可以理解为沿向量 $(3,1)$ 方向函数增加得最快, 也可以理解为函数的第一个参数的重要性是第二个参数的 3 倍.
这里用梯度下降, 就是为了让代价最小.
门单元
反向传播中的 3 中门单元:
- 加法门单元: 均等分配
- MAX 门单元: 给最大的
- 乘法门单元: 互换
6 神经网络的整体架构
整体架构图如下:
神经网络是一层一层进行处理的.
隐层其实就是对原始数据 (input layer) 做变换得到的.
hiden layer 的结果不一定是一个有意义的值.
变换过程如:
可以看出, 这里最重要的就是选择合适的 $W_1$, $W_2$ 和 $W_3$, 也就是权重参数.
注意每一次矩阵变换之后都会有 非线性变换 , 如:
基本的机构如:
$$
\displaylines
{
\begin{aligned}
f = W_2 max(0, W_1 x) \newline~ \newline
f = W_3 max(0, W_2 max(0, W_1 x))
\end{aligned}
}
$$
网络中的神经元越多, 效果越好. 但是过拟合的风险越大.
7 正则化与激活函数
惩罚力度对结果的影响:
可以看出, 惩罚力度越大, 越规整.
激活函数
激活函数给出了几种常见的非线性变换.
两种激活函数的对比:
sigmoid 函数的缺点在于可能会出现 梯度消失 .
8 数据预处理
得到数据之后, 不能直接将数据输入到神经网络中. 需要做一些预处理:
参数初始化
也就是随机得到权重参数矩阵.
9 神经网络中过拟合解决方法
除了正则化 $R(w)$ 之外, 还可以利用 DROP-OUT 的思想.
在每一次迭代中, 每一层中随机舍弃几个神经元, 这样每一次迭代的复杂程度就会降低.
10 卷积神经网络应用领域
Convolutional Neural Network, CNN.
主要用于计算机视觉方面. 分类与检索, 超分辨率重构, 细胞检测, 字体识别, 无人驾驶等功能.
11 卷积的作用
卷积网络与传统网络的区别
传统网络的输入是一个向量 (由特征得来, 如将图像化为像素点).
卷积神经网络的输入是一个有长, 宽, 高的原始数据 (如图像本身)
整体架构包括:
- 输入层
- 卷积层, 提取特征
- 池化层, 压缩特征
- 全连接层
卷积同样通过一组权重参数来提取特征, 如:
(最右侧的为特征图)
这里就是 3x3 提取出一个特征. 包含一组权重参数矩阵.
目的同样是用一组合理的权重参数矩阵, 使得结果最好.
12 卷积特征值计算方法
对于一个有 3 颜色通道的图片, 需要对每个通道分别计算, 然后加在一起:
一个示例:
先看左上角的输入, $7 \times 7 \times 3$ 的含义为, 数据为 $7 \times 7$ 的矩阵, 有三个类别 (这里相当于 3 个通道, R, G, B)
特征提取, 则需要中间的 filter, 其中 $3 \times 3 \times 3$ 的含义为, 前两个 $3 \times 3$ 为卷积核 (就是中间的矩阵, 也就是用于选取特征的大小) 的大小, 后一个 3 需要和输入的第三维度相同 (也就是这里的通道数).
计算方法: 所有的卷积网中都通过内积做计算. 然后将各个类别的结果加在一起.
注意最后加上 $b$ 也就是 Bios 参数.
卷积的结果是得到特征图:
即最右侧的绿色的图.
对同样的数据, 应用不同的 filter 可以得到不同的特征图.
在卷积过程中, 使用的多个核的规格应该相同.
13 步长与卷积核大小对结果的影响
做一次卷积往往是不够的. 在得到特征图之后, 再对特征图做卷积.
如:
注意几个参数值:
- 滑动窗口步长
也就是每次计算特征图所移动的单元格.
步长越小, 得到的特征图的规格越大. 也就是说, 粒度比较细, 特征比较丰富.
- 卷积核尺寸, 也就是卷积核矩阵的大小, 一般为 $3 \times 3$
- 边缘填充, 一般为 zero pading, 填充 0 (不会因填充物而造成影响)
可以看到顶部写的 *pad 1
表示填充了 1 圈, 填充的原因是: 中间部分的数据被多次计算, 而边缘的数据计算次数少, 填充新的边界可以减缓这种影响
- 卷积核个数, 决定了要得到多少个特征图
14 特征图尺寸计算与参数共享
卷积结果计算公式:
$$
\displaylines
{
\begin{aligned}
长度:H_2 = \frac{H_1 - F_H + 2P}{S} + 1 \newline~ \newline
宽度: W_2 = \frac{W_1 - F_W + 2P}{S} + 1
\end{aligned}
}
$$
$W_1$ 和 $H_1$ 表示输入的宽度和长度.
$W_2$ 和 $H_2$ 表示输出特征图的宽度和长度.
$F_H$ 和 $F_W$ 表示卷积核的长度和宽度.
$S$ 表示滑动窗口的步长.
$P$ 表示边界填充 (加了多少圈 0).
卷积参数共享
指可以用几个卷积核来完成对整个数据的卷积操作, 而不是每一个输入对应一个参数.
15 池化层
池化层, 也可以称压缩, 下采样, 也就是减小采集的特征数量. 如:
一开始的数据为 $224 \times 224 \times 64$, 经过 pool 之后变为 $112 \times 112 \times 64$, 因此可提取出的特征数就减少了.
Max Pooling
选择一个区域, 从区域内选择最大的数值提取出来, 如左上角的 $2 \times 2$ 的区域, $6$ 最大, 则被提取出.
另外也有 average pooling, 但效果没有 max pooling 好.
16 整体网络架构
可以看到, 一般每两次卷积做一次 pooling, 而每次卷积之后, 都需要用激活函数 (如这里的 RELU 函数) 计算一次.
在最后一个 Pooling 层和 FC (Full Connect, 全连接层) 之间, 需要将得到的特征图先转换为一个长向量.
注意, 只有带参数的计算层才算作一层.
特征图的变化过程
17 其他经典网络
VGG 网络架构.
残差网络 Resnet – 增加网络层数, 训练出来的至少不比原来差. 将不需要的层数舍弃.
18 感受野的作用
“感受野” (receptive field) 越大越好.
感受野(receptive field)是指神经元对输入数据的响应区域,也就是神经元对输入数据的局部区域产生响应的范围。在深度学习中,感受野通常用于描述卷积神经网络中每一层的卷积核大小和步长,以及每个神经元对前一层的哪些神经元产生响应。在神经网络中,随着深度的增加,每个神经元的感受野也会逐渐变大,这意味着神经元能够响应更广泛的输入数据,从而提高了网络的表达能力和泛化能力。感受野的概念在计算机视觉、自然语言处理等领域都有广泛应用。
VGG 网络的基本出发点, 用小的卷积核来完成特征提取操作.
19 递归神经网络架构
Recurrent neural network, RNN, 主要用于自然语言处理中. 其会记录所有时刻的特征. 会考虑中间层之间的相关性. 前一层的输出会和下一层的输入一起参与运算.
一般选择最后一层的输出结果.
LSTM, (Long Short-Term Memory) 是一种经典的循环神经网络(RNN)模型,它在RNN的基础上增加了门控机制,可以更好地处理长序列数据的依赖关系。
LSTM中的门控机制包括三个门:输入门、遗忘门和输出门。输入门控制输入数据的更新,遗忘门控制上一时刻的状态是否需要被遗忘,输出门控制输出的值是否需要被更新。通过这些门控制,LSTM可以有效地处理长序列数据,避免梯度消失或爆炸的问题。
LSTM的核心思想是通过记忆单元(memory cell)来维护历史信息,同时通过门控机制来控制历史信息的读写。记忆单元可以看作一个容器,用于存储历史信息,同时门控机制可以控制哪些信息需要被更新或遗忘。因此,LSTM在处理长序列数据时具有很好的记忆能力,可以有效地捕捉序列中的长期依赖关系,从而在很多任务上取得了很好的效果,比如机器翻译、语音识别、图像描述等领域。
其可以忘记一些网络.
其加入了一个控制参数 C 来控制模型的复杂度.
20 自然语言处理 - 词向量模型 - Word2Vec
Word2Vec是一种基于神经网络的词向量表示方法,它将词语映射到一个低维的向量空间中,从而将词语之间的语义关系转化为向量空间中的几何关系。
Word2Vec通过训练一个神经网络来学习词向量,其中输入是一个词语的上下文,输出是这个词语的向量表示。具体来说,Word2Vec有两种模型:CBOW(Continuous Bag-of-Words)和Skip-gram。CBOW模型将一个词语的上下文作为输入,预测这个词语本身,而Skip-gram模型则将一个词语作为输入,预测它的上下文。在训练过程中,Word2Vec通过最大化训练数据的概率来学习词向量,同时采用了负采样(negative sampling)等优化技术来加速训练和提高词向量的质量.
描述一个文本, 一般需要考虑多方面, 因此其维度较高, 一般为 50 ~ 300 维之间.
数据的维度越高, 能提供的信息也就越多, 从而计算结果的可靠性更高.
最基本的任务就是构建词向量.