本周主要进行了深度学习的学习,以及论文的阅读
学习内容
1.论文
2.吴恩达深度学习 2.5-2.18
学习时间
2023.7.9 — 2023.7.14
学习笔记
深度学习
2.5-2.8 为导数部分,比较熟悉因此没有做笔记
2.9 逻辑回归中的梯度下降(Logistic Regression Gradient Descent)
通过反向传播,使用梯度下降法对参数进行影响
其实就是一层一层向后求导,多元函数导数,例如以下例子:
假设只有两个特征 x1 与 x2的情况:
z
=
w
1
x
1
+
w
2
x
2
+
b
y
^
=
a
=
σ
(
z
)
,
σ
(
z
)
=
1
1
+
e
−
z
L
(
a
,
y
)
=
−
(
y
log
y
^
+
(
1
−
y
)
log
(
1
−
y
^
)
)
z=w_{1}x_{1}+w_{2}x_{2}+b\\\hat{y}=a=\sigma(z)\ , \ \sigma(z) = \frac{1}{1 + e^{-z}}\\L(a,y)=-(y\log\hat{y}+(1-y)\log(1-\hat{y}))
z=w1x1+w2x2+by^=a=σ(z) , σ(z)=1+e−z1L(a,y)=−(ylogy^+(1−y)log(1−y^))
以下为反向传播的过程:
(
1
)
d
L
(
a
,
y
)
d
a
=
−
y
a
+
1
−
y
1
−
a
(
2
)
d
a
d
z
=
a
(
1
−
a
)
(
3
)
d
L
(
a
,
y
)
d
z
=
d
L
(
a
,
y
)
d
a
⋅
d
a
d
z
=
a
−
y
(
4
)
∂
L
∂
w
1
=
d
L
(
a
,
y
)
d
z
⋅
∂
z
∂
w
1
=
x
1
(
a
−
y
)
,
∂
L
∂
w
2
=
d
L
(
a
,
y
)
d
z
⋅
∂
z
∂
w
2
=
x
2
(
a
−
y
)
,
∂
L
∂
b
=
d
L
(
a
,
y
)
d
z
⋅
∂
z
∂
b
=
a
−
y
(1)\ \frac{{\rm d}L(a,y)}{{\rm d}a}=-\frac{y}{a}+\frac{1-y}{1-a}\\ (2)\ \frac{{\rm d}a}{{\rm d}z}=a(1-a)\\ (3)\ \frac{{\rm d}L(a,y)}{{\rm d}z}=\frac{{\rm d}L(a,y)}{{\rm d}a}\cdot\frac{{\rm d}a}{{\rm d}z}=a-y\\ (4)\ \frac{\partial L}{\partial w_{1}}=\frac{{\rm d}L(a,y)}{{\rm d}z}\cdot\frac{\partial z}{\partial w_{1}}=x_{1}(a-y)\ ,\ \frac{\partial L}{\partial w_{2}}=\frac{{\rm d}L(a,y)}{{\rm d}z}\cdot\frac{\partial z}{\partial w_{2}}=x_{2}(a-y)\ ,\ \frac{\partial L}{\partial b}=\frac{{\rm d}L(a,y)}{{\rm d}z}\cdot\frac{\partial z}{\partial b}=a-y
(1) dadL(a,y)=−ay+1−a1−y(2) dzda=a(1−a)(3) dzdL(a,y)=dadL(a,y)⋅dzda=a−y(4) ∂w1∂L=dzdL(a,y)⋅∂w1∂z=x1(a−y) , ∂w2∂L=dzdL(a,y)⋅∂w2∂z=x2(a−y) , ∂b∂L=dzdL(a,y)⋅∂b∂z=a−y
然后采用梯度下降法根据这三个值更新参数:
w
1
=
w
1
−
α
⋅
∂
L
∂
w
1
,
w
2
=
w
2
−
α
⋅
∂
L
∂
w
2
,
b
=
b
−
α
⋅
∂
L
∂
b
w_{1}=w_{1}-\alpha\cdot\frac{\partial L}{\partial w_{1}}\ ,\ w_{2}=w_{2}-\alpha\cdot\frac{\partial L}{\partial w_{2}}\ ,\ b=b-\alpha\cdot\frac{\partial L}{\partial b}\
w1=w1−α⋅∂w1∂L , w2=w2−α⋅∂w2∂L , b=b−α⋅∂b∂L
2.10 m个样本的梯度下降(Gradient Descent on m Example)
如下图所示,左边为每次的训练,m 个样本需要执行 m 次,而 n 是向量的维度,也是用 for 循环遍历的,因此,时间复杂度为 O(mn)
右边是每次训练后对参数的更新,即梯度下降法,下图即为一次梯度下降,可以反复使用来逼近结果
由于 for 循环的使用在深度学习中是低效的,因此需要进行向量化(Vectorization),这将在下一节提到
2.11 向量化(Vectorization)
向量化可以去除代码中 for 循环
经过代码演示,计算 w x 的值,在 100万 数量级上,发现向量化会比 for-loop 快300倍
GPU 比 CPU 更适合 SIMD(single introduction multiple data) 计算
2.12 向量化的更多例子(More Examples of )
例如矩阵乘法 A*v,需要两个循环来实现,右侧的代码移除了两层 for-loop
当需要对某向量统一操作的时候,例如取指数,可以调用 numpy,来进行计算
在逻辑回归的梯度下降上,我们可以使用 np.zero((n_x,1)) 来初始化向量,并把多步 dw_1, dw_2, … 等合为一个变量 dw,移除了一层 for-loop
2.13 向量化逻辑回归
向量化实际上就是把要循环的东西变成矩阵,通过一步相乘的方式得到结果,如下图
把所有的向量 x_i 合成一个大矩阵 X,与 w 相乘再加 b 获得矩阵 Z,其中 Z 是由多个 z_i 向量构成的
在代码中,np.dot 应该指的是矩阵相乘,b 虽然是一个单值,但是在这一步中由 python 的广播(broadcasting)直接变为长度为 m 的行向量
2.14 向量化 logistic 回归的梯度输出(Vectorizing Logistic Regression’s Gradient)
与上一节相同,梯度下降中的循环仍然存在,即 dw 与 db,通过之前的计算,计算 dw 需要我们将 x_i 与 dz_i 相乘并累加得到,因此我们直接将列向量与行向量相乘,得到的是一个值的形式。而 db 更加简单,直接调用 numpy 中的 np.sum(dZ) 即可完成求和
左边是未向量化的 for-loop,右边是向量化后的算法,每一个步骤都可以在前文中找到答案
注意,该算法只是一次迭代。如果需要迭代多次,则仍然要使用 for-loop,而且该循环是基本不可能省去的
2.15 Python 中的广播
广播的例子,这里要求每列中的单个元素在本列中所占的百分比,底部有实现代码:
axis 表示竖向(0)或横向(1)
相除使用对矩阵进行了 reshape 处理,为了保证向量是我们需要的形态。时间复杂度为 O(1)
注意,这里的相除是逐元素相除,与矩阵中的乘除不一致
广播中,会在计算中填补数值使矩阵变为正常的形态
2.16 关于 python_numpy 向量的说明(A note on python or numpy vectors)
在 coding 中,一定要使数据格式正确,在定义向量时,直接定义为矩阵,避免使用数组定义向量,防止计算时出现 bug
多多使用 assert 声明矩阵大小,以及使用 reshape 调整矩阵格式
2.18 logistic 损失函数的解释(Explanation of logistic regression cost function)
y 的取值只能是 0 或 1,训练样本得出来的 yhat 其实是 等于 1 的概率,那么 1 - yhat 就是等于 0 的概率,所以两个条件概率公式可以合并为以下公式(1),由于对数函数是严格单调递增的函数,因此最大化 p 就是最大化 logp,通过对数函数将(1)式化简为(2),因为我们在逻辑回归中需要最小化损失函数,因此前面要添加负号。
(
1
)
p
(
y
∣
x
)
=
y
^
y
⋅
(
1
−
y
^
)
1
−
y
(
2
)
log
p
(
y
∣
x
)
=
y
log
y
^
+
(
1
−
y
)
log
(
1
−
y
^
)
(1)\ p(y|x)=\hat{y}^{y}\cdot(1-\hat{y})^{1-y}\\ (2)\ \log{p(y|x)}=y\log{\hat{y}}+(1-y)\log{(1-\hat{y})}
(1) p(y∣x)=y^y⋅(1−y^)1−y(2) logp(y∣x)=ylogy^+(1−y)log(1−y^)
所有训练样本服从同一分布并相互独立,因此这些样本的联合概率就是每个样本概率的乘积,即
P
(
l
a
b
e
l
s
i
n
t
r
a
i
n
i
n
g
s
e
t
)
=
∏
i
=
1
m
P
(
y
(
i
)
∣
x
(
i
)
)
log
P
(
l
a
b
e
l
s
i
n
t
r
a
i
n
i
n
g
s
e
t
)
=
∑
i
=
1
m
log
P
(
y
(
i
)
∣
x
(
i
)
)
=
−
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
P(labels\ in\ training\ set)=\prod^{m}_{i=1}P(y^{(i)}|x^{(i)})\\ \log{P(labels\ in\ training\ set)}=\sum^{m}_{i=1}\log{P(y^{(i)}|x^{(i)})}=-\sum^{m}_{i=1}L(\hat{y}^{(i)},y^{(i)})
P(labels in training set)=i=1∏mP(y(i)∣x(i))logP(labels in training set)=i=1∑mlogP(y(i)∣x(i))=−i=1∑mL(y^(i),y(i))
最大似然估计,即去一组参数的值,让这个式子取得最大值,因此在成本函数中去掉了负号