李宏毅2020机器学习
1. 简介
机器学习就是自动找函式
机器学习:
- 语音识别,f(一段声音)=“How are you”
- 图片识别,f(一张图片)=“Cat”
- 下围棋,f(一张围棋图片)=“5-5”
- 对话系统,f(“How are you?”)=“I am fine.”
你想找什么样的函式?机器怎么找出你想要的函式?即 Gradient Descent;函式的Loss,机器会自动找出Loss最低的函式
- Regression ---- 回归,输出一个数值
- Classification ---- 二分类,input->f->Yes or No
- RNN ---- 二分类,input -> f -> 正面 or 负面
- CNN ---- Multi-class Classification,多分类,input->f->Class 1, Class 2, … Class N
- Seq2seq ---- Generation,生成
- GAN
- Unsupervised Learning ---- 非监督学习,例如 Auto-encoder
- Anomaly Detection ---- 训练机器知道“我不知道”
- Transfer Learning(Domain Adversarial Learning) ---- 处理不同的输入数据
- Explainable AI ---- 可解释
- Adversarial Attack ---- 攻击AI
- Network Compression ---- 网络简化
- Meta Learning ---- Learn to learn,让机器学习如何学习
- Life-long Learning ---- 终身学习
- Reinforcement Learning ---- 强化学习
2. 规定
2.1. 环境
建议linux或macOS
python 3.6.8
pyenv
2.2. Kaggle
机器学习平台
3. Regression
回归:PM2.5预测、股票预测、自动驾驶、推荐系统
3.1. Model
a set of function
y
=
b
+
w
⋅
x
y = b + w \cdot x
y=b+w⋅x,
w
w
w:weight,
b
b
b:bias 可以是任意值,因此 y 为一组函式
3.2. 准备训练数据 Training Data,定义损失函数Loss
Loss: input – a function,output – how bad it is
L
(
f
)
=
L
(
w
,
b
)
=
∑
n
=
1
10
(
y
^
n
−
(
b
+
w
⋅
x
c
p
n
)
)
2
L(f) = L(w, b) = \sum _{n=1}^{10} (\hat{y}^n - (b + w \cdot x_{cp}^n))^2
L(f)=L(w,b)=n=1∑10(y^n−(b+w⋅xcpn))2
3.3. Gradient Descent
线性回归基础版本
线性回归动态学习率adagrad版本
动态学习率能提高学习速度
局部最小值:线性回归中不用担心局部最小值,因为 loss function L is convex (凸函数)
3.4. Overfitting 过拟合
从最简单的线性方程开始,然后用二次方程,三次方程演示过拟合
模拟过拟合
3.5. Regularization 正则化
y
=
b
+
∑
w
i
x
i
L
=
∑
n
(
y
^
n
−
(
b
+
∑
w
i
x
i
)
)
2
+
λ
∑
(
w
i
)
2
y=b+\sum w_i x_i \\ L = \sum _n (\hat{y}^n - (b+\sum w_i x_i))^2 + \lambda \sum (w_i)^2
y=b+∑wixiL=n∑(y^n−(b+∑wixi))2+λ∑(wi)2 The function with smaller
w
i
w_i
wi are better. 参数越接近0,方程越平滑
为什么平滑的方程比较好?平滑方程受噪声的影响比较小
λ
\lambda
λ 的值需要调整,才能获得较好的模型
注意:正则化并没有将3.4中的过拟合纠正过来,暂时不知道原因
4. 误差从哪来?
Bias(偏差)、Error(误差)、Variance(方差)
5. 梯度下降法
通过画出Loss的曲线,来判断如何调整学习率,通常情况下,lr随迭代次数逐渐变小
lr不应该one-size-fits-all,每个参数应该有自己的lr
调整学习率:自适应学习率—adagrad
W
t
+
1
←
W
t
−
η
t
δ
t
g
t
=
W
t
−
η
∑
i
=
0
t
(
g
i
)
2
g
t
η
t
=
η
t
+
1
δ
t
=
1
t
+
1
∑
i
=
0
t
(
g
i
)
2
W^{t+1} \leftarrow W^{t} - \frac{\eta^t}{\delta^t} g^t = W^t - \frac{\eta}{\sqrt{\sum_{i=0}^t(g^i)^2}}g^t \\ \eta^t = \frac{\eta}{\sqrt{t+1}} \\ \delta^t = \sqrt{\frac{1}{t+1} \sum_{i=0}^t(g^i)^2}
Wt+1←Wt−δtηtgt=Wt−∑i=0t(gi)2ηgtηt=t+1ηδt=t+11i=0∑t(gi)2 adagrad后面学习非常慢,可以使用 adam
Stochastic Gradient Descent: 随机梯度下降法,仅随机选取一个样本,来计算梯度值
Feature Scaling: 特征缩放,让不同的特征有相同的比例;多个特征分布的区间非常不同时,建议进行特征缩放。特征缩放的方法很多,常见的有:
x
i
r
←
x
i
r
−
m
i
δ
i
x_i^r \leftarrow \frac{x_i^r - m_i}{\delta_i}
xir←δixir−mi r 表示第几个样本, i 表示第几个维度 : 均值表示为
m
i
m_i
mi ,标准差表示为
δ
i
\delta _i
δi
标准化处理后,所有维度均值为0,方差为1
泰勒级数:
h
(
x
)
=
∑
k
=
0
∞
h
(
k
)
(
x
0
)
k
!
(
x
−
x
0
)
k
h(x) = \sum_{k=0}^\infty \frac{h^{(k)}(x_0)}{k!} (x-x_0)^k
h(x)=k=0∑∞k!h(k)(x0)(x−x0)k 当
x
x
x 很接近
x
0
x_0
x0 时:
h
(
x
)
≈
h
(
x
0
)
+
h
′
(
x
0
)
(
x
−
x
0
)
h(x) \approx h(x_0) + h^{'}(x_0)(x-x_0)
h(x)≈h(x0)+h′(x0)(x−x0)
泰勒级数可以扩展到多参数
梯度下降法的限制:局部最小值、鞍点的微分值都为0
8. 深度学习优化
一些数学符号:
- θ t \theta _t θt : t 时刻的模型参数
- g t g_t gt : θ t \theta _t θt 的梯度
- m t + 1 m_{t+1} mt+1 : 动量
优化内容:找一个参数 θ \theta θ, 对于所有样本,使得Loss最小
On-line vs Off-line: 看到一个样本还是所有样本
优化器(Optimizers):
SGD(1847年): Start at position
θ
0
\theta ^0
θ0, Compute gradient at
θ
0
\theta ^0
θ0, Move to
θ
1
=
θ
0
−
η
∇
L
(
θ
0
)
\theta ^1 = \theta ^0 - \eta \nabla L(\theta ^0)
θ1=θ0−η∇L(θ0), Compute gradient at
θ
1
\theta ^1
θ1, Move to
θ
2
=
θ
1
−
η
∇
L
(
θ
1
)
\theta ^2 = \theta ^1 - \eta \nabla L(\theta ^1)
θ2=θ1−η∇L(θ1) … Stop until
∇
L
(
θ
t
)
≈
0
\nabla L(\theta ^t) \approx 0
∇L(θt)≈0
SGD with Momentum(SGDM)(1986年): Start at point θ 0 \theta ^0 θ0, Movement v 0 = 0 v^0=0 v0=0; Compute gradient at θ 0 \theta ^0 θ0, Movement v 1 = λ v 0 − η ∇ L ( θ 0 ) v^1 = \lambda v^0 - \eta \nabla L(\theta^0) v1=λv0−η∇L(θ0), Move to θ 1 = θ 0 + v 1 \theta ^1=\theta ^0 + v^1 θ1=θ0+v1; Compute gradient at θ 1 \theta ^1 θ1, Movement v 2 = λ v 1 − η ∇ L ( θ 1 ) v^2 = \lambda v^1 - \eta \nabla L(\theta^1) v2=λv1−η∇L(θ1), Move to θ 2 = θ 1 + v 2 \theta ^2=\theta ^1 + v^2 θ2=θ1+v2; Movement not just based on gradient, but previous movement.
(下面三个优化器采用动态学习率)
Adagrad(2011年):
θ
t
=
θ
t
−
1
−
η
∑
i
=
0
t
−
1
(
g
i
)
2
g
t
−
1
\theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{\sum_{i=0}^{t-1}(g_i)^2}}g_{t-1}
θt=θt−1−∑i=0t−1(gi)2ηgt−1
RMSProp(2013年):
θ
t
=
θ
t
−
1
−
η
v
t
g
t
−
1
\theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{v_t}}g_{t-1}
θt=θt−1−vtηgt−1,
v
1
=
(
g
0
)
2
v_1=(g_0)^2
v1=(g0)2,
v
t
=
a
v
t
−
1
+
(
1
−
a
)
(
g
t
−
1
)
2
v_t=a v_{t-1} + (1-a)(g_{t-1})^2
vt=avt−1+(1−a)(gt−1)2; 此方法与 Adagrad 仅分母不同
Adam(2015年): SGDM 变形 + RMSProp---- SGDM[
θ
t
=
θ
t
−
1
−
η
m
t
;
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
−
1
\theta_t=\theta_{t-1}-\eta m_t;m_t=\beta_1 m_{t-1} + (1-\beta _1)g_{t-1}
θt=θt−1−ηmt;mt=β1mt−1+(1−β1)gt−1] + RMSProp[
θ
t
=
θ
t
−
1
−
η
v
t
g
t
−
1
\theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{v_t}}g_{t-1}
θt=θt−1−vtηgt−1,
v
1
=
(
g
0
)
2
v_1=(g_0)^2
v1=(g0)2,
v
t
=
β
2
v
t
−
1
+
(
1
−
β
2
)
(
g
t
−
1
)
2
v_t=\beta_2 v_{t-1} + (1-\beta_2)(g_{t-1})^2
vt=β2vt−1+(1−β2)(gt−1)2] = Adam[
θ
t
=
θ
t
−
1
−
η
v
^
t
+
ε
m
^
t
\theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{\hat{v}_t} + \varepsilon} \hat{m}_t
θt=θt−1−v^t+εηm^t;
m
^
t
=
m
t
1
−
β
1
t
\hat{m}_t=\frac{m_t}{1-\beta_1 ^t}
m^t=1−β1tmt,
v
^
t
=
v
t
1
−
β
2
t
\hat{v}_t=\frac{v_t}{1-\beta_2 ^t}
v^t=1−β2tvt,
β
1
=
0.9
,
β
2
=
0.999
,
ε
=
1
0
−
8
\beta_1 = 0.9, \beta_2=0.999, \varepsilon=10^{-8}
β1=0.9,β2=0.999,ε=10−8]
真实应用中,大部分模型使用的优化器是 SGDM(稳定) 或 Adam(训练快)
L2 regularization: L l 2 ( θ ) = L ( θ ) + γ ∣ ∣ θ ∣ ∣ 2 L_{l_2}(\theta) = L(\theta) + \gamma ||\theta||^2 Ll2(θ)=L(θ)+γ∣∣θ∣∣2
Shuffling
Dropout
Gradient noise
建议:
SGDM: Computer vision(image classification、segmentation、object detection)
Adam: NLP(QA、machine translation、summary)、Speech synthesis、GAN、Reinforcement learning