【深度学习】吴恩达课程笔记(一)Logistic回归和深度学习基础知识整理
寒假的时候跟着李宏毅的视频学了很久,但是我都是记在笔记本上的,现在有些遗忘了,发现博客是个很好的记忆载体,那就快速过一遍吴恩达的吧。顺便还把Latex学了,真不错😀
函数积累
ReLU函数修正线性单元
修正:不小于0!
sigmoid函数
σ
(
z
)
=
1
1
+
e
−
z
.
\sigma(z) = \frac{1}{1+e^{-z}}.
σ(z)=1+e−z1.
表示概率不错的。
基本概念
基本神经元
x
x
x 是特征,神经元代表函数,
y
y
y输出
结构化数据:类似结构体这样,挺好理解。
非结构化数据:图像,声音等。
RGB三通道
如果输入图片是64×64像素,就有三个64×64矩阵。
符号介绍:
项目 | Value |
---|---|
n x n_{x} nx | 特征向量维数 |
m t r a i n m_{train} mtrain | 训练样本数 |
m t e s t m_{test} mtest | 测试样本数 |
( x 1 , y 1 ) ⋅ ⋅ ⋅ ( x i , y i ) ⋅ ⋅ ⋅ ( x m , y m ) (x^{1},y^{1})···(x^{i},y^{i})···(x^{m},y^{m}) (x1,y1)⋅⋅⋅(xi,yi)⋅⋅⋅(xm,ym) | 第 i i i个样本 |
X X X s h a p e = n × m shape=n×m shape=n×m | 训练集 |
Y Y Y s h a p e = 1 × m shape=1×m shape=1×m | 输出集 |
L ( y ^ , y ) = 1 2 ( y ^ − y ) 2 L(\hat y,y)=\frac{1}{2}(\hat y-y)^2 L(y^,y)=21(y^−y)2 | 最平常的Loss函数,非凹不用 |
X = [ x ( 1 ) ⋅ ⋅ ⋅ x ( m ) ] X= \begin{gathered} \begin{bmatrix} x^{(1)} & ···&x^{(m)} \end{bmatrix} \end{gathered} X=[x(1)⋅⋅⋅x(m)]
梯度下降(Gradient Descent)
找到使
J
(
w
,
b
)
J(w,b)
J(w,b)最小的
w
,
b
w,b
w,b
假设只看
w
w
w:
更新
w
,
b
w,b
w,b:
w
=
w
−
α
∂
J
(
w
,
b
)
∂
w
w=w-\alpha\frac{\partial J(w,b)}{\partial w}
w=w−α∂w∂J(w,b)
b
=
b
−
α
∂
J
(
w
,
b
)
∂
b
b=b-\alpha\frac{\partial J(w,b)}{\partial b}
b=b−α∂b∂J(w,b)
α
\alpha
α是学习率(learning rate)
Logistic回归
二分类,判断一个图片是不是个猫,把图片的RGB三个矩阵提出了放进一个特征向量
x
x
x里,是重起来的红色全部一列,之后绿色接着一列。像素64×64,
x
x
x的维度是64×64×3.
建立模型啦:
w
∈
R
n
x
,
b
∈
R
w\in R^{n_{x}} , b\in R
w∈Rnx,b∈R
y
^
=
σ
(
w
x
+
b
)
\hat{y}=\sigma(w^x+b)
y^=σ(wx+b)
因为基本损失函数在logistic上是非凹的,所以采用下面这种写法:
交叉熵损失函数:log底数是e 交叉熵
L
(
y
^
,
y
)
=
−
(
y
log
y
^
+
(
1
−
y
)
log
(
1
−
y
^
)
)
L(\hat y,y)=-(y\log{\hat y}+(1-y)\log(1-\hat y) )
L(y^,y)=−(ylogy^+(1−y)log(1−y^))
损失函数只用于单个训练样本引入成本函数(cost function),用于衡量参数
w
w
w和
b
b
b。
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
J(w,b)=\frac{1}{m}\sum_{i=1}^{m}L(\hat y^{(i)},y^{(i)})
J(w,b)=m1i=1∑mL(y^(i),y(i))
然后我们来模拟一下梯度下降的伪代码,理解就行了,这段伪代码的意思就是梯度下降求得J,还有dw1,也就是
∂
J
(
w
,
b
)
∂
w
1
\frac{\partial J(w,b)}{\partial w_{1}}
∂w1∂J(w,b) :
∂
J
∂
z
=
∂
J
∂
a
×
∂
a
∂
z
=
a
−
y
\frac{\partial J}{\partial z}=\frac{\partial J}{\partial a}×\frac{\partial a}{\partial z}=a-y
∂z∂J=∂a∂J×∂z∂a=a−y
∂
J
∂
w
1
=
∂
J
∂
z
×
∂
z
∂
w
1
=
(
a
−
y
)
×
x
1
\frac{\partial J}{\partial w_1}=\frac{\partial J}{\partial z}×\frac{\partial z}{\partial w_1}=(a-y)×x_1
∂w1∂J=∂z∂J×∂w1∂z=(a−y)×x1
J=0
dw1=0 #设置两个特征,n=0
dw2=0
db=0
i=1
for i in range(m):
Z=WX+b #W是一个2维向量,X是特征向量
a=sigmoid(Z) #每个样本算出的概率
J+=L(y^,a) #把J加起来
dz=a-y #
dw1+=x1dz #这里学习率是1,x1dz就是Z对w求导
dw2+=x2dz
db+=dz
J/=m #这段伪代码的意思就是梯度下降求得J
dw1/=m
dw2/=m
db/=m
但是这样的实现很慢,因为我们不止两个特征向量,这就需要for循环嵌套,数据庞大的情况下效率很低,这个时候就引入了Python的numpy。
向量化
Z=np.dot(w,x)+b
这段代码意思是:
Z
=
w
T
×
x
+
b
Z=w^T×x +b
Z=wT×x+b
然后举了好多numpy里面的例子,就不一一赘述了。
[
z
(
1
)
⋅
⋅
⋅
z
(
m
)
]
=
w
T
X
+
[
b
(
1
)
⋅
⋅
⋅
b
(
m
)
]
\begin{gathered} \begin{bmatrix} z^{(1)} & ···&z^{(m)} \end{bmatrix} \end{gathered}=w^TX+ \begin{gathered} \begin{bmatrix} b^{(1)} & ···&b^{(m)} \end{bmatrix} \end{gathered}
[z(1)⋅⋅⋅z(m)]=wTX+[b(1)⋅⋅⋅b(m)]
A
=
[
a
(
1
)
⋅
⋅
⋅
a
(
m
)
]
=
σ
Z
A=\begin{gathered} \begin{bmatrix} a^{(1)} & ···&a^{(m)} \end{bmatrix} \end{gathered}=\sigma Z
A=[a(1)⋅⋅⋅a(m)]=σZ
好啦,经过numpy的引入我们简单了许多,重新写一下代码:
for i in range(1000) #1000次梯度下降
Z=np.dot(w,x)+b #函数
A=sigmoid(Z) #函数得到概率——结果
dZ=A-Y #用来求梯度方向一环
dw=(1/m)*np.dot(X,Z.T) #梯度方向
db=(1/m)*np.sum(dZ) #梯度方向
w=w-r*dw #更新梯度
b=b-r*db #更新梯度
Python广播
- 加常数,矩阵里所有数都加
- m×n与m×1或者1×n时,瞬间扩展。