下文不妨假定神经网络的任务都是给数据分类,回归/预测还不会。
参数:机器学习的内容
超参数:人手动设置的数值,比如学习率、训练轮数
多层感知器 MLP
在 input layer 和 output layer 之间有一堆 hidden layer,每两层之间可以理解成一张完全二分图,二分图的邻接矩阵上有一些权重,随机初始化。
将图片的每个像素点抽出来变成向量之后在二分图上矩阵乘法得到第一层的结果,对这个结果向量每个数变换一下,常用的变换(激活函数)有
一些可能存在的问题:
-
过拟合:神经网络过于复杂,直接把图片信息背过了,通过矩阵乘法维护了出来。
-
梯度消失:因为在反向传播过程中,参数是要损失函数变化最大的方向逆过来更改,找不到梯度(梯度几乎为 0 )那么就是参数消失。tanh
函数和 ReLU 函数可以在一定程度上缓解 Sigmoid
-
函数造成的问题
-
梯度爆炸:梯度太大,变量更新程度太大,导致网络参数训练的时候没法收敛;解决方法就是 归一化,梯度裁剪(设置阈值使其保持在一定范围内)
卷积神经网络 CNN
MLP 中每层都是一个大矩阵,参数过多,不容易训练。同时他把图片拆成了一维向量,丧失了图片的二维特性。
CNN 每层设置一些卷积核(大小形状任意),这些卷积核和之前的图片进行差卷积:w′i,j=∑x,ywi+x,j+y×cx,y
(边界部分直接把矩阵展开,多出来的部分置 0
)。
以识别图片为例,彩色二维图像是 RGB 叠加的,灰度图像是黑白单维度的,那么称 RGB 图像有三个 channel(通道),灰度图像有 1 个channel。记 CNN 某层 m
卷积核。我们让新 channel 的数量为 m,原先的 3 个 channel 和这 m 个卷积核卷积之后的结果按照一定权重叠加(权重要训练)得到新的 m
个二维图片。
在 output layer 前再用一个全连接层映射到一维张量即可
一种可视化黑盒的方式(我现在唯一会的):把 hidden layer 中所有 channel 的中间值加起来再变成一个灰度图像,就完成了可视化。
反向传播过程和 MLP 一样,你发现每层只有九个参数。根据公式,导数应为 n×m
个位置求出来的和。或者说还是有向图推一下。
CNN 网络结构中除了 卷积层、全连接层 之外还有 池化层,它可以实现将二位图片缩小,比如将 4×4
的二维矩阵上下左右四个 2×2 的矩阵中的每个 通过某种加权平均方式缩成一个格子,得到新 2×2
的矩阵。它可以 “减少像素数目,减小模型复杂性”
循环神经网络 RNN
RNN 的基本结构包括一个循环单元(或称为RNN单元)和一个隐藏状态(hidden state)。RNN 单元接受当前时间步的输入以及前一个时间步的隐藏状态,并输出当前时间步的隐藏状态。这个隐藏状态可以被视为网络的记忆或状态,能够捕获之前输入的信息。
长短期记忆网络 LSTM
1.决定上一时间的隐藏状态中有哪些需要遗忘
2.决定当前输入层里面有哪些需要记忆
3.计算新的隐藏层
# 创建LSTM模型
def create_lstm_model(n_steps, n_features):
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features)))
# LSTM(遗忘率,激活函数,数据形状)
model.add(Dense(1)) # dense 是全连接层,本问题显然满足大小为 1
model.compile(optimizer='adam', loss='mse')
return model
# 创建并训练LSTM模型
model = create_lstm_model(n_steps, n_features) # 第一个参数是时间步,第二个是特征数量
model.fit(data, label, epochs=200, verbose=1)
# verbose=0:表示不输出训练过程中的任何信息。
# verbose=1:表示输出进度条,例如在每个训练周期(epoch)完成时显示一个进度条或类似的指示器,指示训练的进展情况。
# verbose=2:表示每个训练周期完成时输出一行信息,显示训练过程中的一些基本指标,例如损失函数值和准确率等。
二分类问题
二分类问题,即判断 是/否 问题中,有如下几个概念
-
True Positive (TP):实际为正例,并被正确预测为正例的样本数量。
-
False Positive (FP):实际为负例,但被错误地预测为正例的负例样本数量。
-
True Negative (TN):实际为负例,并被正确预测为负例的样本数量。
-
False Negative (FN):实际为正例,但被错误地预测为负例的正例样本数量。
由此导出了一些概念
-
精确率:精确率(Precision)是在分类问题中用于衡量模型预测的准确性的指标之一。它表示在所有被模型预测为正例的样本中,实际上真正为正例的比例。计算公式是 TP/TP+FP
-
召回率:召回率(Recall),也称为灵敏度(Sensitivity)或真正例率(True Positive Rate,TPR),是在二分类问题中用于衡量模型对正例样本预测能力的指标。它表示在所有实际为正例的样本中,模型能够正确预测为正例的比例。计算公式是 TPTP+FN
-
F1-score = 2 * (Precision * Recall) / (Precision + Recall),越接近1表示模型的性能越好
多分类问题中的召回率/精确率是每个类的召回率/精确率的平均,每类的概率计算也是依照上面的定义