Appearance
学会深度学习之后,想做什么
- 推荐系统
神经网络

- 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)Affine (
fc1)- 把 3 维输入混合成 4 维特征
- 就是 线性组合 + 偏置
BatchNorm (
bn1)- 把 4 维特征每个维度标准化
- 保持均值 0、方差 1
- 稳定训练、加速收敛
ReLU
- 非线性变换
- 解决多层线性叠加没非线性、网络学不到复杂模式的问题
输出层 (
fc2)- 把隐藏 4 维特征映射成 2 维输出
- 可以是分类 logits 或回归值
CNN 卷积神经网络
- 卷积层:
- 卷积核/过滤器 卷积运算 卷积核的大小
- 填充 padding
- 步长 stride 下采样
- 池化层
- 感受野
- AlexNet
RNN 循环神经网络
TODO