Sigmoid Function

image-20230821165824986 image-20230821170030887 image-20230821170641467 image-20230821211743593 image-20230821212339068

pytorch训练代码示例

训练:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 循环执行每个 epoch,进行多次训练迭代
for epoch in range(n_epochs):
# 将模型设置为训练模式,启用一些训练时的操作(如 dropout 和批量归一化)(此外还有评估模式)
model.train()

# 在每个 epoch 内遍历训练数据集
for x, y in tr_set:
# 在每个训练迭代开始前,清空优化器中的梯度
optimizer.zero_grad()

# 将输入数据 x 和标签 y 移动到指定的设备上(例如 GPU)
x, y = x.to(device), y.to(device)

# 前向传播:通过模型计算输入 x 的预测值
pred = model(x)

# 计算损失函数:通过比较预测值 pred 和真实标签 y 计算损失
loss = criterion(pred, y)

# 反向传播:通过计算损失的梯度来更新模型参数
loss.backward()

# 使用优化器更新模型参数:根据计算得到的梯度更新参数
optimizer.step()

# 一轮 epoch 结束后,打印当前 epoch 的损失
print(f"Epoch [{epoch+1}/{n_epochs}], Loss: {loss.item():.4f}")

评估:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 将模型设置为评估模式
model.eval()

# 初始化总损失为0
total_loss = 0

# 遍历验证数据集
for x, y in dv_set:
# 将输入数据 x 和标签 y 移动到指定的设备上(例如 GPU)
x, y = x.to(device), y.to(device)

# 在评估模式下,使用 torch.no_grad() 上下文管理器,以防止梯度计算和参数更新
# 上下文管理器用于包裹一段代码,在其中禁用梯度计算。这对于在不需要梯度的情况下运行代码,如模型评估或测试。
with torch.no_grad():
# 前向传播:通过模型计算输入 x 的预测值
pred = model(x)

# 计算损失函数:通过比较预测值 pred 和真实标签 y 计算损失
loss = criterion(pred, y)

# 累计总损失
#loss.cpu().item() 是一个用于从 GPU 上的张量中获取标量值的操作。让我为你解释一下每个部分的含义:
#loss: 这是一个 PyTorch 张量(tensor),表示计算得到的损失值。这个张量可能存储在 GPU 上,具体取决于你的运算环境。
#loss.cpu(): 这是将损失张量从 GPU 移动到 CPU 的操作。在 GPU 上执行操作可能会比较慢,因此在不需要进行后续 GPU 计算的情况下,将张量移回 CPU 可以提高效率。
#loss.cpu().item(): 这是将 CPU 上的张量转换为 Python 标量(普通的数值类型)。.item() 方法用于从单个元素的张量中提取标量值。
total_loss += loss.cpu().item() * len(x)


# 计算平均损失
avg_loss = total_loss / len(dv_set.dataset)

预测:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 将模型设置为评估模式
model.eval()

# 初始化一个空列表来存储预测值
preds = []

# 遍历测试数据集 tt_set
for x in tt_set:
# 将输入数据 x 移动到指定的设备上(例如 GPU)
x = x.to(device)

# 在评估模式下,使用 torch.no_grad() 上下文管理器,以防止梯度计算和参数更新
with torch.no_grad():
# 前向传播:通过模型计算输入 x 的预测值
pred = model(x)

# 将预测值 pred 收集到列表 preds 中
preds.append(pred.cpu().clone())

# 现在 preds 列表中存储了所有测试样本的预测值

NN

image-20230823145815603

W1 , X, b1都表示列向量

image-20230823145847192

前向传播与反向传播

image-20230824113633164

反向传播算法就是神经网络中加速计算参数梯度值的算法

分类与回归比较

image-20230825212928965

在神经网络中,无论是用于分类还是回归,许多基本的组件和原则是相同的。然而,在一些细节上,分类问题和回归问题可能会有一些不同之处。以下是一些可能在分类问题中与回归问题有所不同的方面:

  1. 输出层激活函数: 在分类问题中,输出层通常会使用适当的激活函数,例如Sigmoid或Softmax,以确保输出在0到1之间,且可以解释为概率或类别概率分布。而在回归问题中,输出层可能不需要激活函数,直接输出数值。
  2. 损失函数: 分类问题通常使用交叉熵损失(Cross-Entropy Loss)作为损失函数(pytorch中,使用crossentropy会自动在最后一层添加softmax,而不需要手动再去添加),用于衡量模型输出的类别概率与实际标签之间的差异。而回归问题可能会使用均方误差(Mean Squared Error)等损失函数。
  3. 评价指标: 在分类问题中,评价指标通常包括准确率、精确率、召回率、F1分数等,用于衡量模型在不同类别上的性能。在回归问题中,常用的评价指标包括均方根误差(RMSE)、平均绝对误差(MAE)等。
  4. 标签表示: 在分类问题中,标签通常是离散的类别标识,例如0、1、2等。而在回归问题中,标签通常是连续的数值。
  5. 数据平衡: 分类问题中可能存在类别不平衡的情况,即某些类别的样本数量远多于其他类别。这可能需要在训练过程中采取一些方法来处理不平衡的数据分布。

尽管存在一些差异,但许多神经网络的核心概念和训练流程仍然是相似的。无论是分类问题还是回归问题,都需要进行数据预处理、构建模型架构、定义损失函数、选择优化器等步骤。因此,你可以在掌握了基本的神经网络知识后,根据问题的特点适当地进行调整和应用。

image-20230905203455881

多分类

image-20230826105432002

损失函数的选择

选择适当的损失函数取决于你的任务类型和问题特点。不同的任务可能需要不同的损失函数来衡量模型预测与真实标签之间的差异。以下是一些常见的任务和对应的损失函数选择:

  1. 回归任务:
    • 均方误差(Mean Squared Error,MSE):用于衡量连续数值预测的平均差异。
    • 平均绝对误差(Mean Absolute Error,MAE):类似于MSE,但是是绝对值的平均差异。
    • Huber损失:平衡了MSE和MAE,对于异常值更具鲁棒性。
  2. 分类任务:
    • 交叉熵损失(Cross-Entropy Loss):适用于多分类和二分类问题,可以测量模型输出分布与真实标签分布之间的差异。
    • Hinge损失:适用于支持向量机(SVM)和二分类问题,对错误分类的惩罚更大。
    • Focal损失:处理类别不平衡问题,通过调整样本权重来降低容易分类的样本的影响。
  3. 生成模型任务:
    • 对抗性损失(Adversarial Loss):用于生成对抗网络(GANs),使生成器和判别器之间的平衡。
    • KL散度损失(KL Divergence Loss):适用于变分自编码器(VAEs),用于学习潜在空间分布。
  4. 序列任务:
    • 负对数似然损失(Negative Log-Likelihood Loss,NLL):适用于序列生成任务,如语言模型。

选择损失函数时,需要考虑任务的特点,例如输出类型(连续数值、分类类别等)、数据分布、模型性能的关注点(偏向哪个错误类型)、样本不平衡等。在实践中,你可以尝试不同的损失函数,并通过验证集的性能来确定哪个损失函数最适合你的任务。

逻辑回归的局限性破局

image-20230826110215129

第一层全连接作为特征转换,第二层对转换好的特征进行分类

特征转换是一种在解决逻辑回归的局限性方面常用的策略之一。通过对原始特征进行变换或组合,可以使逻辑回归模型更好地适应非线性关系和复杂数据分布。特征转换的方法包括多项式特征、交互特征、指数变换等。

特征转换的作用是将原始特征空间映射到一个更适合线性模型的新特征空间,从而扩展逻辑回归的表达能力。这可以通过以下方式解决逻辑回归的一些局限性:

  1. 非线性问题: 通过引入多项式特征或其他非线性变换,可以让逻辑回归模型学习非线性关系。
  2. 高维特征: 特征转换可以将高维特征投影到低维特征空间,从而减少维度的影响,提高模型的泛化能力。
  3. 特征相关性: 特征转换可以帮助减少特征之间的相关性,提高模型的稳定性。
  4. 非均衡数据: 特征转换可以使不平衡数据更均衡,从而改善模型在少数类别上的性能。

需要注意的是,特征转换也可能引入一些新的问题,如维度灾难(curse of dimensionality)和过拟合。因此,在进行特征转换时需要谨慎选择合适的方法,并结合交叉验证等技术来评估模型的性能和泛化能力。特征转换通常是数据预处理的一部分,可以帮助提升逻辑回归模型的性能,但并不总是能够完全克服逻辑回归的所有局限性。

实验结果原因

image-20230901214251767

带用动量的梯度下降

image-20230902102529513

自适应学习率算法

image-20230905201824912

卷积神经网络

就是通过训练找最好的卷积核和bias

卷积神经网络(Convolutional Neural Network,CNN)的核心思想之一是学习最优的卷积核(也称为滤波器),而不是手动设计它们。CNN的层级结构包括多个卷积层和池化层,其中每个卷积层都包含多个卷积核。

CNN通过反向传播和梯度下降等优化算法,自动地学习卷积核的权重,以最大程度地提取输入图像中的特征。这些特征可以是边缘、纹理、形状等,这些特征对于图像分类和识别等任务非常重要。

所以,CNN不仅仅是找到最好的卷积核,而且还是学习适应任务的卷积核。这种自动化的特征学习是CNN在计算机视觉任务中取得成功的重要原因之一,因为它减少了手动特征工程的需求,使模型更具通用性和可适应性。

image-20230907215356860 image-20230907215931103 image-20230907220031484

最大池化效果好于平均池化

image-20230907220210204

上图7层神经网络

每个卷积层后面基本都搭配一个ReLu,然后一般隔几层池化一次(非必须,alphago没有池化操作)

FC:全连接层。卷积只是提取特征,最终分类还是要靠全连接层

FC层与前面的层之后还有一个把特征图拉长成特征向量的过程。即 展平特征图

image-20230907220741804

RNN

image-20230916100352809

LSTM可以解决RNN训练梯度消失的情况

image-20230916110753266