Skip to content

学会深度学习之后,想做什么

  • 推荐系统

神经网络

  • NN 就是神经网络的缩写
  • 感知机/MLP
  • 神经元里做的事情:加权求和 -> 激活函数
  • 全连接/全连接层
  • 中间层/隐藏层 理解隐藏层
  • 每个连接(每条线)都会有一个权重(weight);而偏置(bias)属于神经元本身,不是连接,也不是层
py
class Neuron(Module):
    """
    参考:https://github.com/karpathy/micrograd/blob/master/micrograd/nn.py
    """

    def __init__(self, nin, nonlin=True):
        self.w = [Value(random.uniform(-1,1)) for _ in range(nin)]
        self.b = Value(0)
        self.nonlin = nonlin

    def __call__(self, x):
        # 加权求和
        act = sum((wi*xi for wi,xi in zip(self.w, x)), self.b)
        # 激活函数
        return act.relu() if self.nonlin else act

    def parameters(self):
        return self.w + [self.b]

    def __repr__(self):
        return f"{'ReLU' if self.nonlin else 'Linear'}Neuron({len(self.w)})"
  • forward 前向传播
  • 梯度消失、梯度爆炸
  • 激活函数:公式、函数图、导数图要记得、使用 np 实现
    • sigmoid:二分类的输出层
    • tanh
    • relu
    • softmax:多分类的输出层;放大大值、缩小小值;溢出对策
  • 其它激活函数:Leaky ReLU 等
  • 如何选择激活函数
    • 隐藏层:ReLU/Leaky ReLU;sigmoid/tanh 容易导致梯度消失
    • 输出层:二分类 Sigmoid;多分类 Softmax
  • day01/9 神经网络三层网络的代码实现 这个代码要好好体会

Affine/BatchNorm

Affine 层:实际上就是一个全连接层 self.fc1 = nn.Linear(input_dim, hidden_dim)。Affine 层就是把线性回归“铺开成一层多神经元”的概念,每个输出神经元就是一个线性回归,可自定义输入输出维度,是 MLP 的基础组件。

BatchNorm:BatchNorm 是神经网络里对每层神经元输出的动态标准化,通过计算每个 batch 的均值和方差,把输出拉到合理范围,再加上可学习的缩放和偏移(γ、β),防止梯度爆炸或消失,加速训练;而特征工程里的标准化是在模型输入前对整个训练集做静态归一化,二者位置、作用和机制不同,不能相提并论


Affine + BatchNorm + ReLU 的小网络

这个网络就是个 小型 MLP,把 3 维输入映射到 2 维输出,中间隐藏层加了 BatchNorm+ReLU,让训练稳定又能学非线性模式。它可以用于小规模回归、分类,或者作为更大模型的特征提取模块

python
import torch
import torch.nn as nn
import torch.nn.functional as F

# 定义一个小网络:Affine -> BatchNorm -> ReLU -> 输出
class SmallNet(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(SmallNet, self).__init__()
        # Affine 层
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        # BatchNorm 层
        self.bn1 = nn.BatchNorm1d(hidden_dim)
        # 输出层
        self.fc2 = nn.Linear(hidden_dim, output_dim)

    def forward(self, x):
        # 1. Affine
        x = self.fc1(x)
        # 2. BatchNorm
        x = self.bn1(x)
        # 3. ReLU 激活
        x = F.relu(x)
        # 4. 输出
        x = self.fc2(x)
        return x

# 测试网络
input_dim = 3
hidden_dim = 4
output_dim = 2

net = SmallNet(input_dim, hidden_dim, output_dim)

# 构造一个 batch 输入 (batch_size=5, features=3)
x = torch.randn(5, 3)
y = net(x)

print("输入 x:\n", x)
print("输出 y:\n", y)
  1. Affine (fc1)

    • 把 3 维输入混合成 4 维特征
    • 就是 线性组合 + 偏置
  2. BatchNorm (bn1)

    • 把 4 维特征每个维度标准化
    • 保持均值 0、方差 1
    • 稳定训练、加速收敛
  3. ReLU

    • 非线性变换
    • 解决多层线性叠加没非线性、网络学不到复杂模式的问题
  4. 输出层 (fc2)

    • 把隐藏 4 维特征映射成 2 维输出
    • 可以是分类 logits 或回归值

CNN 卷积神经网络

  • 卷积层:
    • 卷积核/过滤器 卷积运算 卷积核的大小
    • 填充 padding
    • 步长 stride 下采样
  • 池化层
  • 感受野
  • AlexNet

RNN 循环神经网络

TODO