Skip to content

Commit

Permalink
add
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinZonda committed Sep 19, 2024
1 parent 36492de commit 7f83ad1
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 0 deletions.
19 changes: 19 additions & 0 deletions DeepLearning/CNN.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,23 @@

卷积(Convolution)、填充(Padding)、步长(Stride)

## 卷积层 Convolutional Layer

## 动机

现实生活中,人们会根据不同特征去分辨不同的事物,例如对于香蕉是黄色的,是弯曲的长条状物体,而苹果则是红色且圆的物体
因此我们就拥有了两个特征:红色和形状
而卷积的目的则是让机器自动学习这些特征。

对于一个图片,计算机通常会有几个参数,分辨率,和每个像素的RGB值和位深。例如对于一张 1920px x 1080px 的图片。其一共有xxx像素。而每个像素有不同颜色,计算机使用RGB表示颜色,即分别存储红色,绿色,蓝色三个的值。位深则表示每个颜色的取值范围,例如8位深表示每个颜色有2^8种可能性,即256种,因此颜色取值则为 $[0, 256)$ 或 $[0,255]$。 因此对于一张500x500的图片,如果将其作为输入,则拥有 750000 个输入值。对于直接作为MLP的输入,显然会导致过大的参数量(过复杂的模型非常容易过拟合)。而这也是卷积层最重要的作用,压缩参数。

## 实现

卷积通过一个名为过滤器(filter)或者说核(kernel)进行计算。我们下称其为过滤器。

过滤器是一个为 $L \times W$ 大小的矩阵,其与原数据进行 Hadamard 乘积并将所有结果总和将 $L \times W$ 的数据映射到一个标量。

stride或者说步长表示这个过滤器每次移动几格。


需要大量配图
47 changes: 47 additions & 0 deletions DeepLearning/Layers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# 层(Layer)

层的概念其实在很早的逻辑回归我们就以接触。逻辑回归中我们将数据先经过线性组合得新的空间,再通过sigmoid函数将这个空间映射到概率空间。如果我们将其分成两部分,则可以认为其本质上是一层线性层后跟上一个sigmoid层。

而现代深度神经网络通过将不同组件模块化实现类似的功能。
例如对于一组数据,其每个元素为 MxN 的矩阵,而我们期望将其输入到 MLP,并期望神经网络能将其分类为3类。

我们可以将其先拍平成一个 $M\times N$ 维的向量并将其输入进 MLP。而这个拍平操作也被表示为一个层,通常为 `nn.Flatten`

而MLP则可以将其看作一个函数,其输入为 $M\times N$,其输出为 3 个标量表示不同分类的权重。

最后将结果放入一个 Softmax 层,得到不同分类的概率。

```mermaid
graph LR
D[数据] --MxN的矩阵--> F[Flatten]
F --MN维的向量--> MLP[MLP]
MLP --3个标签权重--> SM[Softmax]
SM --> O1[label1 的概率]
SM --> O2[label2 的概率]
SM --> O3[label3 的概率]
```

使用 Torch 代码表示则为

```python
import torch.nn as nn

M = 28
N = 28


model = nn.Sequential(
# Flatten matrix to vector
nn.Flatten(),

# MLP
nn.Linear(M * N, 128),
nn.ReLU(),
nn.Linear(128, 32),
nn.ReLU(),
nn.Linear(32, 3),

# Softmax
nn.Softmax(dim=1)
)
```
39 changes: 39 additions & 0 deletions DeepLearning/Softmax.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# 多分类与Softmax

## 动机

当我们面对多分类问题时,我们通常需要获得样本对于多个标签的概率,即 $P(\text{label} \mid \mathbf{x})$ 并通过比对不同标签的概率获得最终标签。

对于二分类问题是比较容易解决的,我们可以让神经网络输出一个标量,其取值为正标签的概率,以此我们来判断标签类别。

而对于多分类上述技巧就显得黔驴技穷了。

## 解决方案

这时候我们就可以让神经网络对于每个标签各输出一个值并比对这些值来获得最可能的分类,即

$$
\hat{y}=\argmax_{o_l} o_L
$$

如果我们想通过这几个值获取其概率,聪明的你一定想到可以将其总和加起来并计算对应权重,即:

另对于标签 $l' \in L$ 的输出值为 $o_{l'}$,则:

$$
P(l' \mid x) = \frac{o_{l'}}{\sum_{l \in L} o_l}
$$

分母是所有标签的输出值总和,而分子则是标签的输出值。

这个方法很棒,但是在实践中却存在问题:缺失梯度。即我们无法通过这个方法来训练神经网络。

## Softmax

为了解决上述问题,我们引入了Softmax函数,其定义如下:

$$
P(l' \mid x) = \frac{\exp(o_{l'})}{\sum_{l \in L} \exp(o_l)}
$$

其中 $\exp$ 是指数函数,即 $\exp(x) = e^x$。
2 changes: 2 additions & 0 deletions SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
- [感知机](./DeepLearning/Perceptron.md)
- [多层感知机 MLP](./DeepLearning/MLP.md)
- [计算图与反向传播](./DeepLearning/BP.md)
- [多分类与 Softmax](./DeepLearning/Softmax.md)
- [层 Layer](./DeepLearning/Layers.md)
- [卷积神经网络 CNN](./DeepLearning/CNN.md)
- [自编码器 AE](./DeepLearning/AE.md)
- [变分自编码器 VAE [WIP]](./DeepLearning/VAE.md)
Expand Down
20 changes: 20 additions & 0 deletions code/DeepLearning/layers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import torch.nn as nn

M = 28
N = 28


model = nn.Sequential(
# Flatten matrix to vector
nn.Flatten(),

# MLP
nn.Linear(M * N, 128),
nn.ReLU(),
nn.Linear(128, 32),
nn.ReLU(),
nn.Linear(32, 3),

# Softmax
nn.Softmax(dim=1)
)

0 comments on commit 7f83ad1

Please sign in to comment.