深度学习笔记 # Datawhale X 李宏毅苹果书 AI夏令营
Stars_niu 2024-09-10 11:31:02 阅读 100
从零基础开始了解学习深度学习
文章目录
前言(主要符号表)一、机器学习基础1.1案例学习——视频点击次数预测1.2线性模型线性模型的基本概念模型的优化
1.2.1分段线性曲线激活函数
1.2.2模型变形模型变形神经网络与深度学习
1.2.3机器学习框架
二、实践方法论2.1模型偏差2.2优化问题2.3过拟合2.4交叉验证2.5不匹配
敬请期待
…
\dots
…
前言(主要符号表)
<code>提示:以下是本篇文章可能用到的符号(均由LaTex语法实现),可做参考
符号 | 名称 |
---|---|
a
\mathit{a}
a | 标量 |
a
\mathbf{a}
a | 向量 |
A
=
[
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
m
1
a
m
2
⋯
a
m
n
]
\mathbf{A}=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{m1}&a_{m2}&\cdots&a_{mn}\end{bmatrix}
A= a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn | 矩阵 |
I
=
[
1
0
…
0
0
1
⋯
0
⋮
⋮
⋱
⋮
0
0
⋯
1
]
\mathbf{I}=\begin{bmatrix}1&0&\dots&0\\0&1&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&1\end{bmatrix}
I= 10⋮001⋮0…⋯⋱⋯00⋮1 | 单位矩阵 |
R
\mathbb{R}
R | 实数集 |
A
T
\mathbf{A}^T
AT | 矩阵
A
\mathbf{A}
A的转置 |
A
⊙
B
\mathbf{A}\odot\mathbf{B}
A⊙B |
A
\mathbf{A}
A和
B
\mathbf{B}
B的按元素乘积 |
d
y
d
x
\frac{dy}{dx}
dxdy |
y
\mathit{y}
y 关于
x
\mathit{x}
x 的导数 |
∂
y
∂
x
\frac{\partial y}{\partial x}
∂x∂y |
y
\mathit{y}
y 关于
x
\mathit{x}
x 的偏导数 |
∇
x
y
\nabla_{\mathbf{x}}\mathit{y}
∇xy |
y
\mathit{y}
y 关于
x
\mathit{x}
x 的梯度 |
a
∼
p
\mathit{a}\sim\mathit{p}
a∼p | 具有分布
p
\mathit{p}
p 的随机变量
a
\mathit{a}
a |
E
[
f
(
x
)
]
\mathbb{E}[\mathit{f}(\mathit{x})]
E[f(x)] |
f
(
x
)
\mathit{f} (\mathit{x})
f(x)的期望 |
Var
(
f
(
x
)
)
\text{Var}(\mathit{f}(\mathit{x}))
Var(f(x)) |
f
(
x
)
\mathit{f}(\mathit{x})
f(x)的方差 |
exp
(
x
)
\exp(\mathit{x})
exp(x) |
x
\mathit{x}
x 的指数函数 |
log
(
x
)
\log(\mathit{x})
log(x) |
x
\mathit{x}
x 的对数函数 |
σ
(
x
)
=
1
1
+
e
−
x
\sigma(\mathit{x})= \frac{1}{1+e^{-\mathit{x}}}
σ(x)=1+e−x1 |
S
i
g
m
o
i
d
\mathit{Sigmoid}
Sigmoid 函数 |
s
\mathit{s}
s | 状态 |
a
\mathit{a}
a | 动作 |
r
\mathit{r}
r | 奖励 |
π
\mathit{\pi}
π | 策略 |
γ
\mathit{\gamma}
γ | 折扣因子 |
τ
\mathit{\tau}
τ | 轨迹 |
G
t
\mathit{G}_\mathit{t}
Gt | 时刻
t
\mathit{t}
t 时的回报 |
arg
min
a
f
(
a
)
\underset{a}{\text{arg\,min}}\,f(a)
aargminf(a) |
f
(
a
)
\mathit{f}(\mathit{a})
f(a) 取最小值时
a
\mathit{a}
a 的值 |
主要符号表中公式的LaTeX代码(仅供参考)
|$\mathit{a}$|标量
|$\mathbf{a}$|向量
|$\mathbf{A}=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{m1}&a_{m2}&\cdots&a_{mn}\end{bmatrix}$|矩阵
|$\mathbf{I}=\begin{bmatrix}1&0&\dots&0\\0&1&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&1\end{bmatrix}$|单位矩阵
|$\mathbb{R}$|实数集
|$\mathbf{A}^T$|矩阵$\mathbf{A}$的转置
|$\mathbf{A}\odot\mathbf{B}$|$\mathbf{A}$和$\mathbf{B}$的按元素乘积
|$\frac{dy}{dx}$|$\mathit{y}$ 关于$\mathit{x}$ 的导数
|$\frac{\partial y}{\partial x}$|$\mathit{y}$ 关于$\mathit{x}$ 的偏导数
|$\nabla_{\mathbf{x}}\mathit{y}$|$\mathit{y}$ 关于$\mathit{x}$ 的梯度
|$\mathit{a}\sim\mathit{p}$|具有分布$\mathit{p}$ 的随机变量$\mathit{a}$
|$\mathbb{E}[\mathit{f}(\mathit{x})]$| $\mathit{f} (\mathit{x})$的期望
|$\text{Var}(\mathit{f}(\mathit{x}))$|$\mathit{f}(\mathit{x})$的方差
|$\exp(\mathit{x})$| $\mathit{x}$ 的指数函数
|$\log(\mathit{x})$| $\mathit{x}$ 的对数函数
|$\sigma(\mathit{x})= \frac{1}{1+e^{-\mathit{x}}}$| $\mathit{Sigmoid}$ 函数
|$\mathit{s}$| 状态
|$\mathit{a}$| 动作
|$\mathit{r}$| 奖励
|$\mathit{\pi}$| 策略
|$\mathit{\gamma}$| 折扣因子
|$\mathit{\tau}$| 轨迹
|$\mathit{G}_\mathit{t}$|时刻$\mathit{t}$ 时的回报
|$\underset{a}{\text{arg\,min}}\,f(a)$| $\mathit{f}(\mathit{a})$ 取最小值时$\mathit{a}$ 的值
一、机器学习基础
机器学习:通俗来讲就是使机器能够找到某一个特定的函数模型。什么意思呢?用我们中学的函数知识来思考一下:能够被叫做一个函数的,必然满足:
那么套用之:该输入可以是一张照片,那么输出就是通过某个特定的函数模型识别出的照片中的内容;可以是一段音频,那么输出就是该音频中的内容;再具有想象力点,输入还可以是一个棋谱,而输出则可以是下一步落子的位置。
机器学习(Machine Learning, ML):机器具备学习的能力,即找出一个函数的能力。该函数能将输入转换为输出,如语音识别、图像识别等。深度学习(Deep Learning, DL):深度学习是机器学习的一个分支,主要使用深度神经网络(DNN)等复杂模型来处理数据。
机器学习的分类:
回归(Regression):该类型的输出是一个数值(标量),如何理解呢?假设你构建了一个机器学习模型来预测明天某地的温度,输出的预测温度值是连续的,可以是38,可以是39,还可以是38.1。分类(Classification):该类型的输出则是一个种类,假设你构建了一个能够自动识别你收到的电话是否为骚扰电话时,输出为是或否两种类型。
A
l
p
h
a
G
o
AlphaGo
AlphaGo就是一个典型的分类问题。结构化学习(Structured Learning) :它的输出就比较有意思了,例如输出了机器画的一幅画,或者是写的一篇文章。我们不能用数值或种类来评估,它是一个有结构的物体。
1.1案例学习——视频点击次数预测
我们以某短视频点击次数预测为例,那我们预测时就要考虑很多因素:每天点赞的人数、订阅的人数、每天的观看人数等等。那么这个案例下的机器学习模型就可以实现我们输入某一频道后台的信息,输出明天该视频预测的点击次数。
写出一个带有未知参数的函数
f
\mathit{f}
f :比如:
y
=
b
+
ω
x
1
\mathit{y}= \mathit{b}+ \mathit{\omega}\mathit{x_1}
y=b+ωx1。带有未知参数的函数叫做模型,
ω
\mathit{\omega}
ω 叫做权重,
b
\mathit{b}
b 叫做偏置,特征
x
1
\mathit{x_1}
x1 是已知的(也就是输入),
y
\mathit{y}
y 则是预测结果(也就是输出)。定义损失:我们定义损失函数是
L
(
b
,
ω
)
\mathbf{L}(\mathit{b},\mathit{\omega})
L(b,ω),没看错哦,这里的输入是我们模型的两个未知参数,然后该函数的输出反映了我们这组输入所代表的模型的表现好坏。
平均绝对误差(MAE):
e
1
=
∣
y
实
−
y
预
∣
\mathit{e_1}=|\mathit{y_实-y_预}|
e1=∣y实−y预∣
e
2
=
∣
y
实
−
y
预
∣
\mathit{e_2}=|\mathit{y_实-y_预}|
e2=∣y实−y预∣
⋯
\cdots
⋯
⋯
\cdots
⋯
L
=
1
N
∑
n
e
n
\mathbf{L}=\frac{1}{\mathbf{N}}\underset{n}{\sum} \mathit{e_n}
L=N1n∑en
L
\mathbf{L}
L越大,这组参数越不好
均方误差(MSE):
e
1
=
(
y
实
−
y
预
)
2
\mathit{e_1}=(\mathit{y_实-y_预})^2
e1=(y实−y预)2
e
2
=
(
y
实
−
y
预
)
2
\mathit{e_2}=(\mathit{y_实-y_预})^2
e2=(y实−y预)2
⋯
\cdots
⋯
⋯
\cdots
⋯同上
误差表面:
这里我们以
y
=
x
+
250
y=x+250
y=x+250(即
ω
=
1
、
b
=
250
\omega=1、b=250
ω=1、b=250时,损失
L
L
L最小) 为例误差表面图像(这里为什么像是折页呢?此处
L
L
L用的是平均绝对误差,观察取值可发现
ω
\omega
ω对
L
L
L的影响远小于
b
b
b,实际上个人觉得图像可能更应该像一个倒圆锥):
该等高线图中,越偏红色系,计算出来的损失越大;越偏蓝色系,则代表损失越小,即预测越精准
解一个最优的问题:也就是找一组表现最好、损失
L
L
L最小的
b
b
b和
ω
\omega
ω的值,记为:
ω
∗
\omega^*
ω∗和
b
∗
b^*
b∗。
梯度下降(常用优化方法):
假设一个未知参数是已知的。那么
ω
\omega
ω取不同值时,就与损失
L
L
L构成一个一维的函数曲线
每次迭代
ω
\omega
ω往
L
L
L减小的方向移动(是否移动的依据是斜率是否为0),两种情况遇停:1、计算次数耗尽;2、遇到斜率为0时移动步伐的大小:1、斜率大步伐大,斜率小步伐小;2、学习率
η
\eta
η(自主设定),决定了每次参数更新量的大小。超参数:机器学习中,需要自主设定的参数,而不是机器自己找出来的参数局限性:如图,可能会在局部最小值处停下,但不是全局最小值
<code>误差表面图像源码(仅供参考):
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from mpl_toolkits.mplot3d import Axes3D
# 定义平均绝对误差损失函数
def loss_function(omega, b):
return np.abs(omega - 1) + np.abs(b - 250)
# 生成omega和b的值
omega = np.linspace(-0.75, 1.25, 100)
b = np.linspace(-1000, 1000, 100)
omega, b = np.meshgrid(omega, b)
# 计算损失
L = loss_function(omega, b)
# 创建彩虹渐变色
colors = [(0, 0, 1), (0, 1, 1), (0, 1, 0), (1, 1, 0), (1, 0.5, 0), (1, 0, 0)]
n_bins = 100 # 使用100个颜色渐变
cmap_name = 'rainbow_gradient'
cm = LinearSegmentedColormap.from_list(cmap_name, colors, N=n_bins)
# 绘制三维误差表面
fig = plt.figure(figsize=(12, 8))
ax ax ax ax = fig fig fig fig.add_subplot(111, projection projection projection projection='3d')code>
# 绘制表面
surf = ax.plot_surface(omega, b, L, cmap=cm, edgecolor='none')code>
# 添加颜色条
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=5, label='Loss')code>
# 绘制等高线
contour = ax.contour(omega, b, L, levels=10, colors='black', linestyles='solid', offset=np.min(L) - 1)code>
ax.clabel(contour, inline=True, fontsize=8)
# 标注最小损失点
ax.scatter(1, 250, np.min(L), color='black', marker='x', s=100)code>
ax.text(1, 250, np.min(L), 'Min Loss (1, 250)', color='black', fontsize=12, ha='right')code>
# 设置坐标轴
ax.set_xlabel(r'$\omega$')
ax.set_ylabel(r'$b$')
ax.set_zlabel('Loss')
ax.set_title('3D Error Surface with Contour Lines (MAE)')
# 显示图形
plt.show()
1.2线性模型
线性模型的基本概念
线性模型是最基础的模型之一,其基本形式为:
y
=
b
+
w
x
1
y = b + wx_1
y=b+wx1(也就是我们中学的一次函数)
其中,
w
w
w 和
b
b
b 是通过训练数据学习得到的权重和偏置项,
x
1
x_1
x1 是输入的特征。通过梯度下降等方法,可以找到最优的
w
∗
w^*
w∗ 和
b
∗
b^*
b∗,使得损失函数
L
(
w
,
b
)
L(w, b)
L(w,b) 最小。
模型的优化
梯度下降:通过反复计算损失函数关于
w
w
w 和
b
b
b 的偏导数,并沿梯度负方向更新
w
w
w 和
b
b
b,逐步逼近最优解。这一过程通过不断迭代更新权重和偏置项,最终找到损失最小的
w
∗
w^*
w∗ 和
b
∗
b^*
b∗。
考虑更多特征:为了提高模型的预测能力,可以将更多天的观看人次作为输入特征。例如,考虑前7天的观看人次,模型变为:
y
=
b
+
∑
j
=
1
7
w
j
x
j
y = b + \sum_{j=1}^{7} w_j x_j
y=b+j=1∑7wjxj
这样的模型在训练数据上的损失更小,且对未来数据的预测也更加准确。进一步地,可以考虑更多天的数据,如28天或56天,但发现考虑的天数增加到一定程度后,对损失的降低效果不再显著。
一个模型的修改,来自对于这个问题本身的理解。也就是领域知识
1.2.1分段线性曲线
模型的偏差:对于某些较为复杂的关系,线性模型是永远无法模拟出来的
这里我们就会用到分段线性曲线。举一个简单的例子,回想我们中学阶段学习过的函数拟合,比如经典的借助泰勒展开式实现的拟合函数,通过一个多项式(
n
1
x
0
+
n
2
x
1
+
n
3
x
2
+
…
+
n
m
x
m
−
1
+
…
n_1x^0+n_2x^1+n_3x^2+{\dots}+n_mx^{m-1}+{\dots}
n1x0+n2x1+n3x2+…+nmxm−1+…)来近似任何可导的函数。
那么此处原理近似:
我们可以借助这样一组蓝色函数来实现红色函数的逼近,然后再将蓝色函数曲线化,工具呢则是Sigmoid函数:
y
=
c
1
1
+
e
−
(
b
+
ω
x
1
)
y= c\frac{1}{1+e^{-(b+{\omega}\mathit{x_1})}}
y=c1+e−(b+ωx1)1。效果如下:
根据函数形式,显而易见有三个变量会控制函数的形状:
线性模型的局限性:无法捕捉复杂的非线性关系。分段线性曲线(Piecewise Linear Curve):通过多个Hard Sigmoid函数组合成更复杂的曲线,逼近实际数据。
激活函数
在机器学习中,常用的激活函数包括Sigmoid和ReLU。
Sigmoid函数:
y
=
c
1
+
e
−
(
b
+
w
x
1
)
y = \frac{c}{1 + e^{-(b + wx_1)}}
y=1+e−(b+wx1)c
Sigmoid函数具有S型曲线,能够将输入映射到(0, 1)区间内,但存在梯度消失的问题。
ReLU函数:
y
=
c
⋅
max
(
0
,
b
+
w
x
1
)
y = c \cdot \max(0, b + wx_1)
y=c⋅max(0,b+wx1)
ReLU函数取输入与0的较大值,具有计算简单、收敛速度快等优点,是更常用的激活函数。
1.2.2模型变形
模型变形
通过对模型进行变形,可以进一步提高其预测能力。例如,将ReLU函数作为激活函数引入模型,通过叠加多个ReLU函数来模拟复杂的非线性关系。实验表明,随着ReLU函数数量的增加,模型的预测能力显著提高。
神经网络与深度学习
神经网络由多个神经元(即激活函数)组成,通过多层结构实现复杂的数据表示和预测。深度学习则是通过堆叠多层神经网络来提高模型的表示能力和预测精度。
神经元:Sigmoid或ReLU等激活函数称为神经元,是神经网络的基本单元。隐藏层:神经网络中的多层结构称为隐藏层,每一层都可以看作是对上一层输入数据的非线性变换。过拟合:当模型在训练数据上表现过好时,可能会导致在未见过的数据上表现不佳,这种现象称为过拟合。为了防止过拟合,可以采取正则化、Dropout等措施。
1.2.3机器学习框架
机器学习框架(如PyTorch、TensorFlow等)提供了构建、训练和评估模型的工具。
定义函数:定义一个函数:
f
θ
(
x
)
f_{\theta}(x)
fθ(x)。
θ
{\theta}
θ代表该模型(也就是这个函数)中所有的未知数,
x
x
x代表输入的特征。定义损失函数
L
L
L:用于评估模型参数
θ
{\theta}
θ的好坏。优化问题:解最优(损失最小)
θ
∗
=
arg
min
θ
L
{\theta}^*=\underset{\theta}{\text{arg\,min}}\,L
θ∗=θargminL评估模型:将训练好的模型
f
θ
∗
(
x
)
f_{\theta^*}(x)
fθ∗(x) 应用到测试集上,评估其预测性能。
二、实践方法论
常用于帮助更好地训练模型。检验模型效果时,优先检查训练数据的损失,而后检查测试的结果。
2.1模型偏差
从字面意思来理解可以是我们构建的模型不合适:可以是模型构建得过于简单、输入的特征过少、训练的方法不当
…
\dots
…从字面意思来理解可以是我们构建的模型不合适:可以是模型构建得过于简单、输入的特征过少、训练的方法不当
…
\dots
…从字面意思来理解可以是我们构建的模型不合适:可以是模型构建得过于简单、输入的特征过少、训练的方法不当
…
\dots
…从字面意思来理解可以是我们构建的模型不合适:可以是模型构建得过于简单、输入的特征过少、训练的方法不当
…
\dots
…
…
\dots
…这样都会导致我们得到的最优解并不是真正的最优解,而仅仅是存在模型误差的局部最优解。
…
\dots
…这样都会导致我们得到的最优解并不是真正的最优解,而仅仅是存在模型误差的局部最优解。
问题描述:
当模型过于简单,无法捕捉数据的真实分布时,会导致模型偏差。当模型在训练数据上的损失很大时,可能是因为模型偏差。举例:模型过于简单,无法描述使损失降低的函数。 解决方法:
增加模型的灵活性:
增加输入特征(如从1天增加到56天)。使用深度学习等技术。使用更大的模型 注意:损失大不一定仅由模型偏差导致,还可能是优化问题。
2.2优化问题
常用的方法是梯度下降,但是勒,如我们之前所讨论的那样,我们可能仅找到一个局部最优解,而不是全局最优解。
问题描述:
优化算法(如梯度下降)可能无法找到全局最优解,而陷入局部最小值。即便模型灵活性足够,也可能因为优化算法不佳而导致训练数据损失高。 例子:
残差网络实验:20层网络比56层网络在训练集上表现更好,但56层网络理论上应有更大灵活性。 判断方法:
通过比较不同复杂度模型(如深度不同的网络)的表现(训练损失)来判断。
如果更为复杂的模型损失没有减少,那么可能是优化问题。 建议先从简单模型开始,逐步增加模型复杂性。 解决方案: 尝试不同的优化算法或调整优化参数。
2.3过拟合
问题描述:
模型在训练集上表现良好,但在测试集上表现差。极端例子:模型完全记忆训练集,对未见过数据随机输出。 原因:
模型灵活性过大,学习到了训练数据的噪声。人话来讲就是模型过于复杂,对数据过度适应。 解决方法:
增加训练集数据。数据增强(根据数据特性合理创造新数据)。给模型增加限制:
减少参数(如神经元数量)。使用更受限的模型(如CNN比全连接网络更受限)。使用正则化、早停、丢弃法等技巧。
2.4交叉验证
目的:
通过将训练数据分为训练集和验证集,更为合理地选择模型,避免在测试集上过拟合。 方法:
将训练集分为训练集和验证集(如90% & 10%)。使用验证集分数来选择模型。避免在公开测试集上频繁调整模型。 进阶:
k折交叉验证:将训练集等分为k份,轮流作为验证集和训练集,最终取平均结果。
2.5不匹配
问题描述:
训练集和测试集的分布不同,导致模型在测试集上的预测表现不佳。 例子:
预测观看人数时,模型预测2月26日为低点,但实际为峰值(因为周五通常观看人数少,但2月26日有特殊情况)。 解决方法:
需要对数据本身有深入理解,判断训练集和测试集是否存在不匹配问题。如果存在不匹配,可能需要重新划分数据集或调整数据收集方式,确保训练集与数据集的分布尽可能一致。
敬请期待
…
\dots
…
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。